将sympy中的变量定义为常量

时间:2016-09-23 16:09:19

标签: python symbols sympy

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)

我收到一个与root有关的错误。有没有办法定义Y,这样才能确认它是一个常数,就像0或-3甚至是pi一样,并按预期显示积分?我假设我从同意的请求中遇到的问题是,不知何时Y不承认是一个常数,因此,当试图解决这个请求时,同情面临根本问题。

1 个答案:

答案 0 :(得分:3)

你的问题似乎是当前不等式求解器的一个限制:将不等式系统转换为集合联合的算法显然需要对由这些不等式确定的边界点进行排序(即使只有一个这样的点)。减少具有象征性限制的不平等现象尚未实施。

我建议使用肮脏的技巧来克服这个限制。定义:

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