SymPy Polynome Koeffizienten bestimmen
Verfasst: Samstag 25. Juni 2011, 12:47
Hallo,
moechte folgende Gleichung loesen
l*phi1(x,y) + f3(x,y,phi1(x,y),phi2(x,y)) =
phi1(a*x-b*y+f1(x,y,phi1(x,y),phi2(x,y)),b*x+a*y+f2(x,y,phi1(x,y),phi2(x,y)))
1/l*phi2(x,y) + f4(x,y,phi1(x,y),phi2(x,y)) =
phi2(a*x-b*y+f1(x,y,phi1(x,y),phi2(x,y)),b*x+a*y+f2(x,y,phi1(x,y),phi2(x,y)))
phi1 und phi2 sind unbekannte Polynome(Grad >1) in 2 Variablen, deren Koeffizienten ich
bestimmen moechte. f1-f4 sind aus Taylorentwickelungen bekannte Polynome in 4
Variablen(Grad >1). Ueber den Vergleich der Koeffizienten zu bestimmten Potenzen x^i*y^j
moechte ich sukzessive die Koeffizienten von phi1 und phi2 bestimmen. Ich kann die Werte fuer l, a, b numerisch bestimmen, wuerde jedoch eine symbolische Loesung in Abhaengikeit dieser Parameter bevorzugen, aehnlich bei den Koeffizienten von f1-f4.
Weil analytische Herangehensweise recht anstrengend wird(Polynome von Polynomen von Polynomen), moechte ich also moeglichst unter Python(weil es sich dann leicht in ein Projekt einfuegen laesst) die phi's bis zu beliebiger Ordnung bestimmen (Geschwindigkeit zunaechst sekundaer). SymPy scheint mir das Mittel zur Wahl, jedoch scheiterten meine Versuche z.B. mit match():
p2 = Wild('xx', exclude=[x,y])
p1 = Wild('xy', exclude=[x,y])
p0 = Wild('yy', exclude=[x,y])
x = Symbol('x')
y = Symbol('y')
t = Symbol('t')
g = Symbol('g')
print (p2*x**2+p1*x*y+p0*y**2)._matches_commutative(simplify((t*x+y*g)**2)
> {xy_: 2g*t, xx_: t**2, yy_: g**2} # geht noch
print (p2*x**2+p1*x*y+p0*y**2)._matches_commutative(simplify((t*x+y*g)**2+x*y))
> None # ueberfordert scheinbar schon
Gleiche Resultate mit match und matches. Meine Idee fuer den Algorithmus ist ein allg. Polynom n.ten grades jeweils fuer phi1 und phi2 zu initiieren, die Gleichungungen auszuschreiben(simplify?, evtl. noetig nach Potenzen von x und y zu ordnen?), dann die Koeffizienten zu bestimmten Ordnungen x^i*y^j in jeder Gleichung zu bestimmen, alle Koeffizienten mit gleichem n=i+j bilden ein lineares inhomogenes Gleichungssystem fuer n Koeffizienten von entweder phi1 oder phi2, dass ich dann loesen moechte. Die Loesungen muss ich dann sofort wieder in die Polynome von phi1 und phi2 einsetzen um die Prozedur fuer die naechste Ordnung n zu wiederholen.
Leider hat mir das Tutorial von sympy nicht weiter geholfen und ich bin etwas verloren gegangen in den vielen Moeglichkeiten Polynome zu definieren. Ich waere sehr dankbar, wenn ich Tipps zu passenden Datentypen bzw. Funktionen von Sympy bekommen koennte. (Ich hoffe unter Nutzung von bestehenden Funktionen sollte es nicht allzu aufwendig sein einen Loesungsalgorithmus zu implementieren.)
Schon mal Danke im Voraus
Steffen
moechte folgende Gleichung loesen
l*phi1(x,y) + f3(x,y,phi1(x,y),phi2(x,y)) =
phi1(a*x-b*y+f1(x,y,phi1(x,y),phi2(x,y)),b*x+a*y+f2(x,y,phi1(x,y),phi2(x,y)))
1/l*phi2(x,y) + f4(x,y,phi1(x,y),phi2(x,y)) =
phi2(a*x-b*y+f1(x,y,phi1(x,y),phi2(x,y)),b*x+a*y+f2(x,y,phi1(x,y),phi2(x,y)))
phi1 und phi2 sind unbekannte Polynome(Grad >1) in 2 Variablen, deren Koeffizienten ich
bestimmen moechte. f1-f4 sind aus Taylorentwickelungen bekannte Polynome in 4
Variablen(Grad >1). Ueber den Vergleich der Koeffizienten zu bestimmten Potenzen x^i*y^j
moechte ich sukzessive die Koeffizienten von phi1 und phi2 bestimmen. Ich kann die Werte fuer l, a, b numerisch bestimmen, wuerde jedoch eine symbolische Loesung in Abhaengikeit dieser Parameter bevorzugen, aehnlich bei den Koeffizienten von f1-f4.
Weil analytische Herangehensweise recht anstrengend wird(Polynome von Polynomen von Polynomen), moechte ich also moeglichst unter Python(weil es sich dann leicht in ein Projekt einfuegen laesst) die phi's bis zu beliebiger Ordnung bestimmen (Geschwindigkeit zunaechst sekundaer). SymPy scheint mir das Mittel zur Wahl, jedoch scheiterten meine Versuche z.B. mit match():
p2 = Wild('xx', exclude=[x,y])
p1 = Wild('xy', exclude=[x,y])
p0 = Wild('yy', exclude=[x,y])
x = Symbol('x')
y = Symbol('y')
t = Symbol('t')
g = Symbol('g')
print (p2*x**2+p1*x*y+p0*y**2)._matches_commutative(simplify((t*x+y*g)**2)
> {xy_: 2g*t, xx_: t**2, yy_: g**2} # geht noch
print (p2*x**2+p1*x*y+p0*y**2)._matches_commutative(simplify((t*x+y*g)**2+x*y))
> None # ueberfordert scheinbar schon
Gleiche Resultate mit match und matches. Meine Idee fuer den Algorithmus ist ein allg. Polynom n.ten grades jeweils fuer phi1 und phi2 zu initiieren, die Gleichungungen auszuschreiben(simplify?, evtl. noetig nach Potenzen von x und y zu ordnen?), dann die Koeffizienten zu bestimmten Ordnungen x^i*y^j in jeder Gleichung zu bestimmen, alle Koeffizienten mit gleichem n=i+j bilden ein lineares inhomogenes Gleichungssystem fuer n Koeffizienten von entweder phi1 oder phi2, dass ich dann loesen moechte. Die Loesungen muss ich dann sofort wieder in die Polynome von phi1 und phi2 einsetzen um die Prozedur fuer die naechste Ordnung n zu wiederholen.
Leider hat mir das Tutorial von sympy nicht weiter geholfen und ich bin etwas verloren gegangen in den vielen Moeglichkeiten Polynome zu definieren. Ich waere sehr dankbar, wenn ich Tipps zu passenden Datentypen bzw. Funktionen von Sympy bekommen koennte. (Ich hoffe unter Nutzung von bestehenden Funktionen sollte es nicht allzu aufwendig sein einen Loesungsalgorithmus zu implementieren.)
Schon mal Danke im Voraus
Steffen