4

我正在使用 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),但仍然得到结果。

4

2 回答 2

3

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

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

通常这些表达式会像 become 一样自动变平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().

于 2013-05-06T19:30:25.647 回答
1

是否有理由需要象征性地这样做?只需从 2 开始,然后从那里开始工作。您永远不会遇到递归错误,因为分数将在每个阶段变平

In [10]: def sqrt2(limit):
   ....:     expr = Rational(1, 2)
   ....:     for i in range(limit):
   ....:         expr = 1/(2 + expr)
   ....:     return 1 + expr
   ....:

In [11]: sqrt2(100)
Out[11]:
552191743651117350907374866615429308899
───────────────────────────────────────
390458526450928779826062879981346977190

In [12]: sqrt2(100).evalf()
Out[12]: 1.41421356237310

In [13]: sqrt(2).evalf()
Out[13]: 1.41421356237310

In [15]: print sqrt2(1000)
173862817361510048113392732063287518809190824104684245763570072944177841306522186007881248757647526155598965224342185265607829530599877063992267115274300302346065892232737657351612082318884085720085755135975481584205200521472790368849847501114423133808690827279667023048950325351004049478273731369644053281603356987998498457434883570613383878936628838144874794543267245536801570068899/122939577152521961584762100253767379068957010866562498780385985503882964809611193975682098617378531179669585936977443997763999765977165585582873799618452910919591841027248057559735534272951945685362378851460989224784933532517808336113862600995844634542449976278852113745996406252046638163909206307472156724372191132577490597501908825040117098606797865940229949194369495682751575387690
于 2013-05-12T22:17:37.883 回答