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?

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top