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])

Beitragvon mawe » Freitag 20. Januar 2006, 06:54

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

Beitragvon Dietrich » Freitag 20. Januar 2006, 08:17

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

Beitragvon uruk-kai » Freitag 20. Januar 2006, 13:57

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?
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Freitag 20. Januar 2006, 14:03

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

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

Beitragvon uruk-kai » Freitag 20. Januar 2006, 14:17

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:

Beitragvon modelnine » Freitag 20. Januar 2006, 14:29

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 20. Januar 2006, 14:57

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 Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Freitag 20. Januar 2006, 19:25

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:

Beitragvon modelnine » Freitag 20. Januar 2006, 19:27

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

--- Heiko.
Dietrich

Beitragvon Dietrich » Freitag 20. Januar 2006, 22:10

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])

Beitragvon mawe » Samstag 21. Januar 2006, 05:24

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:

Beitragvon modelnine » Samstag 21. Januar 2006, 11:48

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])

Beitragvon mawe » Samstag 21. Januar 2006, 17:40

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:

Beitragvon modelnine » Samstag 21. Januar 2006, 17:42

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])

Beitragvon mawe » Samstag 21. Januar 2006, 17:45

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 ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder