梯形积分和3点Gauss积分2.docx

上传人:b****5 文档编号:3433247 上传时间:2022-11-23 格式:DOCX 页数:13 大小:216.12KB
下载 相关 举报
梯形积分和3点Gauss积分2.docx_第1页
第1页 / 共13页
梯形积分和3点Gauss积分2.docx_第2页
第2页 / 共13页
梯形积分和3点Gauss积分2.docx_第3页
第3页 / 共13页
梯形积分和3点Gauss积分2.docx_第4页
第4页 / 共13页
梯形积分和3点Gauss积分2.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

梯形积分和3点Gauss积分2.docx

《梯形积分和3点Gauss积分2.docx》由会员分享,可在线阅读,更多相关《梯形积分和3点Gauss积分2.docx(13页珍藏版)》请在冰豆网上搜索。

梯形积分和3点Gauss积分2.docx

梯形积分和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]);

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1