Question

Je souhaite implémenter l'équivalent de la fonction matlab normcdf en C++, j'ai déjà trouvé cet article utile : Fonction de distribution normale cumulative en C/C++ soulignant cette mise en œuvre http://www.johndcook.com/cpp_phi.html.Mais je le veux avec les paramètres mu et sigma facultatifs comme dans Matlab.

Est-ce que ça va, quand je change ceci :

x = fabs(x)/sqrt(2.0);

à:

x = fabs(x - mu)/sqrt(2.0 * sigma * sigma);

ou je suis censé faire autre chose ?

Était-ce utile?

La solution

Attention, vous voulez conserver le signe de x-mu, pas seulement de x:

int sign = 1;
if (x < mu)
    sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);

Sinon votre mise à l'échelle est correcte.

Autres conseils

Vous pourriez plutôt ajouter

x = (x-mu)/fabs(sigma);

comme première ligne de la fonction pour le résultat correct sans changer la vérification du signe.Idéalement, vous devriez lancer une exception pour sigma<=0.0 plutôt que d'utiliser fabs ici.

Sur une note sans rapport, l'implémentation à laquelle vous avez lié est en fait une approximation à simple précision qui vient d'avoir float remplacé par double (d'où l'erreur maximale étant un énorme 7e-8 ;-).
Si vous êtes à l'aise avec la traduction à partir de VB, West donne une implémentation de Hart's beaucoup approximation plus précise dans la figure 2 de http://www.wilmott.com/pdfs/090721_west.pdf.
Malheureusement, en tant que PDF, vous ne pouvez pas copier et coller tous les nombres magiques, vous devrez donc très soyez prudent lorsque vous vérifiez que vous les avez copiés correctement !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top