在 sympy 中解析字符串时识别子表达式
Recognizing subexpressions when parsing a string in sympy
我正在尝试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)
所以xi
和eta
不再是符号了。现在我需要重新解析 expr
以更改变量。我目前做的是:
simplify(repr(expr).replace('xi',repr(xi)).replace('eta', repr(eta)))
这行得通。但这似乎是一种粗略的做法。在解析 repr(expr)
.
时,sympy ro 是否还有其他方法可以识别 xi
和 eta
是表达式而不是符号
正如评论中提到的@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))] ) )
sympify
(或简称 S
)会将字符串转换为表达式,并且它可以选择在执行此操作时进行用户定义的替换。这个玩具示例应该可以帮助您:
>>> from sympy import S, cos
>>> from sympy.abc import x
S('x',dict(x=cos(x)))
cos(x)
我正在尝试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)
所以xi
和eta
不再是符号了。现在我需要重新解析 expr
以更改变量。我目前做的是:
simplify(repr(expr).replace('xi',repr(xi)).replace('eta', repr(eta)))
这行得通。但这似乎是一种粗略的做法。在解析 repr(expr)
.
xi
和 eta
是表达式而不是符号
正如评论中提到的@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))] ) )
sympify
(或简称 S
)会将字符串转换为表达式,并且它可以选择在执行此操作时进行用户定义的替换。这个玩具示例应该可以帮助您:
>>> from sympy import S, cos
>>> from sympy.abc import x
S('x',dict(x=cos(x)))
cos(x)