如何实现集成规则



假设我已经检查了下面的身份,如何在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]]

完成您请求的大多数方法可能涉及到向内置函数(例如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];

我们可以这样使用它:

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]))]   

当我们的规则不匹配时,它仍然会工作,自动切换到正常的计算路径:

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])])

我在假设中将[Alpha]设置为0,以使积分可以以封闭形式进行。

另一个选择可能是实现您自己的专用积分器。

最新更新