matlab — кумулятивная функция нормального распределения в C / C ++ с параметрами

Я хочу реализовать эквивалент функции matlab normcdf в C ++, я уже нашел этот полезный пост: Кумулятивная функция нормального распределения в C / C ++ указывая на эту реализацию http://www.johndcook.com/cpp_phi.html. Но я хочу это с дополнительными параметрами mu и sigma, как в matlab.

Это нормально, когда я изменяю это:

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

чтобы:

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

или я должен сделать что-то еще?

3

Решение

Берегись — ты хочешь сохранить знак x-muне только x:

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

В противном случае ваше масштабирование является правильным.

1

Другие решения

Вы могли бы вместо этого добавить

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

в качестве первой строки функции для правильного результата без изменения знака проверки. В идеале вы должны бросить исключение для sigma<=0.0 а не использовать fabs Вот.

На несвязанной ноте, реализация, с которой вы связаны, на самом деле является приближением с одинарной точностью, просто имея float заменено на double (следовательно, максимальная ошибка является огромный 7е-8 ;-).
Если вам удобно переводить с VB, Вест дает реализацию Харта. много Более точное приближение на рисунке 2 http://www.wilmott.com/pdfs/090721_west.pdf.
К сожалению, как PDF, вы не можете скопировать и вставить все магические числа, поэтому вам придется очень будьте внимательны при проверке правильности их копирования!

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector