考虑SymPy中2个高斯变量的总和:
from sympy import *
from sympy.stats import *
init_printing()
a = Normal('a', 0, Symbol('P', real=true))
b = Normal('b', 0, Symbol('Q', real=true))
ss = a + b
pprint(simplify(density(ss)))
我希望结果是具有更高方差的高斯PDF。相反,结果看起来像这样:
⎧ ⎛ 2 2
⎪ ⎜ z ⋅P
⎪ ⎜ ───────────────
⎪ ⎜ ⎛ 2 ⎞
⎪ ⎜ 4 ⎜ P 1⎟
⎪ ⎜ 4⋅Q ⋅⎜──── + ─⎟
⎪ ⎜ ⎜ 2 2⎟ 2
⎪ ⎜ ⎝2⋅Q ⎠ ⎛ z⋅P ⎞ z
⎪ ⎜ z⋅π⋅P⋅ℯ ⋅erf⎜─────────────────────⎟ ───────
⎪ ⎜ ⎜ __________⎟ ⎛
⎪ ⎜ ⎜ ╱ 2 ⎟ 4 ⎜
⎪ ⎜ ⎜ 2 ╱ P 1 ⎟ 4⋅Q ⋅⎜─
⎪ ⎜ ⎜2⋅Q ⋅ ╱ ──── + ─ ⎟ ⎜
⎪ ⎜ ⎜ ╱ 2 2 ⎟ ⎝2
⎪ ⎜ ⎝ ╲╱ 2⋅Q ⎠ z⋅π⋅P⋅ℯ
⎪ Q⋅⎜- ───────────────────────────────────────────────── - ──────────────
⎪ ⎜ __________ ___
⎪ ⎜ ╱ 2 ╱
⎪ ⎜ 2 ╱ P 1 2 ╱ P
z ↦ ⎨ ⎜ 2⋅Q ⋅ ╱ ──── + ─ 2⋅Q ⋅ ╱ ──
⎪ ⎜ ╱ 2 2 ╱
⎪ ⎝ ╲╱ 2⋅Q ╲╱ 2⋅
⎪- ───────────────────────────────────────────────────────────────────────
⎪ 3/2
⎪ 2⋅z⋅π ⋅P
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎪
⎩
... (426 lines in total)
⎞ ⎞
⎛ 1 ⎞│ π⎟ │ ⎛ 1 ⎞│ π⎟
t⎜──────────────, ∞⎟│ < ─⎟ ∨ │periodic_argument⎜──────────────, ∞⎟│ < ─⎟
⎜ 2 ⎟│ 2⎟ │ ⎜ 2 ⎟│ 2⎟
⎝polar_lift (P) ⎠│ ⎠ │ ⎝polar_lift (P) ⎠│ ⎠
为什么SymPy给出了这样一个奇怪的结果,我应该怎么做才能得到简洁的表格?
答案 0 :(得分:2)
将第二个参数(标准偏差,“ sigma”)声明为正值:
a = Normal('a', 0, Symbol('P', positive=True))
b = Normal('b', 0, Symbol('Q', positive=True))
然后结果如预期:
2
-z
───────────
2 2
2⋅P + 2⋅Q
√2⋅ℯ
z ↦ ─────────────────
_________
╱ 2 2
2⋅√π⋅╲╱ P + Q
在引擎盖下,SymPy使用Meijer G函数计算不正确的积分,这涉及将计算提升到某些Riemann曲面,并且P或Q的值为负数会导致另一个分支。因此答案很复杂。从数学上来说,这对计算没有太大影响,因为sigma是指数的平方。但这对于算法的成功至关重要。
如果SymPy只知道独立法线是如何添加的,那么所有这些都将是没有意义的,但事实并非如此。所有这些计算都是通过直接积分完成的,通常会扩展已实现的积分方法的局限性。
备注:
true
(SymPy真实对象),但是符号创建方法需要使用Python的True
。from sympy import *
和from sympy.stats import *
,因为这会导致命名冲突:E
是SymPy 中的Euler数,中的期望值表示法sympy.stats。