c#中的BesselK函数

BesselK Function in C#

本文关键字:函数 BesselK 中的      更新时间:2023-10-16

我正试图从Boost(一个c++库)实现BesselK方法。Boost方法接受两个双精度体并返回一个双精度体。(我把它实现为cyl_bessel_k .)

我的模型来自于boost文档:http://www.boost.org/doc/libs/1_45_0/libs/math/doc/sf_and_dist/html/math_toolkit/special/bessel/mbessel.html

我也一直在检查Wolfram的值:http://www.wolframalpha.com/input/?i=BesselK%283%2C1%29

当传递"v"的正非整数值时,我能够匹配Boost方法的输出。但是,当传递一个整数时,我的输出就严重中断了。因此,这是一个明显的不连续问题。从阅读这一点来看,这个问题似乎是由传递一个负整数到函数引起的。不知怎的,反射在Bessel_I方法中发挥了作用,但我的数学技能已经接近尾声了。

1)。什么需要发生的bessel_i方法与反射使这项工作?

2)。我现在用的是部分和法。Boost使用连续分数方法。我如何修改它来解释收敛?

任何输入都是赞赏的!谢谢你!

    static double cyl_bessel_k(double v, double x)
    {
        if (v > 0)
        {
            double iNegativeV = cyl_bessel_i(-v, x);
            double iPositiveV = cyl_bessel_i(v, x);
            double besselSecondKind = (Math.PI / 2) * ((iNegativeV - iPositiveV ) / (Math.Sin(Math.PI * v)));
            return besselSecondKind;
        }
        else
        {
           //error handling
        }
    }
    static double cyl_bessel_i(double v, double x)
    {
        if (x == 0)
        {
            return 0;
        }
        double summed = 0;
        double a = Math.Pow((0.5d * x), v);
        for (double k = 0; k < 10; k++) //how to account for convergence? 10 is arbitrary
        {
            double b = Math.Pow(0.25d * Math.Pow(x, 2), k);
            double kFactorial = SpecialFunctions.Factorial((int)k); //comes from MathNet.Numerics (Nuget)
            double gamma = SpecialFunctions.Gamma(v + k + 1); //comes from MathNet.Numerics
            summed += b / (kFactorial * gamma);
        }
        return a * summed;
    }

在进行了大量重构和尝试了一些行不通的东西之后,我想出了这个。它主要是Boost逻辑,已经被改编并翻译成c#。

它并不完美(可能是由于舍入,精度等)。欢迎任何改进!Wolfram的真实Bessel_K值与我的适应方法之间的最大误差为0.0000001926%。当参数'v'是整数时,会发生这种情况。对我来说,这已经很接近了。

链接到小提琴:https://dotnetfiddle.net/QIYzK6

希望这能让一些人不那么头疼。