使用非整数顺序

时间:2016-04-26 17:10:45

标签: java bessel-functions

我正在尝试使用Java计算二阶bessel函数(Y_v(x))。其中v,bessel函数的顺序是非整数。

Apache,我知道,它具有计算一阶bessel函数的函数(J_v(x))

import org.apache.commons.math3.special.BesselJ;

BesselJ bj = new BesselJ(10.5);
double bjr = bj.value(r);

可以计算非整数的一阶bessel函数(但不能计算负序函数)。我不相信它有二等份的等价物。

我找到了一个计算二阶bessel函数的公式(其他地方的数字Recipies的公式6.4.2),它从一阶函数计算二阶bessel函数。

enter image description here

然而,这个等式要求第一阶bessel函数接受apache BesselJ函数不能接受的负v值。

我编写了一个程序来计算BesselJ函数,使用公式接受负值(Numerical Recipes 6.4.1)

enter image description here

import org.apache.commons.math3.special.Gamma;
import org.apache.commons.math3.util.ArithmeticUtils;

private static int lmax;
private static double[][] Gammas;
private static int besselcount;

public static Double Bessel_J(double m, double x){

    double BJ = 0.0;
    for (int k = 0; k < besselcount;k++){
        double kk = (double) k;     
        double llmm = (double) lmax;
        double A = Math.pow(x/2.,(2.*kk)+m);
        double B = Gammas[(int) (m+llmm+0.5)][k];
        if (B==0.0||B==-0.0){break;}
            BJ = BJ + A*B;
        }

        return BJ;
}

public static void main(String[] args) throws Exception {

    besselcount = 80;
    lmax = 20;

    Gammas = new double[2*lmax+2][besselcount+1];
    for (int n = 0;n <= ((2*lmax)+1);n++){
        for (int m = 0;m <=besselcount;m++) {
            double nn = (double) n;
            double mm = (double) m;
            double llmm = (double) lmax;
            Gammas[n][m] =   Math.pow(-1,m)/(ArithmeticUtils.factorialDouble(m)*Gamma.gamma(1.+nn-llmm-0.5+mm));
        }
    }

    for (double x = 0.02; x < 50.0 ; x = x + 0.02){
        double bj = Bessel_J(-10.5, x);
        System.out.println(x+" "+bj);
    }

}

(预先计算并存储在数组中的gammas只是因为在其余代码中使用了bessel函数,以避免不必要地重新计算)

我写的函数适用于低x值但随后失去稳定性。对于在x = 30左右后我使用的v = -10.5值。如图所示。

enter image description here

在wolfram alpha网站上说mathematica使用相同的方程来计算bessel函数,mathematica的BesselJ函数可以计算

Show[Plot[BesselJ[-10.5, x], {x, 0, 50}], ImageSize -> Full]

不失稳定性。

enter image description here

对于如何纠正我的函数或使用Java计算二阶bessel函数的替代方法的任何建议都将非常感激。

请说明任何澄清是否有用。

谢谢

0 个答案:

没有答案