می خواستم برنامه ای بنویسم که با آن بتوانم نمودار هایی برای یکسری توابع آماری از جمله پواسن و گاما و t استیودنت و ... بنویسم
متاسفانه تابع گاما به سادگی دیگر توابع نبود
و چون یکی از مهمترین توابع آماری به شمار می رود و در توابع دیگری مانند t استیودنت و فیشر و ... کاربرد دارد
حال می خواستم از شما کمک بخواهم تا بتوانم محاسبات بروی این تابع را انجام دهم
یعنی دنبال یک Function هستم که من به آن alfa را بدهم ( یک ورودی) و اون به من معادل محاسبه شده گامای آن را بدهد
در اینترنت زیاد راجع به این تابع تحقیق کردم ولی فقط و فقط یک برنامه ++C از آن گیر آوردم و آن را به VB ترجمه کردم
که می توانید آنرا در پیوست ببینید

' Returns the imcomplete gamma functions P(a,x) and Q(a,x).
' Arash kiani Jan/19/2007
Imports System.Math
Public Class clsGamma
Dim cerr As String
Sub New()
End Sub
Function gammp(ByVal a As Double, ByVal x As Double) As Double
Dim gamser, gammcf, gln As Double
If x < 0.0 Or a <= 0.0 Then
cerr = "Invalid argument in routine gammp"
End If
If x < (a + 1.0) Then
Call gser(gamser, a, x, gln)
Return gamser
Else
gcf(gammcf, a, x, gln)
Return 1.0 - gammcf
End If
End Function
Function gammq(ByVal a As Double, ByVal x As Double) As Double
Dim gamser, gammcf, gln As Double
If x < 0.0 Or a <= 0.0 Then
cerr = "Invalid argument in routine gammp"
Exit Function
End If
If x < a + 1.0 Then
gser(gamser, a, x, gln)
Return 1.0 - gamser
Else
gcf(gammcf, a, x, gln)
Return gammcf
End If
End Function
Const ITMAX = 100
Const EPS = 0.0000003
Sub gser(ByRef gamser As Double, ByVal a As Double, ByVal x As Double, ByRef gln As Double)
Dim n As Integer
Dim sum, del, ap As Double
gln = gamma_ln(a)
If x <= 0.0 Then
If x < 0.0 Then
cerr = "x less than 0 in routine gser"
gamser = 0.0
Exit Sub
End If
Else
ap = a
sum = 1.0 / a
del = sum
n = 1
While n <= ITMAX
ap += 1
del *= x / ap
sum += del
If Abs(del) < Abs(sum) * EPS Then
gamser = sum * Exp(-x + a * Log(x) - gln)
Exit Sub
End If
n += 1
End While
cerr = "a too large,ITMAX too small in routine gser"
Exit Sub
End If
End Sub
Const FPMIN = 1.0E-30
Sub gcf(ByRef gammcf As Double, ByVal a As Double, ByVal x As Double, ByRef gln As Double)
Dim i As Integer
Dim an, b, c, d, del, h As Double
gln = gamma_ln(a)
b = x + 1.0 - a
c = 1.0 / FPMIN
d = 1.0 / b
h = d
i = 1
While i <= ITMAX
an = -i * (i - a)
b += 2.0
d = an * d + b
If Abs(d) < FPMIN Then
d = FPMIN
End If
c = b + an / c
If Abs(c) < FPMIN Then
c = FPMIN
End If
d = 1.0 / d
del = d * c
h *= del
If Abs(del - 1.0) < EPS Then
Exit While
End If
i += 1
End While
If i > ITMAX Then
cerr = "a too large ,ITMAX too small in gcf"
End If
gammcf = Exp(-x + a * Log(x) - gln) * h
End Sub
Function gamma_ln(ByVal xx As Double) As Double
Dim x, y, tmp, ser As Double
Dim cof() As Double = {76.180091729471457, -86.505320329416776, _
24.014098240830911, -1.231739572450155, _
0.001208650973866179, -0.000005395239384953}
Dim j As Integer
x = xx
y = x
tmp = x + 5.5
tmp -= (x + 0.5) * Log(tmp)
ser = 1.0000000001900149
j = 0
While j <= 5
y += 1
ser += cof(j) / y
j += 1
End While
Return -tmp + Log(2.5066282746310007 * ser / x)
End Function
End Class

این تابع دو ورودی x و a می گیرد و من نمی دانم چگونه کاری کنم که فقط با دادن یک alfa معادل Gamma آن را به من بدهد. ( تابع گاما حاصل یک انتگرال است توضیحات بیشتر در این رابطه را در
http://mathworld.wolfram.com/GammaFunction.html
ببیند)
با تشکر از دوستان خواهشمندم هر چه زودتر به من کمک کنید
در ضمن ورودی من صحیح یا ضریبی از عدد 1/2 نیست هر عددی می تواند باشد