SymPy Polynome Koeffizienten bestimmen

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.
Antworten
Polynom
User
Beiträge: 3
Registriert: Samstag 25. Juni 2011, 12:18

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
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Kannst du die Formel in Worten erklären die ein baldiger sehr schlauer 6. Klässler verstehen könnte,
dann kan ich vielleicht helfen.

Viele Grüße
Micky2010
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Polynom
User
Beiträge: 3
Registriert: Samstag 25. Juni 2011, 12:18

Bin mir nicht sicher, was mit 'erklaeren' gemeint ist. Also ich habe 2 Funktionen die ich nicht kenne phi1 und phi2 die von jeweils 2 Variablen abhaengen. Ich gehe davon aus, dass bei Funktionen in Form eines Polynoms vorliegen, also z.B. phi1(x,y) = x^2*k1+x*y*k2+y^2*k3. Das waere eine Polynom 2. Grades, die Werte, die ich irgendwie nun bestimmen moechte sind k1, k2 und k3. In den Formeln steht rechts jeweils ein Ausdruck 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))), was also dann (a*x-b*y+f1(x,y,phi1(x,y),phi2(x,y)))^2*k1+b*(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)))*k2+(b*x+a*y+f2(x,y,phi1(x,y),phi2(x,y)))^2*k3 waere. f1-f4 sind auch als Polynome, aber von 4 Variablen gegeben. Wenn ich jetzt die Gleichungen ausschreibe, dann kriege ich sowas wie Expression_left1*x^2 + Expression_left2*x*y + ... = Expression_right1*x^2 + Expression_right2*x*y + ...

Da diese Gleichung fuer alle x,y-Werte richtig sein soll, weiss ich das Expression_left1 = Expression_right1, Expression_left2 = Expression_right2, ... Damit kriege ich lineare Gleichungen fuer die Koeffizienten k1, k2, k3 aus denen ich deren Wert gewinne. Wenn ich jetzt immer groessere Polynome anhaenge an meinen Ansatz fuer die phi-Funktionen kriege ich immer mehr Koeffizienten, die ich dann so Ordnung fuer Ordnung loesen kann.

Mir wuerde es also schon sehr eine Routine helfen, in der ich die Gleichungen in Form von symbolischen Variablen eingeben kann, die dann alles ausmultipliziert und nach Potenzen von x^i*y^j ordnet und mir dann ausgibt, was fuer Koeffizienten vor bestimmten Potenzen stehen, deren Ausdruecke ich dann weiterverarbeiten kann.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

:K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K :K
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

sorry, das ist mir zu spezifisch - ich kann nur wenig mehr helfen als Micky, meine Anforderungen an sympy waren bis jetzt andere. Aber es gibt eine Mailinglist bzw. GoogleGroup. Vielleicht magst Du da mal nachfragen. Ich hab' die Jungs als sehr nett und hilfsbereit wahrgenommen. (siehe http://groups.google.com/group/sympy ). Eine Lösung würde mich aber auch sehr interessieren, wäre schön, wenn Du sie hier postest.

Gruß,
Christian
Polynom
User
Beiträge: 3
Registriert: Samstag 25. Juni 2011, 12:18

Ok, ich habe prinzipiell herausgefunden, wie man das Problem implementieren kann unter Verwendung von Sympy. Leider ergibt sich ein mir nicht ganz verstaendliches Rechen-Problem:

Ich kann einen Ausdruck exp als ein Polynom von x und y abspeichern:

Polynom_of_exp = (exp,x,y)

und dann daraus die Koeffizienten mit coeff(,) bestimmen

Polynom_of_exp.coeff(i,j)
(gibt Koeffizienten vor x**i*y**j zurueck)

analog kann man auch direkt Koeffizienten bestimmen

exp.coeff(x**i*y**j)

Beide Methoden scheinen aber ungeheuren Rechenaufwand, wenn ich eine bestimmte Ordnung in meinen Polynomen ueberschreite (genauer, wenn ich in obiger Gleichung phi1-2 und f1-4 als allgemeine Polynome 3. Ordnung einsetze, dauert der Schritt der Polynomumwandlung laenger als 15 min, wogegen bei 2. Ordnung noch weniger als 1 Sekunde benoetigt wird)

Deswegen eine konkretere Frage zu Sympy:
Gibt es eine effekt. Methode unter Sympy diese Koeffizienten zu bestimmen oder wie erklaert sich Sympy's Versagen an dieser Stelle(ein simpler Brute-Force Algorithmus der Strings durchsucht z.B. sollte dafuer nicht lange brauchen, warum also die Algebra von Sympy --> kann man Poly irgendwie Tips geben, wie es vorgehen soll)?
Antworten