Я пытаюсь написать трехпараметрический метод, который аппроксимирует гамма-функцию на определенном интервале. Аппроксимация должна быть суммой Римана с правым концом.
Гамма-функция определяется как:
GAMMA(s) =
inf
INT x^(s-1) * exp(-x) dx
0
Таким образом, аппроксимация суммы Римана на правом конце в интервале (0, m) должна быть:
GAMMA(s) ~
m
SUM ((m/n)*i)^(s-1) * exp(-(m/n)*i) * delta_x where delta_x = (m/n)
i=1
Мой код выглядит следующим образом:
def gamma(x = 4.0, n = 100000, m = 2500)
array = *(1..n)
result = array.inject(0) {|sum, i| sum + ((((m/n)*i)**(x-1))*((2.7183)**(-(m/n)*i))*(m/n))}
end
puts gamma
Код должен возвращать приближение для 3! = 6, но вместо этого возвращает 0,0. Есть идеи, где я могу ошибаться?