Gleichungen Lösen

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi

ich weiß nicht wer von euch den Taschenrechner TI89 kennt (großes teures Gerät). Unter den bestimmt 1000 Funktionen die er besitzt, interessiert mich "solve()", eine Funktion um Gleichungen zu lösen. Ich würde die Funktion gerne nachbauen.
Die Syntax von solve sieht so aus:
Code:
solve(gleichung, variable/n)
//Beispiele
solve(x^2+4*x = 2,x)
solve(t^3+^t2 = 5*t,t)

Ich könnte jetzt ja auf 2 herangehensweisen versuchen, diese Gleichung zu lösen.
a) Alle Variablen auf eine Seite stellen
b) Einfach einsetzten und gucken wann es stimmt.

Zu a)
Das Problem bei a) wäre meiner Meinung der Funktion die Rechenregeln mitzuteilen, sowie diese bei der Gleichungsumstellung zu programmieren:
Code:
solve(5=7+x,x) // Alle "x" auf die linke Seite bringen
In diesem Beispiel müsste ich jetzt den rechten Teil nach "x"en absuche, und dann den Rechenoperator davor(wenn es den nicht gibt, den danach) abchecken, und dann den komplenmentären für die linke Seite nutzen. Ich denke dass dies vom Programmieraufwand sehr aufwändig wäre (man denke an Sinus/Kosinus/e/potenzen,Wurzeln...), auch wenn es am Ende die "schönere" Variante wäre.
Zu b)
Mein Ansatz bei b) wäre alle Variablen (x) durch Zahlen zu ersetzen und dann zu überprüfen, ob die Variable erhöht oder erniedrigt werden muss. Zwar unschöner, und vielleicht rechenintensiver, aber ich denke vom Programmieraufwand auf jeden Fall einfacher.
Code:
solve(2+x=9,x)
//Berechnung
i = 1;
if( 2+i == 9 )
  return i;
...
//i = 7
if( 2+i == 9 )
  return i;
if( 2+i > 9 ) // -> i - 0.5

Was meint ihr dazu? Habt ihr Ideen? Welche Programmiersprache wäre am besten geeignet?
 
zu b) würde ich nicht blind einsetzen, sondern zum Beispiel das Newton-Verfahren (http://de.wikipedia.org/wiki/Newton-Verfahren) verwenden, damit kommst du relativ schnell zu einer Lösung. Du mußt vorher nur die Gleichung auf die Form ... = 0 bringen und das ist ja relativ einfach, solange es sich um ein Polynom handelt. Dafür mußt du allerdings Ableitungen bestimmen, etc.
 
Hi

das mit den Ableitungen ist eine gute Idee, da bin ich gar nicht drauf gekommen. Ich müsste also den zu berechnenden String nach x^n durchsuchen, und durch n*x^n-1 ersetzen. Bliebe nur noch das Problem wenn ich auf beiden Seiten der Gleichung ein x habe. Aber echt super Idee!
 
Naja, du wirst die Gleichung irgendwie normalisieren müssen, da hast du recht. Auf beiden Seiten x mit der Form "x +4 = 2x - 8" ist ja noch einfach, man kann ja durch Vorzeichen umdrehen das auf die andere Seite ziehen. "x+4 -2x +8 = 0" ist für den Computer genauso lösbar.

Aber im Ernst, wenn das mehr als ein Gedankenspiel ist, zum Beispiel Teil eines größeren Programms, dann würde ich nach einer passenden Bibliothek Ausschau halten, das hat _sicher_ schonmal jemand implementiert.
 
Um die Gleichung analysieren zu können, musst du erst einmal einen Syntaxbaum erstellen, mitt dessen Hilfe du dann auch bestimmen kannst, ob und wie du die Gleichung umformen kannst; es bleibt dir überlassen, ob du dich auf Polynome beschränkst oder zusätzliche Funktionen, eventuell nur für konstante Ausdrücke, mit berücksichtigen willst.
Jedenfalls wünsche ich dir viel Erfolg bei dieser Fleißarbeit. ;-)
 
Zurück