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.
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...
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Wenn Du keine eigene CAS programmierst muß es der Benutzer machen.

Und, da Du das mit Sicherheit nicht selbst tun willst, nimm doch eine die schon fertig ist.

--- Heiko.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Es gibt auch ein CAS welches mit Python zusammenhängt, mathGUIde, wenn du schon das in Common Lisp geschriebene, freie CAS Maxima nicht magst (und alle anderen auch nicht).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

uruk-kai hat geschrieben: Aber muss der Benutzer diese Umformung vornehmen?
Na, es wäre schon nett wenn Dein Programm das übernehmen würde :)
Eine Methode wie das geht steckt ja schon im Snippet von Dietrich drin. Ich hätt sowas in der Art gemacht:

Code: Alles auswählen

def set_zero(eq):
    lhs, rhs = eq.split("=")
    return "%s - (%s)" % (lhs, rhs)

eq1 = "26 / x = 13"
print set_zero(eq1)   # -> 26 / x  - (13)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Aua. Das schreit alles nach Hack, und ist es auch...

--- Heiko.
Dietrich

Dank dem Hinweis von Leonidas habe ich in der Uni-Siegen Seite herumgeschnueffelt. Professor Ring had eigentlich tolles Begleitmaterial fuer seine Pythonvorlesung zusammengestellt das auf
http://www.math.uni-siegen.de/ring/python.html
zu finden ist (als Zips).
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Leonidas hat geschrieben: Es gibt auch ein CAS welches mit Python zusammenhängt, mathGUIde, wenn du schon das in Common Lisp geschriebene, freie CAS Maxima nicht magst (und alle anderen auch nicht).
Warum wollen ihm eigentlich alle einreden, etwas fertiges zu verwenden anstatt selbst zu programmieren? Es gibt auch Leute, die Spass daran haben, etwas nachzuprogrammieren, einfach um zu sehen wie's funktioniert. Also warum wollt ihr ihm das ausreden? Codesnippets und Showcase wären leer, wenn alle so denken würden.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Warum wollen ihm eigentlich alle einreden, etwas fertiges zu verwenden anstatt selbst zu programmieren? Es gibt auch Leute, die Spass daran haben, etwas nachzuprogrammieren, einfach um zu sehen wie's funktioniert. Also warum wollt ihr ihm das ausreden? Codesnippets und Showcase wären leer, wenn alle so denken würden.
Kennst Du die mathematische Theorie hinter einer CAS? Zum Beispiel ist das tolle newtonsche Verfahren was hier immer wieder angesprochen wurde teilweise recht fehleranfällig, bei bestimmten Funktionen verinngert sich nämlich pro Schritt nicht der Abstand zur Nullstelle, sondern vergrößert sich immer noch. Zum anderen: wie finde ich zwei Punkte die links und rechts von der Nullstelle liegen, um ein anderes Verfahren wie das Intervallhalbierungsverfahren nutzen zu können? Wann kann ich simulated annealing benutzen, wann ist ein genetischer Algorithmus das richtige?

Ich hab mich mit sowas zum Teil in meiner Bachelorarbeit für Mathe auseinandergesetzt, bzw. mache es jetzt immer noch, aber das ist alles andere als trivial, und die Forschung ist sich da häufig nicht mal einig.

Und Gleichungen symbolisch lösen ist selbst für eine Person nicht trivial (was meinst Du warum so viele Leute in Mathe Schwierigkeiten haben), warum sollte also der Computeralgorithmus dafür einfach sein? (kleiner Hinweis: es gibt nicht mal für alle Gleichungen eine algebraische Lösung, woher weiß ich dass es eine gibt und mein Algorithmus nicht einfach zu dumm ist?)

Wenn Du wirklich die Theorie hinter der Anwendung von numerischer Mathematik hier kennen würdest, so würdest Du ihm nicht empfehlen es selbst zu schreiben... Genauso wie ich es in diesem ganzen Thread schon getan habe.

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

Oh mann ...

1. Wo wurde hier gefragt, wie man Gleichungen _symbolisch_ löst? Kann ich nicht finden.

2. Was hat Deine Abhandlung mit meiner Frage zu tun? Klar gibt es andere Verfahren als das Newtonsche (ja, ich kenn auch andere, toll ...), aber was spricht bitte dagegen, ein Beispiel ZUR ÜBUNG mit Newton zu programmieren.

