5

I mają następujące wyrażenie:SymPy uproszczenie/podstawienie przy użyciu znanych schematów i sub-wyrażenia

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) 

który może być uproszczone:

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) 

Biorąc pod-wzorów:

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

Obecnie zastępuję ręcznie bj i cj w sim plified u0 wyrażenie dostać:

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

Czy jest możliwe aby użyć SymPy aby to osiągnąć, unikając ręcznej zmiany?

Odpowiedz

8

myślę, czego brakuje, że subs zastąpi dowolnych wyrażeń, nie tylko 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) 

(użyłem simplify ponieważ to, co skutkuje pi*j*(phi + t)/(2*phi) zamiast pi*j/2 + pi*j*t/(2*phi), ale nie jest to inaczej wymagane)

Przeczytaj http://docs.sympy.org/0.7.3/tutorial/basic_operations.html#substitution, aby uzyskać więcej informacji na temat zamiany i wymiany. Jeśli chcesz wykonać bardziej zaawansowaną wymianę, zapoznaj się z metodą replace.

+1

To jest świetne! Dziękuję Ci! –

1

Możesz znaleźć wspólne podwyrażenia za pomocą procedury cse.

+0

czy możliwe jest przekazanie do 'cse' wyrażeń podrzędnych, których powinno szukać? –

+0

Celem 'cse' jest znalezienie wyrażeń dla ciebie. Jeśli znasz wspólne podwyrażenia, po co ich szukać? Jeśli z drugiej strony twoje pytanie dotyczy zamiany wyrażeń, po prostu użyj 'subs' lub jakiejkolwiek innej procedury wymienionej w 'subs' ™ docstringu. Sprawdź samouczek sympy http://docs.sympy.org/0.7.3/tutorial/index.html – Krastanov

+0

Muszę je wyszukać, ponieważ czasami nie są one wyraźnie widoczne, w przeciwnym razie mógłbym tylko zastąpić w edytorze tekstu lub podobnym . Zobacz na przykład 'cj', jego podekspresja jest wewnątrz' u0', ale nie jawnie oddzielone ... –