我尝试编写一个三参数方法,在一定的时间间隔内近似伽玛函数。近似值应为右端点黎曼和。
伽玛函数由下式给出:
GAMMA(s) =
inf
INT x^(s-1) * exp(-x) dx
0
因此,在区间(0,m)上的右端点Riemann和近似值应为:
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。我可能会出错的任何想法?
答案 0 :(得分:3)
问题是当你m/n
当你期望浮动除法(3/4 = 0.75)
时,你正在进行整数除法(例如3/4 = 0)您需要将n
和m
定义为浮点数。
您可以将其重写为
def gamma(x = 4.0, n = 100000, m = 2500)
n = n.to_f
m = m.to_f
(1..n).to_a.inject(0) do |sum, i|
sum + ((((m/n)*i)**(x-1))*((Math::E)**(-(m/n)*i))*(m/n))
end
end
PS:您也不需要array
和result
变量。
PS2:考虑使用Math::E代替2.7183
答案 1 :(得分:2)
你的问题是由@xlembouras确定的。您可以考虑编写如下方法。
<强>代码强>
def gamma(x = 4.0, n = 100000, m = 2500)
ratio = m.to_f/n
xm1 = x-1.0
ratio * (1..m).inject(0) do |sum,i|
ixratio = i*ratio
sum + ixratio**xm1 * Math.exp(-ixratio)
end
end
<强>实施例强>
gamma(x=4.0, n= 40, m =10).round(6) #=> 1.616233
gamma.round(6) #=> 6.0
请确认这些计算是正确的。