将 sympy 中的变量定义为 CONSTANT
Posted
技术标签:
【中文标题】将 sympy 中的变量定义为 CONSTANT【英文标题】:Define a variable in sympy to be a CONSTANT 【发布时间】:2017-02-01 13:49:24 【问题描述】: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 面临着根源问题。
【问题讨论】:
【参考方案1】:您的问题似乎是当前不等式求解器的一个限制:将不等式系统转换为集合并集的算法显然需要对由这些不等式确定的边界点进行排序(即使只有一个这样的点)。使用符号限制减少不等式尚未实施。
我建议一个肮脏的技巧来绕过这个限制。定义:
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
【讨论】:
以上是关于将 sympy 中的变量定义为 CONSTANT的主要内容,如果未能解决你的问题,请参考以下文章