2011-09-26 2 views
8

아래의 신원을 확인했다고 가정합니다. 어떻게 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]] 

답변

7

대부분의 방법 (예 : 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]; 

우리가 그것을 사용하는 방법입니다 통상 평가 경로 전환 :

I 닫힌 형태 가능한 통합을 위해 가정에서 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])]) 

.

또 다른 대안은 고유 한 특수 목적의 통합기를 구현하는 것일 수 있습니다.

+0

어떻게 HoldAll이'(CDF [NormalDistribution [0, 1], \ [Alpha] + \ [Beta] x] + CDF [NormalDistribution [0,1] ], [[ΣM], [Σ], x]'? 나는'Distribute'를 시도했지만 작동하지 않았다. –

+0

@ b.gatessucks 이것은'HoldAll'의 문제가 아닙니다. 이를 공개하면 매크로 내부의 필수 기능은 매크로가보기 전에 정상 경로를 통해 평가할 것입니다. 이는 우리가 원하지 않는 것입니다. 그러나'Block '내부에서는'Blocked' 함수가 모든 것을 완전히 잊어 버립니다. 따라서,이 솔루션 내에서 유일한 선택은 Integrate [x_ + y_, varlims _] : = Integrate [x, varlims] + Integrate [y, varlims]와 같은 다른 규칙을 Integrate에 추가하는 것입니다. 결국 결국 전체 Integrate를 다시 구현하게 될 것이기 때문에 처음부터 얻고 자하는 것을 제약 할 수 있습니다. –

관련 문제