前几天做项目中的一个算法,需要用到贝塞尔函数(半整阶,复数域),网上的代码一般都要收费,索性自己撸了一个,其中涉及伽马函数值求取,下面是我的思路与实现,供大家免费使用。
第一步:首先介绍一下Gamma函数。
(1)在实数域上伽玛函数定义为:
(2)在复数域上伽玛函数定义为:
上述两个定义在百度百科上可以查到。
第二步:设计思路简介
本实现的设计思路如下:
当时,Gamma函数为采用下列极限求值:
当时,Gamma函数为采用 递推至 。
当时, 。
当时,Gamma函数为采用 递推至 。
第三步:实现Gamma函数。
#include <cmath>
//伽马函数(辅助函数,用于求解贝塞尔函数,任意阶数)
//x 变量值
//setAbsRelaErr 相对误差绝对值
double gamma(const double x, const double setAbsRelaErr){
//初始条件判断
if (abs(1.0 - x) < 0.00001) {
return 1.0;
}else if (abs(x - 0.5) < 0.00001) {
return sqrt(3.1415926);
}
//递归求取伽马函数值
if (x > 1.0){
return (x-1)*gamma(x - 1, setAbsRelaErr);
}else if (x < 0.0) {
return gamma(x + 1, setAbsRelaErr)/ x ;
}
double res = 0.0;
double temp = 1.0;
double check = 0.0;
int i = 1;
while (abs((check - temp)/ temp)> setAbsRelaErr)
{
check = temp;
temp *= i / (x - 1 + i);
i++;
}
res = temp * pow(i, x - 1);
return res;
}
第四步:验证
提示:cmath里面提供了 double tgamma(double)函数直接求取伽玛函数值(我也是做着做着了解到的,哎,知识面太窄了)