实验五:Romberg算法
上一次实验课我们练习使用复化求积公式的使用,先来看一下上一次实验课的内容:
实验内容:将[0,1]区间4等分,仅有等分点的函数值,分别用复化梯形公式、复化Simpson公式和复化Cotes公式计算定积分I=∫_01▒1/(1+x2 )dx的近似值.
实验结果:
复化梯形公式求得此定积分的近似值为:0.782794
复化Simpson公式求得此定积分的近似值为:0.785398
复化Cotes公式求得此定积分的近似值为:0.785529
本节课我们练习使用Romberg算法计算定积分I=∫_01▒1/(1+x2 )dx的近似值,要求误差小于10-6。
实验步骤:可以按照书上的学习步骤,先按不同的二分区间计算梯形公式的计算结果,可以先计算到T8,然后再得到S序列、C序列和R序列,误差的判断只需要判断两次的结果之间的误差就可以。
#include <stdio.h>
#include <math.h>
# define f(x) 1/(1+x*x)
void main()
{
double t[5][5],a=0,b=1,temp,h,add;
int n,k=0;
t[0][0]=(b-a)*(f(a)+f(b))/2;
for(k=1;k<=4;k++)
{
n=int(pow(2,k));//n表示区间份数
h=(b-a)/n;//h表示二分k次后的区间宽度
t[k][0]=t[k-1][0]/2;
add=pow(2,k-1);//add 表示每段区间新增加的节点
for(int m=1;m<=add;m++)
{
temp=(m-1)*(2*h)+h;
t[k][0]+=(h*f(temp));
}
}//这一段是变步长的梯形公式
/*for(int i=0;i<=4;i++)
printf("t[%d][0]=%f\n",i,t[i][0]);*/
//接下来这一段是完成加速
for(int j=1;j<=4;j++)//j表示列号
{
for(int i=j;i<=4;i++)//i表示行号
{
t[i][j]=( );
}
}
//这一段是按列输出结果
for(j=0;j<=4;j++)
{
for(int i=j;i<=4;i++)
{
printf("t[%d][%d]=%f\n",i,j,t[i][j]);
}
}
}