Problems with Sympy Sum()



我正在尝试推导出一个离散分布的 CDF,其 PMF 由下式给出:

P(d)=log_10(1+1/d) for d=1,...,9

这是我派生 CDF 的代码:

import sympy
#Find the CDF
d=sympy.Symbol('d')
pmf=sympy.log((1+1/d),10)
CDF=sympy.Sum(pmf,(d,1,d))
print(CDF)
#compute the CDF
CDF=CDF.doit()
print(CDF)
#simplify the expression
CDF=CDF.simplify()
print(CDF)

这不会评估 - 它只是打印出总和:

Sum(log(1 + 1/d)/log(10), (d, 1, d))
Sum(log(1 + 1/d)/log(10), (d, 1, d))
Sum(log(1 + 1/d), (d, 1, d))/log(10)

我做错了什么?

你没有做错任何事。这应该有效:

In [83]: d = Symbol('d')                                                                                                                       
In [84]: CDF = Sum(log(1 + 1/d)/log(10), (d, 1, d))                                                                                            
In [85]: CDF                                                                                                                                   
Out[85]: 
d             
_____           
╲               
╲              
╲      ⎛    1⎞
╲  log⎜1 + ─⎟
╱     ⎝    d⎠
╱   ──────────
╱     log(10)  
╱               
‾‾‾‾‾           
d = 1           
In [86]: CDF.doit()                                                                                                                            
Out[86]: 
d             
_____           
╲               
╲              
╲      ⎛    1⎞
╲  log⎜1 + ─⎟
╱     ⎝    d⎠
╱   ──────────
╱     log(10)  
╱               
‾‾‾‾‾           
d = 1 

这不是因为Sum只是不知道如何评估这个特定的总和。您可以用d代替以获得没有符号限制的总和的结果:

In [88]: CDF.subs(d, 5).doit()                                                                                                                 
Out[88]: 
log(6/5) + log(5/4) + log(4/3) + log(3/2) + log(2)
──────────────────────────────────────────────────
log(10)

为了获得一个符号结果,我们可以将Sum转换为Product,并具有有效的doit。应该可以做CDF.rewrite(Product)但尚未实现,因此这是一种将Sum转换为Product(使用exp.expand(以评估结果的迂回方法:

In [95]: log(exp(CDF).expand().doit()).simplify()                                                                                              
Out[95]: 
log(d + 1)
──────────
log(10)

最新更新