【问题标题】:Gamma function approximation伽玛函数逼近
【发布时间】:2014-08-15 22:16:10
【问题描述】:

我正在尝试编写一个三参数方法,该方法在一定间隔内逼近 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。有什么想法我可能会出错吗?

【问题讨论】:

    标签: ruby gamma-function


    【解决方案1】:

    问题是当你做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

    【讨论】:

    • 我刚刚在excel中实现了这个过程,我得到了正确的答案,所以我知道我的方法是正确的。我是编码n00b,所以我认为它必须是这样。再次感谢。这个网站很棒。
    【解决方案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
    

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

    【讨论】:

    • gamma(4) 应该等于 3! = 6
    • 我计划编写一个方法,将 Gamma 函数扩展到整个复平面。最终目标是能够编写一种方法,让我能够评估黎曼 Zeta 函数的函数方程的值。
    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2018-07-23
    相关资源
    最近更新 更多