Формула у функции НОРМСТРАСП в Excel, какая?
Нeобходимо вычленить формулу из функции "НОРМСТРАСП" в виде текста, чтоб можно было воспользоваться ей в калькуляторе степеней (условно) и для последующего использования в программном коде на языке программирования Python. Формула строит стандартное нормальное интегральное распределение для передаваемого значения.
Попробовал вычленить согласно формуле, описанной на сайте Microsoft, но почему-то значения не совпадают.
Вот преобразованная в текст формула, которая у меня получилась:
(1/sqrt(2*pi))*exp(-1*((z*z)/2))
Если вместо z подставить 1.33333, то должно получиться 0.908788234, но почему-то значение получается другое
Ответы (2 шт):
Microsoft не писал, что это формула и заложена в НОРМСТРАСП:-) Он вам уравнение плотности стандартного нормального распределения привёл, формулу которого и вы тут приводите, а вот считает НОРМСТРАСП функцию нормального распределения.
Вам нужно от этой радости теперь взять интеграл. Вот вам в помощь ссылка: https://smart-lab.ru/blog/213739.php, там ещё ряд ссылочек внутри на коды.
(Сразу почувствовал, что формула странновата, но минут 40 убил, чтобы вспомнить, почему, да поискать подтверждение:-))
По рекомендации Сергея, получилось разобраться в данном вопросе. Функция для Python получилась следующая:
from math import exp
def normsdist2(z):
# Защита от переполнения
if (z > 6.0):
return 1.0
elif (z < -6.0):
return 0.0
b1 = 0.31938153
b2 = -0.356563782
b3 = 1.781477937
b4 = -1.821255978
b5 = 1.330274429
p = 0.2316419
c2 = 0.3989423
a=abs(z)
t = 1.0/(1.0+a*p)
b = c2*exp((-z)*(z/2.0))
n = ((((b5*t+b4)*t+b3)*t+b2)*t+b1)*t
n = 1.0-b*n
if (z < 0.0):
n = 1.0-n
return n
Хотя вариант Fat-Zer даёт более точный результат и имеет компактный вид:
from math import erf,sqrt
def normsdist2(z):
return (1.0+erf(z/sqrt(2.0)))/2.0