Frage

Ich möchte das Äquivalent der Matlab-Normcdf-Funktion in C++ implementieren. Ich habe diesen nützlichen Beitrag bereits gefunden: Kumulative Normalverteilungsfunktion in C/C++ weist auf diese Implementierung hin http://www.johndcook.com/cpp_phi.html.Aber ich möchte es mit optionalen Mu- und Sigma-Parametern wie in Matlab.

Ist es in Ordnung, wenn ich das ändere:

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

Zu:

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

Oder soll ich etwas anderes tun?

War es hilfreich?

Lösung

Passen Sie auf – Sie möchten das Zeichen speichern x-mu, nicht nur von x:

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

Ansonsten ist Ihre Skalierung korrekt.

Andere Tipps

Sie könnten stattdessen hinzufügen

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

als erste Zeile der Funktion für das korrekte Ergebnis ohne Änderung der Vorzeichenprüfung.Idealerweise sollten Sie eine Ausnahme für auslösen sigma<=0.0 statt zu nutzen fabs Hier.

Unabhängig davon handelt es sich bei der Implementierung, auf die Sie verlinkt haben, tatsächlich um eine Näherung mit einfacher Genauigkeit, die es gerade gegeben hat float Ersetzt mit double (daher beträgt der maximale Fehler a satt 7e-8 ;-).
Wenn Sie sich mit der Übersetzung aus dem VB auskennen, bietet West eine Implementierung von Harts an viel genauere Annäherung in Abbildung 2 von http://www.wilmott.com/pdfs/090721_west.pdf.
Leider können Sie als PDF nicht alle magischen Zahlen kopieren und einfügen, also müssen Sie es tun sehr Seien Sie vorsichtig, wenn Sie überprüfen, ob Sie sie richtig kopiert haben!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top