2017-05-31 7 views
3

私はphiPhiという2つのカスタム関数をSympyで定義しています。私はそれがPhi(x)+Phi(-x) == 1を知っています。 Sympyにこの単純化ルールをどうやって提供しますか?これをクラス定義で指定できますか?ここでは特殊関数の簡略化規則を実装しています

は、私がこれまで何をやったかである:好奇心、phiPhiについては

from sympy import Function 


class phi(Function): 

    nargs = 1 

    def fdiff(self, argindex=1): 
     if argindex == 1: 
      return -1*self.args[0]*phi(self.args[0]) 
     else: 
      raise ArgumentIndexError(self, argindex) 

    @classmethod 
    def eval(cls, arg): 
     # The function is even, so try to pull out factors of -1 
     if arg.could_extract_minus_sign(): 
      return cls(-arg) 


class Phi(Function): 

    nargs = 1 

    def fdiff(self, argindex=1): 
     if argindex == 1: 
      return phi(self.args[0]) 
     else: 
      raise ArgumentIndexError(self, argindex) 

はそれぞれ、ガウスPDFとCDFを表します。これらはsympy.statsに実装されています。しかし、私の場合は、結果をphiPhiで解釈する方が簡単です。

+1

を '入力引数が負の場合? – Stelios

+0

ブリリアント!ありがとう、@ Stelios! 'phi'クラスに似た 'eval'メソッドを' phi'クラスに追加しますが、 '1-cls(-arg)'を返すことは完全に機能します。それを回答として提供して、私が質問に答えたようにすることができるようにしてください。 – Stefan

+0

私のコメントは単なるコメントでした。私はあなたが最終的にクラスをどのように実装したかを示すあなた自身の答えを書くことをお勧めします。 – Stelios

答えて

3

Phi(x)のコメントに基づき、xが負の場合は1-Phi(-x)を返す必要があります。次のようにそのため、私はPhi修飾: `1-ファイ(ABS(X))を返すように` Phi`の定義についてどの

class Phi(Function): 

    nargs = 1 

    def fdiff(self, argindex=1): 
     if argindex == 1: 
      return phi(self.args[0]) 
     else: 
      raise ArgumentIndexError(self, argindex) 

    @classmethod 
    def eval(cls, arg): 
     # Phi(x) + Phi(-x) == 1 
     if arg.could_extract_minus_sign(): 
      return 1-cls(-arg) 
関連する問題