我正在尝试使用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函数。
然而,这个等式要求第一阶bessel函数接受apache BesselJ函数不能接受的负v值。
我编写了一个程序来计算BesselJ函数,使用公式接受负值(Numerical Recipes 6.4.1)
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值。如图所示。
在wolfram alpha网站上说mathematica使用相同的方程来计算bessel函数,mathematica的BesselJ函数可以计算
Show[Plot[BesselJ[-10.5, x], {x, 0, 50}], ImageSize -> Full]
不失稳定性。
对于如何纠正我的函数或使用Java计算二阶bessel函数的替代方法的任何建议都将非常感激。
请说明任何澄清是否有用。
谢谢