Función de distribución normal acumulativa en C/C++ con parámetros
Pregunta
Quiero implementar el equivalente de la función matlab normcdf en C++, ya encontré esta publicación útil: Función de distribución normal acumulativa en C/C++ apuntando a esta implementación http://www.johndcook.com/cpp_phi.html.Pero lo quiero con parámetros mu y sigma opcionales como en matlab.
¿Está bien cuando cambio esto?
x = fabs(x)/sqrt(2.0);
a:
x = fabs(x - mu)/sqrt(2.0 * sigma * sigma);
¿O se supone que debo hacer otra cosa?
Solución
cuidado: desea guardar el signo de x-mu
, no solo de x
:
int sign = 1;
if (x < mu)
sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);
De lo contrario, su escala es correcta.
Otros consejos
En su lugar podrías agregar
x = (x-mu)/fabs(sigma);
como la primera línea de la función para obtener el resultado correcto sin cambiar la verificación de signos.Lo ideal sería lanzar una excepción para sigma<=0.0
en lugar de usar fabs
aquí.
En una nota no relacionada, la implementación a la que se ha vinculado es en realidad una aproximación de precisión única que acaba de tener float
reemplazadas con double
(de ahí que el error máximo sea un grandísimo 7e-8 ;-).
Si se siente cómodo traduciendo desde VB, West ofrece una implementación de Hart. mucho aproximación más precisa en la figura 2 de http://www.wilmott.com/pdfs/090721_west.pdf.
Desafortunadamente, al ser un PDF, no puedes copiar y pegar todos los números mágicos, por lo que tendrás que ser muy ¡Cuidado al comprobar que los has copiado correctamente!