Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# math.net中的第一类贝塞尔函数_C#_Math_Math.net_Bessel Functions - Fatal编程技术网

C# math.net中的第一类贝塞尔函数

C# math.net中的第一类贝塞尔函数,c#,math,math.net,bessel-functions,C#,Math,Math.net,Bessel Functions,我需要使用c在unity3d中使用第一种贝塞尔函数。在尝试在unity中使用mathnet.numerics.dll后,我发现许多错误显然是由于unity3d不支持.NET 4。然后我决定使用jetbrains dotPeek反编译器查找贝塞尔函数源代码 然而,贝塞尔函数给出了错误的输出,老实说,数学高于我的工资等级,所以调试它非常困难。有人能看到我用过的东西有什么错误吗 例如,x=20的输出为4355822.5571362 其中应为0.167025 public static double B

我需要使用c在unity3d中使用第一种贝塞尔函数。在尝试在unity中使用mathnet.numerics.dll后,我发现许多错误显然是由于unity3d不支持.NET 4。然后我决定使用jetbrains dotPeek反编译器查找贝塞尔函数源代码

然而,贝塞尔函数给出了错误的输出,老实说,数学高于我的工资等级,所以调试它非常困难。有人能看到我用过的东西有什么错误吗

例如,x=20的输出为4355822.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
};

如果您试图使用贝塞尔函数,而不是修改后的贝塞尔函数,则应查找贝塞尔j,而不是贝塞尔i。然而,我在这个库中没有发现这样的情况。

不深入细节,我的演算已经不可靠了,你是否尝试过验证你的操作顺序是否正确?我已经看到一些数学函数仅仅由于操作顺序而返回意外结果的问题。我将尝试验证这一点。谢谢你确定这是正确的功能吗?第一类和第二类的贝塞尔函数通常用J和Y表示,而第一类和第二类的修改贝塞尔函数通常用I和K表示。还声称它们支持.NET 3.5。对不起,我正在查阅文档。代码用于修改的贝塞尔函数。不是贝塞尔函数。谢谢