0

我正在尝试编写一个三参数方法,该方法在一定间隔内逼近 gamma 函数。近似值应该是右端点黎曼和。

伽马函数由下式给出:

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。有什么想法我可能会出错吗?

4

2 回答 2

3

问题是当你这样做时m/n

当您期望浮点除法(3/4 = 0.75)时,您正在执行整数除法(例如 3/4 = 0)

您需要将nand定义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:你也不需要arrayandresult变量。PS2:考虑使用Math::E而不是2.7183

于 2014-08-15T22:29:49.730 回答
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

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

于 2014-08-15T23:24:19.770 回答