数值分析中的龙贝格算法,是用来求积分的,算法主要是通过不停的迭代,使得最终积分函数值和真实函数值逼近。
对于足够“光滑”的函数来说,收敛速度比较快
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define M_PI 3.14159265358979323846
#define M_E 2.71828182845904523536
#define FUN(x) pow(4 - pow(sin((x)),2),0.5)
#define FUN2(x) ((x)*pow((x)*(x) + 1,0.5))//积分函数
#define N 20 //最大加速次数
#define A 0 //积分区间
#define B 3//积分区间
#define FAC 1//积分函数前面的系数
#define T_ZERO 1.423024947075771e+001//第一次用梯形公式时积分函数值
void main()
{
double T[N][N];
int k,m;
int i,j;
T[0][0] = T_ZERO;
T[1][0] = 6.866658294205204e-001;
for(k = 1;k<N;k++)
{
double t = 0,h = (B-A) * pow(0.5,k);
int n = (int)pow(2,k-1);
#ifdef DEBUG_M
printf("%d\t %lf\n",n,h);
#endif
for( m = 0;m < n;m++)
{
t += h * FUN2(h + 2*h*m);
}
T[k][0] = 0.5*T[k-1][0] + t;
}
for(k = 1;k<N;k++)
{
for(m = 1;m<=k;m++)
T[k][m] = pow(4,m)/(pow(4,m)-1) * T[k][m-1] - 1/(pow(4,m)-1) * T[k-1][m-1];
if(fabs(T[k][k] - T[k-1][k-1]) < 1e-5)
break;
}
for(i = 0;i<=k;i++)
for(j = 0;j<=i;j++)
T[i][j] *= FAC;
for(i = 0;i<=k;i++)
{
for(j = 0;j<=i;j++)
printf("%.15lf\t\t",T[i][j]);
printf("\n");
}
}
#include<stdlib.h>
#include<math.h>
#define M_PI 3.14159265358979323846
#define M_E 2.71828182845904523536
#define FUN(x) pow(4 - pow(sin((x)),2),0.5)
#define FUN2(x) ((x)*pow((x)*(x) + 1,0.5))//积分函数
#define N 20 //最大加速次数
#define A 0 //积分区间
#define B 3//积分区间
#define FAC 1//积分函数前面的系数
#define T_ZERO 1.423024947075771e+001//第一次用梯形公式时积分函数值
void main()
{
double T[N][N];
int k,m;
int i,j;
T[0][0] = T_ZERO;
T[1][0] = 6.866658294205204e-001;
for(k = 1;k<N;k++)
{
double t = 0,h = (B-A) * pow(0.5,k);
int n = (int)pow(2,k-1);
#ifdef DEBUG_M
printf("%d\t %lf\n",n,h);
#endif
for( m = 0;m < n;m++)
{
t += h * FUN2(h + 2*h*m);
}
T[k][0] = 0.5*T[k-1][0] + t;
}
for(k = 1;k<N;k++)
{
for(m = 1;m<=k;m++)
T[k][m] = pow(4,m)/(pow(4,m)-1) * T[k][m-1] - 1/(pow(4,m)-1) * T[k-1][m-1];
if(fabs(T[k][k] - T[k-1][k-1]) < 1e-5)
break;
}
for(i = 0;i<=k;i++)
for(j = 0;j<=i;j++)
T[i][j] *= FAC;
for(i = 0;i<=k;i++)
{
for(j = 0;j<=i;j++)
printf("%.15lf\t\t",T[i][j]);
printf("\n");
}
}
浙公网安备 33010602011771号