2011-09-26 16 views
8

私は以下のアイデンティティをチェックしたとします。それをMathematicaに実装する方法は?あなたはおそらく組み込み関数にルールを追加伴うだろう要求し何をすべきか統合ルールの実装方法は?

(* {\[Alpha] \[Element] Reals, \[Beta] \[Element] Reals, \[Mu] \[Element] Reals, \[Sigma] > 0} *) 

Integrate[CDF[NormalDistribution[0, 1], \[Alpha] + \[Beta] x] PDF[ 
NormalDistribution[\[Mu], \[Sigma]], 
x], {x, -\[Infinity], \[Infinity]}] -> CDF[NormalDistribution[0, 1], (\[Alpha] + 
\[Beta] \[Mu])/Sqrt[1 + \[Beta]^2 \[Sigma]^2]] 

答えて

7

ほとんどの方法は、(IntegrateCDFPDF、などなど)、良い選択肢ではない可能性があります。ここでは少し柔らかめの方法はBlockトリックを使用して、ある - ベースのマクロ:

In[27]:= 
withIntegrationRule[a=Integrate[CDF[NormalDistribution[0,1],\[Alpha]+\[Beta] x] 
    PDF[NormalDistribution[\[Mu],\[Sigma]],x],{x,-\[Infinity],\[Infinity]}]]; 
a 

Out[28]= 1/2 Erfc[-((\[Alpha]+\[Beta] \[Mu])/(Sqrt[2] Sqrt[1+\[Beta]^2 \[Sigma]^2]))] 

私たちのルールが一致しない場合、それはまだ動作します、自動的に:ここで

ClearAll[withIntegrationRule]; 
SetAttributes[withIntegrationRule, HoldAll]; 
withIntegrationRule[code_] := 
    Block[{CDF, PDF, Integrate, NormalDistribution}, 
     Integrate[ 
     CDF[NormalDistribution[0, 1], \[Alpha]_ + \[Beta]_ x_] PDF[ 
      NormalDistribution[\[Mu]_, \[Sigma]_], x_], {x_, -\[Infinity], \[Infinity]}] := 
       CDF[NormalDistribution[0, 1], (\[Alpha] + \[Beta] \[Mu])/ 
        Sqrt[1 + \[Beta]^2 \[Sigma]^2]]; 
     code]; 

は、我々はそれを使用する方法であります通常の評価ルートへの切り替え:

私は閉じた形での統合を可能にするための前提条件で 0\[Alpha]を設定
In[36]:= 
    Block[{$Assumptions = \[Alpha]>0&&\[Beta]==0&&\[Mu]>0&&\[Sigma]>0}, 
    withIntegrationRule[b=Integrate[CDF[NormalDistribution[0,1],\[Alpha]+\[Beta] x] 
     PDF[NormalDistribution[\[Mu],\[Sigma]],x],{x,0,\[Infinity]}]]] 

Out[36]= 1/4 (1+Erf[\[Alpha]/Sqrt[2]]) (1+Erf[\[Mu]/(Sqrt[2] \[Sigma])]) 

また、独自の専用インテグレータを実装することもできます。

+0

HoldAllは、例えば、(CDF [NormalDistribution [0、1]、\ [Alpha] + \ [Beta] x] + CDF [NormalDistribution [0、1] ]、[Σ]、x [Σ])は、正規分布[\ [Mu]、\ [Σ]、x]私は 'Distribute'を試みましたが、うまくいきませんでした。 –

+0

@ b.gatessucksこれは 'HoldAll'の問題ではありません。私がそれを公開すると、マクロ内の積分は、マクロが見る前に通常の経路で評価します。これは私たちが望まないものです。しかし、 'Block'の中では、' Blocked'関数はすべて、それらが何であるかを完全に忘れてしまいます。ですから、このソリューションでは、Integrate [x、y、varlims]:= Integrate [x、varlims] + Integrate [y、varlims] 'のような、別のルールを' Integrate'に追加するだけです。最終的には、Integrate全体を再実装することになりますので、最初からこれから取得したいものを制約することは理にかなっています。 –

関連する問題