La mayoría de formas de hacer lo que usted solicita, probablemente implicará añadir reglas a las funciones incorporadas (como Integrate
, CDF
, PDF
, etc.), que pueden no ser una buena opción. Aquí está una manera un poco más suave, usando el truco Block
- macro basados:
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];
aquí es cómo podemos utilizarlo:
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]))]
Cuando nuestra regla no coincide, seguirá siendo el trabajo, de forma automática cambiar a la ruta de evaluación normal:
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])])
donde hice \[Alpha]
-0
en supuestos para hacer la integración posible en una forma cerrada.
Otra alternativa puede ser implementar su propio integrador de propósito especial.
¿Cómo se puede liberar HoldAll de modo que funcione para la integral, digamos, de '(CDF [Distribución Normal [0, 1], \ [Alpha] + \ [Beta] x] + CDF [Distribución Normal [0, 1 ], \ [Gamma] + \ [Delta] x]) PDF [NormalDistribution [\ [Mu], \ [Sigma]], x] '? Intenté 'Distribuir', pero no funcionó. –
@ b.gatessucks Esto no es un problema de 'HoldAll'. Si lanzo eso, la integral dentro de nuestra macro evaluará a través de su ruta normal antes de que la macro lo vea, que es lo que no queremos. Sin embargo, dentro del 'Bloque', todas las funciones' Bloqueadas 'olvidan por completo lo que son. Entonces, dentro de esta solución, la única opción es agregar otra regla a 'Integrar', como 'Integarte [x_ + y_, varlims _]: = Integrar [x, varlims] + Integrar [y, varlims]'. Eventualmente, terminará re-implementando todo el 'Integrate', por lo que puede tener sentido restringir lo que quiere obtener de esto, desde el principio. –