from sympy import *
from sympy.stats import *
mu, Y = symbols('mu Y', real = True, constant = True)
sigma = symbols('sigma', real = True, positive=True)
X = Normal('X', mu, sigma)
当要求:
E(X, evaluate=False)
我得到:
∞
⌠
⎮ 2
⎮ -(X - μ)
⎮ ──────────
⎮ 2
⎮ 2⋅σ
⎮ √2⋅X⋅ℯ
⎮ ──────────────── dX
⎮ 2⋅√π⋅σ
⌡
-∞
这是我所期望的.当要求:
E(X, X>0, evaluate=False)
E(X, X>pi, evaluate=False)
E(X, X >-3, evaluate=False)
使用任何常数,结果将符合条件期望的标准定义中的期望.但是,在尝试解决以下问题时:
E(X, X>Y)
我遇到一个与根有关的错误.有没有一种方法可以定义一个Y,以使sympy确认它是一个常数,就像0或-3甚至pi一样,并按预期显示积分?我假设来自sympy的请求存在问题,即以某种方式Y不会被确认为常量,因此,在尝试解决此请求时,sympy会遇到根问题.
解决方法:
您的问题似乎是当前不等式求解器的局限性:将不等式系统转换为集合的并集的算法显然需要对由这些不等式确定的边界点进行排序(即使只有一个这样的点).尚未实现减少具有符号极限的不等式.
我建议一个肮脏的把戏来解决这个限制.限定:
class SymbolTrick(NumberSymbol):
def __new__(self, name):
obj = NumberSymbol.__new__(self)
obj._name = name
return obj
_as_mpf_val = pi._as_mpf_val
approximation_interval = pi.approximation_interval
__str__ = lambda self: str(self._name)
这定义了一个具有pi相同数值的NumberSymbol的子类(必须指定一个,因为不等式减少算法需要对列表边界进行排序,否则将失败).
这一点:
In [7]: Y = SymbolTrick("Y")
In [8]: E(X, X > Y, evaluate=False)
Out[8]:
∞
⌠
⎮ 2
⎮ -(X - μ)
⎮ ──────────
⎮ 2
⎮ 2⋅σ
⎮ √2⋅X⋅ℯ
⎮ ────────────────────────── dX
⎮ ∞
⎮ ⌠
⎮ ⎮ 2
⎮ ⎮ -(X - μ)
⎮ ⎮ ──────────
⎮ ⎮ 2
⎮ ⎮ 2⋅σ
⎮ ⎮ √2⋅ℯ
⎮ 2⋅√π⋅σ⋅⎮ ────────────── dX
⎮ ⎮ 2⋅√π⋅σ
⎮ ⌡
⎮ Y
⌡
Y