用SymPy对两个Poisson分布求和

时间:2018-11-06 00:59:25

标签: sympy

我是SymPy的新手,我正试图用它来求和两个泊松分布

这是我到目前为止(使用jupyter笔记本)

from sympy import *
from sympy.stats import *
init_printing(use_latex='mathjax')

lamda_1, lamda_2 = symbols('lamda_1, lamda_2')
n_1 = Symbol('n_1')
n_2 = Symbol('n_2')
n = Symbol('n')

#setting up distributions
N_1 = density(Poisson('N_1', lamda_1))(n_1)
N_2 = density(Poisson('N_2', lamda_2))(n_2)
display(N_1)
display(N_2)

print('setting N_2 in terms of N and N_1')
N_2 = N_2.subs(n_2,n-n_1)

display(N_2)

print("N_1 * N_2")
N = N_1 * N_2

#display(N)

Sum(N,(n_1,0,n))

#summation(N,(n_1,0,n))

一切正常,直到我尝试运行求和。没有错误只是不执行任何操作,jupyter表示它正在运行。我已经让它运行了10分钟,什么也没有...

1 个答案:

答案 0 :(得分:1)

声明符号时,请包括其属性:正,整数,非负等。这有助于SymPy判断某些转换是否合法。

lamda_1, lamda_2 = symbols('lamda_1, lamda_2', positive=True)
n_1, n_2, n = symbols('n_1 n_2 n', nonnegative=True, integer=True)

不幸的是,求和仍然失败,因为SymPy无法提出the key trick:乘以和除以factorial(n)。似乎必须告诉它这样做。

s = summation(N*factorial(n), (n_1, 0, n))/factorial(n)
print(s.simplify())

此打印

Piecewise(((lamda_1 + lamda_2)**n*exp(-lamda_1 - lamda_2)/factorial(n), ((-n >= 0) & (lamda_1/lamda_2 <= 1)) | ((-n < 0) & (lamda_1/lamda_2 <= 1))), (lamda_2**n*exp(-lamda_1 - lamda_2)*Sum(lamda_1**n_1*lamda_2**(-n_1)/(factorial(n_1)*factorial(n - n_1)), (n_1, 0, n)), True))

这是一个充满不必要条件的分段公式...但是,如果我们忽略这些条件(它们只是SymPy如何执行求和的结果),则正确的结果

((lamda_1 + lamda_2)**n*exp(-lamda_1 - lamda_2)/factorial(n)  

在那里。

此外:避免同时从sympy和sympy.stats进行import *,存在符号冲突,例如E为2.718 ...与预期值的冲突。 from sympy.stats import density, Poisson会更好。另外,N是内置的SymPy函数,最好避免将其作为变量名。