Функция Бесселя первого рода от math.net

Мне нужно использовать функцию Бесселя первого рода в unity3d (используя C#). После попытки использовать mathnet.numerics.dll в единстве я обнаружил много ошибок, по-видимому, из-за того, что unity3d не поддерживает.NET 4. Затем я решил использовать декомпилятор jetbrains dotPeek, чтобы найти источник функций бессела.

Однако функция bessel дает неверный результат, и, честно говоря, математика выше моего paygrade, поэтому отладка была очень трудной. Может кто-нибудь увидеть какие-либо ошибки в том, что я использовал.

например, выход с x = 20 равен 43558282,5571362, где предполагается 0,167025

public static double BesselI0(double x)
{
    if (x < 0.0)
        x = -x;

    if (x <= 8.0)
    {
        double x1 = x / 2.0 - 2.0;
        return Math.Exp(x) * ChebyshevA(BesselI0A, x1);
    }
    else
    {
        double x1 = 32.0 / x - 2.0;
        return Math.Exp(x) * ChebyshevA(BesselI0B, x1) / Math.Sqrt(x);
    }   
}

internal static double ChebyshevA(double[] coefficients, double x)
{
    int num1 = 0;
    double[] numArray = coefficients;
    int index = num1;
    int num2 = 1;
    int num3 = index + num2;
    double num4 = numArray[index];
    double num5 = 0.0;
    int num6 = coefficients.Length - 1;
    double num7;
    do
    {
        num7 = num5;
        num5 = num4;
        num4 = x * num5 - num7 + coefficients[num3++];
    }
    while (--num6 > 0);
    return 0.5 * (num4 - num7);
}

private static readonly double[] BesselI0A = new double[30]
{
    -4.41534164647934E-18,
    3.33079451882224E-17,
    -2.43127984654795E-16,
    1.71539128555513E-15,
    -1.16853328779935E-14,
    7.67618549860494E-14,
    0.0 / 1.0,
    0.0 / 1.0,
    0.0 / 1.0,
    0.0 / 1.0,
    -5.18979560163526E-10,
    2.65982372468239E-09,
    -1.30002500998625E-08,
    6.04699502254192E-08,
    -2.67079385394061E-07,
    1.1173875391201E-06,
    -4.41673835845875E-06,
    1.64484480707289E-05,
    -5.7541950100821E-05,
    0.000188502885095842,
    -0.000576375574538582,
    0.00163947561694134,
    -0.00432430999505058,
    0.010546460394595,
    -0.0237374148058995,
    0.0493052842396707,
    -0.0949010970480476,
    0.171620901522209,
    -0.304682672343198,
    0.676795274409476
};

private static readonly double[] BesselI0B = new double[25]
{
    -7.23318048787475E-18,
    -4.83050448594418E-18,
    4.46562142029676E-17,
    3.46122286769746E-17,
    -2.82762398051658E-16,
    -3.42548561967722E-16,
    1.77256013305653E-15,
    3.81168066935262E-15,
    -9.55484669882831E-15,
    -4.15056934728722E-14,
    1.54008621752141E-14,
    0.0 / 1.0,
    0.0 / 1.0,
    0.0 / 1.0,
    0.0 / 1.0,
    0.0 / 1.0,
    0.0 / 1.0,
    4.94060238822497E-10,
    3.39623202570839E-09,
    2.26666899049818E-08,
    2.04891858946906E-07,
    2.89137052083476E-06,
    6.88975834691682E-05,
    0.00336911647825569,
    0.804490411014109
};

1 ответ

Если вы пытаетесь использовать функцию Бесселя, а не модифицированную функцию Бесселя, вам следует искать BesselJ, а не BesselI. Однако я не нашел такого в этой библиотеке.

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