Ein Hinweis auf CAS ist ja nützlich, dagegen sag ich auch nichts. Aber so nach dem Motto "wozu machst Du das, es gibt schon was Gscheiteres" ist doch komisch, oder? Nicht mehr und nicht weniger hab ich gemeint.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

1. Im Original Post:
Ich suche einen Code, mit dem man einfache Gleichungen mit einer Variablen lösen kann.
z.B. x+13=97
x=84
Sieht für mich ganz danach aus dass es um symbolische Manipulation einer Gleichung ging, nicht ums näherungsweise finden einer Nullstelle, was spätestens dann daraus wurde als jemand das newtonsche Verfahren vorgeschlagen hat. Deswegen auch mein Hinweis darauf dass es alles andere als trivial ist eine Gleichung symbolisch zu lösen, erst recht mit dem Computer.

2. Es ist richtig dass das newtonsche Verfahren mal eben zur Übung zu programmieren kein Problem ist. Deswegen hat jemand anderes auch einen link auf das Verfahren gepostet.

Nur: der Thread wuchs danach immer weiter und weiter, und führte auch zu so "absurditäten" wie string-manipulation in der Gleichung um linker von rechter Seite abzuziehen um etwas =0 setzen zu können, o.Ä. Das ist sicherlich in kleinem Maßstab in Ordnung, aber ohne dass der OP sein Funktionsgebiet eingrenzt (einfache Funktionen mit einer Variablen können extrem viele sein, zum Beispiel auch hyperbolische, trigonometrische, etc.) ist es nicht ersichtlich dass das newtonsche Verfahren für ihn das beste, wenn überhaupt ein sinnvolles ist. Zum Beispiel kann es sein dass er mit dem Intervallhalbierungsverfahren bei einer Funktion ein sehr viel besseres Ergebnis erziehlt, bei einer anderen aber ein extrem viel schlechteres, die Folge also langsamer konvergiert. Wann ist es sinnvoll noch ein anderes Verfahren anzuwenden?

Willst Du das alles erklären? Ich nicht. Deswegen mein konsequenter Hinweis darauf dass es Leute gibt die das schon für einen gemacht haben, und die sicherlich mehr Ahnung haben als ich und die meißten hier zusammengenommen, und die das dementsprechend richtig machen und zwar so dass ich nur noch die Gleichung eingebe und er mir ein Ergebnis ausspuckt. Ein Hinweis auf Newton reicht deswegen meines Erachtens. Danach sollte man ihm nur sagen: nutz 'ne CAS.

--- Heiko.
Zuletzt geändert von modelnine am Samstag 21. Januar 2006, 17:51, insgesamt 2-mal geändert.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Dann verstehen wir beide die Frage unterschiedlich. Wenn Du nämlich weiterliest, was er als Lösungsweg vorschlägt, dann sehe ich da nichts Symbolisches mehr ;)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

mawe, ich hab meinen post geupdatet... Du warst zu schnell mit dem antworten. ;-)

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

Du hast mit Deinen Bedenken natürlich Recht. Was mich nur gestört hat war ganz einfach, dass mit Sprüchen wie "machs nicht" (vom Sinn her :)) die Freude am Programmieren verdorben wird (jedenfalls wäre es bei mir so). Ein Hinweis was alles schiefgehen kann ist nützlich, keine Frage. Was er dann damit macht ist seine Sache (sollte jedenfalls so sein).
So schlecht finde ich die Methode zum Nullsetzten übrigens nicht :)

Naja, egal. Schwamm drüber. uruk-kai hat jetzt einige Meinungen gehört, jetzt ist er wieder dran :)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Naja, egal. Schwamm drüber. uruk-kai hat jetzt einige Meinungen gehört, jetzt ist er wieder dran ;-)
Jo, allerdings! ;-)

--- Heiko.
uruk-kai
User
Beiträge: 4
Registriert: Freitag 27. Januar 2006, 14:58

Die Sache war eigendlich nur aus technischem Interresse("Wie macht mein Taschenrechner das bloß?") und als kleine Programmierübung gedacht. Allerdings scheint es ja doch etwas komplizierter zu sein, als ich dachte... :?
Antworten