将 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的主要内容,如果未能解决你的问题,请参考以下文章

批处理将文本中的变量名替换为变量值并删除定义赋值语句

PL/SQL 02 声明变量 declare

如何将用户定义的变量值限制为jmeter中的特定线程组

python3的sympy

sympy 如何简化以变量为指数的表达式

sympy 中的复数:解析欧拉恒等式