Ein mathematisches Problem...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Uruk-kai

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...)!
mawe
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
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

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!
mawe
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
Kathrin
User
Beiträge: 43
Registriert: Dienstag 6. Dezember 2005, 15:11

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich würde dafür ja Maxima (mein Lieblings-CAS, da Freie Software) nehmen. The right tool for the right job :wink:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
uruk-kai

Dookie hat dazu mal ein Script erstellt
Das funktioniert!
Aber nur solange, bis in der Gleichung z.B. 26/x=13 vorkommt. :(
Warum geht das nicht?
uruk-kai

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.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Aber anders wirst du das mit 3x nicht hinbekommen!
mfg

Thomas :-)
modelnine
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.
uruk-kai

Gut.
Aber was ist mit meiner 1. Frage?
Gibt es da eine Lösung oder eine Umformung
die der Benutzer manuell druchführen muss?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Leonidas hat geschrieben:Ich würde dafür ja Maxima (mein Lieblings-CAS, da Freie Software) nehmen. The right tool for the right job :wink:
Nimm 'ne CAS. Oder schreib selbst eine.

--- Heiko.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Aber was ist mit meiner 1. Frage?
Was war noch mal schnell Deine erste Frage? ;)
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

mawe hat geschrieben:Aber was ist mit meiner 1. Frage?
Also, ich hab den Thread nochmal überflogen, und seine erste Frage scheint "Warum geht das nicht?" gewesen zu sein :twisted:

@uruk-kai: Willst du ein CAS schreiben? Welche Eingaben soll das Programm denn verarbeiten könenn?
modelnine
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.
mawe
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.
Dietrich

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)
uruk-kai

Was war noch mal schnell Deine erste Frage?

Ich meine:

Dookie hat dazu mal ein Script erstellt
Das funktioniert!
Aber nur solange, bis in der Gleichung z.B. 26/x=13 vorkommt.
Warum geht das nicht?
Dann forme ich in 26/x-13 um.
Jetzt müsste es ja eigendlich x=2 heißen.
Ist das auch nur ein Problem mit der Python-Syntax oder etwas anderes?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

26 / x = 13 -> 26 * x^(-1) - 13 = 0

Hierauf wendest du nun wieder z.B. das Newtonverfahren an.
uruk-kai

Danke!
Aber muss der Benutzer diese Umformung vornehmen?
Das wär den meisten Menschen viel zu kompliziert...
Antworten