我试图用大量的求和来计算一个长表达式,n选择k's。出于某种原因,下面的表达式(它是长表达式的一部分)返回NaN。
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(应该是这样):
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呢?
发布于 2022-08-04 12:14:59
我重写了一下你的例子,把我的头转到了它上面:
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()显式地完成内部和的。让我们看一看:
>>> 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在加和时出现的原因。
如果我们稍微按摩一下这个东西,您的二项式就会消失,并与分母中的零合并,成为分母中的阶乘,这是安全的:
>>> 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范围内,您可以验证。
https://stackoverflow.com/questions/73222278
复制相似问题