梯形积分和3点Gauss积分2.docx
《梯形积分和3点Gauss积分2.docx》由会员分享,可在线阅读,更多相关《梯形积分和3点Gauss积分2.docx(13页珍藏版)》请在冰豆网上搜索。
梯形积分和3点Gauss积分2
实验六
一、实验名称
复合梯形积分和复化3点Gauss积分计算数值积分
二、实验目的与要求:
实验目的:
掌握复合梯形积分和复化3点Gauss积分算法。
实验要求:
1.给出复合梯形积分和复化3点Gauss积分算法思路,
2.用C语言实现算法,运行环境为MicrosoftVisualC++。
三、算法思路:
1.复合梯形积分
我们把整个积分区间[a,b]分成n个子区间[xi,xi+1],i=0,1,2,…,n,其中x0=a,xn+1=b。
这样求定积分问题就分解为求和问题:
当这n+1个结点为等距结点时,即
,i=0,1,2,…,n,复化梯形公式的形式是
算法:
inputn
fori=1tondo
enddo
outputS
2.复化3点Gauss积分
根据书上6.8节定理5,可以用递推法求正交多项式如下:
,
,
,
求
的根,得到
,
,
,则积分可近似表示为如下形式
,将
带入其中得到
,带入上式得到复化3点Gauss积分公式。
分别在每个小区间上应用三点Gauss积分并求和,便得到复合三点Gauss积分法数值积分值。
算法:
inputn,a,b
h=(a+b)/2
fori=1ton
do
,
,
,
enddo
outputS
四、实验题目:
为了方便起见,我们采取复合梯形积分的方法取N充分大时(这里取N等于2的20次方)得到的积分值近似看作积分的真实值,因为题中的积分函数在积分闭区域上是一致连续的,所以由黎曼积分的定义知在N充分大的情况下,复化梯形积分的值充分接近原积分值,故我们这样做是合理的。
五、问题的解:
编写程序(程序见后面附录),输出结果如下:
为了便于看清数值积分结果与原函数积分实际结果的差异。
我在运行程序时故意计算了一下原函数积分的近似真实结果。
分析并比较得到的数据可以看出,当k越来越大时,error1和error2越来越接近于零,数值积分的结果越来越靠近原函数积分实际结果,并且error2比error1更快地接近于零。
误差比率总是大于零的,当误差比率越大,误差减小得越快。
复合梯形积分的误差项是
.,
,当h趋于零时,显然积分的误差项更快地趋于零,实验结果复符合这一结论。
观察复化3点Gauss积分结果,发现每个结果的误差已经早早地为零了,而三个复合梯形积分的误差还是大于零的,所以我们可以得到结论,使用复化3点Gauss积分能够更精确地得到积分值。
六、附录:
实验编程,运行环境为MicrosoftVisualC++
第一个积分的程序:
#include
#include
#include
doublef(doublex)//定义函数f(x)//
{
doubley;
y=exp(-x*x);
return(y);
}
doubleR(intN,doublea,doubleb)//建立复合梯形积分//
{
doubles,h;
inti;
h=(b-a)/N;s=0.0;
for(i=1;i<=N;i++)
{
s=s+h*(f(a+(i-1)*h)+f(a+i*h))/2.0;
}
return(s);
}
doubleT(intN,doublea,doubleb)//建立复化3点Gauss积分//
{
doubles,h,A1,A2,A3,x1,x2,x3;
inti;
h=(b-a)/N;s=0.0;
for(i=1;i<=N;i++)
{
A1=A3=5.0*h/18.0;A2=4.0*h/9.0;
x1=a+(i-1/2.0)*h-sqrt(3.0/5.0)*h/2.0;
x2=a+(i-1/2.0)*h;
x3=a+(i-1/2.0)*h+sqrt(3.0/5.0)*h/2.0;
s=s+A1*f(x1)+A2*f(x2)+A3*f(x3);
}
return(s);
}
voidmain()//main函数进行最终运算并输出结果//
{
intk,N;
doubles1[8],s2[8],s,error1[8],error2[8];
printf("对第一个积分\n");
s=R(pow(2,20),0.0,1.0);
printf("s1代表复合梯形积分\n");
error1[0]=0.0;
for(k=1;k<=7;k++)
{N=pow(2,k);
s1[k]=R(N,0.0,1.0);
error1[k]=fabs(s1[k]-s);
printf("N=%d,s1=%.12f,error1=%.12f,比率=%.12f\n",
N,s1[k],error1[k],error1[k-1]/error1[k]);
}
printf("\ns2代表复化3点Gauss积分\n");
error2[0]=0.0;
for(k=1;k<=7;k++)
{N=pow(2,k);
s2[k]=T(N,0.0,1.0);
error2[k]=fabs(s2[k]-s);
printf("N=%d,s2=%.12f,error2=%.12f,比率=%.12f\n",
N,s2[k],error2[k],error2[k-1]/error2[k]);
}
}
第二个积分的程序:
#include
#include
#include
doublef(doublex)//定义函数f(x)//
{
doubley;
y=1.0/(1.0+x*x);
return(y);
}
doubleR(intN,doublea,doubleb)//建立复合梯形积分//
{
doubles,h;
inti;
h=(b-a)/N;s=0.0;
for(i=1;i<=N;i++)
{
s=s+h*(f(a+(i-1)*h)+f(a+i*h))/2.0;
}
return(s);
}
doubleT(intN,doublea,doubleb)//建立复化3点Gauss积分//
{
doubles,h,A1,A2,A3,x1,x2,x3;
inti;
h=(b-a)/N;s=0.0;
for(i=1;i<=N;i++)
{
A1=A3=5.0*h/18.0;A2=4.0*h/9.0;
x1=a+(i-1/2.0)*h-sqrt(3.0/5.0)*h/2.0;
x2=a+(i-1/2.0)*h;
x3=a+(i-1/2.0)*h+sqrt(3.0/5.0)*h/2.0;
s=s+A1*f(x1)+A2*f(x2)+A3*f(x3);
}
return(s);
}
voidmain()//main函数进行最终运算并输出结果//
{
intk,N;
doubles1[8],s2[8],s,error1[8],error2[8];
printf("对第二个积分\n");
s=R(pow(2,20),0.0,4.0);
printf("s1代表复合梯形积分\n");
error1[0]=0.0;
for(k=1;k<=7;k++)
{N=pow(2,k);
s1[k]=R(N,0.0,4.0);
error1[k]=fabs(s1[k]-s);
printf("N=%d,s1=%.12f,error1=%.12f,比率=%.12f\n",
N,s1[k],error1[k],error1[k-1]/error1[k]);
}
printf("\ns2代表复化3点Gauss积分\n");
error2[0]=0.0;
for(k=1;k<=7;k++)
{N=pow(2,k);
s2[k]=T(N,0.0,4.0);
error2[k]=fabs(s2[k]-s);
printf("N=%d,s2=%.12f,error2=%.12f,比率=%.12f\n",
N,s2[k],error2[k],error2[k-1]/error2[k]);
}
}
第三个积分的程序:
#include
#include
#include
#definePI3.1415926
doublef(doublex)//定义函数f(x)//
{
doubley;
y=1.0/(2.0+cos(x));
return(y);
}
doubleR(intN,doublea,doubleb)//建立复合梯形积分//
{
doubles,h;
inti;
h=(b-a)/N;s=0.0;
for(i=1;i<=N;i++)
{
s=s+h*(f(a+(i-1)*h)+f(a+i*h))/2.0;
}
return(s);
}
doubleT(intN,doublea,doubleb)//建立复化3点Gauss积分//
{
doubles,h,A1,A2,A3,x1,x2,x3;
inti;
h=(b-a)/N;s=0.0;
for(i=1;i<=N;i++)
{
A1=A3=5.0*h/18.0;A2=4.0*h/9.0;
x1=a+(i-1/2.0)*h-sqrt(3.0/5.0)*h/2.0;
x2=a+(i-1/2.0)*h;
x3=a+(i-1/2.0)*h+sqrt(3.0/5.0)*h/2.0;
s=s+A1*f(x1)+A2*f(x2)+A3*f(x3);
}
return(s);
}
voidmain()//main函数进行最终运算并输出结果//
{
intk,N;
doubles1[8],s2[8],s,error1[8],error2[8];
printf("对第三个积分\n");
s=R(pow(2,20),0.0,2*PI);
printf("s1代表复合梯形积分\n");
error1[0]=0.0;
for(k=1;k<=7;k++)
{N=pow(2,k);
s1[k]=R(N,0.0,2*PI);
error1[k]=fabs(s1[k]-s);
printf("N=%d,s1=%.12f,error1=%.12f,比率=%.12f\n",
N,s1[k],error1[k],error1[k-1]/error1[k]);
}
printf("\ns2代表复化3点Gauss积分\n");
error2[0]=0.0;
for(k=1;k<=7;k++)
{N=pow(2,k);
s2[k]=T(N,0.0,2*PI);
error2[k]=fabs(s2[k]-s);
printf("N=%d,s2=%.12f,error2=%.12f,比率=%.12f\n",
N,s2[k],error2[k],error2[k-1]/error2[k]);
}
}