首先是下不完全伽马函数的定义:
如果按照定义使用c++按照积分形式写,精度会受到积分的影响,并且影响较大,在gamma函数斜率较大的一些点结果误差会较大。
本文按照百度百科提供的下不完全伽马函数的解析延拓的展开式进行c++程序编写。
解析延拓展开式:
根据此式得到的是精确地gamma函数值,但是c++无法进行无穷次的循环累加,因此只需根据自己所需精度设置k的累加次数即可。(一般情况下k=10精度就已足够)
附上c++代码:
#include "device_launch_parameters.h"
#include <math.h>
#include <stdio.h>
float gamma(double x, double s)
{
double a = 0;
float res = 0;
for (int i = 0; i < 10; i++)//i为级数,i越大精度越高,用时越多。
{
a += pow(x, i) / tgamma(s + i + 1);
}
res = (pow(x, s) * tgamma(s) * a * exp(-x)) / tgamma(s);
return res;
}
int main()
{
float a = gamma(1.3, 1.5);
printf("%f", a);
}
上面i=10时的输出与MATLAB中gammainc()函数输出完全一致。