5

Ich habe den folgenden Ausdruck:SymPy, Vereinfachung/Substitution unter Verwendung von bekannten Mustern oder Unterausdrücke

from sympy import pi, sin, cos, var, simplify 
var('j,u,v,w,vt,wt,a2,t,phi') 

u0 = v*a2*sin(pi*j/2 + pi*j*t*phi**(-1)/2) + pi*vt*a2*cos(pi*j/2 + pi*j*t*phi**(-1)/2)*j*phi**(-1)/2 + pi*w*a2*cos(pi*j/2 + pi*j*t*phi**(-1)/2)*j*phi**(-1) 

Welche vereinfacht werden kann:

print simplify(u0) 
#a2*(pi*j*vt*cos(pi*j*(phi + t)/(2*phi)) + 2*pi*j*w*cos(pi*j*(phi + t)/(2*phi)) + 2*phi*v*sin(pi*j*(phi + t)/(2*phi)))/(2*phi) 

Angesichts der Unterausdrücke:

bj = pi*j*(phi + t)/(2*phi) 
cj = j*pi/(2*phi) 

Derzeit ersetze ich manuell bj und cj in der Sim fachter u0 Ausdruck zu erhalten:

u0 = a2*(v*sin(bj) + cj*vt*cos(bj) + 2*cj*w*cos(bj)) 

Ist es möglich, SymPy zu verwenden, das zu erreichen, die manuelle Substitution zu vermeiden?

Antwort

8

denke ich, was Sie vermissen, ist, dass subs beliebigen Ausdrücke ersetzen wird, nicht nur Symbole

>>> print simplify(u0).subs({pi*j*(phi + t)/(2*phi): bj, j*pi/(2*phi): cj}) 
a2*(pi*j*vt*cos(bj) + 2*pi*j*w*cos(bj) + 2*phi*v*sin(bj))/(2*phi) 

(I simplify verwendet, weil das ist, was in den pi*j*(phi + t)/(2*phi) führt statt pi*j/2 + pi*j*t/(2*phi), aber es ist nicht anders erforderlich)

Lesen Sie http://docs.sympy.org/0.7.3/tutorial/basic_operations.html#substitution für weitere Informationen über Substitution und Ersatz. Wenn Sie einen erweiterten Austausch durchführen möchten, sehen Sie sich die Methode replace an.

+1

das ist großartig! Vielen Dank! –

1

Sie können allgemeine Teilausdrücke mit der cse Routine finden.

+0

ist es möglich, an 'cse' die Sub-Ausdrücke zu übergeben, nach denen es suchen soll? –

+0

Der Punkt von 'cse' ist, die Ausdrücke für dich zu finden. Wenn Sie die häufigsten Unterausdrücke kennen, warum sollten Sie danach suchen? Wenn Ihre Frage andererseits das Ersetzen von Ausdrücken ist, verwenden Sie einfach "subs" oder eine der anderen Routinen, die in "subs" docstring erwähnt werden. Schauen Sie sich das sympy Tutorial an http://docs.sympy.org/0.7.3/tutorial/index.html – Krastanov

+0

Ich muss nach ihnen suchen, denn manchmal sind sie offensichtlich nicht sichtbar, ansonsten könnte ich sie einfach in einem Texteditor o.ä. ersetzen . Siehe zum Beispiel 'cj', sein Unterausdruck ist innerhalb von 'u0', aber nicht explizit getrennt ... –