如何实施集成规则?

b.g*_*cks 9 wolfram-mathematica

假设我已经检查了下面的身份,如何在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]]
Run Code Online (Sandbox Code Playgroud)

Leo*_*rin 7

大多数方法可以做到你要求可能会涉及将规则添加到内置功能(如什么Integrate,CDF,PDF,等),这可能不是一个好的选择.这是一种稍微柔和的方式,使用Block基于技巧的宏:

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];
Run Code Online (Sandbox Code Playgroud)

以下是我们如何使用它:

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]))]   
Run Code Online (Sandbox Code Playgroud)

当我们的规则不匹配时,它仍然有效,自动切换到正常的评估路线:

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])])
Run Code Online (Sandbox Code Playgroud)

我在假设中设置\[Alpha]0使封闭形式的集成成为可能.

另一种选择可能是实现您自己的专用集成商.