在sympy中解析字符串时识别子表达式

问题描述 投票:0回答:2

我正在尝试simplify用sympy表达一个相当复杂的表达式。

from sympy import *
xi, eta = symbols('xi eta')
expr = (sin(eta)*sin(xi) - 1)**2*(sin(eta)*sin(xi) + 1)**2/((cos(eta)**2*tan(xi)**2 + 1)*(cos(xi)**2*tan(eta)**2 + 1)*cos(eta)**2*cos(xi)**2)

expr应该简化为1,但是sympy无法自动这样做。为了有所帮助,我需要更改变量:

X, Y = symbols('X Y')
xi = atan(X)
eta = atan(Y)

所以xieta不再是符号。现在,我需要重新解析expr才能更改变量。我目前正在做的是:

simplify(repr(expr).replace('xi',repr(xi)).replace('eta', repr(eta)))

这有效。但这似乎是一种粗略的方法。解析xi时,还有其他方法可以使sympy ro识别etarepr(expr)是表达式而不是符号。

python sympy symbolic-math
2个回答
1
投票

sympify(或简称为S)会将字符串转换为表达式,并且可以选择在执行此操作时进行用户定义的替换。这个玩具示例应该可以帮助您:

>>> from sympy import S, cos
>>> from sympy.abc import x
S('x',dict(x=cos(x)))
cos(x)

0
投票

正如注释中提到的@mapf,可以使用替换(expr.subs):

from sympy import *
xi, eta = symbols('xi eta')
expr = (sin(eta)*sin(xi) - 1)**2*(sin(eta)*sin(xi) + 1)**2/((cos(eta)**2*tan(xi)**2 + 1)*(cos(xi)**2*tan(eta)**2 + 1)*cos(eta)**2*cos(xi)**2)

X, Y = symbols('X Y')
simplify( expr.subs( [(xi, atan(X)), (eta, atan(Y))] ) )
© www.soinside.com 2019 - 2024. All rights reserved.