假设我已经检查了下面的身份,如何在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
,以使积分可以以封闭形式进行。
另一个选择可能是实现您自己的专用积分器。