一个数值积分的matlab实现(带附录)_第1页
一个数值积分的matlab实现(带附录)_第2页
一个数值积分的matlab实现(带附录)_第3页
一个数值积分的matlab实现(带附录)_第4页
一个数值积分的matlab实现(带附录)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——一个数值积分的matlab实现(带附录)

学校代码:11059学号:1107011027

HefeiUniversity

毕业论文(设计)

BACHELORDISSERTATION

论文题目:一个通用数值积分的MATLAB实现学位类别:理学学士学科专业:信息与计算科学姓名:黄凯

导师姓名:段敏完成时间:2023年5月20日

一个通用数值积分的MATLAB实现

摘要

当我们在现实生活和学习研究中需要运用积分来解决某些问题的时候,我们往往会由于这个积分是否能求出确切解以及积分求解的难易程度而感到苦恼。虽然数值积分中巧妙的利用积分中值定理利用各种算法可以近似的求出积分的近似解,但是往往利用单一公式求出的解确切度不是很高,假使要提高精度就涉及到公式的复化问题。在复化公式中我们采用多区间逐步迫近的方法可以让计算结果更加接近确切值,但这样我们的计算量也会跟着加大。Matlab的出现虽然将人们从繁复的计算中解放出来,但若要利用matlab来解决问题就会涉及到matlab编程问题,这会给一般的用户带来很大困难。虽然在各个文献中数值积分的各个公式的matlab程序已屡见不鲜,但终究都是零散单一的对单个公式的编程,没有统一的通用数值积分程序。

本文通过对数值积分的各种算法如:矩形公式、梯形公式、牛顿-柯茨公式等以及这些公式在matlab中的算法实现的比较,将尝试编写出统一的调用程序。根据问题的实际要求选择性的调用某种算法,这样不仅能将错综繁杂的数值积分问题集中化、简单化,更能提高解决问题的效率。所以这篇文章的着重点也就在通用数值积分程序的编写及使用上。

其次章数值积分几种公式探析

2.1数值积分方法的原理

从公式来看:?baf(x)dx?f(?)(b?a)(1)

我们利用积分中值定理得到上面所示的公式,我们所见到的一般的数值积分公式也是由该公式蜕变而来。当f(?)不能求出确切解的时候,我们就只能通过提供不同的近似方法来对f(?)求近似解,这样我们就能求出该函数积分的近似解。当然根据不同的近似方法所求出的f(?)的近似值与确切值之间的误差也会有所不同。因此我们要根据误差要求选择不同的近似方法。

2.2矩形公式

当我们取一个点来近似代替f(?)的值的时候,就会蜕变出我们平日常见的矩形公式。

当我们用f(a)来近似代替f(?)的值的时候,就蜕变成我们平日见到的左矩形公式:

?baf(x)dx?f(a)(b?a)(2)

当我们用f(b)来近似代替f(?)的值的时候,就蜕变成我们平日见到的右矩形公式:

?baf(x)dx?f(b)(b?a)(3)

1当我们用f((a?b))来近似代替f(?)的值的时候,就蜕变成我们平日所见

2的中矩形公式:

?ba1f(x)dx?f((a?b))(b?a)2(4)

2

根据曲线的走势不同,选择左矩形和右矩形近似求解的时候会浮现偏大或偏小的状况,用中矩形方法来求解相对来说误差会小一点。

2.3梯形公式

如图2.3.1所示当我们用两个点f(a)和f(b)的平均值来近似代替f(?)的值的时候,就蜕变成我们平日所见到的梯形公式:

?baf(x)dx?1(f(a)?(b))(b?a)2(5)

图2.3.1梯形公式示意图

相对于矩形公式用一个点来近似代替f(?)的值来说,梯形公式用两个点的平均值来代替f(?)的值,其相对误差要小一点,确切度高一点。

2.4辛普森公式

1当我们选取三个点f(a)、f(b)和f(c)=f((a?b))的值来计算f(?)的近似

2值的时候,我们可以得出辛普森公式:

?baf(x)dx?(b?a)[f(a)?(b)?4f(c)]6(6)

运用辛普森公式近似求出的积分结果相对于矩形公式和梯形公式来说确切度更高一些,但计算方法相对来说也繁杂一点。

3

2.5牛顿-柯茨公式

当我们选取5个点x0、x1、x2、x3、x4来计算f(?)的近似值的时候,我们就能得到平日所见到的的牛顿-柯茨公式[4]:

?baf(x)dx?(b?a)[7f(x0)?32f(x1)?12f(x2)?32f(x3)?7f(x4)]

90(7)

牛顿-柯茨公式相对于前面的几个公式来说,计算误差更小,精度更高,但是计算的繁杂程度也更高。

