Sympy umformen / vereinfachen von Gleichungen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich möchte gerne eine Gleichung (die von einem Solver ausgespuckt wurden) manuell vereinfachen. Ich bekomme eine Gleichung der Form von `func1`. Ich schaffe es sie mit `collect` zu vereinfachen (siehe `func2`).

Mein Wunschformat ist `func3`, das ist trotz Doppelbruch einfacher, weil `a` nur einmal vorkommt.

Mit einem collect schaffe ich es also von func1 -> func2 und mit simplify von func3 -> func2 zukommen, aber nicht umgekehrt.

Kann mir da jemand helfen?

Code: Alles auswählen

from sympy import init_printing, oo, collect
from sympy.abc import a,b,c,d,e
from sympy import simplify
init_printing(use_unicode=True)

func1 = a*(b + c + d + e) / (a*b + a*c + a*d + e)

func2 = collect(func1, a)
# >>> func2
# a*(b + c + d + e) / (a(b + c + d) + e)

#Wunschformat
func3 = (b + c + d + e) / ((b + c + d) + e/a)

#von meinem Wunschziel func3 -> func2 komme ich
simplify(func3) == func2
# True
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Nach Stunden des probierens an vielen Fronten habe ich eine Lösung:

Code: Alles auswählen

func1_zaehler, func1_nenner = fraction(func1)

func1_zaehler /= a

func1_nenner /= a
func1_nenner = func1_nenner.simplify()

func1_neu = func1_zaehler / func1_nenner
Das mag jetzt relativ leicht aussehen, aber ist es bei komplizierteren Funktionen gar nicht. Durch das `func1_nenner.simplify()` wird vieles mit einander Verrechnet man muss dann mit collect (z.B `func1_nenner.collect([Sigma*g*dphi**2, F_T, sin(alpha)])`) das wieder auseinander ziehen, und je nachdem welche Variablen man collected kommt die Funktion wieder in ihre Ausgangsposition zurück. Alles in allem eine "sehr spannende" Angelegenheit. Wenn ich mehr Zeit habe werde ich dazu noch einmal mehr schreiben und mit echten Bewegungsgleichungen mein Vorgehen beschreiben.

Alles in allem braucht man eine iPython Konsole und einiges an Zeit.
BlackJack

@Sr4l: Ich denke nicht das `sympy` und auch andere Software dieser Art wirklich geeignet ist das Ergebnis *so* stark zu steuern.
Antworten