2016-09-23 69 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 
相關問題