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)
这定义了一个 NumberSymbol 的子类,它具有相同的 pi 数值(必须指定一个,因为不等式减少算法需要对列表边界进行排序,否则会失败)。
这一点:
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
关于python - 将 sympy 中的变量定义为 CONSTANT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665207/