关于伽马函数

1、

函数格式:GammaP(a,b,value)

a,b:服从Γ(a,b)分布的函数.

value:代表服从Γ(a,b)分布的函数在x≥value时的概率值.

函数功能:概率统计的gamma函数在x≥value时的概率值.

2、

函数格式:Gammln(a)

a:Γ(a)当中的值

当a≤1的时候,采用多项式逼近的方式来求得Gammln(a)

函数功能:函数成功返回ln(Γ(a))的值.

3、

函数格式:Gamma(a)

a:Γ(a)当中的值

函数原理:

Γ(a+1)=(a+1)*Γ(a)

Γ(a)*Γ(1-a)=π/sin(π*a)

Γ(a)=Exp(Gammln(a))

函数功能:函数成功返回Γ(a)的值.

4、

函数格式:Gamma(a,value)

a:Γ(a,x)当中的a,a>0

value:Γ(a,value)当中的x,value>0

注意:上面a、b参数的值必须都大于0,且都必须小于171,否则程序会崩溃

函数功能:返回不完全伽马函数Γ(a,value)的值.

例子:

问:已知某元件寿命服从X~Γ(2,0.5)分布[单位小时],随便取一个元件,求该元件寿命大于4小时的概率.

答:执行本函数GammaP(2,0.5,4)后返回0.40600584970982即此值即为其概率值.

源代码:

  1. Public Function Gamma(ByVal a As Double, ByVal value As Double) As Double \'注意a必须大于0
  2. \'不完全伽马函数求值P(a,value)
  3. If value = 0 Then
  4. Return 0
  5. ElseIf value > 1.0E+35 Then
  6. Return 1
  7. ElseIf value < 0 Then
  8. value = -value
  9. Return -Gamma(a, value)
  10. End If
  11. Dim i As Integer
  12. Dim d, p, p0, p1, q, q0, q1, s, s1, qq As Double
  13. q = Math.Log(value)
  14. q *= a
  15. qq = Math.Exp(q)
  16. If value < a + 1 Then
  17. p = a
  18. d = 1 / a
  19. s = d
  20. For i = 1 To 100
  21. p += 1
  22. d = d * value / p
  23. s += d
  24. If Math.Abs(d) < Math.Abs(s) * 0.0000001 Then
  25. s = s * Math.Exp(-value) * qq / Gamma(a)
  26. Return s
  27. End If
  28. Next
  29. Else
  30. s = 1 / value
  31. p0 = 0
  32. p1 = 1
  33. q0 = 1
  34. q1 = value
  35. For i = 1 To 100
  36. p0 = p1 + (i - a) * p0
  37. q0 = q1 + (i - a) * q0
  38. p = p0 * value + i * p1
  39. q = q0 * value + i * q1
  40. If q <> 0 Then
  41. s1 = p / q
  42. p1 = p
  43. q1 = q
  44. If Math.Abs((s1 - s) / s1) < 0.0000001 Then
  45. s = s1 * Math.Exp(-value) * qq / Gamma(a)
  46. Return 1 - s
  47. End If
  48. s = s1
  49. End If
  50. p1 = p
  51. q1 = q
  52. Next
  53. End If
  54. s = 1 - s * Math.Exp(-value) * qq / Gamma(a)
  55. Return s
  56. End Function
  57.  
  58. Public Function Gammln(ByVal value As Double) As Double
  59. Dim temp(2) As Double
  60. Dim i As Integer
  61. Dim data() As Double = {76.180091729471457, -86.505320329416776, 24.014098240830911, -1.231739572450155, 0.001208650973866179, -0.000005395239384953}
  62. temp(0) = value
  63. temp(1) = value + 5.5
  64. temp(1) = temp(1) - (value + 0.5) * Math.Log(temp(1))
  65. temp(2) = 1.0000000001900149
  66. For i = 0 To 5
  67. temp(0) += 1
  68. temp(2) += data(i) / temp(0)
  69. Next
  70. temp(0) = Math.Log(2.5066282746310007 * temp(2) / value) - temp(1)
  71. Return temp(0)
  72. End Function
  73.  
  74. Public Function Gamma_Call(ByVal value As Double) As Double
  75. If value < 1 Then
  76. Return Math.Exp(Gammln(value))
  77. ElseIf value = 1 Then
  78. Return 1
  79. End If
  80. value -= 1
  81. Return value * Gamma_Call(value)
  82. End Function
  83.  
  84. Public Function Gamma(ByVal value As Double) As Double \'概率统计里的gamma函数.注意value的值不要大过171且不能且当value<=0时《sin(value*pi)<>0
  85. Dim ret As Double = 0
  86. If value > 171 Then
  87. IsTrue = False
  88. ElseIf value > 0 Then
  89. ret = Gamma_Call(value)
  90. Else
  91. ret = Math.Sin(Math.PI * value)
  92. If ret = 0 Then
  93. Else
  94. ret = Math.PI / ret
  95. ret = ret / Gamma_Call(1 - value)
  96. End If
  97. End If
  98. Return ret
  99. End Function
  100.  
  101. Public Function GammaP(ByVal a As Double, ByVal b As Double, ByVal value As Double) As Double
  102. If a <= 0 Or a > 17 Or b < 0 Or value < 0 Then
  103. Return -1
  104. End If
  105. Dim temp As Double = Gamma(a)
  106. temp = Math.Pow(b, a) / temp
  107. \'*****************采用复化后的2点高斯积分方法
  108. Dim x As Double = 0
  109. Dim b_a_ As Double = value
  110. Dim h_ As Double = b_a_ / 1000
  111. Dim h2_ As Double = h_ / 2
  112. Dim h23_ As Double = h2_ / Math.Sqrt(3)
  113. Dim n_ As Integer = 1000
  114. Dim ret_ As Double = 0
  115. Dim x_ As Double = 0
  116. a -= 1
  117. While n_ > 0
  118. x = x_ + h2_ + h23_
  119. ret_ += Math.Exp(-b * x) * x ^ a
  120. x = x_ + h2_ - h23_
  121. ret_ += Math.Exp(-b * x) * x ^ a
  122. x_ += h_
  123. n_ -= 1
  124. End While
  125. ret_ *= h_
  126. ret_ /= 2
  127. \'*******************
  128. value = 1 - temp * ret_
  129. Return value
  130. End Function

 

版权声明:本文为Jason-yan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Jason-yan/archive/2013/05/04/3059380.html