The Pioneer Geschrieben 22. Januar 2006 Teilen Geschrieben 22. Januar 2006 Hi Leute... Da ich mit hilfe von euch das letzte Problem mit den Strings lösen konnte, habe ich schon ein weiteres und hoffe ihr könnt mir hierbei genau so gut helfen. Möchte ein kleines Programm in C# schreiben, welches lienare Gleichungen oder ggf auch Gleichungssysteme lösen kann. Hat vielleicht schon jemand Erfahrung damit gemacht? Wie soll ich am besten das "Problem" anpacken? Ich danke euch jetzt schon wieder für die Interessanten Tipps und Hilfen! Gruss Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kaeyu Geschrieben 22. Januar 2006 Teilen Geschrieben 22. Januar 2006 Möchte ein kleines Programm in C# schreiben also ich kann dir jetzt schon sagen, klein wird es nicht. also mein tipp, aber das weißt du mit sicherheit, in einer gleichung rechnet man immer mit dem gegenteil. als beispiel nehmen wir ma diese kleine: x²-4=0 da würde man ja erst -4 zu +4 ändern also gegenteil, dannach würde man aus x² die wurzel ziehen. du müsstest die also erstma was ausdenken, dass alles ins gegenteil ändert. bei solchen gleichungen is das ja noch leicht zu proggen, wenn man die ganzen if anweisungen fertig hat, aber es gibt ja auch "brutalere" gleichungen. btw: sowas hab ich auch schon mal versucht, aber hab aufgegeben. dann habe ich ne ganze weile pause gemacht und das wars. ich wusste garnicht mehr wie ich es weitermachen sollte. ich wusste nicht mal wirklich was ich da geschrieben hatte. die pause war anscheinend zu lang ^^" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 22. Januar 2006 Teilen Geschrieben 22. Januar 2006 Vom Primzip her nicht schwer, es geht z.B. mit Gauss. Das kann man noch beschleunigen, z.B. durch LR-Zerlegung. Es gibt aber auch approximative Lösungsverfahren. Eine Beschreibung vom Gauss-Verfahren (unter Gauss-Verfahren zum Lösen linearer Gleichungssysteme) findest Du sicher selbst in einem Mathebuch, weiteres kannst Du mich gerne fragen, wenn es Dich interessiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
imatt Geschrieben 22. Januar 2006 Teilen Geschrieben 22. Januar 2006 was willst du den für gleichungssystem lösen? mal ein beispiel bitte.- willst du gleichungssysteme 2. grades lösen wird das kein problem sein. aber sobald du höhere Systeme hast wirst du probleme bekommen und solltest zuerst einmal die systeme zu fuß lösen können Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 22. Januar 2006 Teilen Geschrieben 22. Januar 2006 solange es nicht irgend welche limes +- unendliche Werte sind würde ich die Rechenfähigkeiten der CPUs nutzen, also try and failure dieses gepaart mit hardcodierten Ableitungsregeln für Standardsachen um Rechenzeit einzusparen -> voila Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 23. Januar 2006 Autor Teilen Geschrieben 23. Januar 2006 Guten Morgen allerseits... Das hagelg ja richtig von Tipps. Zuerst mal zu baba007: solange es nicht irgend welche limes +- unendliche Werte sind würde ich die Rechenfähigkeiten der CPUs nutzen, also try and failure Das habe ich ehrlichgesagt auch schon versucht, nur ist das Problem da, der Benutzer kann eine Gleichung via GUI eingeben, sommit ist die Gleichung zuerst mal ein String. Ich weiss nicht wie ich diese "einfach" in einen double wandlen kann (habe ich auch schon versucht und zur laufzeit gab es mir immer einen Fehler bei den Konvertierung der Opperationszeichen (fast logisch )) dess halb habe ich diese Variante mal zur Seite gelegt. Zu imatt: was willst du den für gleichungssystem lösen? in erster Linie mal ersten Grades, wenn es Zeitlich mir möglich ist auch noch zweiten Grades, höher momentan nicht. Zu Fuss, wie du das nennst, ist kein Problem, nur ist das mit dem Coden bisschen anders und noch zu Bubble: Ja das Gauss-Verfahren ist mir auch noch irendwie geläufig, hatte ich auchmal in der Schule, schaue jetzt mal was ihr für weitere Tipps geben könnt und dann wird ich mich wohl oder übel mit einer diesen Varianten auseinandersetzen :confused: Danke für die Anregungnen Gruss Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 23. Januar 2006 Teilen Geschrieben 23. Januar 2006 Naja da es dir ja anscheind nur um eine Übungsaufgabe geht könntest du die Gleichung vorgeben und den Benutzer nur die Werte eingeben lassen: Also so das am Bildschirm meinetwegen _ X _ _Y = _ steht so das der benutzer dann z.B. 3 + 2 5 eingegebn würde und daraus dann 3x + 2y = 5 wird. Ansonsten wenn du den Benutzer direkt "3x + 2y = 5" eingeben lässt müsstest du ersteinmal einen Parser basteln der das Ganze in seine einzelteile zerlegt und erkennt. Das dürfte das schwierigste an dem Thema sein... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 23. Januar 2006 Teilen Geschrieben 23. Januar 2006 ich würde bestimmte formeln vorgeben, wie mein vorredner schon gesagt hat. die wählt man aus und setzt die variablen werte ein und drückt auf feuer ! ansonsten stinkt es nach regulären Ausdrücken und dieses mit () [] Brüchen, GANZ ÜBEL ! :eek Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 23. Januar 2006 Autor Teilen Geschrieben 23. Januar 2006 Eigentlich will ich schon dass der Benutzer ein Gleichung mit einer Variable eingeben kann z.B "3*x+2=5-x". einen kleine Parser habe ich bereits erstellt. Es ist damit möglich z.B. "3+4-2*5" einzugeben und das wird dann auch ausgerechnet, das Problem wo ich bei diesem Parser noch habe ist, dass er die Regel Punkt vor Strich noch nicht berücksichtigt... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 23. Januar 2006 Autor Teilen Geschrieben 23. Januar 2006 Hmm wo bleiben denn hier die Interessanten Vorschläge??? könnte eure Hilfe noch einbisschen gebrauen... Gruss Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
imatt Geschrieben 23. Januar 2006 Teilen Geschrieben 23. Januar 2006 schau doch mal bei www.planetsourcecode.com such nach "equation" und probier das "Symbolic Calculator" aus da hat sich jm. ein bißchen arbeit gemacht, vllt hilfts dir ja?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 24. Januar 2006 Teilen Geschrieben 24. Januar 2006 Eigentlich will ich schon dass der Benutzer ein Gleichung mit einer Variable eingeben kann z.B "3*x+2=5-x". Wenn du schon einen Parser hast, dann solltest du als nächstes einen Algorithmus zum Auflösen nach x formulieren. Vielleicht solltest du dich dabei zunächst auf Ausdrücke beschränken, in denen nur ein x auftaucht, damit du nur mit linearen Gleichungen zu tun hast. Sonst könnte dir auch die eine oder andere quadratische begegnen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 24. Januar 2006 Autor Teilen Geschrieben 24. Januar 2006 zum jetzigen zeitpunt habe ich den parser noch nicht soweit das er auch variablen erkennt. erst zahlen und opperationszeichen (+,-,*,/) funktionsweise des Parser: .... switch (expression[i]) { case '(': numBrackets++; break; case ')': numBrackets--; break; case '+': if (numBrackets == 0 && type == OperationType.None) { type = OperationType.Addition; operationSignPos = i; } break; .... beim durchgehen der eingabe wird das erste opperationszeichen in "operationSignPos" gespeichert. String firstOperand = expression.Substring(0, operationSignPos); String secondOperand = expression.Substring(operationSignPos + 1, expression.Length - operationSignPos - 1); _op1 = new Operation(firstOperand); _op2 = new Operation(secondOperand); da teile ich den string in 2 teile... und genau da ist der fehler auch begrabe. es wird einfach das erste opperationszeichen genommen. bsp. eingabe: "3*3+5" ergiebt richtig 14 bei meinem parser teilt er den string in firstOpernad = "3" und secondOperand = "3+5" mit diesen beiden operanden geht er den Parser wieder durch bis effektiv eine zahl übrig bleibt. Bei firstOperand ist das bereits der fall, somit wird die 5 als double mal gespeichert... wenn der parser den secondOperand "2+5" durch geht, erkennt er eine Addition und speichert das ergebnis (7) auch als double. erst jetzt macht er die eigentliche multiplikation, aber eben jetzt mit firstOperand (5) * secondOperand (7) und das gibt 35. kann mir da jemand helfen wie ich punkt vor strich operationen richtig handlen kann? besten dank Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 24. Januar 2006 Teilen Geschrieben 24. Januar 2006 Erfasse das LGS doch am besten gleich in Matrix-Notation. Dann kannst Du es gleich mit Gauss lösen. Die paar kleinen Umformungen, um eine Gleichung in die nötige Form zu bringen, kann man eh problemlos von Hand machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 24. Januar 2006 Autor Teilen Geschrieben 24. Januar 2006 Juhui habe das Parser problem mit dem Punkt vor Strich jetzt gelösst. Mit den Gleichungen habe ich das jetzt mal mit "Schablone" a la Guybrush Threepwood: Also so das am Bildschirm meinetwegen _ X _ _Y = _ steht so das der benutzer dann z.B. 3 + 2 5 eingegebn würde und daraus dann 3x + 2y = 5 wird. Falls jemand interesse hat und wissen will, wie man diese Probleme die ich jetzt hatte, lösen kann, soll sich bei mir melden... Gruss und nochmals danke an alle die mir weitergeholfen haben! Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s1ck Geschrieben 27. Januar 2006 Teilen Geschrieben 27. Januar 2006 Klammern brauch die Welt :bimei Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 31. Januar 2006 Autor Teilen Geschrieben 31. Januar 2006 hmm da bin ich wieder mit dem alten Problem wie zuvor geschrieben habe ich das mit den Gleichungen mal mit einer "Schablone" gelösst. Nun will ich es trotz dem Schwirigkeitsgrad anderst versuchen sodass man z.B. "2*x*2 = 4*x-3" eingeben kann und das ausgerechnet wird. bin wieder auf Unterstützung angewiesen. Gruss Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ramses_PyramidenVerleih Geschrieben 31. Januar 2006 Teilen Geschrieben 31. Januar 2006 Wenn du uns sagts, wobei genau, dann können wir dir auch mehr als nur seelische Unterstüzung geben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 1. Februar 2006 Autor Teilen Geschrieben 1. Februar 2006 Ihr könnt mir helfen indem ihr mir lösungansätze geben könnt oder sonnst allgemein tipps wie ich die gleichung sortieren kann danke Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 1. Februar 2006 Teilen Geschrieben 1. Februar 2006 Ihr könnt mir helfen indem ihr mir lösungansätze geben könnt oder sonnst allgemein tipps wie ich die gleichung sortieren kann Was meinst Du mit "sortieren"? Wenn Du einen Term (z.B. "2+4*3") ausrechnen möchtest, würde es Dir helfen aus dem String erst einmal einen Baum aufzubauen. Wenn Du immer noch lineare Gleichungssysteme lösen möchtest, dann solltest Du sie wirklich in Matrixform eingeben - das erspart Dir viel unnötige Mühe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
imatt Geschrieben 1. Februar 2006 Teilen Geschrieben 1. Februar 2006 ich hab ja schonmal einen link dazu gepostet ansonsten kann ich bubble rechtgeben du wirst die was überlegen müssen - was sich sowas wohl noch niemand im board überlegt hat die idee mit dem baum ist nicht schlecht, dazu gibt es natürlich noch kein fertiges objekt, außer vllt. den treeview... bau dir doch mal ne klasse wo dir einen string in deinen baum zerlegt und dann im treeview einträgt - zur visualisierung du kannst die sache ja per javascript machen (ok, gibts kein so schönen treeview) und dann einen link posten... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 1. Februar 2006 Autor Teilen Geschrieben 1. Februar 2006 das lösen von Mathematischen Rechnungen wie "2+4*3" ist kein problem, diesen Parser habe ich bereits implementiert. jetzt geht es um z.b "2*x-3 = 5+x" und es wäre nicht so schwirig das zu lösen wenn ich es so in fertigen Matizen eingeben würde. Nur möchte ich eben eine "grössere" herausforderung, eben mit direktem lösen von gleichungen Gruss Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
imatt Geschrieben 1. Februar 2006 Teilen Geschrieben 1. Februar 2006 hä? versteh ich jetzt net ganz was du meinst du musst doch dann die x auf eine seite bringen und dann die gleichung lösen, bei gleichungen 1. und 2. grades ist das ja nicht so schwer?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 1. Februar 2006 Teilen Geschrieben 1. Februar 2006 das lösen von Mathematischen Rechnungen wie "2+4*3" ist kein problem, diesen Parser habe ich bereits implementiert. jetzt geht es um z.b "2*x-3 = 5+x" und es wäre nicht so schwirig das zu lösen wenn ich es so in fertigen Matizen eingeben würde. Nur möchte ich eben eine "grössere" herausforderung, eben mit direktem lösen von gleichungen Hier ein Vorschlag für lineare Gleichungen in der speziellen Form (Zahl_1*Unbekannte_1) + ... + (Zahl_1*Unbekannte_i) + (Zahl_2*Unbekannte_1) + ... + (Zahl_2*Unbekannte_i) + ... + (Zahl_j*Unbekannte_i) + Weitere_Zahlen_ohne_Variable = ... + (Zahl_k*Unbekannte_i) + Weitere_Zahlen_ohne_Variable i geht von 1 bis N. Und für j und k: 1..j..k..M (wobei, wenn es ein k gibt, j<k sein muss.) Zahl_1 bis Zahl_N dürfen hierbei nicht von einer der Unbekannten abhängen. Bestimme zuerst die Menge aller auftretenden Unbekannten. Wenn Du kein Gleichungssystem, sondern nur eine Gleichung hast, dann hast Du nur eine Unbekannte (N=1). Summiere die Vorfaktoren (Zahl_) für alle gleichen Unbekannten auf und ziehe dabei die rechte Seite von der linken Seite ab (=einfach weiter summieren, aber auf der rechten Seite einfach die Vorzeichen tauschen). Das gleiche machst Du für alle Zahlen ohne Unbekannte. Nun hast Du ein System der Form (Zahl_1*Unbekannte_1) + (Zahl_2*Unbekannte_2) + ... + Weitere_Zahlen_ohne_Variable = 0, welches Du lösen kannst. So kannst Du bestimmte Gleichungen zusammenfassen. Weitere Erweiterungen würden mit der eben beschriebenen Vorgehensweise aber deutlich schwieriger werden. Beispiele: (2x*3+4x)*3 = 7 Hier müsstest Du zuerst die Klammer ausrechnen und auflösen, um 18x+12x=7 zu erhalten, was auf x=7/30 führt. (2x+3)*(3x+4)-6x*x=0 Trotz x*x ist das System linear, denn der quadartische Term fällt weg. Könntest Du behandeln, indem du x*x substituierst. cos(x)=1 Hier müsstest Du den arccos bilden und Du erhälst x=0. Aber folgende Gleichung ist schon schwieriger unzuformen: (cos(x)*cos(x)+sin(x)*sin(x))*x=1 Das ist eine lineare Gleichung mit der Lösung x=1. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
The Pioneer Geschrieben 2. Februar 2006 Autor Teilen Geschrieben 2. Februar 2006 Danke Bubble für deinen Ansatz, werde das versuchen und komme dann sicher auf ein sinnvolles Ergebnis In erster Linie reicht mir das schon mal wenn man Lineare Gleichnungen mit einer Unbekannten eingeben kann. Gruss Roger Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.