2015-11-26 3 views
1

Как рассчитать NORMSINV числа (от 0 до 1) и квадратного корня числа в Ruby?NORMSINV и квадратный корень в Ruby

Я использую функции в Excel, как показано ниже, и мне нужно реализовать его в Ruby.

=NORMSINV(A1) 
=SQRT(A1) 
+1

Квадратный корень может быть достигнут простым использованием 'number ** (1/2)'. '**' - это оператор Ruby для «в силе». Таким образом, когда мы поднимаем число до степени 1/2, он принимает квадратный корень. Что касается NORMSINV, я не понимаю, что это такое. Если вы поясните это, я смогу помочь. – Charles

+1

[NORMSINV] (https://support.microsoft.com/en-us/kb/826772) - нетривиальная статистическая функция. Поиск «norminv formula» возвращает этот [код в Visual Basic] (http://www.source-code.biz/snippets/vbasic/9.htm), например. –

ответ

1

Как c650 отметил в своем комментарии, квадратный корень из x просто

x**0.5 

Martin Vidner дал вам link to a decent algorithm для аппроксимации нормального распределения. Для вашего удобства я поместил его в Ruby:

# algorithm ported from http://www.source-code.biz/snippets/vbasic/9.htm 

A1 = -39.6968302866538 
A2 = 220.946098424521 
A3 = -275.928510446969 
A4 = 138.357751867269 
A5 = -30.6647980661472 
A6 = 2.50662827745924 
B1 = -54.4760987982241 
B2 = 161.585836858041 
B3 = -155.698979859887 
B4 = 66.8013118877197 
B5 = -13.2806815528857 
C1 = -7.78489400243029E-03 
C2 = -0.322396458041136 
C3 = -2.40075827716184 
C4 = -2.54973253934373 
C5 = 4.37466414146497 
C6 = 2.93816398269878 
D1 = 7.78469570904146E-03 
D2 = 0.32246712907004 
D3 = 2.445134137143 
D4 = 3.75440866190742 
P_low = 0.02425 
P_high = 1 - P_low 

def phi(p) 
    raise ArgumentError if p < 0 || p > 1 
    if p < P_low 
    q = (-2 * Math::log(p))**0.5 
    (((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6)/
    ((((D1 * q + D2) * q + D3) * q + D4) * q + 1) 
    elsif p <= P_high 
    q = p - 0.5 
    r = q * q 
    (((((A1 * r + A2) * r + A3) * r + A4) * r + A5) * r + A6) * q/
    (((((B1 * r + B2) * r + B3) * r + B4) * r + B5) * r + 1) 
    else 
    q = (-2 * Math::log(1 - p))**0.5 
    (((((C1 * q + C2) * q + C3) * q + C4) * q + C5) * q + C6)/
    ((((D1 * q + D2) * q + D3) * q + D4) * q + 1) 
    end 
end 
+0

Это работает для меня! Огромное спасибо. – Pushkar

+0

Его, мужчина, его ... – Charles

+0

@ c650: Спасибо, отредактирован. –