2.6自适应数值积分

用自适应积分法解决问题的时候,我们往往取非等间距的节点,我们可以在函数值变化较大的区间采用较小的步长进行计算,其基础是辛普森公式(当然我们也可以采用其他的公式来自适应)。计算关键是结果能否通过精度测试。对于自适应积分法来说我们给出不同的精度,我们在进行区间划分的时候所划分的区间分数也会有相应的要求,一般来说划分的区间越小,精度越大(详情见程序调试实例)。

4

第三章Matlab编程程序

MATLAB是由MathWorks公式开发的一种主要用于数值计算及可视化图形处理的工程语言,是当今最优秀的科技应用软件之一。它将数值计算、矩阵运算、图形图像处理、信号处理和仿真等诸多强大的功能集成在较易使用的交互计算机环境中,为科学研究、工程应用提供了一种功能强、效率高的编程工具[5]。在上一章中我们所提到的各种积分公式均是单一的积分公式,假使将这些公式复化(以矩形公式为例,当我们将一段曲线所围成的面积近似看成一个矩形的时候就是单一的矩形公式,而当我们将这段曲线所围成的面积划分成若干个等步长的小矩形的面积的和的时候就是矩形公式的复化),这样计算出来的结果的误差也会随复化程度的增加而减小。但是计算量也会随着等分区间的增多而变大,人工计算花费的时间会比较多,这时我们就可以使用matlab编写程序来代替人工计算。从以往所发表的文章中各种公式的matlab运算程序已经司空见惯,但是都是单一的程序,没有通用的计算程序。本文将在数值积分的通用matlab程序上做一些摸索。

下面我们将编写通用数值积分的matlab程序,该程序用MATLAB7.0编写,运行坏境:1、硬件环境CPU(intelCorei3-2310M,2.1GHz),内存(2GB昱联),2、软件环境windows7(32位)操作系统。以下编写的算法程序,部分代码

输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,10,'mjx')按回车键显示结果如下:f=0.7856n=10

(2)100等份(n=100)输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,100,'mjx')按回车键显示结果:f=0.7854n=100

(3)1000等份(n=1000)输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,1000,'mjx')按回车键显示结果如下:f=0.7854n=1000

3.2.2梯形公式调用实例(计算不同等分份数的积分值)

(一)10等份输入函数变量:

>>f=inline('1/(1+x*x)');

7

>>[f,n]=tyszjf(f,0,1,10,'tx')按回车键显示结果如下:f=0.7850n=10

(二)100等份输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,100,'tx')按回车键显示结果如下:f=0.7854n=100

(三)1000等份输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,1000,'tx')按回车键显示结果如下:f=0.7854n=1000

3.2.3辛普森公式调用实例

(一)10等份输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,10,'sps')按回车键显示结果如下:

8

f=0.7854n=10

(二)100等份输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,100,'sps')按回车键显示结果如下:f=0.7854n=100

(三)1000等份输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,1000,'sps')按回车键显示结果如下:f=0.7854n=1000

(四)精度要求不同时

(1)wc=0.5*10^(-7)输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,n,'sps',0.5*10^(-7))按回车键显示结果如下:f=0.7854n=100

(2)wc=0.5*10^(-8)

9

输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,n,'sps',0.5*10^(-8))按回车键显示结果如下:f=0.7854n=100

3.2.4牛顿-柯茨公式调用实例

(一)10等份输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,10,'nc')按回车键显示结果如下:f=0.7854n=10

(二)100等份输入函数变量:

>>f=inline('1/(1+x*x)');>>[f,n]=tyszjf(f,0,1,100,'nc')按回车键显示结果如下:f=0.7854n=100

(三)1000等份输入函数变量:

>>f=inline('1/(1+x*x)');

10

>>[f,n]=tyszjf(f,0,1,1000,'nc')按回车键显示结果如下:f=0.7854n=1000

3.2.5自适应积分调用实例

(一)wc=0.5*10^(-6)输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,n,'zsy',0.5*10^(-6))按回车键显示结果如下:f=0.7854n=8

(二)wc=0.5*10^(-7)输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,n,'zsy',0.5*10^(-7))按回车键显示结果如下:f=0.7854n=8

(三)wc=0.5*10^(-5)输入函数变量:

>>f=inline('1/(1+x*x)');

>>[f,n]=tyszjf(f,0,1,n,'zsy',0.5*10^(-5))按回车键显示结果如下:

11

wcs1=s2;n=n*2;s=0;h=(b-a)/n;fori=1:n

s=s+4*f(a+(i-1/2)*(h));end;fori=1:n-1s=s+2*f(a+i*h);

19

end;

s=(f(

温馨提示

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

评论

0/150

提交评论