天天看点

C++实现第一类贝塞尔函数

第一类贝塞尔函数

这几天实习碰到了半整阶的第一类的贝塞尔函数,而且是复数域的。最开始在网上查资料是用递推公式求解的,因为在计算特殊值J(1/2)和J(-1/2)的过程中会省略掉很多项并不精确,且在递推过程中也会省略很多项,导致最终递推得到的结果并不精确,故而又改为实现贝塞尔函数的定义函数。

定义公式:

C++实现第一类贝塞尔函数

递推公式:

C++实现第一类贝塞尔函数

求导递推公式:

对贝塞尔函数求导是用的如下递推公式,需要保证贝塞尔函数一定要算的精确,求导结果才能精确。

C++实现第一类贝塞尔函数

该函数的n可以取任意值,包括负数、小数。因为项目需要,z为复数,把虚部设为0,同样适用于实数。

std::complex<double> JFunction(const double n, const std::complex<double>& z) {	
	std::complex<double> sum(0.0, 0.0);
	std::complex<double> temp(0.0, 0.0);
	int m = 0;
	while (m <= 15)
	{
		temp = pow(-1, m) / gamma(n + m + 1)/ gamma(m + 1)* pow(0.5 * z, 2.0 * m + n);
		sum += temp;
		m++;
	}
	return sum;
}
           

注:while循环在n=12时基本已经收敛,之前设置循环100次,在项目里跑的时候太卡了,设置成15就可以了。

继续阅读