首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SymPy doit返回NaN而不是零

SymPy doit返回NaN而不是零
EN

Stack Overflow用户
提问于 2022-08-03 13:06:52
回答 1查看 75关注 0票数 2

我试图用大量的求和来计算一个长表达式,n选择k's。出于某种原因,下面的表达式(它是长表达式的一部分)返回NaN。

代码语言:javascript
复制
from sympy import *
w_1_2_3 = symbols('w_1_2_3')
w_1_3 = symbols('w_1_3')
w_2_3 = symbols('w_2_3')
w_1_2 = symbols('w_1_2')
exprr = 7*Sum(binomial(5, w_1_2_3)*Sum(binomial(0, -w_1_2_3 + w_1_3)*binomial(2, w_1_2_3 - w_1_3 - 2)*binomial(13, 11 - w_1_2_3), (w_1_3, w_1_2_3, 5)), (w_1_2_3, 0, 5))/868017280
exprr.doit()
-> NaN

但是,如果我分别计算第一个和中的每个项,则每个项的值为0(应该是这样):

代码语言:javascript
复制
exprr2 = binomial(5, w_1_2_3)*Sum(binomial(0, -w_1_2_3 + w_1_3)*binomial(2, w_1_2_3 - w_1_3 - 2)*binomial(13, 11 - w_1_2_3), (w_1_3, w_1_2_3, 5))

for t in range(0, 6):
    res = exprr2.subs(w_1_2_3, t).doit()
    print(t, res)
-> 0 0
   1 0
   2 0
   3 0
   4 0
   5 0

这里发生什么事情?为什么我要在整个学期中获得NaN呢?

EN

回答 1

Stack Overflow用户

发布于 2022-08-04 12:14:59

我重写了一下你的例子,把我的头转到了它上面:

代码语言:javascript
复制
from sympy import *

a = symbols("a", integer=True)
b = symbols("b", integer=True)
summand = binomial(5, a) * Sum(
    binomial(0, -a + b)
    * binomial(2, a - b - 2)
    * binomial(13, 11 - a),
    (b, a, 5),
)
inner_sum = summand.doit()#.simplify()   # <--- the important part
summation = (
    7
    * Sum(
        inner_sum,
        (a, 0, 5),
    )
    / 868017280
)
print(summation.doit())


for t in range(0, 6):
    res = summand.subs(a, t).doit()
    print(t, res)

注意,我是如何告诉渐近通过.doit()显式地完成内部和的。让我们看一看:

代码语言:javascript
复制
>>> pprint(inner_sum)
        ⎛   4        3        2               ⎞ ⎛  0  ⎞ ⎛  2  ⎞ ⎛5⎞ ⎛  13  ⎞
(a - 5)⋅⎝6⋅a  - 102⋅a  + 607⋅a  - 1407⋅a + 756⎠⋅⎜     ⎟⋅⎜     ⎟⋅⎜ ⎟⋅⎜      ⎟
                                                ⎝5 - a⎠ ⎝a - 7⎠ ⎝a⎠ ⎝11 - a⎠
────────────────────────────────────────────────────────────────────────────
                     a⋅(a - 6)⋅(a - 3)⋅(a - 2)⋅(a - 1)

请注意,分母是如何充满了零,只是在你的数字之和,这整件事!事实上,这是导致nans在加和时出现的原因。

如果我们稍微按摩一下这个东西,您的二项式就会消失,并与分母中的零合并,成为分母中的阶乘,这是安全的:

代码语言:javascript
复制
>>> pprint(inner_sum.simplify().factor())
               ⎛   4        3        2               ⎞
-1494484992000⋅⎝6⋅a  - 102⋅a  + 607⋅a  - 1407⋅a + 756⎠
───────────────────────────────────────────────────────
        2
(-a)!⋅a! ⋅(3 - a)!⋅(9 - a)!⋅(11 - a)!⋅(a - 1)!⋅(a + 2)!

这个表达式正确地和在0,6范围内,您可以验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73222278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档