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.
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. –
@ 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. –