自适应复化辛普森公式求积算法(C语言实现)
利用复化辛普森公式求积分自适应步骤
h为步长,a为积分下限,b为积分上限,f为积分函数,n为划分的积分次数,ε为允许误差限(若要求精度为10的负n次方,则误差限为0.5乘以10的负n次方)
基于C语言实现的代码
代码中积分函数f(x)为1/(1+x^2)(在step2中的for循环中可以看到,如需改变函数则改变这里的值)
#include "stdio.h"
void step2(double *h, int *n, double *S, double *S1, double *S2)
{
int i = 0;
*S = 0;
for(i = 0; i < *n; i++)
{
*S += ( 2.0/(1 + ((i+0.25)*(*h) - 4) * ((i+0.25)*(*h) - 4) ) - 1/(1 + ((i+0.5)*(*h) - 4) * ((i+0.5)*(*h) - 4) ) + 2.0/(1 + ((i+0.75)*(*h) - 4) * ((i+0.75)*(*h) - 4) ));
}
*S2 = 0.5 * (*S1) + (*h)/6.0 * (*S);
}
int step3(double *S1, double *S2)//判断精度是否满足
{
if((*S1 - *S2)>0)
{
if((*S1 - *S2) < 0.0000005)//0.0000005为10的负6次方精确度
return 1;
else
return 0;
}
else
{
if((*S2 - *S1) < 0.0000005)
return 1;
else
return 0;
}
}
main()
{
double h = 8;
int n = 1;
int j = 0;
double S = 0;
double S1 = 280.0/51.0;
double S2 = 0;
step2(&h, &n, &S, &S1, &S2);
while(!step3(&S1, &S2))
{
h /= 2.0;
n *= 2;
S1 = S2;
step2(&h, &n, &S, &S1, &S2);
}
printf("%.10f",S2);
}