使用非交换符号时Sympy中的最大递归深度误差

时间:2013-08-15 12:44:00

标签: python runtime-error sympy symbolic-math symbolic-computation

我有一些大表达式,其符号的属性为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(),则会引发错误:

RuntimeError: maximum recursion depth exceeded.

我已经尝试了the "gotcha" sys.setrecursionlimit,但在这种情况下它没有帮助。

commutative=True中设置sympy.var有什么帮助。 (无需将其True设置为sincosexp

由于这些表达式来自前一个过程,因此我有以下工作方法:

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()有效!

还有另一种方法可以克服这个错误吗?

1 个答案:

答案 0 :(得分:2)

使用如此小的表达式,这样的递归错误很可能表示SymPy中存在错误。您应该在SymPy issue tracker处将此报告为错误。