2011-09-26 11 views
8

Supponiamo di aver verificato l'identità di seguito, come implementarla in Mathematica?come implementare una regola di integrazione?

(* {\[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]] 

risposta

7

La maggior parte dei modi per fare ciò che si richiede probabilmente comporterà l'aggiunta di regole di funzioni built-in (come Integrate, CDF, PDF, ecc), che non può essere una buona opzione. Ecco un modo un po 'più morbido, utilizzando il Block trick - macro base:

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

Ecco come possiamo usarlo:

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

Quando il nostro governo non corrisponde, esso continuerà a funzionare, automaticamente passando alla normale percorso di valutazione:

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

dove ho impostato \[Alpha] a 0 in ipotesi per rendere l'integrazione possibile in una forma chiusa.

Un'altra alternativa potrebbe essere quella di implementare il proprio integratore per scopi speciali.

+0

Come si può rilasciare HoldAll in modo che funzioni per l'integrale, ad esempio, di '(CDF [NormalDistribution [0, 1], \ [Alpha] + \ [Beta] x] + CDF [NormalDistribution [0, 1 ], \ [Gamma] + \ [Delta] x]) PDF [NormalDistribution [\ [Mu], \ [Sigma]], x] '? Ho provato a "Distribuire" ma non ha funzionato. –

+0

@ b.gatessucks Questo non è un problema di 'HoldAll'. Se lo rilascio, l'integrale all'interno della nostra macro valuterà tramite la sua normale rotta prima che la macro lo veda, che è ciò che non vogliamo. All'interno di 'Block', tuttavia, tutte le funzioni' Blocked' dimenticano completamente ciò che sono. Quindi, all'interno di questa soluzione, l'unica possibilità è aggiungere un'altra regola a "Integrare", come "Integarte [x_ + y_, varlims _]: = Integrare [x, varimi] + Integrare [y, varimi]'. Alla fine, però, finiresti per ri-implementare l'intero 'Integrate', quindi potrebbe aver senso limitare ciò che vuoi ottenere da questo, dall'inizio. –

Problemi correlati