Wolfram mathematica 如何实现集成规则?

Wolfram mathematica 如何实现集成规则?,wolfram-mathematica,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, -\[I

假设我检查了下面的标识,如何在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
,等等),这可能不是一个好的选择。下面是一种稍微柔和的方法,使用基于
块的
技巧宏:

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
,以使以封闭形式进行集成成为可能


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

如何释放HoldAll,使其能够用于积分,例如
(CDF[正态分布[0,1],\[Alpha]+\[Beta]x]+CDF[正态分布[0,1],\[Gamma]+\[Delta]x])PDF[正态分布[\[Mu,\[Sigma]],x]
?我尝试了
distribution
,但没有成功。@b.gatessuck这不是
HoldAll
的问题。如果我释放它,在宏看到它之前,宏内部的积分将通过其正常路径求值,这是我们不想要的。然而,在
内部,所有
函数都完全忘记了它们是什么。因此,在这个解决方案中,唯一的选择是将另一个规则添加到
Integrate
,例如
integrarte[x+y,varlims]:=Integrate[x,varlims]+Integrate[y,varlims]
。但是,最终,您将重新实现整个
集成
,因此从一开始就限制您希望从中获得的东西可能是有意义的。