ほとんどの方法は、(Integrate
、CDF
、PDF
、などなど)、良い選択肢ではない可能性があります。ここでは少し柔らかめの方法は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])])
。
また、独自の専用インテグレータを実装することもできます。
HoldAllは、例えば、(CDF [NormalDistribution [0、1]、\ [Alpha] + \ [Beta] x] + CDF [NormalDistribution [0、1] ]、[Σ]、x [Σ])は、正規分布[\ [Mu]、\ [Σ]、x]私は 'Distribute'を試みましたが、うまくいきませんでした。 –
@ b.gatessucksこれは 'HoldAll'の問題ではありません。私がそれを公開すると、マクロ内の積分は、マクロが見る前に通常の経路で評価します。これは私たちが望まないものです。しかし、 'Block'の中では、' Blocked'関数はすべて、それらが何であるかを完全に忘れてしまいます。ですから、このソリューションでは、Integrate [x、y、varlims]:= Integrate [x、varlims] + Integrate [y、varlims] 'のような、別のルールを' Integrate'に追加するだけです。最終的には、Integrate全体を再実装することになりますので、最初からこれから取得したいものを制約することは理にかなっています。 –