комплексные числа в симпии: разрешение тождества Эйлера

Я работаю со сложными функциями в sympy (python 3), и у меня проблемы с получением sympy для упрощения уравнений. В частности, я не могу заставить себя использовать тождество Эйлера, чтобы разбить комплексную экспоненту на действительную и мнимую части. Вот мой код:

import sympy as sym
from sympy import I, init_printing

# setup printing
init_printing()

# complex potential cylinder in uniform flow
U,z,R,theta=sym.symbols('U z R theta')
F=U*z+U/z

# complex velocity cylinder in uniform flow
compVel=sym.diff(F,z)
exp1=sym.sympify('R*exp(I*theta)')
compVel=compVel.subs(z,exp1)
print(compVel)
phi,psi=sym.symbols('phi psi')
phi=sym.re(compVel)
psi=sym.im(compVel)
print(phi)
print(psi)

Когда я запускаю этот код, вывод:

U - U*exp(-2*I*theta)/R**2
re(U) - re(U*exp(-2*I*theta)/R**2)
im(U) - im(U*exp(-2*I*theta)/R**2)

Я что-то упускаю, или sympy недостаточно силен, чтобы распознать это упрощение? Заранее спасибо!


person Mike    schedule 30.05.2017    source источник
comment
Sympy предполагает, что все переменные являются сложными, поэтому он правильно возвращает действительную часть compVel в терминах действительной части U, R и т. Д. Если вы объявляете переменные как вещественные с помощью U,z,R,theta=sym.symbols('U z R theta', real = True), sympy возвращает ожидаемый результат.   -  person Stelios    schedule 30.05.2017
comment
@Stelios Должен быть ответ.   -  person    schedule 31.05.2017
comment
На самом деле он разрешил одинокий U, но не разрешил экспоненту:   -  person Mike    schedule 31.05.2017


Ответы (1)


Я понял; @Stelios верен, но, кроме того, когда вы используете sympify, вы должны передать словарь с локальными переменными, которые содержит выражение.

exp1=sym.sympify('R*exp(I*theta)',locals={'R':R,'theta':theta})
person Mike    schedule 31.05.2017