伽玛函数近似

时间:2014-08-15 22:16:10

标签: ruby gamma-function

我尝试编写一个三参数方法,在一定的时间间隔内近似伽玛函数。近似值应为右端点黎曼和。

伽玛函数由下式给出:

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。我可能会出错的任何想法?

2 个答案:

答案 0 :(得分:3)

问题是当你m/n

当你期望浮动除法(3/4 = 0.75)

时,你正在进行整数除法(例如3/4 = 0)

您需要将nm定义为浮点数。

您可以将其重写为

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:您也不需要arrayresult变量。 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

请确认这些计算是正确的。