2016-09-23 74 views
3
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) 

当询问:在sympy定义一个变量是一个常量

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面临着一个根本问题。

回答

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) 

这限定了具有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 
相关问题