C语言-用六种方法求定积分_第1页
C语言-用六种方法求定积分_第2页
C语言-用六种方法求定积分_第3页
C语言-用六种方法求定积分_第4页
C语言-用六种方法求定积分_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

描述问题利用①左矩形公式,②中矩形公式,③右矩形公式,④梯形公式,⑤simpson公式,⑥Gauss积分公式求解定积分。分析问题2.1定积分21.1定积分的定义定积分就是求函数在区间中图线下包围的面积。即所包围的面积。这个图形称为曲边梯形,特例是曲边梯形。如下列图:〔图1〕设一元函数,在区间内有定义。将区间分成个小区间。设,取区间中曲线上任意一点记做,作和式:假设记λ为这些小区间中的最长者。当时,假设此和式的极限存在,那么称这个和式是函数在区间上的定积分。记作:其中称为积分下限,为积分上限,为被积函数,为被积式,∫为积分号。之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,而不是一个函数。21.2定积分的几何意义[1]它是介于x轴、函数f(x)的图形及两条直线x=a,x=b之间的各个局部面积的代数和。在x轴上方的面积取正号;在x轴下方的面积取负号。如图2.2言实现定积分计算的算法22.1利用复合梯形公式实现定积分的计算假设被积函数为,积分区间为,把区间等分成个小区间,各个区间的长度为,即,称之为“步长〞。根据定积分的定义及几何意义,定积分就是求函数在区间中图线下包围的面积。将积分区间等分,各子区间的面积近似等于梯形的面积,面积的计算运用梯形公式求解,再累加各区间的面积,所得的和近似等于被积函数的积分值,越大,所得结果越精确。以上就是利用复合梯形公式实现定积分的计算的算法思想。复合梯形公式:[2]具体算法如下:算法一1:输入积分区间的端点值和;2:输入区间的等分个数〔要求尽可能大,以保证程序运行结果有较高的精确度〕;3:计算步长;4:对累加和赋初值;5:计算累加和6:算出积分值;7:输出积分近似值,完毕。1.2.2利用Smpson公式实现定积分的计算假设被积函数为,积分区间为,把区间等分成个小区间,各个区间的长度为。在复合梯形公式的根底上,构造出一种加速计算积分的方法。作为一种外推算法,它在不增加计算量的前提下提高了误差的精度。具体算法如下:算法二1:输入积分上限和下限;2:输入区间的等分个数〔要求尽可能大,以保证程序运行结果有较高的精确度〕;3:利用辛甫生公式:[2],实现对定积分的求解〔其中,均为梯形公式计算所得的结果,由此可见辛甫生公式是以梯形公式为根底的〕;4:算出积分值;5:输出积分近似值,完毕。1.2.3利用Guass公式实现定积分计算Guass型求积公式是构造高精度差值积分的最好方法之一。他是通过让节点和积分系数待定让函数f(x)以此取i=0,1,2....n次多项式使其尽可能多的能够精确成立来求出积分节点和积分系数。高斯积分的代数精度是2n-1,而且是最高的。通常运用的是-1---+1的积分节点和积分系数,其他积分域是通过变换x=(b-a)t/2+(a+b)/2变换到-1到1之间积分。算法三1:输入积分上限和下限;2:利用Guass公式,求定积分4:算出积分值;5:输出积分近似值,完毕。程序的编写3.1程序一〔左矩形公式〕3.1.1源程序#include<stdio.h>#include<math.h>voidmain(){doublef(doublex);/*f(x)为函数举例,即被积函数*/inti,n;/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n:\n");scanf("%d",&n);h=(b-a)/n;/*步长的计算*/s=f(a)*h;for(i=1;i<n;i++){s=s+f(a+i*h)*h;}printf("函数f(x)的积分值为s=%10.6f\n",s);}/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;y=sqrt(4-x*x);return(y);}3.1.2程序一的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.2程序二〔中矩形公式〕3.2.1源程序#include<stdio.h>#include<math.h>voidmain(){doublef(doublex);/*f(x)为函数举例,即被积函数*/inti,n;/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n:\n");scanf("%d",&n);h=(b-a)/n;/*步长的计算*/s=0.5*(f(a)+f(a+h))*h;for(i=1;i<n;i++){s=s+0.5*(f(a+i*h)+f(a+(i+1)*h))*h;}printf("函数f(x)的积分值为s=%10.6f\n",s);}/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;y=sqrt(4-x*x);return(y);}3.2.2程序二的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.3程序三〔右矩形公式〕3.3.1源程序#include<stdio.h>#include<math.h>voidmain(){doublef(doublex);/*f(x)为函数举例,即被积函数*/inti,n;/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n:\n");scanf("%d",&n);h=(b-a)/n;/*步长的计算*/s=f(a+h)*h;for(i=1;i<n-1;i++){s=s+f(a+(i+1*h))*h;}printf("函数f(x)的积分值为s=%10.6f\n",s);}/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;y=sqrt(4-x*x);return(y);}3.3.2程序三的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.4程序四〔梯形公式〕3.4.1源程序#include<stdio.h>#include<math.h>voidmain(){doublef(doublex);/*f(x)为函数举例,即被积函数*/inti,n;/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n:\n");scanf("%d",&n);h=(b-a)/n;/*步长的计算*/s=0.5*(f(a)+f(a+h))*h;for(i=1;i<n;i++){s=s+0.5*(f(a+i*h)+f(a+(i+1)*h))*h;}printf("函数f(x)的积分值为s=%10.6f\n",s);}/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;y=sqrt(4-x*x);return(y);}3.4.2程序四的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.5程序五〔Simpson公式〕3.5.1源程序#include<stdio.h>#include<math.h>voidmain(){doubleT(doublex,doubley,intz);doublea,b,s;intn;printf("积分下限a:\n");scanf("%lf",&a);printf("积分上限b:\n");scanf("%lf",&b);printf("区间等分个数n:\n");scanf("%d",&n);s=(4*T(a,b,2*n)-T(a,b,n))/3;/*利用辛甫生公式求解定积分*/printf("函数f(x)的积分值为s=%f\n",s);}/*以下为复合梯形公式的定义*/doubleT(doublex,doubley,intz){doubleh,Tn;inti;doublef(doublet);h=(y-x)/z;Tn=(f(x)+f(y))/2;for(i=1;i<z;i++)Tn=Tn+f(x+i*h);Tn=Tn*h;return(Tn);}/*以下为被积函数的定义,即函数举例*/doublef(doublet){doubles;s=sqrt(4-t*t);return(s);}3.5.2程序四的编译运行被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:输入0+回车输入2+回车输入1000+回车3.6程序六〔Guass公式〕3.6.1源程序#include<stdio.h>#include<math.h>#defineN3floatgass_integral(float(*)(float),float,float,int);voidmain(){floatfunction_name(float);floata,b;printf("请输入积分上限b\n");scanf("%f",&b);printf("请输入积分下限a\n");scanf("%f",&a);floatans;ans=gass_integral(function_name,a,b,N);printf("ans=%f",ans);}//高斯求积:代数精度为2n-1.-1---+1之间floatgass_integral(float(*func)(floatx),floata,floatb,intn){//高斯点及其求积系数列表-------------------------------------------------------------------------------------------floatx1[1]={0.0};floatA1[1]={2};floatx2[2]={-0.5573503,0.5573503};floatA2[2]={1,1};floatx3[3]={-0.7745967,0.0,0.7745967};floatA3[3]={0.555556,0.888889,0.555556};floatx4[4]={0.3399810,-0.3399810,0.8611363,-0.8611363};floatA4[4]={0.6521452,0.6521452,0.3478548,0.3478548};floatx5[5]={0.0,0.5384693,-0.5384693,0.9061799,-0.9061799};floatA5[5]={0.5688889,0.4786287,0.4786287,0.2369269,0.2369269};//----------------------------------------------------------------------------------------------------------------------------------float*p,*t;switch(n){case1:p=x1;t=A1;break;case2:p=x2;t=A2;break;case3:p=x3;t=A3;break;case4:p=x4;t=A4;break;case5:p=x5;t=A5;break;default:printf("intputwrong!");}floatg=0;for(inti=0;i<n;i++){g+=(*func)((b-a)*p[i]/2+(a+b)/2)*t[i];}g*=(b-a)/2;ret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论