簡體   English   中英

C# 中有數學伽馬函數嗎?

[英]Is there mathematical gamma function in C#?

我想用 C# 做一個科學計算器,但我沒有找到 gamma 函數來計算分形階乘。 該函數的描述如下: https : //en.wikipedia.org/wiki/Gamma_function

如何在 C# 中達到伽馬函數?

Math.NET包確實是一種獲取 gamma 函數的簡單方法。 請記住, gamma(x)等於(x-1)! . 所以, gamma(4.1) = 6.8134.1! = 27.932 4.1! = 27.932 拿到4.1! gamma(4.1) ,您可以將gamma(4.1)乘以4.1 ,或者簡單地取5.1的 gamma 。 (我認為沒有必要在這里顯示一堆精度數字。)

在 C# 中:

using MathNet.Numerics; //at beginning of program

private double Factorial(double x)
{
    double r = x;
    r *= SpecialFunctions.Gamma(x);
    return r;
    //This could be simplified into: 
    //return x * SpecialFunctions.Gamma(x);
}

private double Factorial2(double x)
{
    double r;
    r = SpecialFunctions.Gamma(x + 1);
    return r;
}

如果由於某種原因您不想使用Math.Net ,您可以編寫自己的伽馬函數,如下所示:

static int g = 7;
static double[] p = {0.99999999999980993, 676.5203681218851, -1259.1392167224028,
 771.32342877765313, -176.61502916214059, 12.507343278686905,
 -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7};

Complex MyGamma(Complex z)
{
    // Reflection formula
    if (z.Real < 0.5)
    {
        return Math.PI / (Complex.Sin(Math.PI * z) * MyGamma(1 - z));
    }
    else
    {
        z -= 1;
        Complex x = p[0];
        for (var i = 1; i < g + 2; i++)
        {
            x += p[i] / (z + i);
        }
        Complex t = z + g + 0.5;
        return Complex.Sqrt(2 * Math.PI) * (Complex.Pow(t, z + 0.5)) * Complex.Exp(-t) * x;
    }
}

請注意,您可以將數據類型Complex替換為doubleComplex. 函數與Math. 如果你不需要復數,像這樣:

double MyGammaDouble(double z)
{
    if (z < 0.5)
        return Math.PI / (Math.Sin(Math.PI * z) * MyGammaDouble(1 - z));
    z -= 1;
    double x = p[0];
    for (var i = 1; i < g + 2; i++)
        x += p[i] / (z + i);
    double t = z + g + 0.5;
    return Math.Sqrt(2 * Math.PI) * (Math.Pow(t, z + 0.5)) * Math.Exp(-t) * x;
}

這是來自舊的 wiki 頁面(已被替換),但已復制到此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM