Ich suche einen Code, mit dem man einfache Gleichungen mit einer Variablen lösen kann.
z.B. x+13=97
x=84
Man könnte jetzt natürlich anfangen, alle möglichen Lösungen mit einer Schleife durchzuprobieren(jedes Mal den Wert erhöhen). Hier ist die Genauigkeit ein Problem. Wenn ich in Einerschritten durchprobiere habe ich die Lösung sofort; aber wenn die Lösung 84,7 lauten würde, würde sie nie gefunden werden. Jetzt kann man natürlich die Genauigkeit erhöhen und 0,0000000001 Schritte benutzen. Das führt dann aber dazu, dass die Rechenzeit enorm ansteigt und ich werde nie auf eine Zahl, wie z.B. 20/7 kommen da diese Zahl leider unendlich viele Stellen nach dem Komma hat.
Es müsste also einen einfachreren Weg geben(es gibt auf jeden Fall einen: Ich habe einen Taschenrechner, der diese Gleichungen mit geringem Rechenaufwand sehr gut lösen kann - und Taschenrechner sind ja auch nur Computer...)!
Ein mathematisches Problem...
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Vielleicht sehe ich es jetzt zu kompliziert, aber alles was Du machen musst, ist die Gleichung Null-setzten, also x+13-97=0 und dann einfach eine Nullstellenberechnung machen. Z.B. mit dem Newton'schen Näherungsverfahren. Such mal dananch hier im Forum. Dookie hat dazu mal ein Script erstellt, und ich hab das Verfahren recht ausführlich erklärt (ob's verständlich ist, ist eine andere Frage ).
Gruß, mawe
Vielleicht sehe ich es jetzt zu kompliziert, aber alles was Du machen musst, ist die Gleichung Null-setzten, also x+13-97=0 und dann einfach eine Nullstellenberechnung machen. Z.B. mit dem Newton'schen Näherungsverfahren. Such mal dananch hier im Forum. Dookie hat dazu mal ein Script erstellt, und ich hab das Verfahren recht ausführlich erklärt (ob's verständlich ist, ist eine andere Frage ).
Gruß, mawe
Hallo!
also das mit den Nullstellen ist ne gute Idde, aber wenn du die 97 mit vertauschtem Vorzeichen auf die linke Seiten bekommst, dann kriegst du doch auch das x mit vertauschtem Vorzeichen auf die rechte Seiten und dann musst du diese Gleichung doch nur noch berechnen, also ist das mit den Nullstellen nicht mehr nötig.
Ähm, Uruk-kai, wie stellst du denn deine Gleichung zusammen? Sind 13 und 97 Varialben, wie a und b und du fragst den Benutzer nach den Zahlen und nach der Form der Gleichung? Also ungafähr so:
Welche From soll ihre Gleichung haben? x + a = b oder x - a = b
geben sie a ein:
geben sie b ein:
dann ist es ganz einfach.
wenn der Benutzer die Aufgabeals string eingibt wird ein wenig schwerer, müsste aber auch gehn.
Grüße, Kathrin!
also das mit den Nullstellen ist ne gute Idde, aber wenn du die 97 mit vertauschtem Vorzeichen auf die linke Seiten bekommst, dann kriegst du doch auch das x mit vertauschtem Vorzeichen auf die rechte Seiten und dann musst du diese Gleichung doch nur noch berechnen, also ist das mit den Nullstellen nicht mehr nötig.
Ähm, Uruk-kai, wie stellst du denn deine Gleichung zusammen? Sind 13 und 97 Varialben, wie a und b und du fragst den Benutzer nach den Zahlen und nach der Form der Gleichung? Also ungafähr so:
Welche From soll ihre Gleichung haben? x + a = b oder x - a = b
geben sie a ein:
geben sie b ein:
dann ist es ganz einfach.
wenn der Benutzer die Aufgabeals string eingibt wird ein wenig schwerer, müsste aber auch gehn.
Grüße, Kathrin!
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi Kathrin!
Wenn die Gleichungen immer die Form x+a=b haben, gehts vielleicht auch einfacher, da hast Du recht. Was aber, wenn sie 3*x+sin(x)-34=14*x^2+44 lautet? Ist ja auch eine Gleichung in einer Variablen
Gruß, mawe
Wenn die Gleichungen immer die Form x+a=b haben, gehts vielleicht auch einfacher, da hast Du recht. Was aber, wenn sie 3*x+sin(x)-34=14*x^2+44 lautet? Ist ja auch eine Gleichung in einer Variablen
Gruß, mawe
Hi mawe!
Hast recht, ich hab mich aber jetzt auf die Rechenoperationen +, -, * und / beschränkt, und da gehts auch mit mehreren Variablen.
also ich habs jetzt noch nicht ausprobiert, aber z.B. bei sin(x) kann man doch dann den Teil sin(x) durch math.sin(x) ersetzen und dann kann man die Gleichung wieder berechnen, oder nicht?
hab mir allerdings die Nullstellenberechnung von Dookie noch nicht angeschaut. Kann gut sein, dass es mit deiner Methode bei Gleichungen komplexeren Rechenoperationen leichter geht.
Hast recht, ich hab mich aber jetzt auf die Rechenoperationen +, -, * und / beschränkt, und da gehts auch mit mehreren Variablen.
also ich habs jetzt noch nicht ausprobiert, aber z.B. bei sin(x) kann man doch dann den Teil sin(x) durch math.sin(x) ersetzen und dann kann man die Gleichung wieder berechnen, oder nicht?
hab mir allerdings die Nullstellenberechnung von Dookie noch nicht angeschaut. Kann gut sein, dass es mit deiner Methode bei Gleichungen komplexeren Rechenoperationen leichter geht.
Das funktioniert!Dookie hat dazu mal ein Script erstellt
Aber nur solange, bis in der Gleichung z.B. 26/x=13 vorkommt.
Warum geht das nicht?
Das nächste Problem wäre natürlich, dass das Programm
keine Werte wie 3x akzeptiert.
Man kann zwar 3*x schreiben, aber das ist für
den Benutzer etwas umständlich.
keine Werte wie 3x akzeptiert.
Man kann zwar 3*x schreiben, aber das ist für
den Benutzer etwas umständlich.
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
einer der schwierigsten Sachen die es so in der numerischen Mathematik gibt: Gleichungen lösen.
Wenn Du wirklich willst dass er 3x erkennt, dann kannst Du nicht einfach eine Python-Funktion draus machen, dann mußt Du einen eigenen kleinen Parser für den String schreiben der selbst dynamisch die Funktion draus macht. Dann kannst Du nämlich eine eigene Syntax für die Funktion definieren, und mußt Dich nicht an Python-Grammatik halten.
Das geht wie gesagt ohne Probleme, ist aber von größerer Komplexität als einfach das Mal reinzusetzen _und_ den Newtonschen Algorithmus zu implementieren (wo es auch noch 'ne ganze Menge andere gibt die besser mit hyperbolischen Funktionen umgehen können), und dementsprechend weiß ich nicht ob sich das ganze wirklich lohnt.
Aber, in anbetracht der Tatsache, dass es hier doch wohl eher um ein kleines Hobbyprojekt geht und Du bisher nicht den Eindruck gemacht hast dass Du einen Parser schreiben kannst: sag den Benutzern doch einfach dass sie sich an Python-Syntax halten sollen!
--- Heiko.
Wenn Du wirklich willst dass er 3x erkennt, dann kannst Du nicht einfach eine Python-Funktion draus machen, dann mußt Du einen eigenen kleinen Parser für den String schreiben der selbst dynamisch die Funktion draus macht. Dann kannst Du nämlich eine eigene Syntax für die Funktion definieren, und mußt Dich nicht an Python-Grammatik halten.
Das geht wie gesagt ohne Probleme, ist aber von größerer Komplexität als einfach das Mal reinzusetzen _und_ den Newtonschen Algorithmus zu implementieren (wo es auch noch 'ne ganze Menge andere gibt die besser mit hyperbolischen Funktionen umgehen können), und dementsprechend weiß ich nicht ob sich das ganze wirklich lohnt.
Aber, in anbetracht der Tatsache, dass es hier doch wohl eher um ein kleines Hobbyprojekt geht und Du bisher nicht den Eindruck gemacht hast dass Du einen Parser schreiben kannst: sag den Benutzern doch einfach dass sie sich an Python-Syntax halten sollen!
--- Heiko.
Gut.
Aber was ist mit meiner 1. Frage?
Gibt es da eine Lösung oder eine Umformung
die der Benutzer manuell druchführen muss?
Aber was ist mit meiner 1. Frage?
Gibt es da eine Lösung oder eine Umformung
die der Benutzer manuell druchführen muss?
Also, ich hab den Thread nochmal überflogen, und seine erste Frage scheint "Warum geht das nicht?" gewesen zu seinmawe hat geschrieben:Aber was ist mit meiner 1. Frage?
@uruk-kai: Willst du ein CAS schreiben? Welche Eingaben soll das Programm denn verarbeiten könenn?
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Also, wenn ich uruk-kai richtig verstehe war seine erste Frage ob Python folgendes irgendwie allgemein lösen kann:
x*14=28
Und genau darauf hab ich geantwortet, dass er eine CAS benutzen soll. Wie Leonidas schon vor mir. Und wie auch schon einige andere.
--- Heiko.
x*14=28
Und genau darauf hab ich geantwortet, dass er eine CAS benutzen soll. Wie Leonidas schon vor mir. Und wie auch schon einige andere.
--- Heiko.
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Ich finde das völlig übertrieben. Es ist doch kein Problem, zwischen einer Zahl und dem x ein * einzufügen, die Gleichung 0 zu setzen und das ganze zu lösen (mit Newton z.B.). Eine nette Programmierübung ist das auch noch.
Ein kleiner Beitrag vom "Python Cookbook"
Code: Alles auswählen
# linear equation solver
def solve(eq, var='x'):
eq1 = eq.replace("=", "-(") + ")"
print eq1 # Test
c = eval(eq1, {var:1j})
print c # Test
return -c.real/c.imag
print
eq = "x-2 = 2*x" # Beispiel
r = solve(eq)
print "%s --> x = %s" % (eq, r)
Was war noch mal schnell Deine erste Frage?
Ich meine:
Dann forme ich in 26/x-13 um.Das funktioniert!
Dookie hat dazu mal ein Script erstellt
Aber nur solange, bis in der Gleichung z.B. 26/x=13 vorkommt.
Warum geht das nicht?
Jetzt müsste es ja eigendlich x=2 heißen.
Ist das auch nur ein Problem mit der Python-Syntax oder etwas anderes?
Danke!
Aber muss der Benutzer diese Umformung vornehmen?
Das wär den meisten Menschen viel zu kompliziert...
Aber muss der Benutzer diese Umformung vornehmen?
Das wär den meisten Menschen viel zu kompliziert...