我想使用SymPy正态分布,因为我用它做了一些符号计算。
from sympy.stats import Normal, cdf
from scipy.stats import norm
norm.cdf(10, 10, 0.1)
def survival(x):
y = Normal("x", 10, 0.1)
return cdf(y)(x)
survival(10)
此代码产生以下错误:
UnboundLocalError: local variable 'reprec' referenced before assignment
值得注意的是,通过以下调整,它似乎有效:
return cdf(y, meijerg=False)(x)
有人可以解释这种行为吗?
答案 0 :(得分:1)
一般要点:
simplify
变得可用。 3602879701896397/36028797018963968
,并且符号集成例程正在适应。 关于第一点;以下示例显示cdf(x)(t)
是一个冒险的主张。
>>> x = Normal('x', 1, 1)
>>> cdf(x)(1)
nan
问题是未经简化的cdf除以_z-1
。更好的方法:
>>> simplify(cdf(x))(1)
1/2
关于第二个问题:由于CDF是通过符号集成计算的,因此将浮点数作为参数传递会使积分器的寿命变得足够困难,以至于使用Meijer G函数进行集成时会遇到一些深度隐藏的错误。使用Rational(1, 10)
或S(1)/10
创建有理数字1/10而不是小数0.1。
>>> from sympy import S
>>> x = Normal("x", 10, S(1)/10)
>>> simplify(cdf(x))(10)
1/2