【问题标题】:Is there mathematical gamma function in C#?C# 中有数学伽玛函数吗?
【发布时间】:2019-01-18 06:08:40
【问题描述】:

我想用 C# 做一个科学计算器,但我没有找到 gamma 函数 计算分形因子。 该函数的描述如下: https://en.wikipedia.org/wiki/Gamma_function

如何在 C# 中实现 gamma 函数?

【问题讨论】:

  • 看起来有一个第三方库可以做到这一点,请参阅here

标签: c# .net calculator gamma-function


【解决方案1】:

【讨论】:

【解决方案2】:

Math.NET 包确实是获取 gamma 函数的简单方法。请记住gamma(x) 等于(x-1)!。所以,gamma(4.1) = 6.8134.1! = 27.932。要从gamma(4.1) 得到4.1!,您可以将gamma(4.1) 乘以4.1,或者简单地取5.1 的伽玛值。 (我认为没有必要在这里显示一堆精度数字。)

在 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,你可以编写自己的gamma函数如下:

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 替换为 double 并将 Complex. 函数替换为 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 页面(已被替换)但被复制 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多