Python 在symphy中绘制两个随机变量之和的密度

Python 在symphy中绘制两个随机变量之和的密度,python,plot,sympy,Python,Plot,Sympy,我想用sympy制作并绘制一个混合随机变量 我有两个均匀加权的正态分布的高斯混合,一个平均值为1,一个平均值为2 from sympy.stats import Normal mixed = 0.5 * Normal('n1', 1, 1) + 0.5 * Normal('n2', 2, 1) E(mixed1) Out: 1.5 这是正确的,但我无法绘制此分布: x = symbols('x') sp.plot(mixed(x), x) ------------------------

我想用sympy制作并绘制一个混合随机变量

我有两个均匀加权的正态分布的高斯混合,一个平均值为1,一个平均值为2

from sympy.stats import Normal
mixed = 0.5 * Normal('n1', 1, 1) + 0.5 * Normal('n2', 2, 1)
E(mixed1)

Out: 1.5
这是正确的,但我无法绘制此分布:

x = symbols('x')
sp.plot(mixed(x), x)

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-a1c8047b8c4a> in <module>()
----> sp.plot(mixed(x), x)

TypeError: 'Add' object is not callable
关于为什么绘图功能不喜欢这里的总和有什么想法吗?

混合(x)抛出错误是出于设计。RandomSymbol对象不可调用(即不能作为函数处理),它们的和也不可调用。绘制密度(混合)(x)是正确的方法。但正确并不总是意味着成功

通过参数
evaluate=False
,您将看到Symphy为密度设置了一个合理的积分:

density(mixed, evaluate=False)(x)
问题在于评估它,而你的例子却失败了。但这可以通过使用有理数而不是像0.5这样的浮点数来解决

mixed = Normal('n1', 1, 1) / 2 +  Normal('n2', 2, 1) / 2
当你有有理数时,成功整合的机会更大。事实上,以下工作:

from sympy.stats import *
mixed = Normal('n1', 1, 1) / 2 +  Normal('n2', 2, 1) / 2
x = symbols("x")
d = density(mixed)(x)
密度的公式看起来很复杂,但经过简化后,
d=d.simplify()
这正是人们所期望的:

exp(-x**2 + 3*x - 9/4)/sqrt(pi)
最后,
绘图(d,(x,-3,5))
给出


啊哈!感谢您提供有关有理数的提示!
exp(-x**2 + 3*x - 9/4)/sqrt(pi)