python-3.x - 长表达式使 SymPy 崩溃

标签 python-3.x expression sympy

我正在使用 64 位 Python 3.3.1、pylab 和 32GB 系统 RAM。这个功能:

def sqrt2Expansion(limit):
    x    = Symbol('x')
    term = 1+1/x
    for _ in range(limit):
        term = term.subs({x: (2+1/x)})
    return term.subs({x: 2})

产生这种表达式:1 + 1/(2 + 1/(2 + 1/(2 + 1/(2 + 1/(2 + 1/(...)))))) .
调用时:sqrt2Expansion(100)返回有效结果,但 sqrt2Expansion(200)生产 RuntimeError有很多页的回溯并挂起 pylab/IPython 解释器,并且有大量系统内存未使用。任何想法如何更有效地实现它?我想调用sqrt2Expansion(1000)仍然得到结果。

最佳答案

我将尝试详细说明我在上面发布的评论。

Sympy 表达式是树。每个操作都是一个节点,其操作数作为分支。例如 x+y看起来像 Add(x, y)x*(y+z)喜欢 Mul(x, Add(y, z)) .

通常这些表达式会像 Add(x, Add(y, z)) 一样自动变平。成为Add(x, y, z) ,但对于更复杂的情况,可以得到非常深的树。

深树可能会带来问题,尤其是当解释器或库本身限制允许的递归深度时(作为防止无限递归和爆炸性内存使用的保护)。这很可能是您的 RuntimeError 的原因。 : 每个 subs使树更深,随着树的深入,递归 subs必须多次调用自己,直到它到达最深的节点。

您可以将树简化为 polynomial/polynomial 的形式。通过使用 factor 具有恒定的深度方法。只需更改 term = term.subs({x: (2+1/x)})term = term.subs({x: (2+1/x)}).factor() .

关于python-3.x - 长表达式使 SymPy 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390875/

相关文章:

python-3.x - Python ARIMA 输出 - 解释 Sigma2

java - Android 中带有平方根的表达式计算器

python - 如何在 SymPy 中使用对数 x 轴正确编写 2D 绘图调用?

python - 如何使用 Python 查找我的数据属于哪个集群?

python - Python 中的 Section 'Warnings' already exists 错误

python - 'numpy.ndarray' object is not callable error with optimize.minimize

javascript - 正则表达式为空

c# - 从 Expression 函数获取父属性

python - "register"一个单位和带有 sympy 的前缀?

python - 区分具有未知数量变量的 sympy 函数