高斯勒让德积分提高精度的问题
为了做一个程序,需要求解一个积分,想到用的是高斯勒让德积分,下边的函数是从别的地方弄到的。我自己也试了一下,如果仅仅用高斯勒让德积分直接求想要的积分,即使弄到了15阶,还是精度不够,下载的这个函数里面用了一个方法把这个精度提高了。
可是没看懂,请高手帮忙解惑,谢谢
static double fk(k,f)
double k,f;
{ int m,i,j;
double s,p,ep,h,aa,bb,w,xx,g,q;
static double t[15]={-0.98799251802067,
-0.93727339240030,
-0.84820658341075,
-0.72441773136004,
-0.57097217260858,
-0.39415134707756,
-0.20119409399743,
0,
0.20119409399743,
0.39415134707756,
0.57097217260857,
0.72441773136009,
0.84820658341064,
0.93727339240040,
0.98799251802063};
static double c[15]={0.03075324199563,
0.07036604748857,
0.10715922046708,
0.13957067792619,
0.16626920581700,
0.18616100001556,
0.19843148532711,
0.20257824192556,
0.19843148532711,
0.18616100001557,
0.16626920581698,
0.13957067792617,
0.10715922046709,
0.07036604748844,
0.03075324199577};
m=1; g=0.0;
h=fabs(f); s=fabs(0.0001*h);
p=1.0e+35; ep=0.000001;
while ((ep>=0.0000001)&&(fabs(h)>s))
{ g=0.0;
for (i=1;i<=m;i++)
{ aa=(i-1.0)*h; bb=i*h;
w=0.0;
for (j=0;j<=14;j++)
{ xx=((bb-aa)*t[j]+(bb+aa))/2.0;
q=sqrt(1.0-k*k*sin(xx)*sin(xx));
w=w+c[j]/q;
}
g=g+w;
}
g=g*h/2.0;
ep=fabs(g-p)/(1.0+fabs(g));
p=g; m=m+m; h=0.5*h;
}
return(g);
}