Есть ли в c# математическая гамма-функция?

Я хотел бы сделать научный калькулятор на C#, но я не нашел гамма-функции для вычислить фрактальные факториалы. Описание функции приведено ниже: https://en.wikipedia.org/wiki/Gamma_function

Как я могу достичь гамма-функции в C#?

Похоже, что это делает сторонняя библиотека, см. здесь

maccettura 10.08.2018 17:25
7
1
1 806
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Установите Пакет Math.NET от nuget

Документация по гамма-функции: https://numerics.mathdotnet.com/Functions.html

Спасибо, это была очень полезная информация. И вы не проголосовали против моего вопроса, как другие здесь. : D

Kovoliver 11.08.2018 09:39

Вот ссылка на рабочую документацию: numerics.mathdotnet.com/Functions.html

Alex_P 26.02.2019 17:51

Пакет Math.NET - действительно простой способ получить гамма-функцию. Имейте в виду, что gamma(x) аналогичен (x-1)!. Итак, gamma(4.1) = 6.813, а 4.1! = 27.932. Чтобы получить 4.1! из gamma(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, вы можете написать свою собственную гамма-функцию следующим образом:

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;
}

Это со старой вики-страницы (которая была заменена), но скопирована здесь.

Другие вопросы по теме