我有一些大的表达式,它们的符号带有属性is_commutative=False
。在
下面是一个例子:
import sympy
from sympy import pi, sin, cos, exp
sympy.var('L, xPL, cosa, i, j, r2, sina, t, x', commutative=False)
sin.is_commutative = False
cos.is_commutative = False
exp.is_commutative = False
f = L*(r2 + sina*x)**(-1)*cosa*x*exp(10000.0*x*xPL*(2*i + 1 + i**2)**(-1)/L**2 \
- 5000.0*xPL**2*(2*i + 1 + i**2)**(-1)/L**2 - 5000.0*x**2*(2*i + 1 \
+ i**2)**(-1)/L**2)*cos(pi*j*t - j*t**2/2 + pi*t - t**2/2) \
- (r2 + sina*x)**(-1)*cosa*x**2*exp(10000.0*x*xPL*(2*i + 1 \
+ i**2)**(-1)/L**2 - 5000.0*xPL**2*(2*i + 1 + i**2)**(-1)/L**2 \
- 5000.0*x**2*(2*i + 1 + i**2)**(-1)/L**2)*cos(pi*j*t - j*t**2/2 + pi*t - t**2/2)
如果我试图执行f.simplify()
,则会引发一个错误:
我已经尝试了the "gotcha"sys.setrecursionlimit
,但在本例中它没有帮助。在
有帮助的是在sympy.var
中设置commutative=True
。(无需将其True
设置为sin
、cos
和{
由于这些表达式来自前面的过程,因此我有以下解决方法:
def get_new_f(f):
sin.is_commutative = True
cos.is_commutative = True
exp.is_commutative = True
str_f = str(f)
for s in f.free_symbols:
sympy.var(str(x))
return eval(str_f)r
那么get_new_f(f).simplify()
起作用了!在
有没有其他方法可以克服这个错误?在
对于这么小的表达式,像这样的递归错误很可能表明SymPy中存在错误。您应该在SymPy issue tracker上报告此错误。在
相关问题 更多 >
编程相关推荐