MATLAB 数值分析与应用

MATLAB 数值分析与应用

MATLAB
数值分析与应用

宋叶志

等编

机械工业出版社

MATLAB 数值分析与应用

内 容 简 介
MATLAB 是数值分析领域使用最广泛的语言之一。本书首先讲述了 MATLAB 语言程序
设计基础,然后分别介绍了符号计算在微积分和复变函数两门大学数学基础课程中的应用,
接着系统的介绍了线性方程组、非线性方程与最优化方法、特征值与特征向量、插值与函数
逼近、估计方法和数据拟合、积分计算、常微分方程的数值方法。从实用角度考虑,本书许
多章节都给出了一些数值分析的应用范例,并在最后一章单独介绍了一些综合性较强的数学
建模问题。本书着重强调数值分析的基本原理与编程思想,并强调计算可视化,尽可能的从
多角度给出计算结果的图象表述。
本书可以作为大学理工科非数学类专业的本科生或研究生教材或参考书,同时可以作为
科技人员及和工程计算人员的参考工具书。

注:本电子书为作者原稿,与机械工业出版社的正式出版书籍有些区别。电子书中包含
原书中最后两章省略部分内容。因时间关系未作详细排版。

仅供个人学习与参考,请勿广泛传阅,机械工业出版社保留版权,谢谢!

MATLAB 数值分析与应用

数值分析是数学的一个分支,它是利用计算机求解各种数学问题的数值方法及相关理
论。现今,科学计算能力已经成为一个国家科技发展水平的一个重要标志。随着计算技术的
发展,曾经出现过多种的计算语言,经过几十年的变迁,有些语言被逐步淘汰了,MATLAB
以其顽强的生命力生存了下来,并且还在非常稳健的发展当中。MATLAB 集科学计算、图
象处理等多种功能于一体,而且其庞大的工具箱系统已经触及控制理论、信号处理、金融分
析、虚拟现实、航空航天、最优化、神经网络设计等诸多科学领域。
目前,MATLAB 版本已经更新至 2008 版。截止到目前,The Math Works 公司发布了
R2008b 版,R2008b 版新增了以下功能:
Ø 函数浏览器,以方便查找函数,还增加了函数自变量的查找功能。
Ø 一些产生随机数算法的函数。
Ø 支持 netCDF 和 JPEG2000 文件格式功能。
Ø 并行计算工具箱。
Ø 符号工具箱中增加了新的 notebook 接口,以用于管理和编制符号计算结果。
Ø 在统计工具箱中增加了 NLME 模型。
Ø 在计量经济学工具箱中,增加了一种新的经济预测方法和风险管理功能。
本书中提供的代码不限于具体的 MATLAB 版本,可以在 MATLAB6.5、7.0、2007、2008
等各版本上运行,作者编写的程序甚至可以在更低版本上运行。
全书分为 12 章和 4 个附录,概要如下:
第一章 “MATLAB 基础”
,比较详细的介绍了 MATLAB 编程的基本方法。这一章中,
从最基本的软件界面认识到程序设计方法都有涉及。初学者完全可以通过这一
章的学习掌握 MATLAB 程序设计的基本方法,并在随后章节的学习中逐增强
MATLAB 编程方法。
第二章 “MATLAB 在大学数学中的应用”

鉴于目前使用 MATLAB 在大学数学中的应
用相关书籍在市面上比较少。而且有些书籍则是用 MATLAB 有什么函数,就
讲什么应用,不顾及大学数学本身的系统性以及大学生在学习这门课程时的顺
序,鉴于此,这一章中则按照大学数学课程本身的内容安排实验顺序,这符合
一般学习大学数学的需要,同时可以让学生在学习基础数学时候就能够用
MATLAB 处理学习中的问题,增强学习兴趣。
第三章 “MATLAB 在复变函数中的应用”
,介绍了符号计算在复变函数中的一些基本
应用问题。复变函数是部分理工科的数学基础课程之一,如果对复变函数没有
兴趣或者用不到的读者可以跳过这一章不读,不影响后面章节的阅读。
第四章 “线性方程组的数值方法”
,线性方程组的数值方法是数值分析的基本问题之
一,其基本的计算方法主要可以分为直接方法和迭代方法。对于一些高阶方程
组,迭代法因简单好用而非常诱人,因为迭代法具有更强竞争力。大部分教材
采用先介绍直接法后介绍迭代法。事实上,迭代法涉及到的数学内容要深刻一
些,但是使用方法上却相对简单一些,所以在这一章中,首先介绍了一些重要
的迭代算法,随后介绍了一些直接算法。
第五章 “非线性方程求根”
,这一章中介绍了常用的求根方法,如二分法、不动点迭
代法、和牛顿迭代法等。迭代法使用起来虽然简单,但是其理论内涵很丰富。
这一章是非线性方程组计算方法的基础。

MATLAB 数值分析与应用

第六章 “非线性方程组与最优化方法”,介绍了多种非线性方程组与最优化的计算方
法。在一般的大学数值分析教材中,对非线性方程组介绍不多,考虑到一些科
技应用问题,所以这一章中比较详细的给了多种计算方法。
第七章 “矩阵特征值与特征向量”
,给出了矩阵特征值的不同计算方法。特征值与特
征向量也是数值分析的一个基本问题,这一章中除了介绍了一般的特征值计算
方法外,还介绍了广义特征值问题。
第八章 “插值与函数逼近”
,介绍了常用的插值与函数逼近方法。这一章的内容是许
多应用数学问题的基础,比如数值积分方法就以插值理论为基础。同时这一章
中,还比较详细的介绍了许多正交多项式问题。这一章的内容是相当重要的,
我们也花了比较大的篇幅来介绍。
第九章 “估计、滤波与数据拟合”
,这一章的内容以实用性较强为特点。在讲解时,
力求联系实际应用问题,同时又联系数学原理,让读者既直观的理解处理的方
法,同时又能真正有效的从数学上掌握这些工具。
第十章 “数值积分”,主要介绍了一般类型的数值积分方法,同时介绍了高斯系列数
值积分方法,涉及广义积分与瑕积分问题。
第十一章
“常微分方程数值方法”
,从最基本的 Euler 方法逐步介绍了一些相关的
计算方法。常微分方程是描述自然科学最常用的工具之一,所以这一章中侧重
于一些实际应用范例,所以在章节中安排了振动理论问题,同时这一章还介绍
了如何发布 MATLAB 实验报告为 HTML 文件。
第十二章
“数值方法应用范例(一)

,结合前面章节介绍的数值方法介绍了几个综
合性较强的数值分析实验。这几个实验都比较典型,涉及宇航、天文、航天器
运动、分形等领域,本身就是不错的参考资料。实验的处理方法比较多样,采
用的数值分析基本内容比较多,对于前面章节介绍的数值分析基本方法也是一
种复习同时可以增强读者对应用问题的综合分析能力。
第十三章
“数值方法应用范例(二)

,为了更深入的介绍数值分析的应用,单独以
小专题的形式在十三章中采用逐步深入的方式介绍了空间导航系统。空间导航
系统在现代生活中已经非常普遍,所以读者对这一问题不会感到陌生。在实验
中侧重问题的分析,然后利用数值方法解决问题。
附录一 “数值分析中的泛函理论”
,考虑到数值分析多处用到泛函理论,而一般大学数
学基础课中没有开设这门课,所以附录一给出了本书中需要用到的一些基本的
理论。这样在理解一些算法时,不会太吃力。
附录二 “代码编辑器 UltraEdit 的使用”
,介绍常用编辑器 UltraEdit 中设置 MATLAB
语法高亮的方法,如果不使用这个编辑器进行 MATLAB 程序编写,可以不必
阅读这一附录。
附录三 “程序调试方法”
,介绍了调试的基本方法与步骤。程序调试方法是每个程序员
都要面对的一个基本技能,在很多程序设计书籍中没有介绍程序调试方法,这
对读者学习来说,无疑是一个遗憾,而没有掌握程序调试方法,就没有真正掌
握编程。在介绍调试方法的书籍中,大部分也是按照软件有哪些调试功能就介
绍哪些内容这样的叙述方法,所以相当多的读者还是根本弄不清楚如何调试。
在这一附录中,则是给出有问题的程序为范例,逐步用调试方法解决问题,给
读者一个调试方法的全过程。
附录四 “常用数值分析理论及应用资源”
,罗列了一些科学计算的网络资源,让读者在
遇到问题时,能主动想办法查阅文献,同时关注最新的数值分析科研发展。
本书叙述清晰、语言通俗易懂,强调基础的编程能力,内容涵盖了数值分析的多个方面。

MATLAB 数值分析与应用

书中实验部分都给出了基本的数学原理,对于这部分内容力求简单、实用,避免烦琐的数学
证明。
本书的另一个特点是突出了计算可视化的思想,这一方法的实现紧密集合了 MATLAB
自身在图象绘制方面的优势。在现代科技论文中,大部分也都有图象化表述,有时所谓一图
胜千言,一张图形表述,会为论文增色许多。
另外,本书力求从读者需求的角度出发,结合大学相关数学课程安排章节。如即使微积
分不熟悉的读者,通过第二章的学习可以为后面章节打下一个基础,这样既可以达到复习微
积分,又能掌握编程方法,同时还掌握了数值计算方法。当然,如果还在学习微积分的读者,
第二章同样可以是不错的学习辅导资料。
本书强调数值分析的实际应用问题,数值分析的研究在很大程度上是为了解决实际的科
研问题,鉴于此,在相关章节中合适的地方都有一些实际应用范例。同时,为了加强读者综
合运用各种数值分析处理应用问题能力,还单独列一章介绍一些比较综合的实验,这些实验
先要进行一定的理论分析,然后建立数学模型,进而采用数值方法结合分析方法求解。教材
中的实验都有一定的工程背景,而不是有些教材中主观编写的建模范例。
本书适合作为大学理工科学生为基本的读者对象,可以作为其数值分析实验课程教材,
也可以供其他工程技术人员或编程爱好者参考。
本书在编写过程中得到了北京理工大学智能机器人研究所贾东永博士的许多帮助,同时
感谢作者所在的课题组中国科学院紫金山天文台卫星精密定轨与应用团组所有成员的帮助。
作者水平有限,加上时间仓促,书中疏漏甚至谬误之处难免,希望读者批评、指正。也
欢迎就相关问题展开讨论,作者邮箱为:song.yz@163.com。

编 者
2008 年 10 月

MATLAB 数值分析与应用

第一章 MATLAB 基础 ..........................................................................1
1.1 MATLAB 介绍 ................................................................................................................1
1.2 MATLAB 语言基础 ........................................................................................................9
1.3 MATLAB 图形和 3D 可视化 .......................................................................................17
1.4 MATLAB 程序设计基础 ..............................................................................................33
1.5 MATLAB 工具箱介绍与帮助系统 ..............................................................................44

第二章 MATLAB 在微积分中的应用................................................. 50
实验 2.1 函数极限运算.........................................................................................................50
实验 2.2 函数的导数与高阶导数运算.................................................................................54
实验 2.3 泰勒展开 ................................................................................................................59
实验 2.4 符号求和与特殊级数问题.....................................................................................62
实验 2.5 不定积分运算.........................................................................................................65
实验 2.6 定积分与反常积分运算.........................................................................................69
实验 2.7 多变量函数极限.....................................................................................................73
实验 2.8 多元函数的偏导数运算..........................................................................................76
实验 2.9 隐函数的偏导数.....................................................................................................80
实验 2.10 多变量泰勒展开....................................................................................................83
实验 2.11 梯度、Jacobi 矩阵与 Hesse 矩阵 ......................................................................86
实验 2.12 重积分运算 ..........................................................................................................92
实验 2.13 第一型曲线积分...................................................................................................94
实验 2.14 第二型曲线积分...................................................................................................97
实验 2.15 第一型曲面积分.................................................................................................101
实验 2.16 第二型曲面积分.................................................................................................105
实验 2.17 场论中的梯度、散度和旋度.............................................................................108
实验 2.18 正交曲线坐标系的三度问题............................................................................. 111
实验 2.19 力学中的保守力场与非保守力场..................................................................... 116

第三章

复变函数与积分变换 .......................................................... 123

实验 3.1
实验 3.2
实验 3.3
实验 3.4
实验 3.5
实验 3.6
实验 3.7
实验 3.8

复数与复矩阵的生成...........................................................................................123
复数的基本运算...................................................................................................126
留数的两种运算方法...........................................................................................132
留数在计算闭曲线积分中的应用.......................................................................136
Fourier 变换........................................................................................................138
Fourier 逆变换....................................................................................................144
Laplace 变换.......................................................................................................149
Laplace 逆变换...................................................................................................153

第四章 线性方程组数值方法 ............................................................ 159
实验 4.1 Jacobi 迭代 ............................................................................................................159
实验 4.2 Gauss-Seidel 迭代 .................................................................................................163

MATLAB 数值分析与应用

实验 4. 3 逐次超松弛迭代法(SOR)..............................................................................166
实验 4.4 Gauss 消去法计算线性方程组..........................................................................170
实验 4.5 列主元消去法计算线性方程组...........................................................................173
实验 4.6 LU 分解法计算线性方程组 .................................................................................176
实验 4.7 Cholesky 分解法计算线性方程组........................................................................178
实验 4.8 奇异值分解法计算线性方程组...........................................................................180
实验 4.9 双共轭梯度法......................................................................................................183
实验 4.10 共轭梯度的 LSQR 方法 ...................................................................................186
实验 4.11 线性方程组的最小残差法................................................................................190
实验 4.12 线性方程组的标准最小残差法........................................................................193
实验 4.13 线性方程组的广义最小残差法........................................................................196
本章小结 ..............................................................................................................................200

第五章 非线性方程求根.................................................................... 203
实验 5.1 波尔查诺二分法.................................................................................................204
实验 5.2 不动点迭代法.....................................................................................................208
实验 5.3 Aitken 加速方法................................................................................................. 211
实验 5.4 Steffensen 迭代法...............................................................................................214
实验 5.5 Newton-Rahpson 迭代方法................................................................................217
实验 5.6 重根的加速迭代问题...........................................................................................220
实验 5.7 割线法 ..................................................................................................................223
实验 5.8 kepler 方程的计算..............................................................................................226
本章小结 ..............................................................................................................................229

第六章 非线性方程组与最优化方法 ................................................ 231
实验 6.1 不动点迭代法.......................................................................................................231
实验 6.2 高斯—塞德尔迭代...............................................................................................235
实验 6.3 非线形方程组的牛顿迭代法...............................................................................239
实验 6.4 简化的牛顿迭代法...............................................................................................243
实验 6.5 拟牛顿法(Broyden 方法)................................................................................248
实验 6.6 Broyden 第二方法.................................................................................................254
实验 6.7 DFP 方法 ............................................................................................................259
实验 6.8 BFS 方法 ............................................................................................................265
实验 6.9 最速下降法 ..........................................................................................................271
实验 6.10 带松弛因子的牛顿下降法.................................................................................276
实验 6.11 共轭梯度法(Fletcher-Reeves 方法) ..............................................................280
实验 6.12 Polak-Ribiere 方法 ...........................................................................................285
实验 6.13 MATLAB 中的 fsovle 函数方法 .....................................................................289

第七章 矩阵特征值及特征向量 ........................................................ 295
实验 7.1 乘幂法计算主特征值及其特征向量...................................................................295
实验 7.2 乘幂法的 2 范数单位化方法...............................................................................302
实验 7.3 Rayleigh 加速方法 ................................................................................................308
实验 7.4 修正的 Rayleigh 加速方法 ..................................................................................314

MATLAB 数值分析与应用

实验 7.5
实验 7.6
实验 7.7
实验 7.8
实验 7.9

反幂法 ..................................................................................................................321
QR 方法..............................................................................................................327
拟上三角阵的 QR 方法.......................................................................................333
MATLAB 中的 eig 方法 ....................................................................................338
一些广义特征值问题.........................................................................................348

第八章 插值与函数逼近.................................................................... 353
实验 8.1 拉格朗日插值方法...............................................................................................353
实验 8.2 牛顿插值法 ..........................................................................................................358
实验 8.3 插值中的龙格现象...............................................................................................363
实验 8.4 Hermite 插值 ......................................................................................................366
实验 8.5 三次样条插值.......................................................................................................373
实验 8.6 保形分段三次插值...............................................................................................376
实验 8.7 MATLAB 中 interp1 函数..................................................................................379
实验 8.8 二元函数插值.......................................................................................................384
实验 8.9 Chebyshev 最佳一致逼近..................................................................................387
实验 8.10 Chebyshev 多项式与第二类 Chebyshev 多项式 ............................................392
实验 8.11 Legendre、Laguerre 和 Hermite 多项式 ............................................................398
实验 8.12 Legendre 最佳平方逼近......................................................................................406
实验 8.13 Chebyshev 最佳平方逼近................................................................................409
实验 8.14 全球变暖数据分析.............................................................................................413

第九章 估计、滤波与数据拟合 ........................................................ 431
实验 9.1
实验 9.2
实验 9.3
实验 9.4
实验 9.5
实验 9.6
实验 9.7

超定方程组的最小二乘解...................................................................................431
最小二乘法估计的 SVD 分解计算方法.............................................................434
Gauss-Markov 估计............................................................................................438
Kalman 滤波.......................................................................................................444
MATLAB 中的多项式拟合 ...............................................................................450
MATLAB 中的 lsqcurvefit 函数 ........................................................................453
最小二乘曲线拟合计算方法...............................................................................457

第十章 数值积分 ............................................................................... 463
实验 10.1 复合梯形求积法.................................................................................................463
实验 10.2 复合 Simpson 积分...........................................................................................468
实验 10.3 变步长的梯形积分方法.....................................................................................473
实验 10.4 变步长的复合 Simpson 方法.............................................................................477
实验 10.5 Romberg 积分方法...........................................................................................481
实验 10.6 Gauss-Legendre 积分 ..........................................................................................484
实验 10.7 Gauss-Laguerre 方法计算反常积分 ...................................................................488
实验 10.8 Gauss-Hermite 方法计算反常积分..................................................................491
实验 10.9 Gauss-Chebyshev 方法计算瑕积分....................................................................494
实验 10.10 蒙特卡洛方法.................................................................................................498
实验 10.11 MATLAB 中的数值积分方法 ..........................................................................502
实验 10.12 二重与三重定积分的计算...............................................................................506

MATLAB 数值分析与应用

第十一章 常微分方程的数值方法 .................................................... 511
实验 11.1 Euler 方法........................................................................................................ 511
实验 11.2 改进的 Euler 方法 .............................................................................................515
实验 11.3 Runge-Kutta 方法 ...............................................................................................520
实验 11.4 变步长的 RK 方法 ..........................................................................................525
实验 11.5 Adams 方法 .....................................................................................................529
实验 11.6 刚性方程组........................................................................................................532
实验 11.7 高阶方程及微分方程组的数值方法................................................................535
实验 11.8 阻尼振动问题....................................................................................................539
实验 11.9 线性方程边值问题的打靶法.............................................................................548

第十二章 数值方法的应用范例(一) ................................................. 559
实验 12.1
实验 12.2
实验 12.3
实验 12.4
实验 12.5

太阳系及地月系统的共线平动点...................................................................559
共线平动点的 Jacobi 常数 ................................................................................570
飞船定点三角平动点问题.................................................................................576
人造地球卫星轨道外推.....................................................................................580
美丽的分形图案.................................................................................................595

第十三章 数值方法的应用范例(二) ............................................ 600
实验 13.1 卫星伪距定位原理..............................................................................................600
实验 13.2 卫星导航系统的多资料定位.............................................................................604
实验 13.3 全球搜救系统的伪距定位方法.........................................................................613
实验 13.4 全球搜救系统的多普勒定位.............................................................................620
实验 13.5 多普勒与伪距的联合定位方法.........................................................................627
附录一 数值分析中的泛函理论介绍.................................................................................643
1 线性空间与度量空间...............................................................................................643
2 赋范线性空间与 Banach 空间.................................................................................645
3 内积空间与 Hilbert 空间 .......................................................................................648
附录三 程序调试方法 ........................................................................................................662
附录四 常用数值分析理论及应用资源.............................................................................675

MATLAB

1

数值分析与应用

第一章 MATLAB 基础
MATLAB 是由 The Math Works 公司开发的一套强大的数学软件,是当今科技界使用最
广泛的语言之一。它集数值计算、符号运算、计算机可视化为一体,是其他许多语言所不能
比拟的。尤其是其不断更新的工具箱,更是获得各专业领域科技工作者的青睐, MATLAB
已经不仅仅在控制领域或数值分析领域所使用,在金融分析、神经网络、优化、虚拟现实等
许多领域都能看到 MATLAB 的影子。许多大型软件都提供了 MATLAB 软件接口。
这一章中,我们就可以初步感受到 MATLAB 强大的功能。从初等数学到复杂的大规模
数值计算,只要有效的使用,MATLAB 都会成为你有力的助手。

1.1 MATLAB 介绍
初始接触 MATLAB 可能觉得窗口非常多,一时难以适应,这也是 MATLAB 非常灵活
的一个反映。其实用习惯了以后,会觉得非常亲切、方便。在这一小结中,从最基本的启动
MATAB 讲起,逐步介绍一些该软件的基础知识。

1.1.1 MATLAB 的启动
启动 MATLAB 主要有三种方法。
方法一:选择“开始”|“所有程序”|“MATLAB” |“MATLAB R2008a”命令。这是
比较常用的方法。
方法二:在安装完成 MATLAB 之后,一般会在左面上有快捷方式,可以双击 MATLAB
图标打开。如果桌面上没有,可以按方法一把鼠标放到 MATLAB R2008a 上,选择鼠标右键
选择“发送到”|“桌面快捷方式”命令,下次便可以这样打开。
方法三:可以找到安装 MATLAB 的文件夹,双击 MATLAB 图标,当然为了方便下次
打开,可以把此图标拖到桌面形成快捷方式。
打开 MATLAB 之后显示如图 1.1 的界面。

MATLAB

2

数值分析与应用

图 1.1 MATLAB 界面
MATLAB 的窗口设置是很灵活的,可以根据个人习惯调整布局。图 1.1 中标注的几个
窗口界面是 MATLAB 中比较常用的,而且是最基础的窗口。
先介绍菜单栏,对于菜单栏,与一般的软件操作类同。如“File” | “New”,可以新
建 M 文件、Fifgure 图象。
“open”可以打开 M 文件,数据文件,Figure 图象等,如图 1.2。

图 1.2

MALTAB 的 File 弹出菜单

“Edit”菜单主要用于编辑功能,
“Debug” 菜单用于程序调试,
“Desktop” 菜单定制

MATLAB

3

数值分析与应用

桌面的各子界面,
“Windows” 菜单显示各子界面,
“Help” 菜单是 MATLAB 的帮助系统。
对于菜单不作过多介绍,读者可以在使用中逐渐熟悉。

1.1.2 命令窗口操作
MATLAB 窗口风格非常自由,甚至可以象草稿纸一样,随时解决你学习或工作中遇到
的各种问题。无论是公式推导,或者是数值问题。

1 2 
5 6 
A= 
B=


3 4  ,
 7 8 ,计算 AB。
【例 1】 已知矩阵
在 MATLAB 命令行窗口输入
>> A=[1 2;3 4];
>> B=[5 6;7 8];
>> C=A*B
按“回车”
,很快给出运算结果显示如下:
C=
19

22

43

50

其操作过程在 MATLAB 中,如图 1.3 所示。

图 1.3 例 1 在 MATLAB 中的运行情况

>> f1=taylor(f.MATLAB 4 数值分析与应用 MATLAB 同样可以出色的完成烦琐的公式推导问题。下举一例说明,初学 MATLAB 的 读者,可以先不去理会命令的具体含义,只需要大概知道就行,后面会单独讲到这些。 【例 2】 求函数 f ( x ) = 1/(1 − x ) 在 0 点的泰勒展开。 在命令窗口中输入: >> syms x. >> f=1/(1-x).x.4 命令窗口 如果需要计算一组雷同的运算,通过 MATLAB 可以很方便的实现编辑,无需重新输入 命令。只要按[↑]键,就可以出现刚才的命令。如现在要推导一下 f=1/(1+x)的泰勒展开,只 需要在刚才的命令窗口中按两次[↑]键,会出现如下命令: >> f=1/(1-x).8) 按回车得到如下结果: f1 = 1+x+x^2+x^3+x^4+x^5+x^6+x^7 2 3 4 5 6 7 8 表示展开到八阶的展开式为 f 1 = 1 + x + x + x + x + x + x + x + x 。 在 MATLAB 中的运行情况如图 1.x.8); 回车得到如下结果: f1 = 1-x+x^2-x^3+x^4-x^5+x^6-x^7 MATLAB 有许多命令,熟练掌握常用命令很有必要,这里整理了一些常用命令,见表 1.4 所示。 图 1. 把表达式改为 f=1/(1+x).1。 . 再用[↑]键得到: >> f1=taylor(f.

5。 图 1.3 当前目录浏览器、路径设置和文件管理 在 MATLAB 中如果左键单击当前目录浏览器右上角的向上小箭头,则当前目录浏览器 会从 MALTAB 界面中脱离出来,如图 1.MATLAB 数值分析与应用 5 命令 作用 命令 作用 exit 退出 MALTAB help 获得帮助信息 clear 清除工作空间中的变量 clc 清除显示的内容 demo 获得 demo 演示帮助信息 edit 打开 M 文件编辑器 type 显示指定 M 文件的内容 which 指出其后文件所在的目录 figure 打开图形窗口 md 创建目录 clf 清除图形窗口 cd 设置当前工作目录 dir 列出指定目录下文件和子目录清单 quit 退出 MATALAB who 显示内存变量 whos 内存变量的详细信息 表 1.1.5 当前目录浏览器 在当前目录浏览器上有:菜单栏,当前目录路径,路径设置区,以及该目录下的 M 文 件或数据文件等。如果把鼠标放到 M 文件上单击右键可以弹出如图 1.1 MATLAB 常用命令 对于初学者,可以不必一次全部掌握,在使用中逐渐熟悉是比较好的方法。有两点要说 明的是: (1) 在编辑代码时候使用分号是为了不显示中间结果,如果没有使用的话则每一次运算 都会输出到窗口。 (2) 运算中,通常显示的是 5 位有效数字。而实际上在计算中都是采用双精度,只是为 了使输出比较简洁,紧凑才这样做的。用户可以根据需要,直接输入命令,获得所 需要的显示结果。 1.6 的快捷菜单,通过 菜单中的选项可以对文件完成一般的文件操作,如打开、删除等。 .

MATLAB 6 数值分析与应用 图 1.6 鼠标右键单击当前目录浏览器下 M 文件弹出菜单 在程序设计时,如果不特别指明存放数据和文件的目录,MATLAB 会默认把它们放在 当前目录下。虽然目录 MATLAB/work 允许拥护存放文件,但最好还是把用户自己的用户目 录设置为当前目录。 建议对计算机操作比较熟悉的读者最好把用户目录设置成当前工作目录。下面给出两种 设置方法: (1)直接使用命令。比如想把 D:\matproject 设置为当前目录,只要使用 cd 命令就可以。 在命令窗口输入: >> cd D:\matproject 这时候去看 MATLAB 界面上的当前目录已经变成刚才设置的路径。 (2) 在图标准工具栏右侧的当前目录设置,单击其中的省略号小点(如图 1.7 当前目录 如果有多个目录需要同时与 MATLAB 交换信息,可以把这些目录设置到 MATLAB 的 搜索路径上。一种快速把文件夹添加到 MATLAB 搜索路径的方法是使用 addpath 命令。如 想把 D 盘下目录为 code 的文件夹目录添加到搜索路径中,只要在命令窗口输入 >>addpath(‘D:\code’) 就可以把该文件夹添加到搜索路径中,但是这样的设置随着 MATLAB 的关闭就结束,再次 打开 MATLAB 的时候该文件夹就不在搜索路径中。要想 addpath 命令设置后,在下次启动 MATLAB 时搜索路径同样一效,可以使用 savepath 命令。即在路径设置以后,直接在命令 窗口输入 >>savepath 这样就保存了当前的路径设置。 .7) ,弹出… 对话框,选择期望的目录作为当前目录。 图 1.

8,其二是直接在命令窗口输入 >>pathtool 这时候系统也会跳出如图 1.8 所示的路径设置对话框。 添加搜索路径的方法是鼠标左键单击 Add Folder,选择要添加的路径,如果希望在 MATLAB 关闭以后,该路径同样有效果,可以用鼠标左键单击 set path 中的 save 按钮。也 可以在命令窗口直接输入 savepath。如果希望回到系统安装时候的默认设置,可以用鼠标左 键单击 set path 中的 Default 按钮。 .MATLAB 数值分析与应用 7 要查看 MATLAB 的路径设置情况,可以在命令窗口输入 >>path 回车就会得到 MATLABPATH D:\MATLAB7\toolbox\matlab\general D:\MATLAB7\toolbox\matlab\ops D:\MATLAB7\toolbox\matlab\lang D:\MATLAB7\toolbox\matlab\elmat D:\MATLAB7\toolbox\matlab\elfun D:\MATLAB7\toolbox\matlab\specfun D:\MATLAB7\toolbox\matlab\matfun D:\MATLAB7\toolbox\matlab\datafun D:\MATLAB7\toolbox\matlab\polyfun D:\MATLAB7\toolbox\matlab\funfun D:\MATLAB7\toolbox\matlab\sparfun D:\MATLAB7\toolbox\matlab\scribe M D:\MATLAB7\toolbox\rtw\targets\xpc\target\build\xpcblocks D:\MATLAB7\toolbox\rtw\targets\xpc\xpcdemos D:\MATLAB7\toolbox\rtw\targets\xpc\xpc\xpcmngr D:\MATLAB7\toolbox\rtw\targets\xpc\target\kernel\embedded 这就是 MATLAB 中的路径情况,包括各工具箱的路径以及用户自己添加的路径。上面 的操作也可以通过图形界面设置完成。这些操作可以在路径设置对话框中完成,打开路径设 置对话框的方法有两种,其一是在选择主菜单“File”|“setpath”,就可以打开路径设置对 话框,如图 1.

8 路径设置对话框 1. 表示 x 在 0 到 4 π 之间,取离散点的间隔为 π /50,y 为 x 的正弦函数。这时查看工作空 间,如图 1.MATLAB 8 数值分析与应用 图 1.9 工作空间浏览器 如果用鼠标双击变量 y,得到图 1. >> y=sin(x).4 工作空间浏览器 鼠标左键单击工作空间浏览器,可以将此界面脱离 MATLAB 界面。在工作空间浏览器 中可以看到各内存变量,如果用鼠标激活这些变量可以方便快捷的实现对数据的操作。下面 以例说明。 【例 3】 在命令窗口中输入: >> x=0:pi/50:4*pi.10,可以看到 y 的值用数组编辑器显示,非常方便。 .9 所示。 图 1.1.

9 中的被圈住的部分)按钮立刻得到 y 的 函数图象,如图 1.2 数组 y 表示的曲线 MATLAB 语言基础 在这一小结中,将介绍 MATLAB 语言的一些基本知识以及数值计算的基础知识。如果 熟悉其他高级语言(如 c/c++.fortran 等)则很容易理解这些内容。当然,如果没有做 过程序设计,通过本小结的阅读,也可以掌握程序设计的基本方法。尤其是 MATLAB 的许 多特殊优点,其上手比一般高级语言要更容易,更快。 .MATLAB 9 数值分析与应用 图 1.11 1.10 数组 y 的值 当激活 y 时,左键单击其中 plot(y) (见图 1.11 所示。这个过程非常方便,不需要再键入命令。同样如果单击 pie(y) 则显示为饼状图等。 图 1.pascal.

1 变量、变量和表达式 1 常量 常量是指程序中其值固定不变的一些量。这里主要介绍一些基本常量:数值常量、逻辑 常量、和字符型常量。 数值常量可以采用小数点记数法和科学记数法都是可以的,比如 82 -28 9.7e-3 都是合法的。 在 MATLAB 中,逻辑常量真为 1,假为 0,下举例说明。 在命令窗口输入命令: >> 3>7 %输入一个表达式 ans = %返回判断结果为假 ,输出 0 0 >> 4<8 ans = 1 %返回判断结果为真,输出 1 字符串常量应该包含在单引号对中,注意单引号对需要是英文状态下的引号 2 变量 MATLAB 中变量可以不用先声明,而在 Workspace 中可以随时查看变量的变化。变量 名第一个字符必须为英文字母,可以包含下划线以及数字,和 Java 一样 MATLAB 语言区分 大小写。在给变量命名时最好能做到见名知意,这会给自己的程序设计带来方便。同时最好 不要使用系统的保留字。就变量类型而言也有和常量类似的几种变量。因为 MALTAB 是直 接面向矩阵与数组计算,所以这里先有意不谈,后面单独讲数组与矩阵。 MATLAB 预先保留了一些变量,这里给出常用的一些保留变量,如表 1.2.225073858507201e-308 >> realmax %计算机最大正实数 .5e3 1.2 一些 MATLAB 保留的变量 【例 4】 在命令窗口输入: >> i %虚数单位 ans = 0 + 1.00000000000000i >> bitmax %计算机的最大正整数 ans = 9.7 1.2。 变量 含义 变量 含义 ans 计算结果缺省时变量名 NaN/nan 不是数 pi 圆周率 eps 计算机零阈小值 Inf/inf 无穷大 realmin 最小正实数 bitmax 计算机最大正整数 realmax 最大正实数 i/j 虚数单位 表 1.007199254740991e+015 >> realmin %计算机最小正实数 ans = 2.MATLAB 数值分析与应用 10 1.

2 矩阵与数组 1 .73346354236719i 3 运算符 对于一般的四则运算可以直接使用“+” 、 “-” 、 “*” 、 “/”就可以,如果是对矩阵与数组 进行运算,下一小节会单独讲。可以使用小括号使运算优先,这与其他的高级语言基本都是 相同的。要进行复杂的数学运算则需要调用系统的函数,或者自行编写函数。 在程序设计中,有时候需要做逻辑判断,这就涉及到一些关系运算符与逻辑运算符,见 表 1.2. >> c2=3*exp(5*i) >> c=c1*c2 c= 17.3 常用运算符 1.矩阵的生成 MATLAB 在矩阵运算方面有非常强的优势,这是使其成为工程应用软件佼佼者的原因 之一。在 MATLAB 中矩阵完全可以是数学意义上的矩阵。对于矩阵的生成,可以是键盘直 接输入、语句或函数产生、建立在 M 文件中、或者外部文件装入。 对于一般的比较小的简单矩阵可以直接用键盘输入。 1 2 3  4 5 6 ,B =    ,可以在命令行中输入 4 5 6 7 8 9  【例 6】要生成一个矩阵 A =  .46399719068541 -16.3。 符号 含义 符号 含义 < 小于 ~= 不等于 > 大于 & 逻辑与 <= 小于等于 | 逻辑或 >= 大于等于 ~ 逻辑非 == 等于 xor 逻辑与非 表 1.797693134862316e+308 另外 MATLAB 还保留了下面四个变量:nargin、nargout、varagin 和 varagout 分别为函 数输入变量个数、函数输出变量个数、可变的函数输入变量个数和可变的函数输出变量个数。 这几个保留变量在做函数文件时候比较有用。 另外 MATLAB 可以直接面向复数进行运算,而不需要读者另外定义复数的数据结构, 对于经常进行复数运算的用户而言,无疑是非常方便的。 【例 5】 c1 = 7 + 4i.MATLAB 数值分析与应用 11 ans = 1. c 2 = 3e5i ,计算 c = c1gc 2 在命令窗口输入: >> c1=7+4*i.

B] D= 特殊矩阵的生成可以直接使用函数。 【例 9】生成单位矩阵、全部元素是一的矩阵、由向量生成对角矩阵。 >> eye(4) ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 >> ones(3.4) .:) 运行结果可以看到: C= 7 8 9 MATLAB 还可以很方便的实现矩阵的合并,下用例说明。 【例 8】分别把 B 矩阵按行和列接到 A 矩阵上形成更大的矩阵。在命令窗口输入 >> D=[A B] D= 1 2 3 4 5 6 4 5 6 7 8 9 1 2 3 4 5 6 4 5 6 7 8 9 >> D=[A.MATLAB 12 数值分析与应用 >> A=[1 2 3.4 5 6] A= 1 2 3 4 5 6 4 5 6 7 8 9 >> B=[4 5 6 7 8 9] B= 在输入中每行的元素之间必须用空格或者逗号分开,每一行的结束必须用回车或者分号 隔开,整个矩阵应该放在方括号中。 A(i,j)表示矩阵 A 中的第 i 行第 j 列的元素,由此可以对其修改。 A(i, : )表示矩 阵 A 中第 i 行全部元素,同样 A(: ,j)表示矩阵 A 中第 j 列的全部元素。 【例 7】把 B 中的第 2 行元素赋值给 C 只需要在命令窗口中输入: >> C=B(2.

/B,A.*B、A.MATLAB 13 数值分析与应用 ans = 1 1 1 1 1 1 1 1 1 1 1 1 >> A=[2 5 3 6 7].7 8 9].\B。     7 6 8  9 5 4  .数组及运算 数组与矩阵是有很大差别的,矩阵有其严格的数学意义。而数组是 MATLAB 所定义的 规则,目的是方便数据管理、操作简单。在其他高级语言中一般也都有数组的概念。 数组与常数的四则运算是指对每个元素进行运算。 1 2 3  4 5 6 ,B =    ,计算 A+2, A× 3 ,A+B 4 5 6 7 8 9  【例 10】 A =  在命令窗口中输入 >> A=[1 2 3.B、A.*” 、 “. >> B=diag(A) B= 2 0 0 0 0 0 5 0 0 0 0 0 3 0 0 0 0 0 6 0 0 0 0 0 7 2./” 、 “. >> A+B ans = 5 11 13 7 9 15 数组之间的加、减法与矩阵加、减法完全相同,而数组的乘、除法运算符号为“.4 5 6]; >> A+2 ans = 3 4 5 6 7 8 6 9 >> A*3 ans = 3 12 15 18 >> B=[4 5 6.\” 。 5 6 7  8 9 6      【例 11】 A = 4 8 3 , B = 5 3 6 分别计算 A.

6667 1.6000 1.5000 数组的乘方完全类同,是对每个元素而言,与矩阵的幂运算不同。 5 6 7    【例 12】 A = 4 8 3 ,计算每个元素的 3 次幂。   7 6 8  >> A=[5 6 7 483 7 6 8].8571 1. >> A.5000 0.MATLAB 14 数值分析与应用 在命令窗口中输入 >> A=[5 6 7 483 7 6 8]; >> B=[8 9 6 536 9 5 4].0000 >> E=A.8000 2./B D= 0.\B E= 1.6667 0.3750 2.7778 1.8333 0.*B C= 40 54 42 20 24 18 63 30 32 >> D=A.6250 0.2.1667 0.5000 0.0000 1.2857 0.3 胞元数组 相比普通的数组,胞元数组用的并没有那么频繁,但是如果掌握胞元数组的方法,有时 . >> C=A.^3 ans = 125 216 343 64 512 27 343 216 512 在数组乘、除和乘方运算时小黑点不能遗漏,且为英文状态下输入。 1.2000 2.2500 0.

45646766516834 0.2}=a22. %创建一维数组 >> a12=ones(3).3}=a13. >> A{1. %创建二维数组 >> a21='welcome to MATLAB'. >> a13=rand(2).1} ans = 0 1 2 3 4 5 6 7 8 9 10 >> A(1.01850364324822 A= %直接引用整个胞元,查看结果。 [1x11 double] 'welcome to MATLAB' [3x3 double] [4x4 double] [2x2 double] [1x1 sym ] 熟悉第一节的读者,还可以通过工作空间直接看到各个变量的存储类型。 .1}=a21.1}=a11. >> A(1. >> A{2. >> A{1.2}=a12.3) ans = [2x2 double] >> A{1.76209683302739 0.89129896614890 0.3} %引用胞元内容,给出具体的胞元存储内容。 ans = 0.3}=a23.MATLAB 数值分析与应用 15 候会让程序设计变的很方便,更加灵活。这里不打算过多的作理论探讨,只通过例子给出简 单的介绍。 顾名思义,胞元数组仍为一种数组,但是胞元数组和一般的数组又有区别。既每一个胞 元可以存放不同的数据类型,可以是单独的一个数、数组、字符串数组、符号对象,甚至是 胞元。而胞元之间是平等的,以下标区别。 在胞元数组中以小括号标识胞元数组中的胞元,如 A(4,5)表示胞元数组 A 的第 4 行第 5 列的胞元。以大括号标识胞元内容,如果 A{4,5}表示胞元内容。 【例 13】创建一个( 2 × 3 )胞元数组,并调出胞元内容。为了说明问题,这里给出几种不 同的数据类型。 >> clear >> a11=0:1:10. %字符串 >> a22=eye(4); >> a23=sym('sin(2*x)+cos(x)') %符号标量 %以下创建胞元数组 >> A{1.1) %引用胞元,结果只给出胞元内容的数据类型 ans = [1x11 double] >> A{1. >> A{2. >> A{2.

“/” , “^” ,这与数值运算的算符有同样意义,是为 加、减、乘、左除、右除和幂运算。 (2)关系运算。 符号对象没有大小之分,所以没有一般高级语言里的大小判断,只有判断是否相等。其 中“= =”和“~ =”分别为等与不等算符。 (3)函数运算。 符号计算的函数比较多,对于一般的函数运算与同名的数值运算方法基本相同。可以使 .2.12 工作空间中的符号变量 2. 符号算符及基本函数 在 MATLAB 中符号运算与数值方法基本相同,主要有以下几种算符。 (1)基本运算 基本运算有“+” 、 “-”, “*”, “\”.MATLAB 16 数值分析与应用 1.4 符号运算 MATLAB 不仅有强大的数值运算能力,同样符号运算也比较出色。其符号运算通过符 号工具箱来实现。符号工具箱的内核采用 Waterloo 大学开发的 Maple 系统,所以对于复杂 的符号运算有时候需要访问 Maple 才能调用。这一节简单介绍符号运算的基本知识,在第 二、三章将详细介绍符号运算在高等数学及复变函数中的应用。 1. 符号对象和符号表达式 在 MATLAB 中符号对象可以借助 sym 或 syms 定义,而且符号对象的表达式也是符号 对象。 【例 14】创建符号变量 a,b 及其表达式 a 2 + b 2 。 在命令窗口输入: >> syms a b >> s=a^2+b^2 回车得到 s= a^2+b^2 可以看到 s 为 a,b 表达式,所以也是符号变量。查看工作空间,如图 1.12 所示,可以 看到各变量的变量类型。 图 1.

MATLAB 17 数值分析与应用 用的函数有三角函数(如 sin.20) 回车得到 ans = 3. >> s2=3*x^2+4*x.cos 等) 、指数、对数函数(如 exp.3.1 二维绘图 MATLAB 提供了很多种二维绘图命令。其中比较常用,而且基础的是 plot,这也下面 将要主要介绍的。对于其他的一些绘图命令,后面会做一些介绍。 .expm) 、矩阵分析函数(如 eig,svd) 、方程函数(solve) 。另外还包括一些微积分函数,积分变换函数等,这在后面将 详细介绍。 【例 15】定义符号表达式 s1 = 2 x. s2 = 3x 2 + 4 x ,并计算 s = s1 + s2 在命令窗口输入: >> syms x >> s1=2*x.1415926535897932385 此为 π 的前 20 位有效数字。 符号运算中比较常用的命令还有 findsyms()函数和 subs()函数,前者为找出给定表 达式中符号变量后者是用新参数替换旧参数,具体使用方法在以后多章节中都有使用。需要 说明的是符号运算是面向矩阵运算,这与数值方法一样,为用户提供了很大程度上的便捷。 1. >> s=s1+s2 回车得到: s= 6*x+3*x^2 在符号运算中可以通过 vpa()函数把符号变量以任意精度显示出来。 【例 16】在命令窗口输入 >> vpa(pi.3 MATLAB 图形和 3D 可视化 MATLAB 具有非常丰富的图形表达功能,可以方便的实现科学计算的结果可视化。比 较好的图形展示,可以令你的专业论文增色,这也是许多其他语言所难以比拟的。很多情况 下,以往我们是通过高级语言计算得到数据结果,然后用文件导出数据,进而使用专门的绘 图软件实现绘图,而 MATLAB 却可以通过简单的命令使之得到有机结合。这减轻了我们学 习多种软件的负担。同时,如果已经采用其他语言计算得到的数据,可以装入 MATLAB 变 量空间直接进行图形绘制。这一节介绍常用的绘图方法。 1.

’s’)命令 【例 17】 绘制出在区间[0,5]上函数 y = 2 cos( x 2 ) 的图象。 在命令窗口输入: x=0:0. 按回车得到结果,如图 1.y. y=2*cos(x.05:5.y).MATLAB 数值分析与应用 18 1 基本的 plot(x.13 用函数 plot 绘制的图形 在上面的例子中,我们使用了 plot 命令非常方便的绘制出一个函数的图形。这里对 plot 函数用法做一些说明。 (1)x,y 是采样离散点的横纵坐标,所以必须向量长度相同。 (2) ‘s’是字符串,不同的值有不同的图形表现形式,如果没有这个输入变量,则系 统默认使用蓝色细实线绘制图形。对于‘s’的意义下面给出一个简表 1. plot(x.13。 图 1.4,读者可以根据自 己的喜好选择合适的图形表现方式。 ‘s’值 图形表现 ‘s’值 图形表现 s 小方块 > 向右三角形 d 菱形 < 向左三角形 h 六角星 + 十字 o 圆圈 * 米字 p 五角星 ^ 向上三角形 v 向下三角形 x 叉符 r 红色线 b 蓝色线 y 黄色线 w 白色线 g 绿色线 m 品红色线 k 黑色线 c 青色线 - 细实线 -- 虚划线 .^2).

>> y1=2*x.y.01:5.^2). 点划线 表 1. >> y2=2*(x+1). >> y=8*x. >> plot(x.MATLAB 数值分析与应用 19 : 虚点线 -.14 例 17 的函数图象 可以看到在数据很密集的地方,线看起来象实线一样。请读者思考为什么在程序中 y 的表达式中乘法和乘方有两个小黑点。 2.plot 命令的扩展 对于多组数据的绘图方法,和一组数据的调用非常类同。只要在 plot 后依次按次序输 入变量值就可以。下面以例说明。 【例 19】对于函数 y1 = 2 x sin( x 2 ) , y 2 = 2( x + 1) cos( x 2 ) ,在[0,5]区间上绘制这两条曲 线。 在命令窗口输入: >> clear >> x=0:0.^2).*sin(x.'p') 按回车后得到结果如图 1. .^2).*sin(x.4 ‘s’的图形表现 这里介绍其中一种图形表现形式,其他的类同,读者可以自己在编程时改变参数看图形 效果。 【例 18】用出函数 y = 8 x sin( x 2 ) 在[0,5]上的图形,用五角星表现。 在命令窗口输入: >> x=0:0.14 所示。 图 1.01:5.*cos(x.

01:6)'.1:2.15 多三元组绘制的多条曲线 在 plot(x,y)都是( m × n )数组时,会绘制出 n 条曲线。每条曲线的位置由 x. 图 1.MATLAB 20 数值分析与应用 >> plot(x.y2. >> plot(x.y1. >> y=sin(x)*k.16 .x.2:0.y) 按回车得到结果如图 1.'d'. >> k=0.'*') 回车运行结果如图 1.15.y 对 应的列确定。如果省略 x,命令变为 plot(y) ,这是使用数组的下标为横坐标。当 y 为一维 数组时,则绘制出一条曲线,当 y 为二维数组时,以数组的行下标为横坐标,y 为纵坐标绘 制出多条曲线,曲线的条数就是数组的列数。 【例 20】绘制多条不同色彩的曲线。 在窗口输入命令: >> x=(0:0.

>> y1=2*x.01:5.*sin(x.^2). >> y2=2*(x+1).17 所示。 2 .MATLAB 数值分析与应用 21 图 1.'s') >> hold on >> plot(x.^2).'x') >> hold off 回车运行结果如图 1.16 多条曲线在同一张图上 3.多次重叠绘制图形 在使用 plot 函数时,有时候我们希望多次绘图,如果不用命令控制,每次运行后,在 Firgure 中都会看到当前的图形,而覆盖上一次的运行结果。这往往不是我们想要的,要在 一张图形中多次重叠绘制图形,可以使用“hold”命令。 hold on 使当前图形与坐标轴保状态,不被刷新。 hold off 使当前图形不再具备不被刷新的性质。 hold 当前图形是否具备被刷新功能的双向切换开关。 【例 21】分次绘制函数 y1 = 2 x sin( x ) 与 y 2 = 2( x + 1) cos( x ) 曲线。 2 在命令窗口输入: >> x=0:0.y2. >> plot(x.*cos(x.y1.

>> y1=cos(5*x)+0.18 所示。 (a) (b) .y2) 回车后得到运行结果,如图 1.1*x.1x 与 y1 = sin(3 x) + 0.1*x.MATLAB 数值分析与应用 22 图 1.1x 的函数图形。 在命令窗口输入: >> x=0:0.^2. >> figure(2) >> plot(x. >> plot(x.y1) >> y2=sin(3*x)+0.17 分次绘制图形 4.多窗口绘图与多子图 有时候可能需要在多个图形窗口看到绘制曲线效果,这时可以使用 firgure 命令,创建 多个窗口。在使用多窗口时,需要按照窗口序号对号入座,默认以缺省方式创建 1 号窗口。 2 【例 22】在两个窗口中分别绘制 y1 = cos(5 x ) + 0.01:5.

3).MATLAB 23 数值分析与应用 图 1. >> y2=cos(3*x).2.2.19 多子图效果 .y3) >> subplot(2.y1) >> subplot(2. >> y4=y1+y2.01:5. >> y1=sin(5*x).plot(x. >> y3=y1.y2) >> subplot(2.2.plot(x.1).2.plot(x.19 所示。 图 1. y 3 = sin(5 x ) cos(3 x) , y 4 = sin(5 x) + cos(3 x) 的图象。 在命令窗口输入: >> x=0:0.4).18 多窗口绘图 有时候需要在一个窗口中同时显示多个独立的子图,可以用 subplot(m,n,k)命令实 现。表示使 m × n 幅子图中的第 k 幅成为当前图。k 是子图的编号,顺序是从左到右,从上 而下,左上第一幅为 1,依次编号。subplot 产生的子图之间互相独立,所有的绘图命令都可 以在子图形中使用。如果在使用 subplot 之后,想再画整幅图形窗的单幅图,可以使用 clf 命令,清除图形窗口。 【例 23】在一幅图的各子图中分别绘制函数 y1 = sin(5 x) , y 2 = cos(3 x) .*y2.2). >> subplot(2.y4) 运行结果如图 1.plot(x.

x.5 提供一些常用的设置选项。 函数 功能 函数 功能 tilte 添加标题 xlable x 轴标注 legend 添加图例 ylable y 轴标注 text 在指定位置添加文本 colorbar 添加颜色条 grid 添加坐标网格 grid off 去掉坐标网格 表 1. >> y1=sin(x).':') %y1 用*表示,y2 用默认的细线表示,y3 用虚点线表示 >> legend('sin(x)'.'sin(x)+sin(5x)') >> xlabel('x') %x 轴标注 >> ylabel('y') %y 轴标注 >> title('the functon of sine') >> grid %分别对用上面标示给出图例 %标题 %加坐标格 这样一来,我们得到一个看上去有点凌乱的图形,如图 1.04:20.'*'.20 所示。当然在实际应用中 我们可以不一定每一个选相都要设置,应该根据需要而定。 .y2.sin(5x). >> plot(x.x. >> y3=y1+y2.MATLAB 数值分析与应用 24 5 图形标注 在默认设置下,MATLAB 一般能给出非常满意的图形效果,当然用户也可以根据自己 的需要,对默认设置做修改。同时 Firgure 还有很不错的编辑功能,可以传达更丰富的信息, 这可以通过命令实现,也可以通过 Firgure 编辑器实现。表 1.y1.5 常用的图形标注函 有时为了需要常常需要一些希腊字母,甚至是数学表达式出现在图形信息中,在 Firgure 中是很容易实现的。我们给出一两个例子,对于一般的情况读者可以参考 MATLAB 的帮助 文档。下面用一个例子阐述上面的方法。 【例 24】分别绘制函数 sin(x).y3.'sin(5x)'.sin(x)+sin(5x)并加一些上面介绍的标注。 >> x=0:0. >> y2=sin(5*x).

6 常用的二维绘图命令 【例 25】在极坐标下画出函数图象 在命令窗口输入: >> t=0:.MATLAB 数值分析与应用 25 图 1.20 图形的标注 6.其他的一些二维图形绘制 有时候根据需要可能会用到其他一些图形绘制方法,比如有时候分析各种成分的比例, 我们可能需要饼状图或者条状图,有了 plot 作为基础,这些方法是很容易掌握的。这里给 出常用的绘图命令,见表 1.*cos(9*t)+sin(15*t)).6。以一个例子说明用法,其他类同。 命令 功能 命令 功能 plot 绘制基础的二维图 quiver 箭头图 rose 扇形图 ferther 羽毛图 stairs 梯形图 compass 射线图 polar 在极坐标下绘制绘制曲线 stem 二维杆图 Hist 频数直方图 pie 饼状图 表 1.01:2*pi.sin(t). >> polar(t. 回车运行结果如图 1.21 所示。 .

>> bar(x. >> y=x.^2+exp(x)+20.y) 回车运行结果如图 1.3.21 极坐标图象 x 【例 26】在 bar 状图中绘制 y = x 2 + e + 20 函数图象。 在命令窗口输入: >> x = -5:0.4:5.3 三维绘图 三维图形的绘制相对与二维图形要复杂一些,但是有了前面的做基础还是不难理解各种 .22 bar 状图 通过这两个例子,很容易实现表 1.MATLAB 26 数值分析与应用 图 1.22 所示。 图 1.6 中的各种形式的绘图功能,读者可以根据实际需要 选择合适的功能。 1.

y.y)。在计算得到变量 z 的值之后,就可以作图。对于 网格图曲面图形的格式分别为 surf(x.c) 。在缺省参数情况下,和前面 几种绘图方法类似。 【例 28】绘制三维网格图与曲面图 在命令窗口输入: .z.y1.MATLAB 27 数值分析与应用 命令。三维图形有时候能能传达的信息也更加丰富。这里主要介绍三维曲线绘制、三维曲面 绘制以及一些相关问题。 1 plot3 命令 三维曲线的 plot3 命令与二维情况下很类似,基本格式为 plot3(x.y.y.z) >> grid on 运行结果如图 1. >> plot3(x.y2.z2.c)和 mesh(x.z.y]=meshgrid(x. >> z=cos(2*x).z.x2.’s1’.’s’) 。x、y、z 是 向量时,则绘制以 x、y、z 为元素的三维曲线。当 x、y、z 为矩阵时,则绘制多条曲线。字 符串‘s’的用法同二维情况。对于多组数据的绘图也类同二维情况。可以使用命令 plot3 (x1. >> y=sin(x).y.…) 。 【例 27】绘制参数方程的三维曲线 x = t   y = sin t  z = cos 2t  在命令窗口中输入: >> x=0:0.23 所示。 图 1.23 三维曲线的绘制 2.三维网格图与曲面图的绘制 三维网格图与曲面图的绘制非常相似,调用格式也近乎一致。绘图之前先要形成字变量 的格点矩阵。命令为[x.’s2’.z1.01:40.

8).3).4).MATLAB 数值分析与应用 28 >> clear >> x=-10:0. >> y=-10:0. >> z=sin(r)+cos(r).z.contourf(z.2). >> subplot(1.y.surf(x.2.contour3(x.25 所示。 .y]=meshgrid(x.contour(z.y.5:10.z]=peaks(30).2.24。 图 1. >> r=sqrt(x.n) ,其中 n 表示 从最低位置到最高位置的等高线的条数。缺省 x,y 状态时表示为二维等高线图。 【例 29】绘制三维高斯型分布的等高图。 >> clear >> clf >> [x.2.mesh(x.^2+y.z) >> subplot(1.5:10. %用色彩填充二维的等高图 回车运行结果如图 1.y.1).mesh(z).2).8).y).z) 运行结果如图 1.8).2.24 网格图和曲面图的绘制 MATLAB 还可以很方便的画出等高图,基本调用格式为 contour(x. >> subplot(2. >> subplot(2.1).^2).y.y. >> [x.z.2. %三维高斯分布 >> subplot(2. %二维的等高图 . %三维的等高图 >> subplot(2.2.

ymax]) ezplot(x.max]) ezplot(f.y)为默认的参数方程 函数图象,ezplot(x.max])为指定参数变化范围的函数图形, ezplot(f.4 符号运算的可视化 MATLAB 中除了数值结果可以绘制图象以外,还提供了丰富的符号绘图功能,符号绘 图命令以 ez 字母开头。这里介绍这些命令适用于多种类型函数:符号函数、M 文件函数、 字符串函数和句柄函数等。这里主要介绍常用的几个函数 ezplot、ezplot3、ezsufr 和 ezmesh。 通过这几个函数的学习,其他绘图函数也很容易掌握。 ezplot 的基本调用格式为 ezplot(f) ezplot(f. >> ezplot(y).26。 .y.y 范围的函数图形。ezplot(x.tmax]) ezplot(f)为默认的调用方式,ezplot(f.MATLAB 数值分析与应用 29 图 1.ymin.tmax])是为限制参数范围的函数图象。 2 【例 30】绘制函数图象 y = x + x − 2 在命令窗口输入 >> syms x >> y=x^2+x-2.grid 回车得到图象 1.3.[tmin.25 等高图 1.[min.[tmin.xmax.ymin.[xmin.ymax])是为指定 x.[min.y) ezplot(x.y.xmax.[xmin.

>> z=2*cos(t).y.MATLAB 30 数值分析与应用 图 1.z.y.[0.20]) >> grid 回车得到函数图象 1. >> ezplot3(x. >> y=sin(t). 20]  z = 2cos t  在命令窗口输入: >> clear >> syms t >> x=t.y.tmax] 第一种为默认的调用方法,第二种则指定参数变化范围绘制函数图象,下以范例说明。 【例 31】采用符号作图方法绘制变形的螺旋线。参数方程为 x = t   y = sin t , t ∈ [0.26 ezplot 绘制的函数图象 一般而言,如果缺省参数使用默认的调用方式,MATLAB 会自动选择一个比较合适绘 制图象范围,除非用户自己有要求需要修改参数范围。 ezplot3 的基本使用方法为 ezplot3(x.27。 .z.[tmin.z) ezplot3(x.

z) ezmesh(x.y.y)的曲面图象,而 ezmesh(x.z.[0.z.smax.domain) ezmesh(x. >>z=2*cos(t1).[min.y.tmax]为参数区间范围。Ezsurf 使用方法基本相同,下面以两个范例分别说 明。 【例 32】 采用 mesh 绘图方法绘椭球面,椭球参数方程为  x = sin t1 cos t2   y = 16sin t1 sin t2  z = 2cos t  1 在命令窗口输入: >>syms a t1 t2 >>x=sin(t1)*cos(t2).MATLAB 31 数值分析与应用 图 1.smax.y.y.2*pi]) >>hidden off %透视效果,注意 hiddenoff 效果对 ezsurf 无效 回车得到图 1.0.tmin. >>y=16*sin(t1)*sin(t2).z. >>ezmesh (x.max]) 其中 ezmesh(f) 产生函数 f(x.27 变形的螺旋线 ezmesh 和 ezsurf 使用方法基本一样,只是图形表现形式不同,而且对部分函数的支持 不同。如 ezmesh 其基本调用格式为 ezmesh(f) ezmesh(f.z)是为曲面为参数方程。 [smin.tmin.tmax]) or ezmesh(x.28。 .y.pi.[smin.

>>y=sin(t)*(3+cos(u)). >>z=sin(u).2*pi.29。 数值分析与应用 .[0.0. u ∈ [0.y. t ∈ [0. 2π ] .2*pi]) >>axis off %不显示坐标轴 回车得到环面图形,如图 1.28 ezmesh 绘制的椭球透视图象 【例 33】采用 ezsurf 绘图方法绘制轮胎状环面,参数方程为  x = cos t ( 3 + cos u )   y = sin t ( 3 + cos u ) . 2π ]  z = sin u  在命令窗口输入: >>clear >>clc >>syms t u >>x=cos(t)*(3+cos(u)).z.MATLAB 32 图 1. >>ezsurf(x.

1 M 文件概述与编辑/调试器窗口基本操作 在 delphi 编程中,原代码一般使用 pas 作为后缀名、c++中使用 cpp 做后缀名、java 程 序设计中通常用 java 做后缀名、fortran 中一般使用 f90 做后缀名。在 MATLAB 中以文件形 式保存的源代码一般使用 m 做后缀名,这样的文件称为 M 文件,M 文件在表现形式上比上 面的几种文件有更大的灵活性。 M 文件有两种形式,一种是脚本文件,另一种是函数文件 。打开编辑/调试器窗口可以 通过以下方法打开。 1) 2) 3) 鼠标左键单击 MATLAB 工具栏图标 。 在 MATLAB 主菜单栏依次选择“File”|“New”|“M-file”命令,如图 1.MATLAB 33 数值分析与应用 图 1.4.29 ezsurf 绘制的轮胎状环面 1.2。 直接在命令窗口输入命令:edit。 .4 MATLAB 程序设计基础 前面几节介绍的 MATLAB 运行方式都是在命令窗口中直接实现,这给用户带了很大的 方便,不过这样的方式比较适合于处理不太复杂语句不太多的问题。有过其他高级编程经验 的读者,在做比较复杂的程序设计时,通常不会把所有问题都放在主程序中实现,而把问题 分解成多个子程序,按照结构化的思想,逐步细化程序。当然在 MATLAB 中处理较复杂的 结构设计时,如果把所有语句都放在命令窗口中实现的话,原则上可行,但是这样做会非常 笨拙,繁琐。所以,掌握编程方法是非常必要而且很基础的技能。 1.

1 中的一种方法打开 Editor 编辑器,并输入以下命令: x=0:0.30 所示。 图 1.4.z) 界面如图 1.4.y.30 Editor 窗口 可以看到 Editor 窗口有自己的菜单和工具栏,可以实现对自己的文件管理功能,实际上 还可以直接进行程序调试。 “File”菜单下拉菜单如图 1.2 M 脚本文件 M 脚本文件实际上和窗口命令没有本质上的区别,是包含了一系列的命令的集合,可 以理解为一种批处理文件,而且脚本文件运行产生的变量留在 MATLAB 工作空间中,运行 结果可以在命令窗口显示,也可以用图形显示,还可以以文件形式保存。 【例 34】 用 M 编辑器编辑脚本文件并运行之。分别绘制函数 y = sin x + sin 4 x + sin 6 x 与函数 z = cos x + sin 3 x + cos 5 x 的图象。 用 1.31 所示。 . y=sin(x)+sin(4*x)+sin(6*x).'*'.MATLAB 34 数值分析与应用 空白的 Editor 窗口如图 1. z=cos(x)+sin(3*x)+cos(5*x).2 所示,如果打开已经存在的文件,可以选择“File”|“open” 命令。保存已经编辑的文件,如果是第一次保存,会让用户选择保存路径,否则覆盖前一次 的保存结果。如果选择“save as”则表示另存文件。 1.x. plot(x.02:8.

32 所示。 图 1.1 节。 设保文件名称为 ex31.MATLAB 35 图 1.31 数值分析与应用 脚本文件在 Editor 时状态 保存文件,使文件在 MATLAB 能够搜索到的路径中,关于路径设置方法,参考 1.4.m,注意后缀名必须为 m。最好不要保存在包含中文的路径中,这样 有可能会让你的程序运行不了。 运行脚本文件,有两种方法,第一直接在 Editor 编辑器中选择菜单“Debug”|“Run” 命令,如果你之前没有保存,这时候的选择是 Save and run,即在你保存之后自动运行。运 行结果如图 1.32 脚本文件运行结果 也可以采用另外一种运行方式,既在命令窗口直接输入 ex1,然后回车,当然前提是你刚才 已经保存了这个文件。运行结果和刚才是一样的。 1.3 M 函数文件 M 函数文件就比较类似于一般的高级语言的函数功能,其格式也比较严格,不象脚本 文件那么自由。可以这样说函数方法是结构化程序设计非常重要的一个基础,如果不能把问 题逐步细化,面对比较大的复杂的问题往往我们无法下手。 函数文件必须以 function 开头,在函数文件运行时系统会专门开辟一个临时空间,所 .

%设置微分方程参数 >> [t.8598 0.51 y y 1 2  dt  步骤一:在命令窗口输入:edit,打开 Editor 编辑器。在编辑器中输入函数: function dy = rigid(t.[1e-4 1e-4 1e-5]).7 所示。 %调用系统函数 ode45 计算方程 y1 y2 y3 0 0 1.m。 步骤二:在命令窗口输入如下命令: >> options = odeset('RelTol'.5109 0.MATLAB 数值分析与应用 36 有中间变量都放在这个空间中,当函数调用结束时候,释放这些空间。函数中可以使用注释 语句,方法和命令窗口的注释方法相同,在程序运行时注释语句不被执行。 函数主要结构如下: 1) 函数声明,既以 function 开头,输入/出变量也在这里定义。 2) 函数体,由实现函数功能的各指令组成,中间可以使用注释。 有经验的编程者,一般会以相对固定一点的格式编写程序,这样方便自己以后快速度的 明了前面所做的工作。在紧随函数声明之后的第一行注释常成为 H1 行,H1 行包含大写的 函数文件名和运用关键词描述函数功能,这样可以供 lookfor 和 help 在线帮助使用。之后的 可以单独阁行描述一下编程作者以及时间,这样可以便于以后的文件管理。接着另起一行开 始用注释解释一些变量的意义。 【例 35】计算常微分方程组,并把计算结果用图象表现出来。  dy1  dt = y2 y3  y1 (0) = 0   dy2  ,初值条件为  y2 (0) = 1 = − y1 y3   y (0) = 1  dt  3  dy3 = − 0.1e-4.0317 0.9977 M M M M 8.Y] = ode45(@ex1_35.0000 1.0951 0.4156 0.0949 0.51 * y(1) * y(2).9097 0.0633 0.y) %原方程右函数 % y 为列向量 dy = zeros(3. dy(3) = -0.9997 0.1).'AbsTol'.0634 0.options) 回车得到运行结果如表 1.7894 8. dy(1) = y(2) * y(3).9479 0.3190 0.7604 8. dy(2) = -y(1) * y(3).9980 0.9990 0.[0 1 1].9955 0.8573 0. 保存文件,文件名为 ex1_35.7183 0.5794 0.7362 t .000 0.[0 12].0317 0.9995 0.

') 回车,运行得到的结果如图 1.'-'.8373 0.6041 -0.8473 -0.MATLAB 数值分析与应用 37 8.4.7058 -0.Y(:.9379 11.3).7710 -0.1).9237 -0.2).'-.0000 -0.33 所示。 图 1.5472 -0.33 微分方程组解的图形显示 说明: (1)通过这个例子我们可以看到,我们自己编写了自定义的函数,同时调用了系统函数 ode45,ode45 就是解微分方程的数值方法之一,当然如果根据实际工作的需要可以编写出 工程要求(如精度等)更高的方法。 (2)为了排版的需要,我们省略了部分输出的数据。 1.4 MATLAB 控制流 1966 年,Bohra 和 Jacopini 提出了三种基本的程序设计结构既:顺序结构、选择结构、 循环结构。已经证明,这三种结构组成的算法,可以解决任何复杂的问题。由基本结构构成 的算法属于结构化的算法,不存在无规律的转移。这三种结构都有四个特点: 1) 只有一个入口。 .t.6570 -0.Y(:.6946 -0.8639 表 1.'.t.7178 M M M M 11.4865 -0.9752 0.7542 0.8833 12.7 微分方程组的计算结果 步骤三:结果用图形表示出来,在命令窗口输入: >> plot(t.9024 11.Y(:.9207 11.'.7087 0.8739 0.7972 0.9962 0.2218 0.

MATLAB 数值分析与应用 38 2) 只有一个出口。 3) 结构内不存在死循环。 4) 结构内的每一部分都有机会被执行到。 所以,基本结构不一定局限在上面三种,只要具备上面的四个特点,我们可以定义自己 的基本结构,并组成结构化程序。事实上,为了程序设计的方便很多语言都外加了一些基本 结构。 这里主要讲一下 MATLAB 的一些程序设计方法,当然这并不局限在 M 文件中,在命令 窗口中同样有效。 循环结构 MATLAB 提供了 for 循环和 while 循环 1.for 循环。for 循环语句格式为 for 控制变量=初始值:步长:终值 循环体 end 步长缺省时,默认为 1。 50 【例 36】计算 ∑x x =1 在命令窗口输入: >> s=0. >> for x=1:50 s=s+x. ∑ x 步骤二:调用函数,分别计算 x =1 在命令窗口分别输入: 。 . end 保存文件为 ex1_36. end >> s s= 1275 可以看到运行结果为 s=1275。(请添加对上面的命令窗口中命令行的说明) 同样,我们可以把求和方法定义为一个函数,当我们再进行求和函数时候,只要调用就 可以实现刚才的方法,那么对一般的求和就可以方便的实现,而不必局限在 x=50 的情况。 步骤一 :打开 Editor 编辑器,输入如下语句: function s=adds(x) %求一个数的连加 s=0. for i=1:x s=s+i.m 50 75 200 x =1 x =1 ∑ x. ∑ x.

2000 0. j ) = 1 。为了使读者快速掌握一种方法,所以一般以比较容易的例子入手。这里 i + j −1 使用很多书上常用的 Hilbert 矩阵阐述嵌套的用法。我们还是分别采用命令窗口方法和 M 文 件方法做示范。 这里给出 6 阶 Hilbert 方阵,在命令窗口输入: >> clear >> for i=1:6 for j=1:6 a(i.1111 0.1429 0.0909 下面我们采用 M 文件方法,给出一般阶 Hilbert 矩阵的方法。 步骤一:打开 Editor 编辑器,输入以下语句: function a=hbM(n) for i=1:n for j=1:n a(i.1111 0.1250 0.2000 0.1667 0.1667 0.2500 0.3333 0.1667 0.1250 0.1111 0.1000 0. .j)=1/(i+j-1).1429 0.MATLAB 数值分析与应用 39 >> s50=ex1_36(50) 运行得: s50 = 1275 >> s75=ex1_36(75) 运行得: s75 = 2850 >> s200=ex1_36(200) 运行得: s200 = 20100 对于 x=50 的情况,我们可以看出计算结果是一样的。 【例 37】使用 for 循环语句的嵌套方法,给出 Hilbert 方阵。Hilbert 矩阵元素的表达式为 a (i .5000 0. end end >> a 回车运行结果为: a= 1.1000 0.5000 0.1250 0.3333 0.2000 0.1667 0.1667 0.1429 0.1429 0.2000 0.1429 0.0000 0.1250 0.2500 0.2500 0.1667 0.3333 0.2000 0.j)=1/(i+j-1).2500 0.

1111 0.0000 0.1429 0.1429 0. >> x=1.1667 0.5000 0.1667 0.1667 0.2500 0.1000 0.2000 0. >> while x<=75 s=s+x.m 文件,下面调用之并分别给出 4 阶,和 7 阶 Hilbert 矩阵。在命令窗口输 入以下语句: >> a4=ex1_37(4) 运行得: a4 = 1.1000 0.1667 0.2500 0.2000 0. x=x+1.5000 0.2500 0.1250 0.0000 0.1667 0.2000 0.0769 2.2000 0.1429 0.1111 0.1111 0.1000 0.1250 0.3333 0.1429 0. end >> s 运行得 s= 2850 可以看出和前面的结果是一样的,当然我们可以采用脚本语言或者是函数方法都可以 实现。 .5000 0.0833 0.1429 0.0909 0.0909 0.1250 0.3333 0.1250 0.2500 0.0833 0.0909 0.2000 0.3333 0.1250 0.1111 0.1667 0.1667 0.2000 0.2500 0.1429 >> a7=ex1_37(7) 运行得: a7 = 1.3333 0.MATLAB 数值分析与应用 40 end end 并保存为 ex1_37.1429 0.1429 0.while 循环 。while 循环的格式为 while 循环判断条件 循环体 end 75 【例 38】用 while 循环语句计算等差数列求和 ∑x 1 在命令窗口输入: >> s=0.2000 0.2500 0.1000 0.2500 0.3333 0.1667 0.2500 0.3333 0.1111 0.1250 0.2000 0.5000 0.

m 保存。 步骤二:调用函数. else y=x^2+2.MATLAB 数值分析与应用 41 (1) 选择结构 MATLAB 主要有三种分支结构,其格式分别为 1. if 判断表达式 执行语句 end 当表达式成立时,进行执行语句。 2 if 判断表达式 执行语句 1 else 执行语句 2 end 当表达式成立时,执行语句 1,否则执行语句 2。 3 if 判断表达式 1 执行语句 1 elseif 判断表达式 2 执行语句 2 else 执行语句 3 end 表达式 1 成立时,执行语句 1,不成立时判断表达式 2,如果成立执行语句 2,如果还是 不成立,执行语句 3。 【例 39】计算分段函数的值 e x  y =  x2 + 2 − x 2  步骤一:打开 Editor 编辑器,输入以下语句: function y=ex1_39(x) if x>2 y=exp(x).在命令窗口输入: >> ex1_39(1) 运行得: ans = 3 x>2 2 > x > -2 x < -2 . end 以文件名为 ex1_39. elseif x<-2 y=-x^2.

MATLAB 数值分析与应用 42 >> ex1_39(3) 运行得: ans = 20.0855 >> ex1_39(-3) 运行得: ans = 运行得: -9 (3)多选择的 switch-case 结构 在 forgran90、c/c++和 pascal 等高级语言均有多选择结构,在 MATLAB 中同样有多分之选 择结构。格式为: switch 选择判断变量 case 变量的值 1 对应值 1 的执行语句 case 变量的值 2 对应值 2 的执行语句 M case 变量的值 n 对应值 n 的执行语句 otherwise 所有 case 都不发生,则执行该语句 v 【例 40】在做空间运动分析时经常要用到坐标转换矩阵。在一个坐标系中矢量 r ,在旋转 v 后的新坐标系中以 r ' 表示,如果平面 y-z、z-x 和 x-z 分别绕 x、y 和 z 轴转动角度 θ 的话, 则有 v v r ' = Rx (θ )r v v r ' = Ry (θ )r v v r ' = Rz (θ )r 其中 0 1  Rx (θ ) =  0 cosθ  0 -sinθ   cos θ 0  Ry (θ ) =  0 1  sinθ 0   cos θ sinθ Rx (θ ) =  sinθ cosθ 0 0  0  sinθ  cosθ  -sinθ   0  cosθ  0 0  1  .

m(3.1)=cos(x).3)=1.2)=1.3)=cos(x). m(2. case 2 %绕 y 轴旋转 m(1. m(2.2)=cos(x).1)=sin(x). %把角度化为弧度 m=zeros(3.3)=-sin(x). m(1. m(3.2)=sin(x). m(2.1)=1.8660 >> m2=ex1_40(2. m(2.1)=-sin(x). switch a case 1 %绕 x 轴旋转 m(1.3)=cos(x).30) %绕 x 轴转动 30 度的旋转矩阵 运行得: m1 = 1. m(3.x) %by song ye zhi %08/04/10 %计算旋转矩阵 x=x*pi/180.3)=sin(x).3).m 文件名保存,并使之在搜索路径上。 步骤二:调用旋转矩阵函数。 在命令窗口分别输入: >> m1=ex1_40(1. case 3 %绕 z 轴旋转 m(1.45) 运行得: %绕 y 轴转动 45 度的旋转矩阵 m2 = .2)=-sin(x).8660 0. m(3. m(1. m(3.0000 0 0 0 0. end 以 ex1_40.5000 0. m(2.1)=cos(x).5000 0 -0.2)=cos(x).MATLAB 43 数值分析与应用 这就是旋转矩阵,它有重要的性质 R −1 (θ ) = RT (θ ) = R ( −θ ) 。下面用 switch 语句实现旋转 矩阵的计算。 步骤一:编写旋转函数。 打开 Editor 编辑器,输入以下语句: function m=ex1_40(a.

5.0000 0 0. 可变精度计算:可以给出数学表达式任意精度的数值。 g. 积分变换:富里叶变换、拉普拉斯变换、Z-变换以及它们的逆变换。 符号计算是用加拿大滑铁卢大学数学系开发的 Maple 作为计算引擎。 (2)统计工具箱 统计工具箱从最基本的随机数的产生,到曲线拟合,统计实验设计都有相应部分可以处 .7071 0 1.5 前面几小节介绍了 MATLAB 的基本使用方法,当然这里不可能罗列所有的方法。在实 际应用时候可能会遇到各种各样的麻烦,这时候就需要自行解决问题的能力。如何使用帮助 系统,以及如何利用网络资源进行帮助是这小节要介绍的内容。同时鉴于 MATLAB 很多工 具箱非常有特色,所以这里也做一简单介绍。 1. 特殊函数:经典数学的特殊函数。 f.7071 0 -0.MATLAB 44 数值分析与应用 0.2588 0.9659 0.2588 0 0 0 1.1 MATLAB 工具箱介绍 MATLAB 的工具箱是非常有特色的,这也是吸引很多工程人员的原因之一,到目前为 止 MATLAB 已经有多达几十个工具箱,而且还在陆续添加当中。相对传统的研究领域比如 控制理论、信号处理都有自己的工具箱,而比较新的国际上的一些近二、三十年数学研究进 展在 MATLAB 中也有体现,比如小波分析、神经网络、鲁棒控制都有工具箱。不太好说哪 一个工具箱一定比其他的重要,主要取决于用户自己的工作领域与兴趣、爱好。 这里不打算罗列全部的工具箱,这里只介绍几个相对比较常用工具箱,如果想知道详细 内容或者其他工具箱,读者可自行查看 MATLAB 的帮助系统。 (1) 符号计算工具箱 符号运算工具箱不一定限于某个专业领域,在个领域都可以有自己的解析计算问题。 MATLAB 在数值运算方面非常出色,而符号工具箱使得 MATLAB 在符号计算方面同样非 常出色。符号工具箱主要有以下几个方面 a. 微积分:包含微分、积分、极限、泰勒级数等领域。 b. 解方程:解微分方程与代数方程。 e.9659 0 -0. 线性代数:主要包含矩阵的逆,行列式、特征值、矩阵分解、范数等。 c.0000 MATLAB 工具箱介绍与帮助系统 1.7071 >> m3=ex1_40(3.75) %绕 z 轴转动 75 度的旋转矩阵 m3 = 0. 化简计算:代数表达式的化简。 d.7071 0 0.

非线性最小二乘与曲线拟合。 e. 无约束非线性最优化问题。 b. 概率与统计的建模模块。 b. 约束非线性最优化问题。 c. 非线性系统的方程求解。 f.1 命令行帮助 命令行帮助是纯文本帮助方式,方便快捷。 【例 41】 ]如果我们想知道函数 sin 的用法,只需要在窗口输入 >> help sin 回车得到如下信息: .MATLAB 45 数值分析与应用 理。 工具箱主要提供两方面的工具: a.2 帮助系统 一般来说用户很难也没有必要记住软件的所有操作或者命令。但是在遇到困难的时候, 知道如何利用帮助系统解决问题,是一个基本的要求。作为一个优秀的科学计算软件, MATLAB 有多种友好的帮助系统。主要有以下几种: (1)命令行帮助 (2)帮助导航/浏览器 (3)DEMO 帮助系统 (4)网络资源帮助 下面分别做一些简单介绍。 1. 线性规划。 d. 约束线性最小二乘。 g. 图形与交互工具。 第一部分主要是以 M 文件保存在计算机中,供用户调用。用户可以查看这些文件的代 码。而且用户可以修改这些代码、重命名、甚至添加自己的 M-文件。在十二章还会讲到如 何建立自己的仿真模块库。 第二部分工具箱通过用户界面(GUI)方法,提供了许多交互工具。可以进行预测、插 值等。 统计工具箱提供的函数非常丰富,事实上这已经不会比目前比较流行的专业统计软件逊 色。当然,前提是用户熟悉 MATLAB 与统计工具箱的操作。 最优化工具箱 最优化工具箱是一系列函数的集合,用以扩展数值计算。最优化工具箱主要可以处理以 下的一些最优化问题: a. 稀疏矩阵与大规模结构求解。 最优化工具箱的所有函数以 M-文件保存,用户可以查看、编辑 M 文件,也可以编写自 己的函数文件。 限于篇幅,这里对其他工具箱不再介绍。可以这样说,每一个工具箱都很精彩,都是前 人优秀工作的结晶。事实上,工具箱本身也是一个领域一本非常难得的生动教材,通过这些 工具箱的学习,可以使我们的相关领域数学水平与应用能力都会得到提高。 1.5.5.2.

2.34 所示: . "whatsnew robust" to display this file).5.identify a system variable.MATLAB 46 SIN 数值分析与应用 Sine. …… 然后你可以在其中寻找你感兴趣的内容。 1.e. Readme .m Reference page in Help browser doc sin 既为 sin 函数的详细用法,同时还可以得到相关的一些信息比如函数 asin 和 sind。 【例 42】 ]如果你想知道鲁棒控制的信息只要在命令窗口输入 >> help robust control 就会得到如下信息: Robust Control Toolbox Version 2. i.0. graft .10 (R14) 05-May-2004 New Features. SIN(X) is the sine of the elements of X. See also asin.2 帮助导航/浏览器 帮助导航/浏览器界面非常友善、是寻求帮助的主要资源。打开方法有多种如: 在指令窗口运行 helpbrowser 或者 helpdesk。 使用快捷键盘 F1。 在菜单栏先选择 Help,界面如图 1. issystem .extract branches from a tree. Overloaded functions or methods (ones with the same name in other directories) help sym/sin. branch .add a branch to a tree. sind.Important release information about the Robust Toolbox (Type "whatsnew directoryname". Optional System Data Structure.

3 DEMO 演示帮助系统 DEMO 帮助系统也是 MATLAB 非常优秀的帮助系统,而且其方便性是许多书籍没法代 替的。打开 DEMO 帮助系统有多种方法。如 (1)通过菜单栏的[Help][Demos] (2)直接在指令窗口输入 >> demo DEMO 主界面如图 1.5.35 所示: 图 1.34 帮助窗口 1.MATLAB 47 数值分析与应用 图 1.35 DEMO 帮助系统 .2.

com 当然,也可以在一些国内编程网站论坛上寻求帮助,与其他人交流。 有了这些帮助系统,相信它们会逐步扫清你在编程学习中的障碍,引导你步入程序设计 高手境界。 .4 网络帮助系统 公司的官方网站有丰富的资源,有相关书籍介绍、使用建议、常见问题解答。其官方网 站为: http://www.36。 图 1.2.0 提供 3 种基本的 DEMO, 其中包括视频演示方法。 下面以一个例说明 DEMO 帮助系统的魅力。比如想了解 2D 绘图基础,只需要打开目录[MATLAB]、[Graphics]、[2-D Plots ] 后看到如下界面,如图 1.MATLAB 48 数值分析与应用 MATLAB7.5.36 2D 绘图的 DEMOS 帮助界面 看到在此目录下有几种图形。可以一一打开,同时看到代码并且可以运行。当然用户也 可以把这些代码复制到命令行,然后运行,以达到学习该方法的目的。同时很方便的学习各 工具箱的用法。 1.mathworks.

MATLAB 49 数值分析与应用 小结 这一章比较详细的介绍了 MATLAB 的基本知识, 从软件的使用到程序设计都做了说明, 并附以范例。对于 MATLAB 的初学者完全可以通过这一章的学习,了解 MATLAB 的基本 使用方法及程序设计基础。对于熟悉这门语言的读者,也可以作为有益的参考。讲述知识点 时不求全面,但求实用。所以,这一章的基本目的是要使读者快速有效的掌握这一工具。 对于没有程序设计经历的读者,学习本章的难度要大一些,但是读者不必一次全部掌握 这些内容,而是先了解一个大概,在以后的使用中会逐步熟悉。 .

a.'right'):对应于第一种情况下的,左、右极限。 当自变量趋近无穷时,可以使用“inf”代替 a,趋近负无穷时可以用“-inf”.'left') 使用方法如下: limit(F.x.MATLAB 50 数值分析与应用 第二章 MATLAB 在微积分中的应用 微积分理论是数值分析的基础,在这一章中比较系统的介绍 MATLAB 符号方法在微积 分中的应用。鉴于目前深入介绍 MATLAB 在微积分中应用的资料不是特别多,所以这一章 给出微积分中相对深入的一些问题 MATLAB 处理方法,基本上涵盖微积分或数学分析主要 内容。这些内容主要采用符号计算方法。对于一些比较简单的问题,往往可以直接调用系统 函数进行处理,而相对复杂的一些问题则需要编写符号运算程序。一个实验中不同的范例往 往代表了不同类型的问题。 最后两个实验,一般而言对于要学习弹性力学、流体力学或电磁场理论的读者可能比较 有兴趣,对于一般的微积分初学者可以略去不读。 实验 2.a.x.x.x.x.a): 事实上等价于 limit(F.a)在 a=0 的情况。 limit(F.a):是 x 趋近于 a 时的函数 F 的极限。 limit(F.a.1 函数极限运算 实验基本原理 处理这类问题的基本原理与方法是洛必达法则,但在实际使用中,有时候需要采用等价 替换,还有一些类型如果使用泰勒公式展开会有非常好的效果。总之,这些都属于微分中值 定理的应用。 MATLAB 作为一种强大的数学工具,为这些问题提供了有效的处理方法。在 MATLAB 中函数极限问题的调用格式为: limit(F. 函数极限问题是微积分基本问题之一,本实验里选择了一些极限计算的基本类型。这些 例题有的来自大学数学教材,有的直接选自研究生入学考试试题,所以有一定的代表性。 希望这些实验的使用,能对正在学习大学数学的学生,或者对打算参加研究生入学考试 的学生都有所帮助。不过希望读者不要颠倒主次,重要的还是要自己会计算,可以把实验里 的方法作为验证用,甚至达到启迪的目的。 .a.'right') limit(F.x.x.a) limit(F) limit(F.a) imit(F.a) ,使用了 findsym(F)方法找到函数的符号变量。 limit(F) :默认情况下是 limit(F.'left') 或 limit(F.

MATLAB 51 实验目的与要求 l 明白极限的数学意义。 l 能用 ε − N 方法表述函数极限问题。 l 能用 MATLAB 符号方法计算函数极限。 l 对不同类型的极限问题,能灵活使用洛必达法则方法处理之。 实验内容及数据来源 针对以下不同类型的函数极限问题,采用 MATLAB 给出结果。 (1) 0 未定型 0 1 − 1 − x2 x → 0 e x − cos x lim (2) ∞ 未定型 ∞ 1 − e1/ x x →+0 x + e1/ x lim ∞ (3)1 未定型 a x + b x 3x lim( ) x→0 2 (4) ∞g0 未定型 3x 2 + 5 2 sin x →∞ 5 x + 3 x lim (5) ∞ − ∞ 未定型 lim( x→0 1 1 − ) 2 x x tan x 实验操作指导 光盘:\实验视频\chapter2.rar\2-1.m 步骤一:编写脚本文件。 数值分析与应用 .exe 光盘:\实验代码\chapter2\jixian.

inf) %(5) 无穷-无穷 y5=1/x^2-1/x/tan(x).x.grid on.m 保存。 步骤二:运行脚本文件。 在命令窗口输入: >> clear >> jixian 回车得到运算结果如下: 第 1 题结果为: lim_y1 = 0 第 2 题结果为: lim_y2 = 下同 .grid on. %可省略 因为前面已经定义 x 为符号变量 y2=(1-exp(1/x))/(x+exp(1/x)).ezplot(y5.grid on. y1=(1-sqrt(1-x^2))/(exp(x)-cos(x)).MATLAB 数值分析与应用 52 打开 Editor 编辑器,输入以下语句: %(1)0/0 型 syms x.title('(1)') %(2)无穷/无穷 型 syms x.3:4).[0.2).title('(5)') 以文件名 jixian. disp('第 1 题结果为:') lim_y1=limit(y1.x.[-4.0.4]).'right') subplot(2.ezplot(y1.2. y3=(a^x/2+b^x/2)^(3/x).[-4.x.4]). disp('第 4 题结果为:') lim_y4=limit(y4.x.1).2]).x. disp('第 5 题结果为:') lim_y5=limit(y5.0) %(4) 无穷于 0 乘积型 syms x y4=(3*x^2+5)/(5*x+3)*sin(2/x).0) subplot(2.title('(2)') %(3)1 的无穷次数型 syms x a b.2.0) subplot(2.2. disp('第 2 题结果为:') lim_y2=limit(y2.ezplot(y2. disp('第 3 题结果为:') lim_y3=limit(y3.

1 函数极限图象 读者可以把自己在用的高等数学教材,找到一些典型的例题,自己通过 MATLAB 编程 给出结果,然后与自己的运算相比较。对于比较难的习题,可以采用等价替换、或者泰勒展 开等方法尝试。 .MATLAB 53 数值分析与应用 -1 第 3 题结果为: lim_y3 = a^(3/2)*b^(3/2) 第 4 题结果为: lim_y4 = 6/5 第 5 题结果为: lim_y5 = 1/3 实验结论 因为计算结果在 MATLAB 中输出已经一目了然,所以这里就不再赘述。从实验里可以 看出其实计算函数极限的格式还是比较统一的,在使用中不必区分各种类型的极限方式。这 为用户提供了方便。 在本实验中对于范例(1) 、 (2、 ) (5)使用函数作图法给出了函数图象,如图 2.1。在函 数图象中也可以直观的看出计算结果。其中范例(3)结果中含有参数,而范例(4)中表现 为 x 趋近无穷时的极限情况,所以没有给出图形。 图 2.

'v') 或 diff(S.n) 与 diff(S.'v'.x):表达式 S 对 x 变量求导。 diff(S.'v') diff(S.n):类似 diff(S)用法,但是计算 n 次导数。 diff(S.n) diff(S.n.MATLAB 54 数值分析与应用 实验 2.'v'.x.sym('v')) :符号表达式 S 对自变量 v 求导 diff(S.n) 函数的使用方法 diff(S): 默认的符号变量求导,在 MALTAB 中使用 findsym 函数找到符号自变量。 diff(S.2 函数的导数与高阶导数运算 实验基本原理 导数问题是微积分基本问题,MATLAB 为导数运算问题提供了方便、快捷的命令,可 以满足一般的运算需求。 在 MALTAB 中导数计算的基本语法为: diff(S.n):表达式 S 对 x 求 n 阶导数。 在这一章安排中,我们的顺序主要按照大学数学的学习顺序安排各种运算问题,就本实 验而言给出三个运算实例,这些例子都分别代表一种典型。 其中范例(1)是一般的导数计算,让读者熟悉导数计算方法。范例(2)为了突出 MATLAB 面向矩阵运算的思想给出了矩阵导数运算问题。范例(3)则是高阶导数运算问题。希望读 者理解导数运算的基本原理,当然这属于微积分(或数学分析)范畴。 实验目的与要求 l 明白导数的数学意义和几何意义。 l 会用用解析方法计算一般的导数问题。 l 会调用 MATLAB 计算导数问题,注意正确的设置参数。 l 会用 MATLAB 直接计算高阶导数问题。 l 把计算结果用图形方式表达出来。 实验内容及数据来源 (1) 计算函数 y= 1 + sin( x) 1 + cos( x) .'v') :这样的方法 MATLAB 可以接受,但是不提倡。 在实际使用中,往往可以直接使用 diff(S.

rar\2-2. y4=acot(x).2). %计算导数 df1=diff(f1.x) %把窗口拆分为两个子窗口绘图 subplot(1. %建立符号矩阵 y=[y1 y2.grid on %第(2)题 syms x. y1=asin(x). f1=1+sin(x)/(1-cos(x)).ezplot(df1).2.y3 y4]. y2=acos(x).grid on subplot(1.ezplot(f1).MATLAB 数值分析与应用 55 的导数。 (2)计算矩阵函数的导数 arcsin x y= arctan x arctan x  arc cot x  (3)计算函数 y = x 2 cos( x) 的 8 次导数。 实验操作指导 光盘:\实验视频\chapter2.1).2.exe 光盘:\实验代码\chapter2\daoshu. y3=atan(x).m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %范例(1) syms x. %计算符号矩阵导数 dy=diff(y) %新建立窗口 figure(2) %把窗口拆分四小格,画出矩阵函数图象 .

2 中左边为函数 .grid subplot(2.grid %新建窗口,画出矩阵函数导数图象 figure(3) subplot(2.3).grid subplot(2.2.ezplot(y2).ezplot(y3).grid subplot(2.2.ezplot(dy(4)).4).2.4).1).1).ezplot(y4). dz8=diff(z.3).ezplot(z).grid subplot(2.2).ezplot(dz8).2. -1/(1-x^2)^(1/2)] [ 1/(1+x^2). -1/(1+x^2)] dz8 = -56*cos(x)+16*x*sin(x)+x^2*cos(x) 实验结论 实验的计算结果,已经在 MATLAB 输出中很清楚了,只是表达方式按照 MALTAB 编 程语言习惯。同时在运算结束后,一次性给出全部符号图形表达,下面阐述之。 图 2.MATLAB 56 数值分析与应用 subplot(2.x.2.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> daoshu 回车得到运算结果: df1 = cos(x)/(1-cos(x))-sin(x)^2/(1-cos(x))^2 dy = [ 1/(1-x^2)^(1/2). z=x^2*cos(x).2.2).2).grid %在第二子窗口画出高阶导数图象 subplot(1.ezplot(dy(3)).ezplot(dy(2)).grid subplot(2.grid %第(3)题 syms x.8) %新建窗口,画出函数图象 figure(4) subplot(1.ezplot(dy(1)).2.ezplot(y1).1).grid 以文件名 daoshu.2.2.2.grid subplot(2.

MATLAB 数值分析与应用 57 y= 1 + sin( x) 1 + cos( x) 符号作图结果,右边为 y 的导数符号作图结果。既原函数的导函数为 dy cos x sin 2 x = − dx 1 − cos x (1 − cos x ) 2 图 2.3 范例(2)的原矩阵函数图象 图 2.3 中,四幅图分别为矩阵函数 arcsin x y= arctan x arctan x  arc cot x  符号作图结果。 图 2.4 中,四幅图为上述矩阵函数的导数符号作图结果。既原矩阵函数的导数为: .2 范例(1)的函数图象与函数导数图象 图 2.

3)做了调整,作图时需要留意。 图 2.2.2.4 题范例(2)的矩阵函数导数图象 在图 2.2)与 subplot(2.5 中,左边一幅图表示范例(3)中原函数,既 y = x 2 cos( x) 右边一幅是该函数的 8 次导函数的符号作图结果。既 8 次导数运算结果为 d8y = 56 cos x + 16 x sin x + x 2 cos x 8 dx .MATLAB 数值分析与应用 58  1 dy  1 − x 2 = dt  1 1 + x 2 − 1 1− x 1 1 + x2 2      在程序设计时候,图形编排顺序与矩阵元素排列顺序不同,所以在程序设计时候画导数命令 时 subplot(2.

v.a) 用法说明 taylor(f.n.MATLAB 59 数值分析与应用 图 2.v) r = taylor(f. c1 .3 泰勒展开 实验基本原理 泰勒公式是处理很多问题的有力工具,关于这些想必学过微积分的都知道泰勒公式的重 要性。 既然涉及到展开,就应该考虑收敛性问题。不应该认为每个无穷可微的函数泰勒级数都 会在点 x0 收敛,因为对于任何一个数列 c0 .n.a):用于返回 f 的泰勒级数展开,展开点是 a,关于展开阶数和上面一样。 a 可以为符号变量或者数值。 .L cn .L 都可以构造一个函数 f ( x ) ,使得 f ( n) ( x0 ) = cn ([俄]卓里奇《数学分析》)。 也不应该认为,如果泰勒级数收敛,它就一定收敛到产生它的函数。泰勒级数收敛到它 产生的函数,只对与解析函数成立。这些是读者需要注意的。 MATLAB 符号工具箱中提供了单变元函数的泰勒展开函数。对于多变元的泰勒展开在 MATLAB 中没有提供,如果需要使用的话可以在 MATLAB 中调用 maple 函数,我们会在实 验 2.n.v.n.10 中讲述。单变元泰勒展开的基本函数为 r = taylor(f) r = taylor(f.5 范例(3)的函数与高阶导数图象 [注]:需要说明的是 diff 函数不只是用在求导数方面,在 MATLAB 的基本函数中 diff 函数 有其他作用,在系统识辩工具箱和金融时间序列工具箱中都有特定的用法。这里的导数方法 实际上是 MATLAB 符号工具箱中的函数。 实验 2.v):用于返回 f 的麦克劳林级数的多项式展开,其中 f 为符号表达式,n 为展 开的阶数参数,实际返回 n-1 阶。v 为符号自变量。 r = taylor(f.

ezplot(y1.grid %画出展开级数在展开点附近的图象 subplot(1.rar\2-3.ezplot(tay_y1.[-5.2.2).m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第(1)题 syms x.exe 光盘:\实验代码\chapter2\ taile. y1=exp(x^2)*cos(x) tay_y1=taylor(y1.1).MATLAB 60 数值分析与应用 关于展开的一些扩展或简略形式,如果 n 缺省则,默认 n 为 6。实际使用还中可以缺省 自变量参数,也可以缺省展开点 a 参数(其实就是麦克劳林展开) 。 实验目的与要求 l 理解 Taylor 展开的数学意义。 l 熟悉常用的函数展开表达式。 l 能利用常用的函数展开表达式构造复杂的函数展开式。 l 能用符号工具箱处理 Taylor 展开问题,能根据需要正确的设置参数。 l 把计算结果用图形表达出来。 实验内容及数据来源 (1) y1 = e x cos( x) 展开为幂级数,展开到 8 阶。 2 (2) y 2 = 1 展开为幂级数,展开到 8 阶。 x − 3x + 2 2 (3) y 3 = e 在 x=2 处展开,展开到 5 阶。 x 实验操作指导 光盘:\实验视频\chapter2.grid %第(2)题 .5]).[-5.2.5]).8) %画出图象 subplot(1.

8.2) 以文件名 taile.6。 图 2. y3=exp(x) tay_y3=taylor(y3.6 范例(1)的函数图象与泰勒展开多项式图象 注意泰勒展开不是数据拟合,只有在展开点附近才能比较好的逼近原函数,而不是大范 .MATLAB 数值分析与应用 61 syms x. y2=1/(x^2-3*x+2).x.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> taile 回车得到: >> taile tay_y1 = 1+1/2*x^2+1/24*x^4-31/720*x^6 tay_y2 = 1/2+3/4*x+7/8*x^2+15/16*x^3+31/32*x^4+63/64*x^5+127/128*x^6+255/256*x^7 tay_y3= exp(2)+exp(2)*(x-2)+1/2*exp(2)*(x-2)^2+1/6*exp(2)*(x-2)^3+1/24*exp(2)*(x-2)^4 实验结论 MATLAB 输出已经给了结果,如果使用 LATEX 的用户,可以把使用命令把这些表达式 直接转换为看起来比较输入的表达式。 对于范例(1) ,给出了原函数图象与泰勒展开的多项式图象,如图 2. tay_y2=taylor(y2.8) %第(3)题 syms x.

a.a.v. >> taylor(y.MATLAB 62 数值分析与应用 围的。这属于数学内容,这里不缀述。 泰勒展开的重要性是不言而喻的,而且其使用性也非常重要。初学微积分的学生往往觉 得泰勒展比较难,这就需要我们理解其数学原理,不可死记硬背其展开公式。 [注]:很多 MATLAB 教材里,关于泰勒展开中的 n 问题,表达为展开项数,实际上是展开 阶数参数,这是不同的概念,请读者留意。而实际返回的是 n-1 阶次展开。如在命令窗口输 入: >> syms x >> y=sin(x).b) 这里介绍完整的函数意义 r = symsum(s.a.4 符号求和与特殊级数问题 实验基本原理 很多时候我们需要对函数进行展开,但有时候可能相反,我们需要对一些展开式需要求 和。 MATLAB 符号工具箱中的 symsum 函数可以有效的处理这一问题。symsum 是符号求和 函数在 MATLAB 符号工具箱中放在微积分一类。 基本语法为 r = symsum(s) r = symsum(s.b)表示符号表达式 s 对变量 v 求和,求和的 范围从 v=a 到 v=b,其他属于参数的一些缺省情况,是 MALTAB 可以接受的。但就个人观 点而言不提倡用缺省情况,如果使用不慎的话,会得到不是自己期望的结果。 实验目的与要求 l 熟悉 symsum 函数的使用方法,能正确配置函数参数。 l 理解无穷级数尤其是幂级数的数学分析性质。 l 熟悉常见的函数展开式。 .x) 回车得到: ans = x-1/6*x^3+1/120*x^5 展开结果只有 3 项,而不是 6 项。而是指展开式中比六阶低的邻近一阶,这里为 5 阶。 实验 2.v.v) r = symsum(s.b) r = symsum(s.6.

inf) %%%%%% %%在第 2 和 4 子窗口画出函数曲线 数值分析与应用 .rar\2-4.exe 光盘:\实验代码\chapter2\sym_sum.grid on %第 2 题 %[俄]卓里奇《数学分析(下) 》P390 %斯特林公式 syms x n s=2*x^(2*n-1)/(2*n-1). sum_2=symsum(s.n.1).1.MATLAB l 63 灵活处理级数问题,对于一些展开式能知道其原函数的表达式。 实验内容及数据来源 计算以下级数: x2 xn (1)1 + x + +L+ +L 2! n! ∞ (2) 2 x x2 m ∑ m =0 2m + 1 (3)1 − 1 1 1 + − L + (−1) n +1 + L 2 3 n n(n + 1) n −1 x 2 n =1 ∞ (4) ∑ 实验操作指导 光盘:\实验视频\chapter2. k.ezplot(sum_1). 0.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第一题 e 的展开式 syms x k s=x^k/sym('k!'). sum_1=symsum(s.inf) subplot(2.2.

inf) %第 4 题 %南京大学编《大学数学(下) 》P81 syms x n s=n*(n+1)/2*x^(n-1).2.n.MATLAB 64 数值分析与应用 subplot(2. sum_3=symsum(s.inf) subplot(2.1.ezplot(sum_4).grid on 以文件名 sym_sum.2.k.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> sym_sum 回车得到运算结果: sum_1 = exp(x) sum_2 = log((1+x)/(-x+1)) sum_3 = log(2) sum_4 = -1/(x-1)^3 实验结论 级数理论是非常丰富的,在很多领域都有广泛而深刻的应用。如行星运动的摄动方程或 者工程中的非线性振动是小参数的非线形方程,其求解非常复杂,这时候采用所谓的摄动法 就是级数理论。 .grid on %第 3 题 %莫斯科大学数学系<数学分析>期末口试参考题 syms k s=(-1)^(k+1)/k.[2 4]).0.3).ezplot(sum_2). sum_4=symsum(s.

MATLAB 65 数值分析与应用 图 2.7。其中范例(3)结 果为一个数,所以没有给出函数图象。 实验 2.7 和函数的函数图象 在本实验中给出几个例子有的通项里含有参数,有的不含有参数,不过在符号工具箱里 这些都作为符号运算的。这里给出了实验中和函数的函数图象,如图 2.v) 其使用方法也比较简单,符号变量 S 对其变量 v 进行积分,第一种情况是变量 v 的缺 省形式,MATLAB 是可以接受的。 对于缺省的情况,积分变量是系统默认的一个变量,使用时候需要比较小心。有时候系 统默认的不一定会是我们默认的,为什么这样说,我们看一下下面的例子。 .5 不定积分运算 实验基本原理 计算不定积分,是在微积分学习过程中比较头疼的事情。积分计算的方法比较灵活,比 起求函数的导数而言,计算不定积分要麻烦很多。 而 MATLAB 的提供的 int 函数可以比较有效的处理一些积分问题。但是 int 函数不是万 能的,关于这一点我们做了实验后就知道,在实验结论里进一步讨论这个问题。这里介绍一 下 MALTAB 中的符号不定积分的基本函数为: R = int(S) R = int(S.

MATLAB 66 数值分析与应用 >> syms a x >> int(a*x) ans = 1/2*a*x^2 我们可以看到,在声明符号变量时 a.x 是平等的,但是系统默认 x 为积分变量。 >> clear >> syms a b >> int(a*b) ans = 1/2*a*b^2 同样,在声明符号变量时 a、b 是平等的,但是系统设置 b 为符号变量,也许我们会认 为是表示乘积时默认右边的量为变量。那结果又错了,我们再看 >> syms a x >> int(x*a) ans = 1/2*a*x^2 这次可以看到却又对前者做了默认变量。其实,仔细观察会发现,MATLAB 总是尽量 的“人性化” ,考虑到我们的习惯。但是有时候习惯不一定是好事。所以建议使用时,除非 很明了,否则尽量使用参数设置比较完整的调用形式。在有些其他函数中也存在类似情况。 要说明的是,对一个函数求不定积分得到应该是一个加任意一个常数,在 MALTAB 中 对这个常数输出做了省略。 实验目的与要求 l 理解不定积分的数学意义及计算方法。 l 能使用 MATLAB 符号方法进行不定积分计算。 l 对于不同类型的积分问题要会正确的配置函数参数。 l 熟悉微积分中的不定积分的一些计算技巧,这往往比机器运算更有效。 实验内容及数据来源 计算以下不定积分问题 (1) ∫ ln x − 1 dx x2 ∫ (2) e (tan x + 1) dx ∫ 2x (3) e (4) ∫ − x2 2 dx sin x dx x .

2.2.m 保存。 步骤二:运行脚本文件。 在命令窗口输入命令: >> clear >> bd_jifen 回车得到: int_y1 = 数值分析与应用 .ezplot(y2).grid on %第(2)题 y2=exp(2*x)*(tan(x)+1)^2.1).grid on %另一子窗口作出原函数图象 subplot(1.exe 光盘:\实验代码\chapter2\bd_jifen.grid on %在另一子窗口,用符号作图法作出原函数图象,积分常数取 0 subplot(1. int_y2=int(y2) %新开图象窗口 figure(2) %作出函数图象 subplot(1.ezplot(int_y2). int_y3=int(y3) %第(4)题 另一种不可积范例 y4=sin(x)/x.2. int_y4=int(y4) 以文件名 bd_jifen.ezplot(y1).MATLAB 67 实验操作指导 光盘:\实验视频\chapter2.2).2).1).rar\2-5. int_y1=int(y1) %用符号作图法作出函数图象 subplot(1.2.m 步骤一:编写脚本函数文件。 打开 Editor 编辑器,输入以下语句: syms x %第(1)题 y1=(log(x)-1)/x^2.ezplot(int_y1).grid on %第(3)题 不可积范例 y3=exp(x^(-2)).

8 所示。 图 2.MATLAB 68 数值分析与应用 -1/x*log(x) int_y2 = exp(2*x)*tan(x) int_y3 = exp(1/x^2)*x+i*pi^(1/2)*erf(i/x) int_y4 = sinint(x) 实验结论 在本实验中,有意的选择了两个可以积分的普通的积分。从输出来看,范例(1)的积 分结果为 ∫ ln x − 1 ln x dx = − +C 2 x x 其中 C 为积分常数,在 MATLAB 输出时省略了 C。 这里分别给出了被积函数与原函数的函数图象,如图 2.8 范例(1)的被积函数与原来函数图象 范例(2)的积分运算结果为 ∫e 2x (tan x + 1)2 dx = e 2 x tan x + C 其中 C 为积分常数,同样在 MATLAB 输出时省略了 C。这里也给出了范例(2)的被积函 数与原函数的函数图象,如图 2.9。 .

∫ dx sin x dx. ln x ∫ x 虽然这些积分存在,却无法用初等函数表示出来,著名的法国数学家刘维尔(Lioville) 曾对此作过证明。在常微分方程领域有类似情况,也是数学家刘维尔给出了证明。这些内容 的证明已经超出了一般的微积分教材范围。 对于这些函数的积分问题,当然 MATLAB 或者其他如 Maple、Mathmatica 都是无能为 力的,因为软件是按照我们人的思想设计,我们人都没有找到这样的方法,计算机又如何去 做到。 不过 MATLAB 给出了针对这些问题的友好提示。在范例(3) 、 (4)中就分别选择了上 面给出的两种情况。在范例(3)的输出中涉及了函数 erf,范例(4)涉及了函数 sinint(x)。 在 MATLAB 中这两种函数的定义分别为 erf ( x ) = 2 π ∫ 0 sin int( x) = ∫ x 0 e −t dt 2 sin t dt t 实验 2.9 范例(2)被积函数与原函数图象 这里需要对范例(3)和范例(4)做一下说明。从输出的结果来看范例(3) 、 (4)似乎 有点怪异,夹带了一些不熟悉的函数。事实上,在大学高等数学教材里我们学习的是求不定 积分的基本方法,以及一部分特殊方法。通常说“计算不定积分” ,我们总是默认指能用初 等函数形式把不定积分表达出来。就这个意义下而言,可能结果令我们有些失望,很多看似 很简单的函数,我们都没法做到这一点。例如 ∫e ± x2 dx.6 定积分与反常积分运算 实验基本原理 x . ∫ 1 − k 2 sin 2 xdx (0 < k 2 < 1) .MATLAB 数值分析与应用 69 图 2.

a.a.1) 上可积,x=1 . u ] ⊂ [0.MATLAB 70 数值分析与应用 相比不定积分而言,定积分有了更丰富的物理内涵,而不仅仅是一种运算的求逆。尤其 是现代数学的发展赋予了微积分更深刻的意义。 在 MATLAB 中,定积分与不定积分使用相同的函数,只是需要正确设置积分区间,便 成了定积分。其中积分区间可以设置为无穷,那么这时候就是反常积分,对于积分中的瑕点, 符号运算仍然可以进行,这就是瑕积分。 定积分的基本函数为 R = int(S.1) 上连续,从而在任何 [0.b) 对于第一种形式,是对表达式 S 积分积分变量为系统默认的一个变量,在使用时候要 注意。 a.v.b 表示积分区间,可以使用数字,而且允许设置为无穷。正无穷时可以用 inf.b) R = int(S.负无穷 时可以用-inf。 实验目的与要求 l 理解牛顿-莱布尼兹公式,明白微积分基本原理。 l 熟悉定积分的计算方法。 l 能处理反常积分与瑕积分问题。 l 正确配置函数参数以期满足不同的计算需求。 实验内容及数据来源 计算以下定积分问题 (1) ∫ π /4 ∫ 1 0 (2) 0 x dx 1 + cos 2 x 3 x(1 − x 4 ) 2 dx (3)反常积分 ∫ ∞ 0 (4)瑕积分 ∫ 1 0 dx dx ( x + 7) x − 2 dx 1 − x2 为瑕点。 ) 实验操作指导 dx(被积函数在 [0.

grid on %第 3 题 %反常积分问题 y3=1/(x+7)/sqrt(x-2).grid on %第 4 题 %瑕积问题 y4=1/sqrt(1-x^2).2.x.rar\2-6.1).grid on %第 2 题 y2=x*(1-x^4)^(3/2). %第 1 题 y1=x/(1+cos(2*x)). int_y1=int(y1.2).1).x. int_y3=int(y3.2. int_y4=int(y4. %在新 figure,第一子图中画出原函数图象 subplot(1.2.x.2.0.m 保存。 步骤二:运行脚本文件。 在命令窗口输入: >> clear >> d_jifen 回车得到: int_y1 = 1/8*pi-1/4*log(2) int_y2 = 3/32*pi 数值分析与应用 .ezplot(y1).inf) %新开 figure figure(2).2).m 步骤一:编写脚本文件。打开 Editor 编辑器,输入以下语句: syms x.pi/4) %在第一幅 figure 中,第一子图画出原函数图象 subplot(1.ezplot(y2).exe 光盘:\实验代码\chapter2\d_jifen.x.0. int_y2=int(y2.MATLAB 71 光盘:\实验视频\chapter2.grid on 以文件名 d_jifen.ezplot(y4).1) %在新 figure,第二子图中画出原函数图象 subplot(1.1) %在第一幅 fitgure 中,第二子图画出原函数图象 subplot(1.0.ezplot(y3).2.

MATLAB 72 数值分析与应用 int_y3 = 1/3*pi int_y4 = 1/2*pi 实验结论 输出中已经给出了运算结果,这些结果同前面的实验一样给出的是符号类型,如果想转 换为数值类型可以使用函数 vpa。 在 MATLAB 中计算定积分与不定积分使用相同的函数名,只需要正确设置参数。在本 实验中,给出的计算结果就不再阐述,这里给出了积分函数图象。 图 2.10 中,因为定积分给出的结果是一个值,而不是函数,所以这里没有给出积分 计算后的图象,如果要给的话,那么是一个点。事实上,这个点的值就是函数图象曲线与 x 轴所围成的图形面积,另外的两条直线为平行于 y 轴的线 x=a,x=b。 图 2.11 中,两个都是反常积分,对于第一幅图,是 x 的积分区间为无穷。但是虽然积 .10 范例(1) 、 (2)的被积函数图象 在图 2.11 范例(3) 、 (4)被积函数图象 图 2.

y0 ) 存在重极限 lim ( x . y ) → ( x0 . y ) 在点 ( x0 .MATLAB 数值分析与应用 73 分区间为无穷,但是积分结果是有限值,亦既函数曲线与 x 轴和围成的面积为有限值。对于 2. y ) 与累次极限 lim lim f ( x. y ) x → x0 y → y0 则它们必相等。 实验目的与要求 l 明白累次极限与重极限的区别与联系。 l 一定条件下会使用累次极限计算重极限。 l 使用 MATLAB 处理这样的问题时,要判断是否符合运算条件。 l 对计算结果与手工计算方法比较。 l 把计算结果用图象表达出来。 实验内容及数据来源 .10 中的第二幅图,虽然函数在 x=1 为瑕点,但是积分值却是有意义的。不会因为 x=1 时 候函数趋向无穷,而变为无穷。 实验 2.7 多变量函数极限 实验基本原理 讨论极限计算问题的首要问题是极限是否存在,多元函数的极限问题比一元函数要复 杂。 设 f 为定义在 D ⊂ R 上的二元函数, P0 是函数的一个聚点,A 是一个确定的实数。如 2 果对任意正数 ε ,总存在一个正数 δ ,使用得当 P ∈ U o ( P0 . y0 ) f ( x. δ ) ∩ D 时,都有 f ( P ) − A < ε , 则称 f 在 D 上当 P → P0 时,以 A 为极限,这也称为重极限。重极限要求变量以任何方式趋 近给定的点,极限都存在。 实验中采用的方法是用计算累次极限的方式计算重极限,从数学的角度而言累次极限和 重极限是两个不同的概念,它们的存在性没有必然的蕴涵关系。 而在很多时候我们又可以使用累次极限的方式计算重极限,主要是基于以下的事实,如 果 f ( x.

y. %累次极限求重极限 lim_y2=limit(limit(y2.ezsurf(y2) %第 3 题 y3=(x*x+y*y)/(x^4+y^4).0) %画出函数图形 subplot(1.rar\2-7.x.MATLAB 74 求下列二元函数极限问题 (1) (2) lim ( x .0) 1 x + y2 2 x2 + y 2 (3) lim ( x .0).0) %在第一幅 figure 上画出函数图象 subplot(1. %运用累次极限求重极限 lim_y1=limit(limit(y1.ezsurf(y1) %第 2 题 y2=(x+y)*sin(1/(x*x+y*y)). y ) → ( +∞ . %运用累次极限求重极限 lim_y3=limit(limit(y3.x.y.y.inf) %新开一幅 figure,并在第一幅子图上画出函数图象 figure(2).m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: syms x y. y ) → (0.+∞ ) (1 + 1 x sin y ) xy 实验操作指导 光盘:\实验视频\chapter2.1).2).+∞ ) x 4 + y 4 (4) lim ( x . y ) → ( +∞ .exe 光盘:\实验代码\chapter2\dby_jixian.0) x2 + y2 x2 + y 2 −1 lim ( x + y ) sin ( x .x.2.2. %第 1 题 y1=(x^2+y^2)/(sqrt(1+x*x+y*y)-1). 数值分析与应用 .0).inf). y ) → (0.

m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> dby_jixian lim_y1 = 2 lim_y2 = 0 lim_y3 = 0 lim_y3 = 1 实验结论 运算结果显示,上面 4 个范例的重极限分别为 2、0、0、1。这里给出了四个题目的函 数曲面,如图 2.x.ezsurf(y4) 以文件名 dby_jixian. %运用累次极限求重极限 lim_y3=limit(limit(y4.2.inf) %在新开的 figure 第二幅子图上画出函数图象 subplot(1.MATLAB 75 数值分析与应用 subplot(1.ezsurf(y3) %第 4 题 y4=(1+1/x/y)^(x*sin(y)).2.12。其中第一幅图形的第 1,2 子图分别为范例(1) 、 (2) ,第二幅图的第 3、 4 子图分别为范例(3) 、 (4) 。从图形读者可以直观的体会在给定点的极限情况。 .1).y.inf).2).

MATLAB 76 图 2.12 范例(1) 、 (2)函数图象 图 2. y ) ∈ D ,如果 ( x0 . ( x.13 范例(3) 、 (4)函数图象 数值分析与应用 实验 2. y0 ) ∈ D ,且 f ( x. y ).8 多元函数的偏导数运算 实验基本原理 偏导数问题是多元函数微分的基础。如多元函数极限问题相仿,相比一元函数而言多元 函数的微分问题比一元函数要复杂。 设函数 z = f ( x. y0 ) 在 x0 的某一领域内有定 义,则当极限 .

x) . y0 ) − f ( x0 . y0 ) = lim ∆x → 0 ∆x → 0 ∆x ∆x lim 存在时,那么我们就把这个极限称为 f 在点 ( x0 . 。 ∂x ∂y ∂x∂y ∂7 f (2) f = xy gcos( x + y ) ,要求计算高阶导数 4 3 。 ∂x ∂y 实验操作指导 光盘:\实验视频\chapter2. y0 ) f ( x0 + ∆x. %关于 x 偏导数 dzx=diff(z.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: syms x y.exe 光盘:\实验代码\chapter2\dy_daoshu.MATLAB 77 数值分析与应用 ∆xf ( x0 . %第一题 z=exp(sin(x*y)). y0 ) 关于 x 的偏导数。 从上面可以看到,函数 f 对哪一个自变量求偏导数时,是把其他自变量看为常数,从而 变成一元函数的求偏导数问题。 实验目的与要求 l 理解偏倒数与多元函数可微性之间的联系。 l 弄清多元函数可微性的充分条件与必要条件。 l 会正确使用 MATLAB 计算偏导数问题。 l 理解多元函可微性的几何意义及应用,如计算曲面在给定点的切平面与切平面法线问 题。 实验内容及数据来源 计算下列偏导数与高阶偏导数 (1) z = esin xy ,要求分别计算 ∂z ∂z ∂ 2 z . .rar\2-8.

2.y.2.2.4).3).ezmesh(f) %高阶导数图形 subplot(1.ezsurf(z) %第二子图,画出关于 x 的偏导数 subplot(2.ezsurf(dzxy) %第二题 f=(x*y)*cos(x+y).2.ezsurf(dzx) %第三子图,关于 y 的偏导数 subplot(2.y) %先对 x 求偏导数, 后对 y 求偏导数。实际为复合运算 dzxy=diff(dzx. dfx4=diff(f.MATLAB 78 数值分析与应用 %关于 y 偏导数 dzy=diff(z.2).ezsurf(dzy) %第四子图,关于先 x 后 y 的偏导数 subplot(2.1).3) figure(2) %原函数图形 subplot(1.2). dfx4y3=diff(dfx4.2.2.ezmesh(dfx4y3) 以文件名 dy_daoshu.4).m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >>clear >> dy_daoshu 回车得到运算结果 dzx = cos(x*y)*y*exp(sin(x*y)) dzy = cos(x*y)*x*exp(sin(x*y)) dzxy = -sin(x*y)*x*y*exp(sin(x*y))+cos(x*y)*exp(sin(x*y))+cos(x*y)^2*y*x*exp(sin(x*y)) dfx4y3 = -12*sin(x+y)-4*y*cos(x+y)-3*x*cos(x+y)+x*y*sin(x+y) 实验结论 .y) %在第一幅 firgure 里,第一子图画出函数图象 subplot(2.1).x.

MATLAB 79 数值分析与应用 系统输出已经给出了计算结果,图 2.5 范例(1)的原函数与高阶偏导数图象 在本实验结束之际,还是要再强调一下读者应该从数学方面把握偏导数与多元可微分的 关系,真正理解其数学内涵,不只是停留在仅会简单的计算。 .15 中给分别出了函数 f = xy gcos( x + y ) 以及其高阶偏导数函数的图象。在作图中如 果使用 surf 方法则图象颜色比较深,所以这里采用 mesh 方法。 图 12.14 中分别给出了范例(1)的原函数以及分别关于 x 和 y 的偏导数函数和关于 x、y 的二次偏导数函数。借助图形可以直观的理解偏导数的意 义。 图 2.114 范例(1)的函数与各偏导数图象 在图 2.

y . G ) 时,如果 J = 确定  不为 0 时则, ∂ (u . y. y )  F ( x. v) = 0 ∂( F . =− ∂y J ∂ ( y . y ) = 0 确定 y = y ( x ) 时, F' dy = − x . y ) 时, F' ∂z = − x . v) = 0 (2) 方程组  ∂u 1 ∂( F . v) ∂y J ∂ (u . y. u . y ) G ( x. ( F 'z ≠ 0) ∂x F 'z u = u ( x. G ) ∂v 1 ∂( F . ( F ' y ≠ 0) dx F 'y (2) F ( x. u . =− J ∂( x. v ) ∂x J ∂ (u . v ) v = v ( x .9 隐函数的偏导数 实验基本原理 隐函数定理及其应用在数学分析里一般会叙述的比较多,而在普通的微积分教材中讲的 会比较少一些,也偏于直观。这里不打算给出比较细的理论叙述,下面直接给出具体的计算 方法。 而事实上,在给出计算方法时无法回避的需要描述使用该计算方法的条件那么这就需要 大量的数学语言,鉴于这不是数学教材,这里省去这些内容,严格的叙述可以参考数学分析 或者微积分教材。 假设满足隐函数求偏导数的条件下 (1) F ( x. G ) ∂v 1 ∂(F . y ) 实验目的与要求 l 掌握隐函数定理及其应用的基本内容,会使用手工方法计算隐函数的偏导数问题。 l 能使用 MATLAB 编程计算隐函数偏导数问题。 l 掌握隐函数组的问题,会正确计算隐函数组的偏导数问题。 l 能用 MATLAB 处理隐函数组的偏导数问题。 . G) =− .MATLAB 80 数值分析与应用 实验 2. x ) ∂x ∂u 1 ∂( F . z ) = 0 确定 z = z ( x. G) =− .

jaco=det(jaco).[u.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第一题 隐函数偏导数问题 %华东师范大学编《数学分析(下) 》P150 syms x y z F=x*y*z^3+x^2+y^3-z.z) pz_y=-diff(F. y ) 的偏导数 ∂z ∂z 和 。 ∂x ∂y (2) 计算隐函数组的偏导数问题。  xu − yv = 0 ∂u ∂u ∂v ∂v . %计算 Jacobian 行列式 jaco=jacobian(G.MATLAB l 81 数值分析与应用 能处理平面曲线的切线、法线,空间曲线的切线与法平面,以及条件极值问题。 实验内容及数据来源 (1) 计算隐函数偏导数问题。 计算方程 xyz 3 + x 2 + y 3 − z = 0 在原点附近所确定的隐函数 z = f ( x. .v]). 。 ,求 ∂x ∂y ∂x ∂y  yu + xv = 1 设 实验操作指导 光盘:\实验视频\chapter2. pz_x=-diff(F. G=[F.z) %第二题 隐函数组偏导数问题 %同济大学编《高等数学(下) 》P35 syms x y u v F=x*u-y*v.x)/diff(F.y)/diff(F. . H=y*u+x*v-1.H]. .exe 光盘:\实验代码\chapter2\yhs_pds.rar\2-9.

MATLAB 82 数值分析与应用 %计算偏导数 pu_x=-det(jacobian(G.v]))/jaco pu_y=-det(jacobian(G.[u.v]))/jaco pv_x=-det(jacobian(G. = ∂x 1 − 3 xyz 3 ∂y 1 − 3 xyz 2 习惯于单变元微积分的情况,遇到多变元微积分时往往觉得关系比较复杂,这需要我们 理清楚多变元微积分各定义、定理关系之间的联系与区别。就本实验而言,笔者认为理解隐 函数定理的证明过程是掌握隐函数求导公式的最好方法,最好不要尝试去死记求偏导数公 式。 .y]))/jaco 以文件名 yhs_pds.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> yhs_pds 回车得到: pz_x = (-y*z^3-2*x)/(3*x*y*z^2-1) pz_y = (-x*z^3-3*y^2)/(3*x*y*z^2-1) pu_x = (-x*u-y*v)/(x^2+y^2) pu_y = (x*v-y*u)/(x^2+y^2) pv_x = (-x*v+y*u)/(x^2+y^2) pv_y = (-x*u-y*v)/(x^2+y^2) 实验结论 从计算结果来看范例(1)由方程确定的隐函数 z(x,y)关于 x 和 y 的偏导数分别为 ∂z yx3 + 2 x ∂z xz 3 + 3 y 2 = .[x.[y.x]))/jaco pv_y=-det(jacobian(G.[u.

you must prefix the category with index. category) Description .The following categories of topics are available in the help subsystem: expression operators for forming expressions function list of Maple functions misc miscellaneous facilities module topics related to modules packages descriptions of library packages procedure topics related to procedures and programming statement list of Maple statements To access these help pages. v) mtaylor(f. thus ? index[category]. v.MATLAB 83 数值分析与应用 实验 2. v. 要查看具体的函数使用方法可以使用指令: mhelp function_name。如查看多元函数的 泰勒公式可以在命令窗口输入 >> mhelp mtaylor 就可以得到在 maple 中泰勒公式的帮助资源。 在 maple 中泰勒公式的基本函数为 mtaylor(f.10 多变量泰勒展开 实验基本原理 多变元函数的泰勒展开原理和单变元泰勒展开类似,但表达形式上略微复杂一些。在实 际应用中二元函数的泰勒展开式用的比较多一些。在 MATLAB 的符号工具箱里没有多元泰 勒展开的公式,如果要使用的话可以在 MATLAB 中实现对 maple 函数的调用。 对于初次接触 maple 的用户而言可以使用 Maple 在线帮助帮助指令,可以在 MATLAB 命令窗口输入 >> mhelp index 回车得到如下资源: Index of help descriptions Calling Sequence ?index[category] or help(index. w) . n. n) mtaylor(f.

y]’.[x=1.exe 光盘:\实验代码\chapter2\dby_taile.4) disp('泰勒展开计算的 1.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第一题 《数学分析(下) 》P135 华东师范大学编 syms x y.69 。 (2) 求函数 f ( x.08)3.69 次幂') subs(tay_1.’[x. %调用 maple 函数 tay_1=maple('mtaylor'.[1.y=b]’.08 的 3.y=4].f1.f.69]) . y ) = ln(1 + x + y ) 的泰勒展开式,要求展开到 4 次项。 实验操作指导 光盘:\实验视频\chapter2. y ) = x y 在点(1,4)的泰勒公式。并用它计算 (1.[x y].4)') 实验目的与要求 l 理解多变元函数的 Taylor 展开,及展开方法。 l 能够用手工计算多元函数的展开低次项,尤其是二元函数的展开。 l 知道在 MATLAB 中如何调用 maple 函数处理相关符号计算问题。 l 能利用多元函数展开方法处理一些应用问题。 实验内容及数据来源 (1) 求函数 f ( x.08 3.y=4]'.f.rar\2-10.MATLAB 84 数值分析与应用 如果要在 MATLAB 中调用 Maple 函数,需要使用对原来的调用格式做一些修饰。 可以采用如下的调用格式 R=maple(’mtaylor’. f1=x^y.k) 也可以采用另一种格式,如对 x y 在 x=1,y=4 点展开 R=maple('mtaylor(x^y.’[x=a.k) R=maple(’mtaylor’.'[x=1.

69 次幂 ans = 1.'[x.y]'.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> dby_taile 回车得到运算结果 tay_1 = -3+4*x+6*(x-1)^2+(x-1)*(y-4)+4*(x-1)^3+7/2*(y-4)*(x-1)^2 泰勒展开计算的 1.f2.1).ezsurf(tay_2) 以文件名 dby_taile.69]) %画出原函数图曲面 subplot(1.2).ezsurf(f1) %画出展开式的曲面 subplot(1.08 的 3.08 3.2.69 次幂真值') subs(f1.69 次幂真值 ans = 1.08 的 3.32841465402236 f2 = log(1+x+y) tay_2 = x+y-1/2*x^2-x*y-1/2*y^2+1/3*x^3+y*x^2+y^2*x+1/3*y^3 实验结论 实验输出结果给出了指定要求下的泰勒展开式。对于范例(1)这里给出了原函数图象 .[x y].2.2.4) figure(2) %在新窗口第一子图 画出原函数曲面 subplot(1.2).ezsurf(tay_1) %第二题 《高等数学(下) 》P64 同济大学编 clear syms x y f2=log(1+x+y) %调用 maple 函数 tay_2=maple('mtaylor'.[1.1).ezsurf(f2) %画出展开式图形 subplot(1.MATLAB 85 数值分析与应用 disp('1.08 的 3.2.328704 1.

17 中给出了范例(1)原函数图象与有限次泰勒展开式绘制的函数图象,要说明 的是依然是展开式在小范围内比较接近原函数。 在实际应用中,泰勒展开式是经常需要用到的,所以说掌握好泰勒公式对分析很多问题 是有很大的帮助。 实验 2.69 ,对我们来说是难度很大的,甚至是做不到的。 图 2.16 范例(1)的原函数与泰勒展开式图象 利用范例(1)的展开结果,我们可以计算出一个幂级数的近似值,在很粗糙的要求下 这个值可以作为一个估计值。而事实上这些是我们可以利用笔和草稿纸就比较容易做到的。 如果不采用展开的方法直接计算 (1.16。展开式只是对小量展开,所以在展开点附 近展开式和原函数是比较接近的,大范围在不存在这样的情况,从图中也可以看出 图 2.MATLAB 86 数值分析与应用 与有限次泰勒展开式绘制的函数图象,如图 2.08)3.11 梯度、Jacobi 矩阵与 Hesse 矩阵 实验基本原理 .17 范例(2)的原函数与泰勒展开式图象 在图 2.

xn ] 的梯度为  向量函数 f = [ f1 . f 2 . ϕ . f m ] ' 对于向量 [ x1 .L . xn ] 的 Jacobi 矩阵为  ∂f1  ∂x  1  M   ∂f m  ∂x  1 ∂f1  ∂xn   O M   ∂f m  L ∂xn  K Hesse 矩阵为  ∂2 f  2  ∂x1  M  2  ∂ f  ∂x ∂x  1 n ∂2 f   ∂x1∂xn  O M   ∂2 f  L ∂xn 2  K 实验目的与要求 l 会手工计算梯度,Jacobi 矩阵与 Hesse 矩阵问题。 l 能使用 MATLAB 编程处理上面三个问题。 l 能调用 maple 函数直接处理相关问题,并对比使用 MATLAB 编程运算的结果。 l 针对一些具体问题,理解上面三个概念的几何意义或物理意义。 实验内容及数据来源 (1) 数量场 r = x 2 + y 2 + z 2 ,编写脚本程序计算其梯度,并调用 maple 函数计算验证 计算结果。 (2) 空间直角坐标系 ( x. x2 . x2 .L .L. θ ) 的变换公式为  x = r sin ϕ cos θ   y = r sin ϕ sin θ  z = r cos ϕ  . .MATLAB 87 数值分析与应用 在多元微积分中经常会遇到梯形度、Jacobi 矩阵与 Hesse 矩阵。数量函数 f 对于向量 ∂y ∂y ∂y  . z ) 到球坐标系 ( r .L . 。 ∂x n   ∂x 1 ∂x 2 [ x1 . y .

vector([x.z)] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %访问 maple 函数 syms x y z disp('调用 maple 函数,计算得到的梯度') grad_maple=maple('grad(sqrt(x^2+y^2+z^2).') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %jacobi 矩阵 syms r fa the x=r*sin(fa)*cos(the).x).θ ) (3) 已知函数 f = xy sin( x + 5 y ) 编写 MATLAB 脚本程序计算其 Hesse 矩阵,并调用 maple 函数验证计算是否正确。 (4) 调用 maple 函数计算三维函数 f = ( x + y )ge z 的 Hesse 矩阵。 实验操作指导 光盘:\实验视频\chapter2. y=r*sin(fa)*sin(the). ϕ . y.z])).y).y. z ) ∂(r .diff(r. z=r*cos(fa).rar\2-11. %计算 jacobi 矩阵 . %计算梯度向量 grad_r=[diff(r.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %08 年 6 月 24 %梯度向量 syms x y z.MATLAB 88 数值分析与应用 计算其 Jacobi 矩阵 ∂( x.exe 光盘:\实验代码\chapter2\gr_ja_he. r=sqrt(x^2+y^2+z^2).diff(r.

MATLAB 89 数值分析与应用 ja=jacobian([x.x).z].2. df12=diff(diff(f.ezsurf(df11) subplot(2.ezsurf(df22) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %访问 maple 函数计算 Hesse 矩阵 disp('调用 maple 函数,计算得的 Hesse 矩阵') hesse_maple=maple('hessian((x*y)*sin(x+5*y).2.y.df21 df22].[x.y).x).x).z]).') 以文件名字 gr_ja_he. df22=diff(diff(f.y). Hesse=simple(Hesse) %画出原函数图形 ezsurf(f) figure(2) %分别画出 Hesse 矩阵各元素的图象 subplot(2.ezsurf(df21) subplot(2.y.') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %第 4 题 三维 Hesse 矩阵计算 clear syms x y z hesse3D_maple=maple('hessian((x+y)*exp(z).y]). 1/(x^2+y^2+z^2)^(1/2)*z] .x).1).2.[r fa the]) %Hesse 矩阵 syms x y f=(x*y)*sin(x+5*y). 1/(x^2+y^2+z^2)^(1/2)*y.y).2).2.[x.4).3).ezsurf(df12) subplot(2. %分别计算各元素,对于比较大的 n 维变量问题 %可以设计出一个函数处理 Hesse 矩阵 df11=diff(diff(f. df21=diff(diff(f.m 保存。 步骤二:运行脚本程序。 在命令窗口输入以下语句: >> clear >> gr_ja_he 回车得到运算结果 grad_r = [ 1/(x^2+y^2+z^2)^(1/2)*x. Hesse=[df11 df12.y).

0. 0] Hesse = [2*y*cos(x+5*y)-x*y*sin(x+5*y sin(x+5*y)+x*cos(x+5*y)+5*y*cos(x+5*y)-5*x*y*sin(x+5*y) ] [sin(x+5*y)+x*cos(x+5*y)+5*y*cos(x+5*y)-5*x*y*sin(x+5*y). exp(z)]. -r*sin(fa)*sin(the)] [ sin(fa)*sin(the). 10*x*cos(x+5*y)-25*x*y*sin(x+5*y)]]) hesse3D_maple = matrix([[0. 0. r*cos(fa)*cos(the). [0. 1/(x^2+y^2+z^2)^(1/2)*y. -r*sin(fa). exp(z).MATLAB 数值分析与应用 90 调用 maple 函数,计算得的梯度 grad_maple = vector([1/(x^2+y^2+z^2)^(1/2)*x. (x+y)*exp(z)]]) 实验结论 系统输出已经给出了计算 。在 MATLAB 符号运算工具箱中只给出了计算 Jacobi 矩阵 的计算方法,也给出了计算梯度的数值函数。要计算 Hesse 矩阵可以利用上一实验中介绍的 调用 maple 函数方法。当然,实际编程情况并不很麻烦,在符号工具箱的基础上很容易做到 这些。 对于范例(1)我们通过编写一 MATLAB 程序方法计算梯度,然后又调用 maple 函数 的梯度计算方法,发现两者是相同的。 范例(2)中给出了常用的直角坐标到球坐标变换公式的 Jacobi 矩阵,因为 MATLAB . [exp(z). r*sin(fa)*cos(the)] [ cos(fa). [sin(x+5*y)+x*cos(x+5*y)+5*y*cos(x+5*y)-5*x*y*sin(x+5*y). 1/(x^2+y^2+z^2)^(1/2)*z]) ja = [ sin(fa)*cos(the). exp(z)]. 10*x*cos(x+5*y)-25*x*y*sin(x+5*y)] 调用 maple 函数,计算得的 Hesse 矩阵 hesse_maple = matrix([[2*y*cos(x+5*y)-x*y*sin(x+5*y). r*cos(fa)*sin(the). sin(x+5*y)+x*cos(x+5*y)+5*y*cos(x+5*y)-5*x*y*sin(x+5*y)].

19 范例(3)Hesse 矩阵的各元素 在因为二元函数的 Hesse 矩阵比较简单,甚至可以直接罗列矩阵中的几个元素。对于多 元函数情况,可以编写相应的 Hesse 函数,这样对于普遍情况就可以调用。当然更为快速的 方法同样是直接访问 maple。所以给出了范例(4) 。 .MATLAB 91 数值分析与应用 中有这个函数,所以可以直接调用。 图 2.18 所示。而在图 2.19 中则给出了由 其计算的 Hesse 矩阵的 4 个元素的各自函数图形。我们先自行编写 MATLAB 程序给出了计 算结果,后又调用 maple 函数进行了对比,结果和期望的一样,两者是相同的。 图 2.18 范例(3)的原函数图象 这里给出了范例(3)的原函数的函数图象,如图 2.

y ) ∆S i =1 i i i ,如果分割的模趋 近 0,此和式有有限极限,而且该极限与分割方法无关系与区域上任意取的点无关系,那么 这个极限就是函数 f 在区域 D 上的的二重复积分。三重积分情况于之类似。 计算重积分的方法比较灵活,有时候需要换元。实验中采用的基本方法是把重积分化为 累次积分。有时候在计算时,可能需要交换积分次序,如果交换以后仍然不能求出解析解, 那么很可能原来的积分问题没有解析解。 实验目的与要求 l 理解重积分的几何及物理意义,掌握常用的计算技巧。 l 能通过 MATLAB 计算一些在给定区域上的重积分问题。 l 能解决一些实际问题,如薄片质量问题,体积问题,转动惯量问题。 实验内容及数据来源 (1) 计算二重积分问题 I = ∫∫ e x2 dxdy ,其中 D 是第一象限中由直线 y = x 与 y = x3 所围 D 成的封闭区域,如图 2. yi ) 作和式 ∑ f ( x .20 范例(1)的积分区域 (2) 计算三重复积分 ∫∫∫ xdxdydz ,其中 D 是由 D .12 重积分运算 实验基本原理 任意划分为 n 个子区域 Di , Di 设 D ⊂ R 为有界闭区域,函数 f : D → R ,将区域 D n 2 的面积记为 ∆Si ,每个子区域上任意取点 ( xi .MATLAB 数值分析与应用 92 实验 2.x。 图 2.

b*(1-x/a)). (a.x. int_f=int(int2.x^3.rar\2-12.x. %累次积分法计算重积分 int1=int(f.a) 以文件名 chong_jifen. + + = 1.1) %第 2 题,三重积分的计算 %例题选自南京大学数学系编《大学数学》 (上)P286 syms x y z a b c f=x. b.0.0.z.y.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第 1 题,二重积分的计算 %例题选自同济大学田根宝教授编《考研数学一本通》P204 syms x y z=exp(x^2). int_z=int(int1. c ) > 0 a b c 所包围的立体。 实验操作指导 光盘:\实验视频\chapter2.c*(1-x/a-y/b)).MATLAB 93 x y z x = 0.y.x).exe 光盘:\实验代码\chapter2\chong_jifen.0. int2=int(int1. %累次积分法计算重积分 int1=int(z.0. z = 0. y = 0.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> chong_jifen 回车得到运算结果如下: int_z = 1/2*exp(1)-1 int_f = 1/24*b*c*a^2 实验结论 数值分析与应用 .

13 第一型曲线积分 实验基本原理 第一型曲线积分的数学定义这里不再给出,可以参考一般的微积分教材。这里提一下第 一型号曲线积分的物理意义,一个函数定义在一段曲线上,我们把这个函数理解为质量线密 度函数,那么第一型积分的目的就是求这段线段的总质量。 下面给出计算第一型号曲线积分的计算方法: (1) 对于平面曲线 L : y = y ( x). t ∈ [t1 . z (t )) x '2 (t ) + y '2 (t ) + z '2 (t )dt t1 可以看出其实含参数的空间曲线第一型曲线积分公式是一般公式,包含了前面两种计算方 法。 . t ∈ [t1 . t2 ]  y = y (t ) 第一型曲线积分为 ∫ L t2 f ( x. y ( x )) 1 + y '2 ( x)dx a (2) 对于参数的平面曲线  x = x (t ) L: . t2 ]  z = z (t )  第一型曲线积分为 ∫ L t2 f ( x. z )ds = ∫ f ( x(t ). y )ds = ∫ f ( x.MATLAB 94 数值分析与应用 实验已经给出了计算结果,这里就不作过多说明。在计算重积分时一般需要化出积分区 域,这样有利于分析问题,容易确定积分限。当然这对于大部分问题是够用了,但是对与一 些高维问题或一些比较复杂问题,事实上积分限的确定问题可以用代数方法确定,不过这比 较复杂一些,有兴趣的读者可以参考有关文献。 对于重复积的应用问题也应该值得重视,在国外的教材中一般比较注重这些内容,尤其 是美国和俄罗斯的微积分教材。目前国内的研究生入学考试数学科目中也有这类的题目。 实验 2. y. y (t ). z )ds = ∫ f ( x (t ). y. y (t )) x '2 (t ) + y '2 (t )dt t1 (3)对于空间曲线  x = x (t )  L :  y = y (t ) . x ∈ [a. b] 其第一型曲线积分为 ∫ L b f ( x.

m 步骤一:分析问题。 对于范例 1,给的就是是参数方程,可以直接编程运算。 对于范例 2,取 Γ 的参数方程为  x = ρ (θ ) cos θ = a sin θ cos θ  2  y = ρ (θ ) sin θ = a sin θ 如此可以按照基本原理里的方法进行运算。 步骤二:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第 1 题 %华东师范大学数学系《数学分析》 (下)P200 syms a positive θ ∈ [0. π ]  y = a sin t 计算第一型曲线积分 ∫ (x L 2 + y 2 )ds 。 (2) 计算第一型曲线积分 ∫ Γ x 2 + y 2 dl ,其中 Γ 为圆周 x 2 + y 2 = ay.exe 光盘:\实验代码\chapter2\first_curve. π ] .MATLAB 数值分析与应用 95 实验目的与要求 l 熟悉第一型曲线积分的数学意义和物理内涵。 l 理解空间曲线积分公式的推导原理。 l 会计算一般的第一型曲线积分问题。 l 对于一些应用问题,能转化为本实验的数学模型,并用 MATLAB 编程运算,给出结果。 实验内容及数据来源 (1) 设 L 是半圆周  x = a cos t L: t ∈ [0.rar\2-13. (a > 0) 。 实验操作指导 光盘:\实验视频\chapter2.

theta.theta).0.-1. dx=diff(x.t).[0. y=a*sin(t).theta). z=sqrt(x^2+y^2).6].axis(V). x=a*cos(theta)*sin(theta). %弧长微元 weiyuan=sqrt(dx^2+dy^2). %化简运算结果 int_2=simple(int_2) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %百分号内为作图部分,画出曲线积分范围 %需要对 a 赋一数值 a=5. int_1=int(a^2*weiyuan.pi). dy=diff(y. y=a*sin(theta)*sin(theta).grid on %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 以文件名 first_curve. %控制坐标轴范围向量 V=[-4. dy=diff(y. int_2=int(z*weiyuan.4.pi) %第 2 题 %南京大学编《大学数学》 (下)P5 syms a theta xy.0.pi]).t. %弧长微元 weiyuan=sqrt(dx^2+dy^2).y. x=a*cos(theta)*sin(theta).MATLAB 96 syms t x=a*cos(t).m 保存。 步骤二,运行脚本程序。 在命令窗口输入: >> clear >> first_curve 回车得到运行结果: int_1 = pi*a^3 int_2 = 数值分析与应用 .t). dx=diff(x. y=a*sin(theta)*sin(theta). ezplot(x.

z ).14 第二型曲线积分 实验基本原理 第二型曲线积分的物理意义表现为在一定力场下质点沿曲线运动所作的功。考虑力场 F = {P( x.21 中给出了范例(2)的积分路线。可以这样理解在这条圆上各点的线 密度不同,其密度函数就是题目中的被积函数,而计算结果就是这个圆的总质量。 图 2. y.21 范例(2)的积分曲线 第一型曲线积分在曲线与曲面积分里是相对比较简单的,而且其物理意义也比较直观, 方法也比较简单。所以对第一型的曲线积分要理解透彻一些,这样学习第二型曲线积分与曲 面积分时候才能更好的体会各自的区别与联系。 实验 2. y. Q ( x. z ).MATLAB 97 数值分析与应用 2*a^2 实验结论 从计算结果可以看出范例(1)的第一型曲线积分结果为 a 3π ,而范例(1)曲线积分 2 结果为 2a 。在图 2. z )} 则第二型曲线积分为 ∫ Fgds = ∫ L L Pdx + Qdy + Rdz 所以一般而言,第二型曲线积分积分方向是有关系的。 下面给出第二型曲线积分的计算方法 . y . R( x.

MATLAB 数值分析与应用 98 (1) 对于平面曲线 L : y = y ( x ) ,x 从 a 变到 b(a 对应于起点 A,b 对应与终点 b,a 不 要求比 b 小) ,这时第二型曲线积分为 b ∫ Fgds = ∫ [ P( x. y(t ). y( x))dx + Q( x. x + y + z ) 作用下,质点由 A 沿螺旋线 L 到 B 所作的功,其中 L 为  x = a cos t   y = a sin t  z = bt  实验操作指导 t ∈ [0. z (t )) x '(t ) + L L Q ( x (t ). y( x)) y '( x)]dx L a (2)对于空间曲线  x = x (t )  L :  y = y (t ) . y (t ). z = bt 从 t = 0 到 t = π 上的一短段。 (2)求力 F ( y. y (t ). t2 ]  z = z (t )  这时第二型曲线积分为 ∫ Fgds = ∫ [ P( x(t ). z (t )) y '(t ) + R( x(t ). y = a sin t . 2π ] . − x. t ∈ [t1 . z (t )) z '(t )]dx 可以看出,空间参数曲线已经包含第一种情况。 实验目的与要求 l 理解第二型曲线积分的物理含义及数学定义。 l 对于给定的第二型曲线积分会正确的计算,并能通过 MATLAB 符号编程实现。 l 体会第一型曲线积分与第二型曲线积分的联系。 l 对于一些实际问题,如力场做功问题能正确建模转化为第二型曲线积分问题,并处理之。 实验内容及数据来源 (1) 计算第二型曲线积分 I = ∫ xydx + ( x − y )dy + x 2 dz L L 是螺旋线: x = a cos t .

int_curve1=int(F*ds. %向量场函数 F=[y.diff(z)]'.t.diff(y).x-y.MATLAB 99 光盘:\实验视频\chapter2.pi) %第二题 %华东师范大学《数学分析》 (下)P207 syms t x y z.t. %微元 ds=[diff(x).rar\2-14.x^2].exe 光盘:\实验代码\chapter2\sec_curve.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第一题 %华东师范大学《数学分析》 (下)P207 syms a t x y z.2*pi) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %百分号内部分为作图部分,画出力场的积分路线 %为了画出图形需要对 a,b 赋数值 a=3. z=b*t.x+y+z].z. y=a*sin(t).-x.0. x=a*cos(t).diff(z)]'. int_curve2=int(F*ds.2*pi]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数值分析与应用 .b=3. %向量场函数 F=[x*y. y=a*sin(t). z=b*t. syms b positive %曲线参数方程 x=a*cos(t). %微元 ds=[diff(x). ezplot3(x.0.diff(y).y. z=b*t. syms b positive %曲线参数方程 x=a*cos(t). y=a*sin(t).[0.

MATLAB 100 数值分析与应用 以文件名字 sec_curve.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> sec_curve 回车得到运行结果: int_curve1 = 1/2*a^2*pi+1/2*a^2*b*pi int_curve2 = -2*a^2*pi+2*b^2*pi^2 实验结论 这两个范例都选择了空间曲线,因此具有一般性。范例(1)的计算结果表示在指定的 力场下,把质点从起点移动到终点需要做功 1 2 a (1 + b)π ,范例(2)在指定的力场下把质 2 点从起点移动到终点需要做功 2π (π b − a ) 。这里给出了范例(2)质点运动的路径,如图 2 2 2.22。 图 2.22 质点运动路径 从程序来看,实现的过程并不复杂。当然这些程序是面向一般的第二型曲线积分,如果 换一个问题,只要修改其中的力函数与积分路径问题,就可以计算。有兴趣的读者甚至可以 把这些算法编成函数,这样你也可以有自己微积分符号计算函数库。 .

y ).ηi .MATLAB 数值分析与应用 101 实验 2. y. z ) 是定义在曲面 S 上的函数。把 S 作分割 T,这样把 S 分割成许多小曲面块 Si ,用 ∆Si 记曲面块 Si 的面积,分割的细度 T = max { Si 的直径},在 Si 上任意一点 (ξi . y ) ∈ D 的公式,这里略去,读者可以参考一般大学数学教材。 实验目的与要求 . ς i ) ,如果极限 1≤ i ≤ n n lim ∑ f (ξi . ς i )∆Si T →0 i =1 存在,而且与点的取法无关,那么这就是第一型曲面积分的含义。 下面给出一般的第一型曲面积分计算方法。设 S 为光滑曲面,其向量方程为  x = x (u . v)  z = z ( y . y (u. v).15 第一型曲面积分 实验基本原理 第一型曲面积分类似于第一型曲线积分,如果 f ( x.ηi . ( x. v). v)  S :  y = y ( y . v)  (u . z )dS = ∫∫ f ( x(u. z(uv)) S EG − F 2 dudv D 其中  ∂x   ∂y   ∂z  E =  +  +   ∂u   ∂u   ∂u   ∂x  ∂x   ∂y  ∂y   ∂z  ∂z  F =    +    +     ∂u  ∂v   ∂u  ∂v   ∂u  ∂v  2 2  ∂x   ∂y   ∂z  G =   +  +   ∂v   ∂v   ∂v  2 2 2 2 由这个公式不难得到积分曲面为 S : z = z ( x. v ) ∈ D 则计算公式为 ∫∫ f ( x. y .

D4 那么整个封闭曲面的积分为第一型积分为: Ò ∫∫ xyzdS = ∫∫ xyzdS + ∫∫ xyzdS + ∫∫ xyzdS + ∫∫ xyzdS D D1 D2 D3 D4 其中在 D1 .z=0 和 x+y+z=1 上的部分分别记为 D1 .y0. y . D3 . D2 . D2 .rar\2-15. D3 上,被积函数 f ( x.exe 光盘:\实验代码\chapter2\first_surf. z ) = xyz 都为零。所以 ∫∫ xyzdS = ∫∫ xyzdS = ∫∫ xyzdS = 0 D1 D2 D3 那么 Ò ∫∫ xyzdS = ∫∫ xyzdS D D4 如此就可以按照积分曲线的第一种方法进行计算,注意积分区域在范围。D4 在 x,y 平面上 .z=0 以及 x+y+z=1 所围成的四面体的整个 D 边界曲面。 (2) 计算 ∫∫ ( xy + yz + zx)dS ,这里 D 是由圆锥面 z = x 2 + y 2 被圆柱面 x 2 + y 2 = y 截 D 下的一块曲面。 实验操作指导 光盘:\实验视频\chapter2.m 步骤一:分析问题。 a.第(1)题 整个边界曲面 D 在平面 x=0.MATLAB 数值分析与应用 102 l 理解第一型曲面积分的物理意义。 l 对于给定曲面和曲面上的函数会进行第一型曲面积分计算。 l 在使用 MATLAB 处理时,要先分析问题,不要盲目下手。 l 对比第一型曲线积分与第一型曲面积分的意义及计算方法。 l 对于一些实际问题,能建立正确的数学模型并处理之。 实验内容及数据来源 (1) 计算 Ò ∫∫ xyzdS ,其中 D 是由曲面 x=0.y=0.

π ]} 如此可以按照曲线积分的第二中方法进行计算。 步骤二:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %同济大学应用数学系编《高等数学》 (第 5 版下)P157 syms x y z %面积微元 z=1-x-y.rou)*diff(x.theta)^2+diff(y.theta. %面积微元 ds=sqrt(E*G-F*F). %向量函数 x=rou*cos(theta).theta)^2.pi) %作出圆锥面函数图象 数值分析与应用 . int1=int(f*ds.rou)^2.0. θ ) ∈ D D = {( ρ .rou.rou)^2+diff(z. %密度函数 f=x*y*z.MATLAB 103 的投影为 x=0,y-0 与 x+y=1 所维成的区域。 b.第(2)题 圆锥曲面 D 的向量方程为 r = ( ρ cos θ .0. ρ ).y.rou)*diff(y. %分别计算出 E、G、F E=diff(x.0. %分别把 E,F,G 简化 E=simple(E). %被积函数 f=x*y+y*z+z*x. θ ∈ [0.theta)^2+diff(z. ds=sqrt(1+diff(z.rou)*diff(z.theta)+diff(z. G=simple(G).rou)^2+diff(y. z=rou.1-x).sin(theta)).theta)+diff(y.y)^2). ( ρ . ds=simple(ds). int_2=int(int1.0. y=rou*sin(theta). F=diff(x.x)^2+diff(z. F=simple(F). G=diff(x.sin θ ].theta).1) %南京大学编《大学数学》 (下)P14 clear syms rou theta. int1=int(f*ds. ρ sin θ . θ ) | ρ ∈ [0.x. int_1=int(int1.

'circ') 以文件名 first_surf.23 范例(2)积分曲面 . ezsurf(z.y 显函数的积分类 型,原问题虽然不是直接给的这样类型,但是轻松的变换就可以直接看出来。 图 2.MATLAB 104 数值分析与应用 syms x y z=sqrt(x^2+y^2).m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >>clear >> first_surf 回车得到: int_1 = 1/120*3^(1/2) int_2 = 4/15*2^(1/2) 实验结论 第一型的积分曲线物理意义可以这样理解,被积函数为定义在曲面上的质量面密度,第 一型积分的目的是求出曲面的整体质量,在一般的微积分教材里也是这样引进这个概念的。 在实验操作部分,我们就对问题进行了分析。如范例(1) ,虽然积分曲面有多块,但是 略微一分析便知道其中有三块的函数为 0,如果联系第一型的含义,如果在一块曲面上质量 密度为 0,当然该曲面的整体质量就为 0。范例(1)是给出的如果 z 是 x.

v). ∂ (u . y(u.MATLAB 数值分析与应用 105 范例(2)是针对一般的参数方程的曲面积分问题,所以更具一般性。计算结果为 4 2, 15 这里给出了积分曲面的圆锥面,如图 2. z (u. y ))dxdy (cos γ < 0)  ∫∫  Dxy 对于另外两个积分情况于之类似。其中实验范例(2)就属于这个类型。 下面给出一般的参数方程计算方法设光滑曲面 S 由于参数方程给出:  x = x (u . y. v). z ) ∫∫ Pdydz = ± ∫∫ P( x(u. y ))dxdy (cos γ ≥ 0)  D∫∫xy ∫∫S Rdxdy = − R( x. R : S → R 连续,如果 S 的方程为 z = z ( x. ( x.23。对于计算的结果可以理解为在圆锥面上被圆柱面 所截下的一块面密度为 xy + yz + zx ,那么 4 2 为其总质量。当然如果定义的密度为电荷 15 面密度,那么计算结果就是被圆柱面截下部分圆锥面上的总电荷。 实验 2. z ( x. y ) . y ) ∈ Dxy ,函数 z : Dxy → R 连续可 微,则有  R( x. Q. x) ∂ ( x. v)  (u . v) 不同时为零,则有 ∂( y. z ( x. v ) ∂ (u . v ) ∈ D 如果它们的函数行列式 ∂ ( y. v) dudv S D . z ) ∂ ( z . y.16 第二型曲面积分 实验基本原理 第二型曲面积分又称为对坐标的曲面积分,严格的数学定义这里不再给出。简单的提一 下其物理意义,设流体密度为 1,速度场 v = Pi + Qj + Rk ,在单位时间内流过曲面 S 一侧 的流量和就是第二型曲面积分,即 ∫∫ Pdydz + Qdzdx + Rdxdy 。 S 这里给出第二型曲线积分的计算方法,设置 S ⊂ R 为有界光华的双册曲面,函数 3 P. v) ∂ (u. . v)  S :  y = y ( y . v)  z = z ( y . y ). v) ∂(u.

rar\2-16. v). syms h a positive. z (u. y(u. x) ∫∫ Qdydz = ± ∫∫ Q( x(u. v) ∂ (u.exe 光盘:\实验代码\chapter2\sec_sufr. v) dudv S D ∂( x. y(u. v). z (u. y ) ∫∫ Rdydz = ± ∫∫ R( x(u. v). v) dudv S D 其中正负号分别对应 S 的两个侧面, 当 uv 平面的正方向对应与曲面 S 所选顶的正向一侧时, 取正号,否则取负号。其中实验范例(1)属于这个类型。 实验目的与要求 l 理解第二型曲面积分的数学原理与物理意义。 l 熟悉常用的处理第二型曲面积分的常用技巧。 l 体会第一型号曲面积分与第二型曲面积分的联系。 l 对于一些实际问题,如流体力学,电磁学中的问题能建立正确的数学模型,并使用 MATLAB 给出分析方法及分析结果。 实验内容及数据来源 (1) 计算 ∫∫ zdxdy ,其中 D 是球面 x 2 + y 2 + z 2 = a 2 的外侧。 D (2) 计算 ∫∫ xdydz + ydzdx + zdxdy ,其中 D 是圆柱面 x 2 + y 2 = a 2 界于 z = − h 与 z = h D 之间部分的外侧。 实验操作指导 光盘:\实验视频\chapter2. v). v) ∂ (u. %球面的参数方程 .m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %第 1 题 南京大学编《大学数学》 (下)P21-22 syms theta fa .MATLAB 数值分析与应用 106 ∂ ( z .

theta)-diff(x.z. z=a*cos(fa).-h. ezmesh (x. y=a*sin(fa)*sin(theta). %计算 C C=diff(x.fa).theta.2*pi).fa)*diff(y.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear 数值分析与应用 . Fy=y. int_z=int(int(Fz*C.0.theta.pi).2*pi).[0.-h. int1=int(Fz*C. z=a*cos(fa). int2=int(int1.h).0. %计算向量场函数 Fx=x.MATLAB 107 x=a*sin(fa)*cos(theta).-h. int_y=int(int(Fy*B.0.fa.theta. x=a*sin(fa)*cos(theta).theta. %计算 A B C A=a*cos(theta). y=a*sin(theta).0.2*pi).pi*2) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %作出积分曲面的函数图象. C=0. Fz=z.z.给 a 赋一个数值 a=5. y=a*sin(fa)*sin(theta).2*pi]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %第 2 题 南京大学数学系编写《大学数学》 (下)P20 syms a theta z x=a*cos(theta). C=simple(C). B=a*sin(theta).pi.theta)*diff(y. %对三个坐标方向积分 int_x=int(int(Fx*A. %三者之和 int_2=int_x+int_y+int_z 以文件名 sec_sufr.h). %z 方向的函数 Fz=z.0.0.z.y.h).z.

17 场论中的梯度、散度和旋度 实验基本原理 .MATLAB 数值分析与应用 108 >> sec_surf 回车得到运算结果: int2 = 4/3*a^3*pi int_2 = 4*pi*a^2*h 实验结论 4 3 从系统输出可以看到范例(1)曲面积分的计算结果为 π a 3 ,范例(2)的曲面积分计 算结果为 4π a 2 h ,这正是我们想要的结果。读者可以自己用笔算一算然后比较,理一理编 程计算的顺序。 图 2.24 范例(1)的积分曲面 在图 2.24 中,给出了范例(1)的积分曲面—球面图形,让读者可以更直观的想象。在 微积分中,曲线积分和曲面积分这一部分相对是比较难一些,各种概念很多又很相似,容易 混淆。通过编程可以加深对这些概念的理解。 实验 2.

xy 2 z . Q.MATLAB 数值分析与应用 109 梯度、散度和旋度问题是场论最基本的问题,许多初学者觉得很抽象,这些内容是微积 分知识相对综合的应用。场论是很多后续课程的基础,如流体力学、电磁场理论、等离子体 物理等。一般大学微积分教材里会用篇幅不多的章节来介绍这些内容。本实验给出这些问题 的基本计算程序。 数量场 f 和向量场 A = ( P. xyz 2 ) 。 实验操作指导 . 2. −2) 处的梯度 2 2 2 (2) 计算向量场 A 的散度和旋度, A = ( x 2 yz . R ) 的梯度、散度和旋度公式为: gradf = ∂f ∂f ∂f i+ j+ k ∂x ∂y ∂z divA = ∂P ∂Q ∂R + + ∂x ∂y ∂z i rotA = ∂ ∂x P j ∂ ∂y Q k ∂ ∂z R 实验目的与要求 l 理解场论的基本数学概念以及一些物理意义。 l 会正确计算场论中的三度问题。 l 能用符号编程给出问题的分析结果。 l 针对具体的问题,理解运算结果的物理内涵。 实验内容及数据来源 (1) 已知道函数 u = ln( x + y + z ) ,计算该函数在点 M (1.

diff(P.sym('-2')}) %《数学分析(下) 》华东师大编 P304 syms x y z P=x^2*y*z.{sym('1'). %化简 disp('向量场 A 的散度为:') div_2=simple(div_1) disp('向量场 A 的旋度为:') rot_2=simple(rot_1) 以文件名 changlun.y). R=x*y*z^2.z)-diff(R.x)-diff(P. rot_1=[diff(R. %计算散度和旋度 div_1=diff(P.sym('2').y)].x). 2*y/(x^2+y^2+z^2).rar\2-17.z).z). %计算梯度 grad_1=[diff(f. Q=x*y^2*z.diff(f.y)+diff(R.m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> changlun 回车得到: u 的梯度一般表达式为: grad_1 = [ 2*x/(x^2+y^2+z^2).x)+diff(Q. disp('u 的梯度一般表达式为:') grad_1=simple(grad_1) %把数字作为符号 计算出具体点的梯度 disp('u 在点(1,2,-2)处的梯度为:') grad_2=subs(grad_1.y)-diff(Q.z}.y.exe 光盘:\实验代码\chapter2\changlun.z)]. 2*z/(x^2+y^2+z^2)] u 在点(1,2,-2)处的梯度为: grad_2 = 数值分析与应用 .diff(f.MATLAB 110 光盘:\实验视频\chapter2.diff(Q.x).{x.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句: %《考研数学一本通》田根宝编 P266 syms x y z f=log(x^2+y^2+z^2).

x^2*y-y*z^2. v. y ( x 2 − z 2 ). w)e 2 + A3 (u. w). w)e3 则梯度、散度和旋度分别为: gradf = 1 ∂f 1 ∂f 1 ∂f e1 + e2 + e3 h1 ∂u h2 ∂v h3 ∂w . v. z (u. y^2*z-x^2*z] 实验结论 程序输出结果显示 u 的梯度一般表达式为   2x 2y 2z . 111 数值分析与应用 4/9. v. v. y (u . v.MATLAB [ 2/9. z ( y 2 − x 2 )} 当然,在实际工作或者科研中,需要这样计算的情况并不一定会很多,很多时候可能需要理 论分析。这要求读者应该充分的从数学原理掌握这些内容,而不是只会机械的运算。 实验 2.10 中,我们曾经给出了使用 MATLAB 方法计算梯度和访问 maple 直接调用函数计算的方法。这里我们保留了梯度的计算实验,并 给出了如何具体计算指定点的梯度方法。 由结果还可以看出向量场 A 的散度为 6xyz ,而旋度为: {x( z 2 − y 2 ). v. 2 gradu =  2 2 2 2 2 2 2 x + y + z x + y + z x + y + z  而在特定的点,又调用函数给出了具体的值。在实验 2. w). 2 . w)e1 + A2 (u. w)) A = A1 (u. -4/9] 向量场 A 的散度为: div_2 = 6*x*y*z 向量场 A 的旋度为: rot_2 = [ x*z^2-x*y^2.18 正交曲线坐标系的三度问题 实验基本原理 正交曲线坐标系下三度问题相对而言比直角坐标系下情况要复杂一些,在一般的大学微 积分里通常不予介绍。要推导正交曲线坐标系下的场论问题,需要用到外微分(可以参考阿 诺德的《经典力学的数学方法》或卓里奇的《数学分析》 ,均有中译本)等概念,这里略去 这些内容,直接给出梯度,散度和旋度的公式。 设函数 f = f ( x (u .

θ + z .MATLAB 数值分析与应用 112 divA = 1 ∂ ∂ ∂ [ (h2 h3 A1 ) + (h3 h1 A2 ) + (h1h2 A3 )] h1h2 h3 ∂u ∂v ∂w 1 e1 h2 h3 rotA = 1 e2 h3 h1 ∂ ∂u h1A1 ∂ ∂v h2 A2 1 e3 h1h2 ∂ ∂w h3 A3 其中 h1h2 h3 为拉梅系数。 实验目的与要求 l 对一般的微积分初学者不做要求。 l 对于一般工科要学习工程电磁场的读者或者将要学习理论物理中的场论(如电动力学) 的读者,本实验仅供参考。 l 熟悉常见的曲线坐标系,如柱坐标系,球坐标系,椭球坐标系等。 l 知道曲线坐标系中的三度计算方法。 l 用 MATLAB 编程实现曲线坐标系的三度计算问题。 实验内容及数据来源 (1) 计算柱坐标系下,数量场与矢量场的梯度,散度和旋度。其中数量场为 f = r cos(θ + z ) 向量场为 A = [r cos(2θ ).sin(θ )] . cos(θ )] (2) 计算球坐标系下,数量场与矢量场的梯度,散度和旋度。其中数量场为 向量场为 f = ρθϕ A = [ ρ sin(2ϕ ). ϕ + θ .

z=z. v=theta.rot3]. h3=sqrt(diff(x. h3=simple(h3).w)-diff(h3*A3. %柱坐标系下的数量场和矢量场 syms f A1 A2 A3 f=u*cos(w+v). h2=simple(h2).u)^2+diff(y.u)+diff(h3*h1*A2. rot_A=[rot1. rot1=diff(h3*A3.v)/h2.u)-diff(h1*A1.m 步骤一:编写计算柱坐标系下的三度问题的脚本函数。 打开 Editor 编辑器,输入以下语句: %柱坐标系下的梯度,散度和旋度问题 %08 60 25 syms rou fa z positive u=rou.diff(f.w).rot2. rot3=diff(h2*A2. A1=u*cos(2*v).v).w)^2). h2=sqrt(diff(x.v)^2).w)/h3].u).exe 光盘:\实验代码\chapter2\zhu.u)/h1.MATLAB 113 实验操作指导 光盘:\实验视频\chapter2.w)^2+diff(z.v)^2+diff(z. w=z. div_A=(diff(h2*h3*A1. %计算梯度 grad_f=[diff(f.diff(f.v)+diff(h1*h2*A3.u)^2). %化简拉梅系数 h1=simple(h1). %计算拉梅系数 h1=sqrt(diff(x.u)^2+diff(z.v)-diff(h2*A2.w))/h1/h2/h3. A3=cos(v).w)^2+diff(y. %对三者化简 数值分析与应用 .rar\2-18.v)^2+diff(y. A2=v+w. %坐标变换 x=rou*cos(theta). rot2=diff(h1*A1. y=rou*sin(theta).

w)^2).v)^2+diff(z. 0. z=u*cos(v).v)^2).m 保存。 步骤二:运行脚本程序。 在命令窗口输入: >> clear >> zhu 回车得到运算结果: grad_f = [ cos(z+theta). %坐标变换公式 x=u*sin(v)*cos(w). A3=sin(v). %计算拉梅系数 h1=sqrt(diff(x. z+theta+2*rou*sin(2*theta)] 步骤三:编写球坐标系下的三度问题脚本函数。 打开 Editor 编辑器,输入以下语句: %球坐标系下的三度问题 %2008 60 25 syms rou fa theta positive u=rou. h3=simple(h3). A2=v+w. h2=sqrt(diff(x.w)^2+diff(z. h3=sqrt(diff(x. w=theta.v)^2+diff(y. A1=u*sin(v). -rou*sin(z+theta)] div_A = 4*cos(theta)^2-2+1/rou rot_A = [ -sin(theta)-rou.MATLAB 114 grad_f=simple(grad_f) div_A=simple(div_A) rot_A=simple(rot_A) 以文件 zhu. y=u*sin(v)*sin(w). %化简拉梅系数 h1=simple(h1). v=fa. -sin(z+theta).u)^2+diff(z.u)^2). 数值分析与应用 . %球坐标系下的数量场和矢量场 syms f A1 A2 A3 f=u*v*w.w)^2+diff(y. h2=simple(h2).u)^2+diff(y.

rot3]. fa+theta-rou*cos(fa)] 实验结论 程序的输出已经给出了计算结果。选择柱坐标系和球坐标系,是因为这两个坐标系都是 比较常用的也是最重要的正交曲线坐标系,在张量分析与数学物理方法里都会经常遇到。有 兴趣的读者还可以进一步编写在这两种坐标系下的拉普拉斯算子的程序。我们知道在直角坐 标系下调和场的势函数满足拉普拉斯方程: ∂ 2 u ∂ 2u ∂ 2u + + =0 ∂x 2 ∂y 2 ∂z 2 而在柱坐标和球坐标下对应的方程都是相当重要的,许多经典数学问题都是围绕这些展 开的。 . -(1-cos(fa)^2)^(1/2)*sin(fa).v)-diff(h2*A2.v).v)+diff(h1*h2*A3.w)/h3].MATLAB 115 数值分析与应用 %分别计算 grad_f=[diff(f.w)-diff(h3*A3.u)/h1. %化简三者 grad_f=simple(grad_f) div_A=simple(div_A) rot_A=simple(rot_A) 以文件名字 qiu. div_A=(diff(h2*h3*A1.u).rot2.u)-diff(h1*A1. theta.u)+diff(h3*h1*A2.w))/h1/h2/h3.diff(f.v)/h2. fa/(sin(fa)^2)^(1/2)] div_A = 3*sin(fa)+1/rou/(1-cos(fa)^2)*cos(fa)*sin(fa)*fa+1/rou/(1-cos(fa)^2)*cos(fa)*sin(fa)*theta+ 1/rou rot_A = [-rou*(-2*cos(fa)+2*cos(fa)^3+(1-cos(fa)^2)^(1/2))/(1-cos(fa)^2)^(1/2). rot2=diff(h1*A1. rot1=diff(h3*A3.w). rot_A=[rot1. rot3=diff(h2*A2.diff(f.m 保存。 步骤四:运行脚本程序。 在命令窗口输入: >> clear >> qiu 回车得到运行结果: grad_f = [ fa*theta.

MATLAB 116 数值分析与应用 当然本实验程序本身并不限与这两种坐标系,只要给出函数变换关系,在程序中稍做调 整就可以计算一般的曲线坐标系的三度问题。 实验 2.19 力学中的保守力场与非保守力场 实验基本原理 到本实验为止,MATLAB 在微积分中的应用就基本介绍差不多了。这里给出一个微积 分知识的具体应用。问题的背景并不很难,甚至在中学物理中老师就已经灌输了关于力学中 势能与做功的思想了。当然学习了微积分以后,应该从更高的角度来看这个问题。 保守力场在力学领域与数学领域是研究相当多的一个问题,其方法也比较多。尤其是在 分析力学诞生以后,Hamilton 力学赋予了这些内容更丰富的内涵。当然保守场不一定限与普 通的牛顿力学问题,如静电荷产生的场也是保守场。 这里不打算讨论过多的数学内容,下面的实验中给出了计算方法,从方法中读者可以体 会这些内容。 实验目的与要求 l 理解力学的基本原理以及理论力学的一般处理方法。 l 对理论力学问题建立可靠的数学模型。 l 使用 MATLAB 辅助分析力学问题。 l 一般而言,对于数学分析结果还要回到力学实际背景中分析其意义。 实验内容及数据来源 考虑保守力场  Fx = x + 2 y + z + 5   Fy = 2 x + y + z   Fz = x + y + z − 6 质点沿螺旋线  x = cos θ  L1 :  y = sin θ  z = 7θ  运行自 θ = 0 到 θ = 2π ,力对质点做功情况。 .

if(l1&l2&l3) disp('该力场为保守力场') else disp('该力场为非保守力场') end %%%%%%%%55 %第二个力场 . l2=(l2==0).z).rar\2-19. Fx=F(1).x+y+z-6].exe 光盘:\实验代码\chapter2\pd_gong. l1=diff(Fz.y)-diff(Fy.MATLAB 117 数值分析与应用 要求先判断该力场是否为保守力场,然后从起点到终点改变路线,看是否力做功变化。 再考虑非保守力场  Fx = 2 x − 3 y + 4 z − 5   Fy = z − x + 8   Fz = x + y + z + 12 质点沿 L1 运动做功情况。同时考,改变路线沿起点到终点运行,看做功能是否变化,改变 的路线可以选择  x = cos8θ  L2 :  y = 20sin θ  z = 7θ  实验操作指导 光盘:\实验视频\chapter2.m 步骤一:编写判断是否为保守力场脚本函数。 打开 Editor 编辑器,输入以下语句: %判断力场是否为保守力场 syms x y z F=[x+2*y+z+5.z)-diff(Fz. l3=diff(Fx.2*x+y+z. l2=diff(Fx.y)-diff(Fy.x). Fz=F(3). l3=(l3==0). Fy=F(2). %l1 这时候变成 逻辑变量真时为 1 假时为 0 l1=(l1==0).x).

x+y+z+12].m 保存。 步骤二:运行该脚本文件。 在命令窗口输入: >> clear >> pd_gong 回车得到: 该力场为保守力场 该力场为非保守力场 从输出可以看到,第一个力场为保守力,而第二个力场为非保守力。那么按照势能理论, 第一个力场做功能情况与路径无关,只和初始位置与终点位置有关系,既存在势能函数。那 么我们按照不同的路径积分,得到的做功应该是一样的,下面的程序我们将验证之。 判断显示,第二个力场为非保守力,那么按照势能理论其做功情况应该与路径都关,如 果我们改变不同路径,得到结果不同,那么就证实保守力场的情况,下面的程序也将验证之。 当然,如果我们不同路径做功相同,那么只是巧合,只要我们改变其他路径,结果肯定会不 同的。而保守力场,从任何一条路径出发,只要初始位置与终点位置不变,那么做功就相同。 步骤三:编写计算做功的函数。 打开 Editor 编辑器,输入以下语句: %南京大学物理系编《理论力学》 (第二版) ,P51,高等教育出版社 %高等教育出版社 %沿原路线做功情况 syms x y z theta x=cos(theta).z)-diff(Fz.y)-diff(Fy. l1=diff(Fz.x).z-x+8.z).MATLAB 118 数值分析与应用 syms x y z F=[2*x-3*y+4*z-5.y)-diff(Fy. l2=(l2==0).x). Fx=F(1). Fy=F(2). l3=diff(Fx. l2=diff(Fx. . l3=(l3==0). Fz=F(3). %l1 这时候变成 逻辑变量真时为 1 假时为 0 l1=(l1==0). if(l1&l2&l3) disp('该力场为保守力场') else disp('该力场为非保守力场') end 以文件 pd_gong.

diff(z)]'.diff(y).pi*2]) 以文件名 gong. y=20*sin(theta). %路径微元 ds=[diff(x).x+y+z-6].2*x+y+z.z.2*pi) %%%%%%%%%%%%%%%%%%%%%%%%%%%% %改变路线 x=cos(8*theta).0.diff(z)]'.theta. y=sin(theta). %力场 F=[2*x-3*y+4*z-5.y.2*pi) disp('非保守力场,做功与路径有关,不存在势能') %%%画出运行路径 figure(2) ezplot3(x. z=7*theta. z=7*theta. y=20*sin(theta).0.2*pi) ezplot3(x.pi*2]) %%%%%% %新力场下改变力的作用路线 x=cos(8*theta).0.2*pi) disp('保守力场,做功与路径无关') %%%%%%%%%%%%%%%%% %改变力场 syms x y z theta x=cos(theta).x+y+z+12]. int_1=int(F*ds. z=7*theta. %路径微元 ds=[diff(x).diff(z)]'.z.[0.[0. %路径微元 ds=[diff(x).m 保存。 数值分析与应用 .z-x+8. z=7*theta. %力场 F=[x+2*y+z+5.0. int_3=int(F*ds.theta.diff(z)]'.diff(y).y.theta. int_2=int(F*ds. %路微元 ds=[diff(x).diff(y).MATLAB 119 y=sin(theta).diff(y).theta. int_4=int(F*ds.

25。和图 2.26 中,我们有意的改变了积分路线,但是不改变起 点和终点。质点从起点运动到终点力场 1 和力场 2 对质点做功分别为 98π 2 − 70π 和 98π 2 + 204π 。对于得到的结果前面已经做了阐述,这里就不再赘述。 .25 中运动质点从起点在运动到终点,力场 1 和力场 2 对质点做功分别为 98π 2 − 70π 和 98π 2 + 226π 。而在图 2.25 第一条积分路径 在图 2.MATLAB 120 数值分析与应用 步骤三:运行脚本程序。 在命令窗口输入: >> clear >> gong 回车得到运行结果: int_1 = 98*pi^2-70*pi int_2 = 98*pi^2-30*pi 保守力场,做功与路径无关 int_3 = 226*pi+98*pi^2 int_4 = 98*pi^2+204*pi 非保守力场,做功与路径有关,不存在势能 实验结论 质点作工问题对应于微积分中的线积分。这里给出了两条积分路线,也是物体的运动路 线。这里给出了两条路线的空间曲线,如图 2.26。 图 2.

26 第二条积分路径 本章小结 本章详细介绍了 MATLAB 在微积分中的应用,基本按照国内微积分教材的章节顺序介 绍,这样方便阅读又可以使在学习微积分过程中学以致用,但需要说明的是计算机分析方法 不能代替数学理论的学习,这一点是需要注意的。 符号计算并不是 MATLAB 所特长,有些问题需调用 maple 函数处理,这样可以发挥 maple 的计算潜力,在相关实验中,详细介绍了深入调用 maple 方法,作为对比在实验中还 给出了使用 MATLAB 编程的方法处理相关问题。同时在实验中,力求突出数学的图形表达, 所以尽可能的把结果可示范化。 上机操作题 1. 使用 MATLAB 符号工具箱计算以下极限问题。 .MATLAB 121 数值分析与应用 图 2.

MATLAB 数值分析与应用 122  1 ln  1 +  x lim  x →∞ arccot x 参考答案:1 2. 计算以下函数的导数问题 (2) f ( x ) = (1) f ( x ) = x sin x , ex e x sin x 参考答案: (1) sin x + x cos x 。 (2) + 。 cos x cos 2 x 3. 计算 f(x)在 x=0 点处的泰勒展开,展开到前 6 项。 1− x 1+ x 2 3 4 5 参考答案:1 − 2 x + 2 x − 2 x + 2 x − 2 x 。 f ( x) = 4. 用符号法计算定积分问题。 ∫ π 0 t sin tdt 参考答案: π 。 5. 已知函数 z = sin ( xy ) 计算 ∂3 z ∂x∂y 2 参考答案: − x 2 y cos ( xy ) − 2 x sin ( xy ) 。 6. 计算第二型曲面积分问题。要求计算 ∫∫ xdxdy ,其中 D 是球面 x D 4 3 参考答案: π a 3 。 2 + y 2 + z 2 = a 2 的外侧。 ex cos x .

b ) ,如果遵从以下基本运算规则: ( a1 . b2 ) = ( a1 + a2 . d ) = ( ac − bd . ad + bc ) 那么我们就称这一对有序实数 ( a. b1 + b2 )  ( a. b ) 定义了一个复数 z。通常可以记为 z = a + bi 。在 MATLAB 中,虚单位使用 i 或 j 来记。事实上 MATLAB 本身就是面向复数运算的,所以不 需要象 C/C++,Pascal 等语言需要定义新的数据结构,这为用户带来了方便。 复数有以下的表示形式: (1) 代数式。如 z=a+bi,a、b 分别称为 z 的实部和虚部。 (2) 三角式。复数 z 也可以用极坐标表示,如 z = ρ ( cos θ + i sin θ ) , ρ、θ 分别 称为 z 的模与辐角。 (3) 指数式。三角形式和指数形式可以通过 Euler 公式相互转化,三角式的 z = ρ ( cos θ + i sin θ ) 可以写为 z = ρ eiθ 下面通过实验给出的几个产生复数的方法,当然符号运算对复数也是实用的,尤 其 MATLAB 中强大的矩阵运算能力对复数也是实用的。 实验目的与要求 .1 复数与复矩阵的生成 实验基本原理 有序实数 ( a. b1 ) + ( a2 . b )( c.MATLAB 123 数值分析与应用 第三章 复变函数与积分变换 复变函数是大学理工科的数学基础课程之一,在工程上有广泛应用。这一章简要介绍 MATLAB 在复变函数以及积分变换中的一些应用。在实际的应用中可能会遇到比实验中更 复杂的问题,但是本章介绍的内容是基础。积分变换部分主要讲了 Fourier 变换和 Laplace 变换,这两个变换是最基础也是最重要的变换,对于一些不太常用的变换这里没有介绍。 实验 3.

1] 区间上服从均匀分布的随机数。 实验操作指导 光盘:\实验视频\chapter3.MATLAB 124 l 熟悉复数概念与意义。 l 能把不同的复数表达形式互相转换。 l 熟悉 MATLAB 产生复数的方式。 数值分析与应用 实验内容及数据来源 (1) 用 MATLAB 生成复数 7+8i。 (2) 生成复数 5e −6i 。 (3) 由各个元素单独输入生成复矩阵  2 + 2i 4 .4i 5 + 6i  3 .5i 2 . b2=rand(4.4).2i 4 -8i    (4) 用实矩阵生成复矩阵 4 × 4 的复矩阵,要求实部各元素服从 N (0.exe 光盘:\实验代码\chapter3\shengcheng.rar\3-1.12 ) 正态随机分 布的随机数,虚部各元素为在 [ 0.4).m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %(1)生成代数式复数 a1=7+8*i %(2)生成指数式复数 a2=5*exp(6*i) %(3)直接由元素生成复数矩阵 a3=[2+2*i 4-4*i 5+6*i 3-5*i 2-2*i 4-8*i] %(3)实矩阵方法直接生成复矩阵 b1=randn(4. format short a4=b1+b2*i .

1536i 0.3710 + 0.4544i 0.0000 + 8.0000 + 2.0158i 0.0000 .1.0558 + 0.0378 + 0.0000i 5.0000 .4.5532 + 0.5869i -1.3971i a3 = 2.3676i 1.5.1901i 0.0000i 2.0000 + 6.4650 + 0.MATLAB 125 数值分析与应用 以文件名 shengcheng.7176i -1.6315i -0.0000 .3898 + 0.4293 + 0.8009 .0000i 3.7079 + 0.0164i -0.0000i 4.3679 + 0.6927i 0.0000 .0000i 4.6756i 实验结论 本实验比较简单,也没有许多理论可言,主要是要熟悉复数的基本产生方法,为后面的 实验所用。 在第(4)小题中,分别用 randn 和 randn 产生正态分布和均匀分布矩阵,这样的方法 有时候很有用。比如在做模拟仿真时候,往往我们需要人为的产生噪声数据,加到系统中去, 如数学模型噪声、观测噪声等。 .7283 + 0.0576i -1.2888 + 0.0841i 2.8.3155 + 0.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >> shengcheng 回车得到: a1 = 7.1122 + 0.4418i -0.3813 + 0.3533i 1.0000i a2 = 4.2.0000i a4 = 0.0226 + 0.3573 + 0.6085i -0.

MATLAB 126 数值分析与应用 实验 3.2 复数的基本运算 实验基本原理 上一个实验介绍了如何生成复数及复矩阵,这个实验主要介绍定义在复数上的一些基本 运算。这些运算是比较初等的,但是如果数据很多的话用 MATLAB 处理是很方便的。本实 验要介绍的运算主要包括:提取复数的实部和虚部、计算复数的模与辐角、复数的共轭、复 数的加、减、乘、除法、复数上的三角函数计算、有关复数的幂的计算、指数与对数的计算。 提取实部和虚部可以用函数 real,imag、计算模可以用 abs、辐角可以用 angle、复数 的共轭可以用 conj,其他的语法与实数函数的语法同。对于复矩阵和数组的问题,需要注意 矩阵的函数格式。 下面通过实验中的具体范例直接给出各种调用方法。 实验目的与要求 l 熟悉基本提取复数实部、虚部的方法。 l 会对复数进行辐角与模运算。 l 会对复数进行四则运算。 l 熟悉其它的关于复数的函数运算。 实验内容及数据来源 (1) 产生 4 × 4 复矩阵 A,要求实部各元素服从 N (0.12 ) 正态分布,虚部为 Hilerbt 矩阵。提取其实部与虚部。 (2) 计算 A 各元素的模与辐角。 (3) 求 A 的共轭矩阵 B。 (4) 计算 A+B。 (5) 设 b = 3 + 4i ,用 b 乘以 A 中的每个元素。 (6) 用 A 中的每个元素除以 b。 (7) 计算 A 中各元素的正弦函数值。 (8) 对 A 中的各复数计算其 3 次幂。 (9) 计算 A 中各元素的对数。 (10) 计算 A 中各元素的指数。 实验操作指导 .

MATLAB 127 光盘:\实验视频\chapter3.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %%%%(1) disp('产生正态随机矩阵') a1=randn(4.rar\3-2.exe 光盘:\实验代码\chapter3\yunsuan.4) disp('产生 hilbert 矩阵') a2=hilb(4) %产生 A 矩阵 disp('生成的 A 矩阵为') A=a1+a2*i %A 的实部 disp('实部为') re=real(A) %A 的虚部 disp('虚部为') im=imag(A) %%%%%%% %(2) disp('A 的各元素模为') rou=abs(A) disp('A 的个元素辐角为') theta=angle(A) %(3) %共轭矩阵 disp('A 的转置为') B=conj(A) %%(4) %%加法 disp('A 及其转置的和为') C=A+B %%(5) 数值分析与应用 .

3304 -0.5911 0.0807 -0.4733 -1.1748 1.6547 -0.0477 -0.m 保存。 步骤二:运行程序。 在命令窗口输入: >> clear >> yunsuan 回车后得到: 产生正态随机矩阵 a1 = -2.9573 0.0360 0.^3 %(9) disp('A 中各元素的对数函数') H=log(A) %(10) disp('A 中各元素的指数函数') G=exp(A) 以文件 yunsuan. disp('A 中各元素与 b 的乘积为') D=b.4490 -0.*A %(6) disp('A 的各元素除以 b') E=A/b %(7) disp('A 中各元素的 sine 函数为') s=sin(A) %(8) disp('A 的各元素 3 次幂') F=A.3793 -0.4409 -0.2809 数值分析与应用 .MATLAB 128 %乘法 b=3+4*i.4999 1.2925 0.1169 -0.

2500 0.3333 0.0000 0.1667i 实部为 re = -2.2500 0.2000i 0.2000 0.3333i -0.4490 + 1.4490 -0.2000 0.1169 + 0.2000 0.2500 0.2000i 0.3079 1.2000 0.4409 -0.2500i 0.4733 -1.1667 0.1667 0.0360 + 0.4409 + 0.1748 1.2500i 1.9573 0.2500 0.1169 -0.1748 + 0.1667 0.2500i -0.3333 0.3333i -0.3793 + 0.2809 + 0.5000 0.5911 + 0.1309 0.2000 0.2925 + 0.1429 A 的各元素模为 rou = 2.0360 0.4999 + 0.3333 0.2500i 0.3304 + 0.3333i -0.2000 0.1429 生成的 A 矩阵为 A= -2.6885 1.9573 + 0.0807 -0.5000 0.0807 + 0.5589 1.0000i -0.5000 0.4693 0.0000 0.4733 + 0.2809 虚部为 im = 1.3333 0.4999 1.3333 0.6453 0.0477 + 0.MATLAB 129 数值分析与应用 产生 hilbert 矩阵 a2 = 1.1667 0.5000i -0.8238 0.1429i .6547 + 0.3333 0.2500 0.5000i -1.2500 0.1667i -0.5000 0.2500 0.9894 0.2000i -0.3793 -0.6547 -0.5911 0.2925 0.3304 -0.0477 -0.2500 0.

9825 + 1.3214i -3.1613 -0.5000i -0.8424 2.1822 0.0791i -0.1188i -2.3799 0.6607 -1.3304 .2889 数值分析与应用 A 的个元素辐角为 theta = 2.0.0.1535 1.5753 .4678i -1.0477 .4733 .0807 .1.8861 0.3533 0.2545 0.2500i 0.2496i -0.5911 .1.3380 + 2.0720 0.4490 .2500i 0.8818 -1.6418 0.0.3.0.5801 + 3.3244 .5523i .6779 0.4852 2.0000i -0.3094 -0.2334 1.4288 0.5000i -1.1748 .6.1111 A 的转置为 B= -2.2000i 0.7488 0.6547 .0.2636i 3.5619 A 中各元素与 b 的乘积为 D= -11.0.9641 .3793 .5591i -0.0.2714 + 5.3333i -0.3226i -2.2032 0.1990i 3.2000i 0.0.0.5851 0.2500i -0.7594 1.2925 .4561i -2.9998 2.3614 2.1174i -1.0.0.1667i -0.0.1909 .9145 0.3517 2.0776 + 5.4894 2.0360 .7702i 0.9466 -2.MATLAB 130 0.4997 .1.1.8128 2.2000i -0.8980 -1.3495 2.1169 .7415 0.8718 .6144i A 的各元素除以 b E= 0.0.4409 .0.7587 -0.1429i A 及其转置的和为 C= -4.2500i 1.0.7733 .4714 0.3.2339 -0.1667i 1.3333i -0.0.4999 .1432 + 0.2415 1.0955 -0.7539 2.7961i -3.6561 + 2.9079 + 0.3471 .0.3931i -4.2809 .3333i -0.9573 .

2129i -0.6779i 0.3733 + 0.0107 + 2.4638i -0.0.1871 .0137 + 0.2523i -0.4327 + 0.2104 + 0.1648i 0.0410i A 的各元素 3 次幂 F= -7.5634 + 0.7539i -0.0298i 0.0309 + 0.0505i 0.7696i 0.0376i 0.4133i -0.3614i -0.9808 + 0.1649i 0.5326 + 0.1246i 0.2351i 0.2578i 0.5118i 0.0367 + 0.1832i 0.0763 + 0.0367i 数值分析与应用 0.0.4435 + 2.7415i -0.0.8128i 0.2538 + 0.0406 + 1.0014 + 0.4322 + 0.3678i 0.2684 + 0.7565 + 2.5125i .9681 + 0.0.3212i -0.0775 .9018 + 1.0043 .4560 + 0.4209 + 2.2334i -1.0.0088 .6716i -0.3777 + 0.5365 + 0.1535i -1.3414 +16.1501i 3.0234 + 0.1339 + 0.3372i -0.0157i -0.3207 + 0.1598i -0.1938 + 2.3720 + 0.9044i -0.2110i -0.0950i 1.1718i -0.3517i -0.0467 + 0.1916i 1.9944i 0.0.4087 + 0.0749 + 0.1111i A 中各元素的指数函数 G= 0.2217i 0.1308i -0.0.0200 + 0.0343 + 0.0622 + 0.0374 .3799i 0.1514i -0.5817 + 2.1766 .0.1870i -0.0312 + 0.0492 + 0.9238 + 0.0727i 0.8424i -0.0234i 0.2012i 0.9728 + 2.1454i 0.4944 + 0.MATLAB 131 -0.7594i -1.2464i 0.2903i 0.0796 .9317 + 0.0043 + 0.5180i 0.8861i -0.0092 + 0.9853 .5748 + 0.9454 + 0.0783i 0.0957 + 0.6866 + 0.0480i 0.0072i 0.1100i 0.0721i -0.1110i 0.0674 + 0.1230 + 2.0213i -0.8433 + 0.0106i 2.0929i -0.1828i 0.6791 + 0.5877 + 0.6977 + 0.0091 + 0.9931i 0.8467 + 0.2098i 0.5140 + 0.0139i -0.3684 + 1.1368 .1878i A 中各元素的 sine 函数为 s= -0.0057 + 0.2359i 0.7003i A 中各元素的对数函数 H= 0.0926i 2.3426 + 0.7488i -0.0.2489 + 0.7236i 1.2491i 0.0490 + 0.0277 + 0.4852i -1.1393i 3.5935 + 1.1232 + 0.0741 + 0.8280 + 0.4894i -0.1763 + 0.1370i 1.0553i 0.7521 + 0.5695 + 0.

z = a ] = lim( z − a) f ( z ) z→a 如果 z = a 是 m 阶奇点的话,可以用如下方法计算 d m −1 1  f ( z )( z − a )m  z → a ( m − 1)! dz m −1  Res [ f ( z ).z.p.a)。 对于 m 阶奇点: c=limit(diff(F*(z-a)^m.p.a) 在控制理论以及信号处理中的传递函数经常会是有理分式的形式,针对这样的情况可以 直接调用 MATLAB 中的 residure 函数,这一方法是以数值方法给出的。Residure 的基本格 式为 [r.3 留数的两种运算方法 实验基本原理 设 z = a 是复变函数 f ( z ) 的一个孤立奇点,把 f ( z ) 在这点展开为洛朗级数,其中 ( z − z0 )−1 项系数叫 f ( z ) 在该点的留数,通常记为 Resf ( z0 ) 。对于留数的计算问题,一般 可以采用 Res [ f ( z ).a] = residue(r. z = a ] = lim 如此,便可以采用 MATLAB 中的符号工具箱计算 对于 1 阶奇点: c=limit(F*(Z-a).m-1)/prod(1:m-1).MATLAB 数值分析与应用 132 实验结论 系统输出已经给出了各运算结果,在实验中,我们针对实验基本原理部分提出的各种运 算设计了范例。 虽然上面程序很多,但是这是脚本语句各句都是独立的,当然有可能用到前面的变量问 题。所以这理解起来很容易,也比较容易上手。复数的基本运算是复变函数的基础。这些问 题,如果在其他高级语言中可能需要编写复数的数据结构,当然数学软件除外,如 Maple、 Mathmatics。在一般性的高级语言中 Fortran 的基本数据类型是包含复数的。 实验 3.k) 第一种格式直接给出留数以及所在奇点,第二种格式刚好相反,从留数以及奇点给出系 统的传递函数,k 为余项。 .z.z.k] = residue(b.a) [b.

m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: .exe 光盘:\实验代码\chapter3\liushu.rar\3-3.MATLAB 数值分析与应用 133 实验目的与要求 l 熟悉留数的含义。 l 理解留数定理。 l 会使用 residure 方法计算一类留数问题。 l 会编程处理一般性的留数问题。 l 对于数学问题不可回避的需要一定的数学分析能力。 实验内容及数据来源 (1) 使用 residue 计算复变函数 s 的留数,其中 s= 5 z 3 + 3z 2 − 2 z + 7 −4 z 3 + 8 z + 3 (2) 求复变函数 f 在奇点处的留数。其中 eiaz − eibz f = z2 (3) 求复变函数 g 在 z0 = 1 处的二重奇点出的留数。其中 g= 1 ( z − 1) 2 exp ( z 2 ) 实验操作指导 光盘:\实验视频\chapter3.

s1) %(2) 单重奇点情况 syms z a b f=(exp(i*a*z)-exp(i*b*z))/z^2 disp('f 在 0 处的留数为') c_f=limit(f*z. [r.MATLAB 134 %留数的计算 %08 年 7 月 23 %(1)使用 residure 计算留数 s2=[ 5 3 -2 7].z.z. s1=[-4 0 8 3].0) %(3) 多重奇点情况 g=1/(z-1)^2*exp(z^2) disp('f 在 2 处的留数为') c_g=limit(diff(g*(z-1)^2.25000000000000 数值分析与应用 .41671015413220 -0.1)/prod(1:1).m 保存。 步骤二:运行程序。 在命令窗口输入: >> clear >> liushu 回车得到: r= -1.16443609098554 -0.z.1) 以文件名 liushu.k]=residue(s2.57371511684888 -1.66525057020591 1.33196072433811 p= 1.p.40927902586334 k= -1.

16443609098554  -0. -1.40927902586334  = 1.57371511684888  p =  -1. -0.57371511684888 = -1.33196072433811 输出中还可以看到余项 k 为-1.MATLAB 135 数值分析与应用 f= (exp(i*a*z)-exp(i*b*z))/z^2 f 在 0 处的留数为 c_f = i*a-i*b g= 1/(z-1)^2*exp(z^2) f 在 2 处的留数为 c_g = 2*exp(1) 实验结论 系统输出可以看到,s 的留数为  -1.66525057020591 Res  s ( z ) .66525057020591   1.41671015413220  r =  -0.40927902586334 亦既 Res  s ( z ) .41671015413220 Res  s ( z ) . 1.16443609098554  = -0.33196072433811  留数所在的奇点为  1.25,当分子多项式的次数低于分母多项式次数时候余相 为空。resdue 是采用数值方法计算的,事实上关于分式多项式的展开实际上有时候是一类病 态问题,所以有可能会出现这个方法不一定非常可靠的情况,这是需要注意的。 .

MATLAB 数值分析与应用 136 有理分式问题是一类重要的问题,因为在信号系统以及自动控制理论的传递函数很多是 用这一类型而表达的,所以被研究的也比较多。对于实验中另外的两个范例,则是一般问题, 需要编程计算。 对于 f 要计算的是一阶奇点问题,计算结果为 ia − ib 。 g 对应的是是二阶奇点问题, 代表高阶奇点情况,计算结果为 2e 。 实验 3.4 留数在计算闭曲线积分中的应用 实验基本原理 留数在定积分中如果使用得当会非常有效,在这一实验中将介绍留数在计算闭曲线积分 中的应用。 对于封闭的曲线积分 Ñ∫ f ( z )dz Γ 值等于积分曲线内留数的和乘以 2π i ,即 Ñ∫ Γ n f ( z )dz = 2π i ∑ Res[ f ( pi )] i =1 关于留数的计算问题,已在上一个实验中做了介绍。 实验目的与要求 l 熟悉留数的计算方法。 l 知道应用留数定理计算实变函数定积分的数学方法。 l 能用符号法编程实现封闭曲线积分的运算。 实验内容及数据来源 (1) 计算封闭曲线积分 Ñ∫ (2) 计算封闭曲线积分 z =3 1 πz sin dz z −1 4 2 .

1). disp('封闭曲线 s1 积分为') s1=2*pi*i*(c1+c2) %(2)多阶奇点情况 g=exp(z)/z^3. c3=limit(diff((g*z^3).z.z.z. disp('封闭曲线 s2 积分为') s2=2*pi*i*c3 以文件名字 liushu_yy.2)/prod(1:2).z.rar\3-4.0).exe 光盘:\实验代码\chapter3\liushu_yy.MATLAB 137 Ñ∫ exp ( z ) dz z =1 z3 实验操作指导 光盘:\实验视频\chapter3.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %(1)单阶奇点 但是多个奇点情况 syms z f=1/(z^2-1)*sin(pi*z/4) c1=limit(f*(z-1). c2=limit(f*(z+1).m 保存。 步骤二:运行程序。 在命令窗口输入: >> liushu_yy 回车得到: f= 1/(z^2-1)*sin(1/4*pi*z) 封闭曲线 s1 积分为 数值分析与应用 .-1).

5 Fourier 变换 实验基本原理 Fourier 变换定义为 F (ω ) = ∫ ∞ −∞ f ( x)e − iω x dx 在 MATLAB 中 Fourier 变换有三种调用格式 F = fourier(f) F = fourier(f.u.v)则 把 v 的函数变成 u 的函数。在调用 之先要保证原函数已经为符号变量表达式。 .v) 其中,第一种形式为基本的调用格式,按照默认的变量进行 Fourier 变换。F = fourier(f.v) 使用 v 代替默认的符号变量 ω 。F = fourier(f.v) F = fourier(f.MATLAB 138 数值分析与应用 s1 = i*pi*2^(1/2) g= exp(z)/z^3 封闭曲线 s2 积分为 s2 = i*pi 实验结论 需要注意的是积分方向为逆时针的封闭曲线,如果积分方向为顺时针,则运算结果需要 改变正负号。 在实验中,列举了两个简单的范例阐述了留数定理在计算封闭曲线积分中的应用,其中 一个是单阶奇点情况,另一个为多阶奇点情况。应用留数定理计算实变函数定积分的方法是 很灵活多样的,读者如有需要可以阅读复变函数教材或专著,如梁昆淼先生的《数学物理方 法》等。 实验 3.u.

m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %Fourier 变换 .rar\3-5.exe 光盘:\实验代码\chapter3\fuliye.MATLAB 139 数值分析与应用 需要说明的是,在实际应用中,Fourier 变换常常采用下面三种定义形式 1 2π (1) F1 (ω ) = (2) F2 (ω ) = (3) F3 (ω ) = ∫ ∞ ∫ ∞ −∞ −∞ ∫ ∞ −∞ f ( x )e −iω x dx f ( x)e− iω x dx f ( x)e− i 2πω x dx 在 MATLAB 中采用的是第二中定义方法,在使用中这是需要注意的。 实验目的与要求 l 知道 Fourier 变换的不同定义式,并能相互转化。 l 熟悉 Fourier 变换的性质,如线性性质、微分性质、积分性质、卷积性质等。 l 熟悉 MATLAB 中 Fourier 变换的几中调用方式。 l 能用调用符号工具箱实现 Fourier 变换。 l 能把运算结果用图象表达。 实验内容及数据来源 把下列函数进行 Fourier 变换 (1) f = exp ( −2 x ) (2) g= (3) h = cos 2 2 x 4sin 3x x 实验操作指导 光盘:\实验视频\chapter3.

2.2.2.2) ezplot(H) 140 数值分析与应用 .2.2.MATLAB syms x disp('原函数 f') f=exp(-2*abs(x)) disp('象函数 F') F=fourier(f) %作图 subplot(1.1) ezplot(g) grid subplot(1.1) ezplot(h) grid subplot(1.2) ezplot(F) grid %% figure(2) disp('原函数 g') g=4*sin(3*x)/x disp('象函数 G') G=fourier(g) %作图 subplot(1.1) ezplot(f) grid subplot(1.2) ezplot(G) grid % figure(3) disp('原函数 h') h=(cos(2*x))^2 disp('象函数 H') H=fourier(h) %做图 subplot(1.2.

MATLAB grid 以文件名 fuliye.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >>fuliye 回车得到: 原函数 f 原函数 f f= exp(-2*abs(x)) 象函数 F F= 4/(4+w^2) 原函数 g g= 4*sin(3*x)/x 象函数 G G= 4*pi*(heaviside(w+3)-heaviside(w-3)) 原函数 h h= cos(2*x)^2 141 数值分析与应用 .

1 中给出了原函数与象函数 4 + ω2 的函数图象。 图 3.MATLAB 数值分析与应用 142 象函数 H H= 1/2*pi*(2*dirac(w)+dirac(w+4)+dirac(w-4)) 实验结论 有些函数虽然看上去很简单,但是也许变换的结果很复杂。这里把上面三个范例运算结 果整理一下。 对于范例 1,经过 Fourier 变换后象函数为 4 ,在图 3.2。 .1 原函数 f 及其象函数 F 范例 2,经过 Fourier 变换后象函数经过 MATLAB 输出为 4*pi*(heaviside(w+3)-heaviside(w-3)) 这里给出了 h 及其象函数 H 的函数图象,如图 3.

3 给出了范例 3 的原函数与 Fourier 变换后的象函数图象。 图 3.3 原函数 h 及其象函数 H 数值分析与应用 .MATLAB 143 图 3.2 原函数 h 及其象函数 H 范例 3 中,系统的输出为 1/2*pi*(2*dirac(w)+dirac(w+4)+dirac(w-4)) 其中 dirac 为狄拉克函数,既象函数为 H= π  2δ (ω ) + δ (ω + 4 ) + δ (ω − 4 ) 2 图 3.

6 数值分析与应用 Fourier 逆变换 实验基本原理 Fourier 逆变换的定义为 f ( x) = 1 2π ∫ ∞ −∞ F (ω )eiω x dω 与 Fourier 变换对应也有三种基本的调用格式 f = ifourier(F) f = ifourier(F.u) f = ifourier(F.u) 其基本意义与 Fourier 变换相对应,这里就不在赘述。同样,在实际应用中 Fourier 逆变 换也有三种形式,分别为 f1 ( x ) = (1) (2) f 2 ( x) = 1 2π 1 2π ∫ ∞ −∞ ∫ ∞ −∞ F1 (ω )eiω x d ω F2 (ω )eiω x d ω ∞ f3 ( x) = ∫ F3 (ω )ei 2πω x d ω −∞ (3) 这里的逆变换顺序与上一实验中的 Fourier 变换顺序对应。 实验目的与要求 l 知道 Fourier 逆变换的定义。 l 对于不同的定义形式要会互相转化。 l 熟悉 MATLAB 中 Fourier 逆变换的几种调用方式,知道各个参数的意义。 l 能用符号工具箱实现 Fourier 逆变换。 l 能把运算结果图象化表达。 实验内容及数据来源 计算如下函数的 Fourier 逆变换: (1) F= δ (ω − 2) + δ (ω + 2) ,其中 δ 为狄拉克函数。 2 .MATLAB 144 实验 3.v.

2.exe 光盘:\实验代码\chapter3\fuliye_fan.rar\3-6.1) ezplot(F) grid subplot(1.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %Fourier 逆变换 %8 月 23 日 %范例 1 syms w disp('象函数 F') F=(dirac(w-2)+dirac(w+2))/2 disp('F 的原函数为') f=ifourier(F) %作图 subplot(1.2.2.1) ezplot(H) 数值分析与应用 .2) ezplot(f) grid %范例 2 figure(2) disp('象函数 H') H=sin(w*2)/w/pi disp('H 的原来函数为') h=ifourier(H) %作图 subplot(1.MATLAB 145 (2) H= 1 sin(2ω ) π ω (3) G= 1  4sin(ω − 3) 4sin(ω + 3)  + 2π  ω − 3 ω + 3  实验操作指导 光盘:\实验视频\chapter3.

2.-1.5]) grid %范例 3 figure(3) disp('象函数 G') G=(sin(3-w)*4/(3-w)+sin(3+w)*4/(3+w))/2/pi %反变换 disp('G 的原来函数为') g=ifourier(G) %作图 subplot(1.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >> fuliye_fan 回车得到 象函数 F F= 1/2*dirac(w-2)+1/2*dirac(w+2) F 的原函数为 f= 数值分析与应用 .2.2.MATLAB 146 grid subplot(1.2) ezplot(h) axis([-6.6.1) ezplot(G) grid subplot(1.2) ezplot(g) grid 以文件名 fuliye_fan.

1 给出了象函数与原函数的函数图形。 .MATLAB 147 数值分析与应用 1/2*cos(2*x)/pi 象函数 H H= sin(2*w)/w/pi H 的原来函数为 h= 1/2*(heaviside(x+2)-heaviside(x-2))/pi 象函数 G G= (-2*sin(w-3)/(-w+3)+2*sin(w+3)/(w+3))/pi G 的原来函数为 g= 2*cos(3*x)*(-heaviside(x-1)+heaviside(x+1))/pi 实验结论 实验选择的几个范例都是比较典型的,可能有些读者对输出的结果不太熟悉,这里把输 出结果整理一下。对第一个范例,经过 Fourier 反变换得到原来函数为 f = 1 cos ( 2ω ) 2π 图 3.

5。 图 3.5 象函数 H 及其原函数 h 对于范例 3,经过反变换 MATLAB 输出的函数为 2*cos(3*x)*(-heaviside(x-1)+heaviside(x+1))/pi 依然含有 heaviside 函数,其意义同前。图 3.MATLAB 148 数值分析与应用 图 3.4 象函数 F 与原函数 f 范例 2,经过反变换 MATLAB 输出 1/2*(heaviside(x+2)-heaviside(x-2))/pi 其中 heviside 是阶跃函数。既 heviside(x)在 x>0 时候为 1,x<0 或者 x 为 NaN 时候为 0。象 函数与原函数的函数图象如图 3.6 给出了象函数 G 与原函数 g 的函数图象。 .

MATLAB 149 数值分析与应用 图 3.z) 使 w 代替默认的变量 s,z 代替默认的 变量 t 和 s。 在调用变换函数时,先要确保原函数为符号变量表达式。 实验目的与要求 l 知道 Laplace 变换的定义。 l 熟悉 Laplace 变换的一些重要性质,如线性性质、微分性质、积分性质、卷积性质等。 .w.6 象函数 G 与原函数 g 实验 3.w.t) laplace(F.z) 第一中调用格式为默认的调用格式,默认 t 为时域变量。在格式 L = laplace(F.t) 中,使 L 中用 t 代替默认的变量 s。在格式 L = laplace(F.7 Laplace 变换 实验基本原理 Laplace 变换定义为 ∞ L( s ) = ∫ f (t )e− st dt 0 在 MATLAB 中有三种基本的调用格式 laplace(F) laplace(F.

2.rar\3-7.2) ezplot(Lf) grid %%%%% figure(2) syms t (2) 数值分析与应用 .exe 光盘:\实验代码\chapter3\laplace_main.MATLAB 150 l 能够调用 MATLB 工具箱对函数进行 Laplace 变换。 l 把变换结果用图象表达。 实验内容及数据来源 计算以下函数的 Laplace 变换 (1) f = sin 2t + sh3t (2) g = exp ( −4t ) sin 3t + ( exp ( −2t ) + 2t − 1) 4 实验操作指导 光盘:\实验视频\chapter3.1) ezplot(f) grid subplot(1.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %Laplace 变换主函数 syms t disp('原函数 f') f=sin(2*t)+sinh(3*t) disp('f 的象函数 Lf') Lf=laplace(f) pretty(Lf) %作图 subplot(1.2.

2.2) ezplot(Lg) grid 以文件名字 laplace_main. disp('g 的象函数 Lg') Lg=laplace(g) pretty(Lg) %作图 subplot(1.1) ezplot(g) grid subplot(1.2.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >> laplace_main 回车得到 原函数 f f= sin(2*t)+sinh(3*t) f 的象函数 Lf Lf = 2/(s^2+4)+3/(s^2-9) 2 -----.MATLAB 数值分析与应用 151 disp('原函数 g') g=exp(-4*t)*sin(3*t)+(exp(-2*t)+2*t-1)/4.+ ------ 3 .

1/4 1/s 2 1/9 (s + 4) s+2 +1 2 s 实验结论 直接输出的结果有点凌乱,可以通过 pretty 进行修改显示方式,对于第 1 个范例,运 行结果为: L[ f ] = 2 3 + 2 s + 4 s −9 2 图 3.+ 1/2 ---.7 中给出了原函数与象函数的函数图象 图 3.MATLAB 数值分析与应用 152 2 s +4 2 s -9 原函数 g g 的象函数 Lg Lg = 1/3/(1/9*(s+4)^2+1)+1/4/(s+2)+1/2/s^2-1/4/s 1 1 1 1/3 ---------------..+ 1/4 ----.7 及其 Laplace 变换的函数图象 范例 2 的结果略微复杂一些,输出结果为 1/3/(1/9*(s+4)^2+1)+1/4/(s+2)+1/2/s^2-1/4/s 使用 pretty 排版后效果依然不是太好,如果会使用 Latex 的用户,可以直接在 MATLAB 中生成 Latex 的排版语句,只需要使用函数 latex()就可以。上面的结果用为, .

x)中,使 F 的变量由默认的 t 变为 x,L 的变量由默认的 s 变 y,即 F ( x) = ∫ c + i∞ c −i ∞ L( s )e xy dy . \left( s+4 \right) ^{2}+1 \right) ^{-1}+1/4\.{s}^{-1} 把这个语句用 Latex 软件编译就可以得出结果。 在图 3.y.y)中,是 F 的变量由默认的 t 变为 y。即 F ( y) = ∫ c +i∞ c −i ∞ L(s )e sy ds 在格式 F = ilaplace(L.8 Laplace 逆变换 实验基本原理 Laplace 逆变换的定义为 F (t ) = ∫ c + i∞ c − i∞ L( s )e st ds 在符号工具箱中,主要有三种调用格式 F = ilaplace(L) F = ilaplace(L.MATLAB 数值分析与应用 153 1/3\.8 中给出了 g 的函数图象及其 Laplace 变换的函数图象。 图 7. \left( s+2 \right) ^{-1}+1/2\.{s}^{-2}-1/4\.y) F = ilaplace(L.8 g 及起 Lapalce 变换的函数图象 实验 3.x) 其中第一种为默认的调用格式。在格式 F = ilaplace(L. \left( 1/9\.y.

rar\3-8.MATLAB 154 实验目的与要求 l 熟悉 Laplace 逆变换的定义式。 l 注意 MATLAB 中几种关于逆变换的格式,弄清楚各个参数的意义。 l 能调用 MATLAB 符号工具箱处理逆变换问题。 实验内容及数据来源 计算下面两个函数的 Laplace 逆变换 (1) L[ f ] = (2) L[ f ] = 1 ( s + 2 )( s + 3) s+2 ( s + 2) 2 +4 实验操作指导 光盘:\实验视频\chapter3.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %Laplace 逆变换主函数 syms s disp('象函数 Lf') Lf=1/(s+2)/(s+3) disp('Lf 的原函数 f') f=ilaplace(Lf) pretty(f) %作图 数值分析与应用 .exe 光盘:\实验代码\chapter3\laplace_fan_main.

4) ezplot(g) grid 以文件名 laplace_fan_main.2.3) ezplot(Lg) grid subplot(2.2.1) ezplot(Lf) grid subplot(2.2.2.MATLAB 155 subplot(2.2) ezplot(f) grid %%%%% (2) syms s disp('象函数 Lg') Lg=(s+2)/((s+2)^2+4) disp('Lg 的原函数 g') g=ilaplace(Lg) pretty(g) %作图 subplot(2.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >> laplace_fan_main 回车得到: 象函数 Lf Lf = 1/(s+2)/(s+3) Lf 的原函数 f 数值分析与应用 .

MATLAB 156 数值分析与应用 f= 2*exp(-5/2*t)*sinh(1/2*t) 2 exp(.9 中给出了,这两个范例中的象函数以及其原函数的函数图象。 .5/2 t) sinh(1/2 t) 象函数 Lg Lg = (s+2)/((s+2)^2+4) Lg 的原函数 g g= exp(-2*t)*cos(2*t) exp(-2 t) cos(2 t) 实验结论 MATLAB 已经给出了输出结果,为了使用结果更美观一些,采用了 pretty 函数。在图 3.

9 象函数及其原函数的函数图象 有了 Laplace 变换及其逆变换的方法,就可以处理一些微分方程与积分方程。因为在 MATLAB 的符号工具箱中,有单独函数处理微分方程,所以这里就不在介绍 Laplace 方法, 仅简单介绍一下思路,可以分为三步: (1)对方程进行 Laplace 变换,这时已经把初始条件 一并考虑了。 (2)从变换后的方程解出像函数。 (3)对像函数反演,原函数就是原来方程的 解。 小结 在这一章中,介绍了 MATLAB 在复变函数中的应用以及两个积分变换问题。事实上, MATLAB 的数据运算本身就是面向复数的。而在一般的高级语言,如 c/c++、java、Delphi 等基本运算类型是不包含复数的(Fortran 的基本数据类型包含复数类型) 。在叙述中,主要 介绍 MATLAB 在复变函数中的一些运算问题,而对于数学本身叙述不多,因这不是一本数 学教材。 上机操作题 1. 用 MATLAB 产生实部和虚部都为(5,5)的正态分布的随机的复数矩阵。分别计 算各元素的模与辐角。 本题无参考答案,与用户计算机产生的随机数有关系。 2. 使用 residue 函数把 b ( s ) 5s 2 + 3s 2 − 2 s + 7 = a (s) −4 s 3 + 8 s + 3 转化为 .MATLAB 157 数值分析与应用 图 3.

4167   1.2500 。     1. p = -1.6653 .p>0 t + p2 f (t ) = 参考答案: F (ω ) = 2 exp ( − p ω ) π p 。 4. 计算函数的 Fourier 逆变换,其中 F (ω ) = − ( i ω 。 2 π a + ω2 ) 参考答案: f ( x ) = sgn x exp − a x 。 5. 计算函数的 Laplace 变换,其中 f (t ) = 参考答案: F ( s ) = 1 ( at − sin at ) a3 1 。 s ( s + a2 ) 2 2 6. 计算函数的 Laplace 逆变换,其中 F (s) = 参考答案: f ( t ) = 1 。 s ( s + a2 ) 1 (1 − cos at ) 。 a2 2 数值分析与应用 .3320   -0. k = -1.4093      3. 计算函数的 Fourier 变换,其中 1 .5737      参考答案: r = -0.MATLAB 158 b (s) r r r = 1 + 2 +L + n + k (s) a ( s ) s − p1 s − p2 s − pn 的形式。  -1.1644 .

MATLAB 159 数值分析与应用 第四章 线性方程组数值方法 对于科学与工程而言,数值代数是一门基础工具。随着计算技术的发展,产生了各种数 值代数计算方法。而数值代数的主要问题之一就是线性方程组的计算。线性方程组可以分为 欠定方程组、适定方程组与超定方程组。在这一章主要讲适定方程组。对于超定方程组,在 最小二乘与数据拟合一章中阐述。 就解线性方程组方法而言,主要分为直接方法和迭代方法,这里会分别介绍。直接法是 在没有舍入误差的假设下,能在预定的运算次数内求得精确解。而实际上,原始数据的误差 和运算的舍入误差是不可以避免的,实际上获得的也是近似解。 迭代法是构造一定的递推格式,产生逼近精确解的序列。对于高阶方程组,如一些偏微 分方程数值求解中出现的方程组,采用直接法计算代价比较高,而迭代法简单又实用,所以 比较受工程人员青睐。 而 MATLAB 作为一门工程软件,其内置的处理代数方程组的方法也很丰富,我们也将 在后面讲到。 实验 4.A) = E . g 2 .L . B = D-1 (D .1 Jacobi 迭代 实验基本原理 设线性方程组 AX = b 的系数矩阵非奇异,且主对角元素 aii ≠ 0 。令 bij = − aij / aii i ≠ j  i=1.2. a22 . ann ) , g = ( g1 .D-1 A 则上述方程用矩阵符号表示既为 X = BX + g .n  gi = bi / aii 原方程可以改写为  x1 = b12 x2 + b13 x3 + L + b1n xn + g1 x = b x + b x + L + b x + g  2 21 x 23 3 2n n 2  M   x1 = bn1 x1 + bn 2 x2 + L + bn .n −1 xn −1 + g n 令 D = diag ( a11 .L .L g n )T .

MATLAB 160 由此如果我们得到迭代公式 X ( k ) = BX ( k +1) + g ,此即 Jacobi 迭代。 实验目的与要求 l 对于给定的线性方程组,能判断是否合适使用 Jacobi 迭代。 l 能够构造出迭代公式。 l 能编程实现 Jacobi 迭代,并处理相关问题。 l 如果迭代不收敛,要求给出相关信息。 l 把迭代收敛情况用图象表现出来。 实验内容及数据来源 应用 Jacobi 迭代法求解如下方程组: 4 x1 − x2 + x3 = 7  4 x1 − 8 x2 + x3 = −21 −2 x + x + 5 x = 15 1 2 3  −7 要求计算精度为10 。 实验操作指导 光盘:\实验视频\chapter4.m.tol) % jacobi 迭代法 计算线性方程组 % tol 为输入误差容限,x0 为迭代初值 max1= 300. f=D\b. jacobi.rar\4-1. L=-tril(A.m 步骤一:编写 Jacobi 迭代法的函数。 在打开 Editor 编辑器,输入以下语句: function [x.b. D=diag(diag(A)).1). B=D\(L+U). %默认最多迭代 300,超过要 300 次给出警告 数值分析与应用 .exe 光盘:\实验代码\chapter4\Fjacobi.-1).x0.k]=Fjacobi(A. U=-triu(A.

4 -8 1. if(k>=max1) disp('迭代超过 300 次,方程组可能不收敛').99999997450829 3.b. x0=[0 0 0]' .1e-7) 以文件 jacobi.x0. return. %迭代次数 while norm(x-x0)>=tol x0=x.-2 1 5].m 保存。 步骤三:运行程序。 在命令窗口输入: >> jacobi 回车可以得到运算结果 x= 1.99999999073029 3. k=k+1. %迭代初值 [x.00000001297760 k= 17 说明:两个文件必须都在 MATLAB 的搜索路径上,或者当前目录,后面的实验例同。 实验结论 为了分析迭代的中间情况,我们保留了计算的每一结果见表 4.k]=Fjacobi(a. k=1. end %[k x'] %如果想显示每一步迭代的结果 可以把这行命令保留 end 以文件 Fjacobi. b=[7 -21 15]'.MATLAB 161 数值分析与应用 x=B*x0+f.m 保存。 步骤二:打开 Editor 编辑器,输入以下语句: %jacobi 迭代验证程序 %08 年 4 月 14 日 a=[4 -1 1.1。从表中可以看出,在 指定精度(这里使用 1E-7)的情况下迭代到 17 次收敛。 . x=B*x0+f.

99989453125000 3.65625000000000 3.00000001297760 表 4.00000000000000 11 1.99998187255859 3.99999970336914 2.98710937500000 3.00000034606934 15 1.99999406738281 13 1.00000000000000 14 1.MATLAB 数值分析与应用 162 k x1( k ) x2 ( k ) x3( k ) 1 0.88750000000000 4 1.99999975280762 3.99984179687500 10 1.85000000000000 2.00000000000000 5 1.00024609375000 9 1.1 Jacobi 迭代 迭代的收敛速度,可以见下图 4.99999989803314 3.99999985168457 3.1。从图 4.99999932022095 3.99437500000000 2.92500000000000 3.99999999073029 3.99578125000000 7 1.99951660156250 3.87500000000000 3.99531250000000 3.1 中,也可以直观反应迭代收敛还是比较平 稳的。在迭代 5 次以后,方程的根基本不在有大幅的振荡,而是逐渐趋向平稳,接近收敛值, 这也说明 Jacobi 迭代方法是比较有效的。 .99999340820313 3.99806640625000 3.00000922851563 12 1.00000000000000 0.99999728088379 3.99999604492188 3.99978906250000 2.99964843750000 3.00000000000000 17 1.99999998146057 3.99999208984375 2.99999997450829 3.00000000000000 2 1.00000000000000 0.99998681640625 3.17500000000000 3 1.00656250000000 6 1.99718750000000 3.94843750000000 3.99992749023437 3.99062500000000 3.00000000000000 8 1.99982421875000 3.99999950561523 3.99999977752686 16 1.

1 Jacobi 迭代结果图形表示 实验 4.MATLAB 数值分析与应用 163 图 4.2 Gauss-Seidel 迭代 实验基本原理 从 Jacobi 迭代可以看出,用 X (k ) 计算 X ( k +1) 时候,需要同时保留这两个向量。事实上如 果每次新获得的分量如果在计算下一个分量时及时更新,既节省存储单元,又能使迭代加速, 这就是 Gauss-Seidel 方法。过程如下  x1( k +1) = b12 x2 ( k ) + b13 x3 ( k ) + L + b1n xn ( k ) + g1  ( k +1) = b12 x2( k +1) + b13 x3( k ) + L + b1n xn ( k ) + g1  x2  M  x ( k +1) = b x ( k +1) + b x ( k +1) + L + b x ( k +1) + g n . n −1 n −1 12 2 13 3 1  n 实验目的与要求 l 对于给定的线性方程组,能够判断是否适合使用 Gauss-Seidel 迭代。 l 能够构造出迭代公式。 l 编程实现 Gauss-Seidel 迭代方法。 l 如果迭代不收敛,要给出相关信息。 l 把迭代结果用图象表现出来。 实验内容及数据来源 .

while norm(x-x0)>=tol x0=x.1 中的方程,要求计算精度为10−7 。 实验操作指导 光盘:\实验视频\chapter4. k=1.x0.rar\4-2exe 光盘:\实验代码\chapter4\Fgseid. x=G*x0+f. f=(D-L)\b. end % [k.MATLAB 164 应用 Gauss-Seidel 迭代法求解实验 4.m 步骤一:编写高斯-塞德尔迭代方法函数。 打开 Editor 编辑器,输入以下语句: function [x. gseid.b. if(k>=max1) disp('迭代次数太多,可能不收敛').k]=Fgseid(A. L=-tril(A.tol) %高斯-塞德尔迭代法 计算线性方程组 % tol 为误差容限 max1= 300.m. G=(D-L)\U.-1). return. U=-triu(A.1). %默认最高迭代 300 次 D=diag(diag(A)). k=k+1. x=G*x0+f.m 文件名保存。 步骤二:编写调用函数。 打开 Editor 编辑器,输入以下语句: %gauss-seidel 方法的验证程序 %08 年 4 月 14 日 数值分析与应用 .x'] %如果要显示每一步迭代结果,可以这行命令。 end 以文件 Fgseid.

99997597656250 6 1.b.99902343750000 2.2 Gauss-Seidel 迭代法的收敛情况 可以看出 Gauss-Seidel 收敛速度要比 Jacobi 迭代收敛的要快一些,事实上一般情况下的 .99999999627471 2.99999809265137 2.99999999627471 2.99999964044189 3.99997548828125 3.99999999461628 3.87500000000000 3.99987890625000 3.1e-7) 以文件名 gseid.99999999859157 k= 10 实验结论 可以看到,同样的方程用 Gauss-Seidel 方法,10 次就收敛,收敛速度要比 Jacobi 方法 快。 为了分析迭代的过程中的收敛情况,我们给出每一步迭代值,如表 4.-2 1 5].99375000000000 3.00000000000000 0.99999999461628 3.96250000000000 3 1.93750000000000 2.m 为文件名保存。 步骤三:运行程序。 在命令窗口输入: >>gseid 运行得到: x= 1.99828125000000 3.99999953088379 8 1.99999999859157 表 4.99987792968750 2.99999976158142 2.99999997019768 2.99950781250000 5 1.4 -8 1. %迭代初值 [x.99999324707031 7 1.MATLAB 数值分析与应用 165 a=[4 -1 1.k]=Fgseid(a.00000000000000 2 1.00000000000000 0.99999996443024 3.x0. b=[7 -21 15]'.2。 k x1( k ) x2( k ) x3( k ) 1 0.99998474121094 2. x0=[0 0 0]' .99906250000000 4 1.99218750000000 2.99999990386047 9 1.99999999173256 10 1.99999787353516 3.

3 逐次超松弛迭代法(SOR) 实验基本原理 一般而言,因 Jacobi 迭代收敛速度不够快,所以在工程中用的不是太多。在 Jacobi 迭 代收敛速度很慢的情况下,通常 Gauss-Seidel 也不会太快。因此,可以对 Gauss-Seidel 做修 改,提高收敛速度,这就是这里要介绍的逐次超松弛迭代。 在 Gauss-Seidel 中迭代格式为 X ( k +1) = LX ( k +1) + UX( k ) + g 可以将迭代格式改写为 X ( k +1) = X ( k ) + ∆X 其中 ΔX = LX( k +1) + UX( k ) + g .2 可以看出,迭代两次以后就迅速靠 近真解,并且不再有大的波动,比较平稳。这也说明 Gauss-Seidel 方法是一种很有效的迭代 方法。 图 4.X 如果在修正项上家上一个参数 ω ,便得到松弛迭代法公式 X( k +1) = X ( k ) + ω∆X = (1 − ω ) X( k ) + ω (LX( k +1) + UX (k ) + g) .MATLAB 166 数值分析与应用 确是这样,不过这也不是绝对的。 其收敛结果可以用曲线表示出来如图 4.2。在图 4.2 高斯-塞德尔迭代结果图形表示 实验 4.

%迭代最大次数 %对松弛因子做出限制 if(w<=0 || w>=2) .MATLAB 167 数值分析与应用 上式可以改写为 X ( k +1) = (D .m.ω L)-1 b 当 ω =1 时候,就退化为 Guass-Seidel 迭代法; ω >1 时,称为主次超松弛迭代法, ω <1 时 候,为逐次低松弛迭代法。通常,统称为逐超松弛迭代法。 实验目的与要求 l 对于给定的线性方程组,能判断是否适合使用超松弛迭代。 l 能够构造出迭代公式。 l 能编程实现超松弛迭代方法,并处理相关线性方程组问题。 l 把结果用图象表示出来。 实验内容及数据来源 用超松弛迭代方法,解方程组 5 x1 − x2 − x3 − x4 = −4 − x + 10 x − x − x = 12  1 2 3 4  − x1 − x2 + 5 x3 − x4 = 8 − x1 − x2 − x3 + 10 x4 = 34 要求计算精度为10−7 。 实验操作指导 光盘:\实验视频\chapter4.ω )D + ω U]X ( k ) + ω (D .ω L)-1[(1.m 步骤一:编写超松弛迭代方法函数。 打开 Editor 编辑器,输入以下语句: function [x.b.x0.w.exe 光盘:\实验代码\chapter4\Fsor.k]=Fsor(A.tol) %超松弛迭代法计算线性 %08 年/4 月/14 日 %tol 需要的计算精度 max = 300.rar\4-3.sor.

%求 A 的下三角阵 L=-tril(A.-1).x0. B=inv(D-L*w)*((1-w)*D+w*U). %求 A 的上三角阵 U=-triu(A.m 为文件名保存。 步骤三:运行程序。 在命令窗口输入: >>sor 运行得到: x= 1. if(k>=max) disp('迭代次数太多,SOR 方法可能不收敛').m 保存文件。 步骤二:打开 Editro 编辑器,输入以下命令: %超松弛迭代的验证程序 %08 年/4 月/14 日 a=[5 -1 -1 -1 -1 10 -1 -1 -1 -1 5 -1 -1 -1 -1 10]. end % [k.k]=Fsor(a. k=1. b=[-4 12 8 34]'.x'] %如果要显示中间结果,可以保留这行语句 end 以 Fsor. [x.00000000983388 数值分析与应用 . k=k+1.1e-7) 以文件名 sor. x0=[1 1 1 1]'.b.1).2. x=B*x0+f. end %求 A 的对角矩阵 D=diag(diag(A)).MATLAB 168 error. x =B*x0+f.1. %迭代次数 while norm(x-x0)>=tol x0=x. return. f=w*inv((D-L*w))*b. return.

MATLAB

数值分析与应用

169

1.99999999502864
3.00000000071336
4.00000000211974
k=
14

实验结论
计算结果表明迭代到 14 次,已经满足精度。为了分析迭代的过程中的收敛情况,我们
给出每一步迭代值:

k

x1( k )

x2 ( k )

x3( k )

x4( k )

1

1.0000000000000

1.0000000000000

1.00000000000000

1.00000000000000

2

1.02069360640000

2.05212603596800

3.24099400056832

3.98523856515236

3

1.06266734312528

2.02424278186792

2.96911688552127

4.00967552823126

4

0.98819497832385

1.99118993067558

3.00355112783111

3.99601721877341

5

1.00014299088246

2.00172737436332

2.99878279459838

4.00087493542662

6

1.00030382687671

1.99964991195554

3.00044232290245

3.99987254032284

7

0.99993078066806

2.00009949487609

2.99988821122759

4.00001571034804

8

1.00001466381480

1.99997033127163

3.00002252705876

3.99999776058782

9

0.99999481577741

2.00000774615655

2.99999557199348

4.00000022395373

10

1.00000188694942

1.99999817271628

3.00000095366997

4.00000007680954

11

0.99999943137711

2.00000042087954

2.99999979224189

12

1.00000015094842

1.99999990204428

3.00000004034457

4.00000002280489

13

0.99999996145681

2.00000002254390

2.99999999356443

3.99999999274684

14

1.00000000983388

1.99999999502864

3.00000000071336

4.00000000211974

表 4.3 超松弛迭代结果
其收敛过程用图形表示如图 4.3

3.99999994197792

MATLAB

数值分析与应用

170

图 4.3 超松弛迭代的图形表示
在图 4.3 中,可以看出三个根收敛是很快的,而且比较稳定,超松弛迭代是线性方程组
一种比较有效的迭代方法。

实验 4.4

Gauss 消去法计算线性方程组

实验基本原理
对于线性方程组,作如下运算不会改变方程组的解:
a)

交换任意两个方程的顺序。

b)

方程中组任一方程乘上一个非零数。

c)

方程组中任一方程加上另一个方程的倍数。

所以,可以对方程组的系数矩阵变换,由此有下面的计算方法。
Step1:对于方程 AX = b 的增广矩阵

 a11 a12 L
a a L
[A, b] =  21 22
 M M

 an1 an 2 L
不妨设 a11 ≠ 0 ,在增广矩阵中每一行减去第一行的

a1n b1 
a2n b2 
M M 

ann bn 
ai1
倍,则增广矩阵可以变为
a11

MATLAB

数值分析与应用

171

 a11 a12 L a1n

 0 a22 L a2n

a11
a11
[A1 , b1 ] = 
M
 M M

an 2
a
L nn
0
a11
a11

b1 
b2 
a11 

M 
bn 

a11 

Step2:再把第二列对角元素以下的元素消为零,逐步消去可以把矩阵变为上三角矩阵。
Step3:对于系数为上三角矩阵的方程组,从最后一行开始回代,可以逐步求得方程组的解。

实验目的与要求

l

掌握系数矩阵为三角矩阵的方程组的回代方法。

l

理解 Gauss 消去法的计算原理,能够给出伪代码。

l

能够编程实现 Gauss 消去法。

实验内容及数据来源

用高斯消去法计算线性方程组

2 x1 + 2 x2 + 3 x3 = 3

4 x1 + 7 x2 + 7 x3 = 1
−2 x + 4 x + 5 x = −7
1
2
3

实验操作指导
光盘:\实验视频\chapter4.rar\4-4.exe
光盘:\实验代码\chapter4\Fgauss.m,gauss.m

步骤一:编写高斯消去法函数。
打开 Editor 编辑器,输入以下语句:
function X=Fgauss(A,b)
% Gauss 消去法 计算线性方程组
zengguang=[A b]; n=length(b);
ra=rank(A);

MATLAB

172

rz=rank(zengguang);
temp1=rz-ra;
if temp1>0,
disp('无一般意义下的解,系数矩阵与增广矩阵的秩不同')
return
end
if ra==rz
if ra==n
X=zeros(n,1);
C=zeros(1,n+1);
for p= 1:n-1
for k=p+1:n
m= zengguang(k,p)/ zengguang(p,p);
zengguang(k,p:n+1)= zengguang(k,p:n+1)-m* zengguang(p,p:n+1);
end
end
b=zengguang(1:n,n+1);
A=zengguang(1:n,1:n);
X(n)=b(n)/A(n,n);
for q=n-1:-1:1
X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);
end
else
disp('方程为欠定方程。')
end
end
把文件保存为 Fgauss.m
步骤二:编辑方程组信息。
打开 Editor 编辑器,输入以下语句:
%Gauss 消去法的验证程序
a=[2 2 3
477
-2 4 5];
b=[3 1 -7]';
x=Fgauss(a,b)
把文件文件为 gauss.m

步骤 3:运行主程序。
在命令窗口输入:
>> gauss
运算结果为

数值分析与应用

MATLAB

数值分析与应用

173

x=
2
-2
1

实验结论
实验的数学原理很容易理解,也容易上手。把运算结果 x = ( 2, −2,1) 代入原方程,可
T

以发现计算结果完全符合原方程,给出的是精确解。这说明 Gauss 消去法还是比较有效的一
种方法。
可以证明对于线性方程组

 a11 a12 L

 a21 a22 L
 M M

 an1 an 2 L

a1n 
 b1 

 
a2 n 
b
x= 2
M 
M 

 
ann 
 bn 

如果系数矩阵 A 的顺序主子失全不为零,即

a11 a12 L a1i

a21 a22 L a2i
M

M

ai1 ai 2

M
L aii

≠ 0, i = 1, 2,L , n

则 Gauss 消去法可以实现方程组的求解。
然而是在逐次消元的过程中,如果主对角元素相对同列的其他元素绝对值很小,那么舍
入误差会很大,这必然会影响计算精度,甚至消元过程无法进行。下个实验将要介绍的列主
元素消元法可以克服这一问题。

实验 4.5 列主元消去法计算线性方程组
实验基本原理
实验 3.4 最后指出了在逐次消元过程中,如果主对角元素相对其他同列元素绝对值很
小,那么会给计算精度带来比较大的影响。
为了使消元过程中见效舍入误差和不至于中断,我们可以不按照自然顺序进行消元。
事实上,在第 k 步消元的时候,我们不一定选取 akk ( k −1) 作为主元,而从同列 akk ( k −1) ,

ak +1, k ( k −1) ,…, ank ( k −1) 中选择绝对值最大的作为主元素,即使

MATLAB

174

akk ( k −1) = max aik ( k −1)
k ≤i ≤n

如此我们就得到了列主元消去法。

实验目的与要求

l

理解列主元消去法的原理。

l

熟悉列主元消去法的计算步骤,能用伪代码描述。

l

能编程实现列主元消去法,以计算线性方程组问题。

实验内容及数据来源

用列主元消去法计算方程组

0
2

4

6

2
2
-3
1

0
3
0
-6

1   x1   0 
 
2   x2   −2 
g
=
1   x3   −7 
   
-5  x4   6 

实验操作指导
光盘:\实验视频\chapter4.rar\4-5.exe
光盘:\实验代码\chapter4\Fzhuyuan.m, zhuyuan.m

步骤一:编写列主元消去法的函数。
打开 Editor 编辑器,输入以下语句:
function X=Fzhuyuan(A,b)
%列主元方法 计算线性方程组
zengguang=[A b]; n=length(b);
ra=rank(A);
rz=rank(zengguang);
temp1=rz-ra;
if temp1>0,
disp('方程组无一般意义下的解,系数矩阵与增广矩阵秩不同.')
return

数值分析与应用

MATLAB

175

end
if ra==rz
if ra==n
X=zeros(n,1); C=zeros(1,n+1);
for p= 1:n-1
[Y,j]=max(abs(zengguang(p:n,p))); C=zengguang(p,:);
zengguang(p,:)= zengguang(j+p-1,:); zengguang(j+p-1,:)=C;
for k=p+1:n
m= zengguang(k,p)/ zengguang(p,p);
zengguang(k,p:n+1)= zengguang(k,p:n+1)-m* zengguang(p,p:n+1);
end
end
b=zengguang(1:n,n+1);A=zengguang(1:n,1:n); X(n)=b(n)/A(n,n);
for q=n-1:-1:1
X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);
end
else
disp('方程组为欠定方程组')
end
end
把文件以 Fzhuyuan.m 为文件名保存。
步骤二:编写方程组的系数矩阵。
打开 Editor 编辑器,输入以下命令:
%列主元消去法 验证程序
a=[0 2 0 1
2232
4 -3 0 1
6 1 -6 -5];
b=[0 -2 -7 6]';
x=Fzhuyuan(a,b)
以文件名 zhuyuan.m 保存文件。
步骤三:解方程。在命令窗口输入:
>> zhuyuan
运算得
x=
-0.50000000000000
1.00000000000000
0.33333333333333
-2.00000000000000

数值分析与应用

MATLAB

176

数值分析与应用

实验结论
把向量计算得到的解向量代入原方程,可以发现符合的还是比较好的。这说明了列主元
消去法计算这一类方程的有效性。
事实上,对于普通 Gauss 消去法的修正,还可以有行主元消去法,全主元消去法。但是
全主元消去法相对于行、列主元消去法的工作量要大的多。所以列主元消去法是解线性方程
组实用的方法之一。如果使用按比例列主元消去法,效果会比列主元消去法要更优,尤其是
方程组系数相差非常大的时候,而且按比例列主元消去法算法上相对而言也比较容易实现。

实验 4.6 LU 分解法计算线性方程组
实验基本原理
如果方阵 A 可以分解成一个下三角矩阵 L 和一个上三角矩阵 U 的乘积,就把这样的分
解叫 A 的三角分解或者 LU 分解。特别的,如果 L 为下三角矩阵时候,称其为 Doolittle 分
解,U 为上三角矩阵时候,称其为 Crout 分解。
对于矩阵 A ,如果所有的顺序主子式都不为零,则 A 可以唯一的分解为

A = LU
其中 L 为下三角矩阵, U 为上三角矩阵。这时方程

AX = b
可以写成

LUX = b
令 UX = Y ,则有

LY = b
那么由此,把原方程的求解变为,求解系数矩阵为三角阵的方程,很容易实现。具体计
算步骤如下:
Step1:计算 A 的 LU 分解。
Step2:向前回代求解下三角方程 LY = b 。
Step3:向后回代求解上三角方程 UX = Y 。

实验目的与要求

l

会调用 MATLAB 的系统函数进行 LU 分解。

l

能利用 LU 分解方法计算线性方程组。

l

理解 LU 分解的计算流程,能给出 LU 分解的伪代码。

l

能自行编制出 LU 分解程序。

MATLAB

177

数值分析与应用

实验内容及数据来源

调用 MATLAB 的 LU 分解函数计算方程组

5.8 x1 − x2 − x3 + 4.6 x4 = 21.3
7 x − 8 x + x − 30.3 x = −15.7
 1
2
3
4

9.5 x1 + 2 x2 + 5 x3 − x4 = 16.6
6 x1 − x2 + 12.9 x3 + 10 x4 = 7.9

实验操作指导
光盘:\实验视频\chapter4.rar\4-6.exe
光盘:\实验代码\chapter4\LUfj.m

步骤一:编写主函数。
打开 Editor 编辑器,输入以下命令。
%LU 分解计算
a=[5.8 -1 -1 4.6
7 -8 1 -30.3
9.5 2 5 -1
6 -1 12.9 10];
b=[21.3 -15.7 16.6 7.9]';
[l,u]=lu(a);
x=u\(l\b)
以文件名为 LUfj.m 保存。
步骤二:在命令窗口输入:
>>LUfj
运行得
x=
2.59451803634398
0.03959342091970
-1.41333222048038
1.06044708470527

实验结论
通过上面的实验可以看出,用 LU 分解方法计算线性方程组还是很方便的。但是这一方

MATLAB

178

数值分析与应用

法不一定总会有效果,前提是系数矩阵的各阶顺序主子式要不都不为零。

实验 4.7 Cholesky 分解法计算线性方程组
实验基本原理
在许多工程与实践中,方程组的系数矩阵往往是实对称的。对此直接三角分解还可以做
一些改进。
设矩阵 A = [ aij ] ∈ R n×n 为实对称正定矩阵,A = GG T 称为矩阵 A 的 Cholesky 分解,其
中 G ∈ R n×n 是具有正的对角线元素的下三角形矩阵。
如果 A = [ aij ] ∈ R n×n 是对称正定矩阵,则必存在非奇异下三角矩阵 G,使

A = GG T
而且当 G 的主对角元素均为正时,这种分解是唯一的。
于是方程组

AX = b
可以写成

GG T X = b
在方程两边做矩阵变换,可以得到方程组的解。

实验目的与要求

l

会调用 MATLAB 的系统函数对矩阵进行 Cholesky 分解。

l

能利用 Cholesky 分解计算线性方程组。

l

理解 Cholesky 分解原理,熟悉分解的算法流程。

l

能自行编程实现 Cholesky 分解。

实验内容及数据来源
已知

MATLAB



A= 


数值分析与应用

179

16.42904628903813 16.12007848664000 7.82278120608096 2.95700879000000 
16.12007848664000 17.16712678518432 4.36553354006000 4.36310597100000 
7.82278120608096 4.36553354006000 14.88811554662400 -0.53261940800000 

2.95700879000000 4.36310597100000 -0.53261940800000 18.86911452484754 

 x1 
15.6 
x 
5.8 
2



X=
b=
 x3 
 20.8
 


11.9 
 x4 
用 Cholesky 分解法计算 AX = b 。

实验操作指导
光盘:\实验视频\chapter4.rar\4-7.exe
光盘:\实验代码\chapter4\cholfj.m

步骤一:编写主函数。
打开 Editor 编辑器,输入
%cholesky 分解计算线性方程组
%*********************
%可以用来产生对称的正定矩阵
%temp=[1 2.2336 3 1.20003222
%1.2 1.52221115 3 2.1
%-1.6 3.1444 1.2 -1.000432
%1.00055213 2.1 -2.1114 3];
%
% a=temp*temp'
%***********************
a=[

16.42904628903813

16.12007848664000

7.82278120608096

2.95700879000000
16.12007848664000 17.16712678518432

4.36553354006000

4.36310597100000

7.82278120608096

4.36553354006000 14.88811554662400 -0.53261940800000

2.95700879000000

4.36310597100000 -0.53261940800000 18.86911452484754];

b=[15.6 5.8 20.8 11.9]';
ch=chol(a);
x=ch\(ch'\b)

MATLAB

180

数值分析与应用

保存为 cholfj.m

步骤二:求解方程组
在命令窗口输入:
>>cholfj
运行得:
x=
21.04568809397816
-18.77801201029621
-4.09920767640171
1.55888894709567

实验结论
把计算结果代入原方程用 MATLAB 检验运算结果可以发现计算效果还是不错的。
对一个矩阵进行 Cholesky 分解前提是,矩阵必须为 Hermitan 矩阵。如果不是正定对称,
引用该函数时,MATLAB 会给出错误信息。

实验 4.8 奇异值分解法计算线性方程组
实验基本原理
可以这么说,奇异值分解是现代数值分析最基本和最重要的工具之一,在统计分析、信
号处理、控制理论等领域被广泛的应用。
设 A ∈ C m×n ,则存在酉矩阵 U ∈ C m×n 和 V ∈ C m×n 使

A = UΣV H
其中

 Σ 0
Σ= 1 
0 0 
且 Σ1 = diag (σ 1 , σ 2 ,L , σ r ) ,其对角元素按照顺序

σ 1 ≥ σ 2 ≥ L ≥ σ r > 0, r = rank (A )
排列。
有了奇异值分解,直接在原方程两边做矩阵变换就可以得到方程组的解。

MATLAB

数值分析与应用

181

实验目的与要求

l

能够调用 MATLAB 中的奇异值分解函数,对矩阵进行奇异值分解。

l

能利用奇异值分解结果计算线性方程组。

l

奇异值分解的方法,熟悉计算流程。

l

最好能自行编写函数实现奇异值分解功能。

实验内容及数据来源
调用 MATLAB 的奇异值分解函数,并计算方程组

 6.5
 6.2

3

1

-1 -1
7
-5
2.1 -6
5.6 3.7

3.6
4
4.8
2.1

  x1  12.3 
  x   21.4 
g 2  = 

  x3   −7.8
  

  x4   21 

实验操作指导
光盘:\实验视频\chapter4.rar\4-8.exe
光盘:\实验代码\chapter4\svdfj.m

步骤一:编写主函数。
打开 Editor 编辑器,输入以下语句
%奇异值分解计算线性方程组
a=[6.5

-1 -1 3.6

6.2 7 -5 4
3 2.1 -6 4.8
1 5.6 3.7 2.1];
b=[12.3 21.4 -7.8 21]';
[u,s,v]=svd(a)
x=v*inv(s)*u'*b
保存为 svdfj.m 文件。

步骤二:运行主程序。
在命令窗口输入:
>> svdfj

41468912364328 s= 14.97995209192822 2.16109134503896 0.85749451186780 0 0 0 0 7.63771095689545 -0.50936709711725 2.50936709711725 2.44386397593026 -0.39139941954830 0.21320273589473 0 0 0 0 2.97995209192822 2.58873699296253 0.37530393110199 0.24028706083599 0.13497231040525 -0.86406975358104 -0.22665794629177 -0.47257525480137 0.01596345580798 -0.02306231021941 -0.87271349503002 -0.17856082667821 -0.22341736082823 v= -0.59265088725310 -0.74652590797365 -0.46145248945037 可以查看奇异值分解的结果为: u= -0.17332791772008 0.85586487398819 x= 3.MATLAB 数值分析与应用 182 回车得到 x= 3.34317667132178 -0.19909253839485 -2.52134773516563 0.46547848308270 0.19583143321837 -0.46145248945037 实验结论 程序输出中已经给出了原线性方程的解。在数值代数的很多问题中,奇异值分解都会找 到自己的用武之地,如总体最小二乘问题。奇异值分解有其深刻的数学内涵,所以有很多意 味深长的性质,如矩阵的谱范数等于它的最大奇异值,奇异值还与矩阵的行列式、条件数、 特征值都有关系。 .35952671579466 -0.48484995462154 0.69366191471644 -0.77729393070950 0.63894229865359 -0.46282716561529 0 0 0 0 5.19909253839485 -2.13111175911714 -0.61489184557183 -0.31187061896009 -0.

) bicg 用来处理线性方程组,要求系数矩阵为方阵,在计算比较大的稀疏矩阵时比较有效。 如前面所说, 一般系统给出的这样一些函数都是比较有效的。在计算失败时会给出失败信息, 同时会给出相对误差,误差是通过范数给出的,相对误差范数为 b .M2...b..) [x.relres] = bicg (A.) [x.maxit.maxit) bicg (A.M2) bicg (A.x0)中,A、b为方程矩阵。tol为误差容限,缺省情况下 −6 默认为10 ;matix为最大迭代次数,缺省情况下如果方程在20阶以下,就以方程阶为迭代 次数,大于20的,以20次为迭代次数;x0为迭代初值,如果缺省默认为从零向量开始迭代。 其他一些参数可以参考帮助文档。 在输出参数[x.maxit.maxit.MATLAB 183 数值分析与应用 实验 4.b.b.flag] = bicg (A..M) bicg (A..tol.relres.flag.b.iter] = bicg (A.flag.mfun1.x0) bicg (afun.tol.tol.x0.tol.AX 给出。 实验目的与要求 l 大致明白双共轭梯度法计算原理。 l 会使用双共轭梯度法计算相关线性方程组问题。 l 知道双共轭梯度法各输入、输出量的意义。 .iter..relres.b.iter.AX b 在输入参数 (A.p2.mfun2.9 双共轭梯度法 实验基本原理 共轭梯度算法是一种迭代方法。从一组初值向量出发,定义代价函数,进而转化为最优 化问题。从数学的角度讲,是寻找一个向量,这个向量使得计算的代价函数为极值,这里是 极小值。国外有学者甚至把这样的方法归结到人工神经网络计算原理之下。双共轭梯度法在 MATLAB 中的基本函数是 bicg。对于 bicg 还有一些可选择的参数,主要有以下一些语法 x = bicg (A.p1.flag.tol.b) bicg (A.M1.b.flag..b.b.tol) bicg (A.M2.b.relres.M1.tol.b.) [x.M1.....resvec] = bicg (A..) [x.maxit..maxit.b...resvec]中,x 表示要计算的方程组的解;flag 计算成功与否 的标志;relers 为相对误差,用刚才的范数给出;iter 为迭代次数;resvec 为每次迭代的残差 以范数 b .

8 -9.rar\4-9.4 -9.53 4.2 -4.65 4.8 -6.5 -7.8 45.6].07 -4.1 -4.8 7.53 -3.32 -6.6 4.7 3.6   3.1e-12) %x 输出运算结果 %flag 给出计算是否失败信息 %relres 计算误差范数 %实际 iter 迭代计算次数 .32 3.3 7.5 7.82   ,b =   -3.4 4.7000  -7.5000   8.89 4.54 15.5 -4.flag.89 -3.4 15.82 24.37 8.64 -9.exe 光盘:\实验代码\chapter4\bicgFa.3     42.iter.08 4.6   -9.05 7.05 4.MATLAB 数值分析与应用 184 l 能够根据需要正确的利用输入、输出参数实现相关要求,如中间结果。 l 把迭代收敛情况用图象表示出来。 实验内容及数据来源 计算线性方程组 AX = b 其中  23.64   -21.1 3.3 9.5 4.6 -3.3 -21.5 6.4000   4.47]'.b 为系数矩阵 A=[23.5 8.5   26.6 6.54 3.8 -7.2 7. b=[-9.62 -6.3000  7.b.2 3.65 6.6  4.6 -6.1200  5.48     25.5 0.07 2.4 2.8 4.resvec]=bicg(A.62 0.08 4.8 A= 8.4 -9.4700  实验操作指导 光盘:\实验视频\chapter4.8 -7.8 4.8 -3.2 24.8 25.relres.8 4.37 6.5 5. %调用函数计算 [x.48 26.8 45.2 8.12 42.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %双共轭梯度法计算线性方程组 %A.2  9.8 8.3 -3.

14086092876145 7.25672052300766 0.86097015776917 76.41645004513924 -2.70157003627711 flag = 0 relres = 8.39606838896977 -0.61912341562296 -8.37170545970637 65.00000000000416 其中 x 表示要计算的方程组的解。flag=0 表示在期望的误差容限和指定迭代次数的情况 收敛,迭代成功。 实验结论 从上面的计算结果可以看出,迭代的收敛速度还是非常快的,方法也是比较有效的。把 迭代的残差用图象表示出来,如图 4.MATLAB 185 数值分析与应用 %每次迭代误差相对范熟 plot(resvec) %画出每次迭代误差曲线 以文件 bicgFa.m 为文件名保存。 步骤二:运行程序。 在命令窗口输入: >> clear >> bicgFa 回车得到: x= 1.430700845349511e-014 iter = 6 resvec = 49.4。从每次迭代残差情况也可以看出方法的有效性。 .90486181041918 50.64773215087207 52.67881141389233 3.77088083326368 0.

M1.M2) lsqr(A...maxit.resvec] = lsqr(A..M1..tol.tol) lsqr(A.relres...M) lsqr(A.b.maxit.) [x.p2.b.resvec..maxit..relres.maxit) lsqr(A. b) 可以处理一般的线性方程组,同时可以处理超定方程,标准是范数 b − AX 最小。其中系数矩阵不需要是方阵。 其语法有很多扩展形式: x = lsqr(A.tol.flag..p1..b.tol..b.x0) lsqr(afun..) [x.tol.flag..b.M2.flag.) [x.flag.b.flag] = lsqr(A.relres] = lsqr(A.m2fun.b.maxit.x0.10 共轭梯度的 LSQR 方法 实验基本原理 x = lsqr ( A..) [x.b.) [x.iter.tol..m1fun.b.iter] = lsqr(A..) 参数的意义与双共轭梯度算法类似,这里介绍比较常用的参数设置。在输入参数中 A、 b 分别对应方程 AX = b 中的 A、b。tol 表示期望的计算误差容限,如果缺省默认为10−6 。 Maxit 为指定的最大的迭带次数,如果缺省的默认为系数矩阵的行、列与自然数 20 三 者之间的最小数。 在输出向量中 x 返回的运算结果、flag=0 表示在指定的误差容限与迭代次数范围内计 算成功、relres 返回误差范数估计、iter 给出迭代的次数、resvec 给出每一步迭代的误差范数。 .iter.relres.b) lsqr(A.4 实验 4.b..b.lsvec] = lsqr(A.MATLAB 186 数值分析与应用 图 4..

MATLAB 数值分析与应用 187 需要说明的是上面的输入输出参数中,很多是可选择的,所以相互组合会有多种表达形 式。但是在调用过程中必须按照参数的对应顺序用参数替代。 实验目的与要求 l 会使用共轭梯度法计算相关线性方程组问题。 l 知道共轭梯度法各输入、输出量的意义。 l 能够根据需要正确的利用输入、输出参数实现相关要求。 l 把迭代收敛情况用图象表示出来。 实验内容及数据来源 已知矩阵 A,b 如下 -3.rar\4-10.6 -5.64   -9.5 8.71 4.05  6.3 -9.1 3.3  3.2 7.4  -7.65  -7.3  调用 lsqr 函数计算方程组 AX = b 实验操作指导 光盘:\实验视频\chapter4.4  -9.2 21.8 24.89 -3.7 8.89   .6  4.4 10.4  -4.22  -3.7 1.15 4.3     4.8     -3.8 0.54  3.8 4.5 0.3     -2.65 -5.08   2.8 -7.5     2.8 -6.6 3.5   -21.05     4.5 -4.54   26.8    7.5 4.8 4.5 6.2 4.5 4.15 -0.6  9.exe 光盘:\实验代码\chapter4\lsqrFa.4   -2.8 2.62  5.5 4.4 15.8  7.4     2.b =  0.1 15.15 4.4   -1.2 -4.4 1.8   -6.18 10.2  -9.1  2.05  7.6 3.4  3.4 A= 4.37 2.1 3.3 3.63   -1.3 6.41 4.8 4.2 0.51 -2.61  0.53 -4.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句 .4 -9.5  8.2 18 -0.

relres.5 8.05 3. %调用函数计算 [x.3 6.1 -0.65 6.8 8.4 2.62 4.8 -9.5 0.7 7.18 4.4 2.41 1.53 -3.6 4.8 7.22 -1. b=[-6.89 4.37 -4.4 4.b.05 24.15 6.15 10.2 3.8 4.3 18 -0.8 -7.6 3.8 4.4 -9.2 8.51 -7.resvec] = lsqr(A.4 0.iter.8 4.2 -2.89 -3.6 -3.1 -4.8 -6.8 4.8 3.4 -9.4 -4.2 7.08 2.63 -1.MATLAB 188 %用 lsqr 计算线性方程组 %A,b 为系数矩阵 A=[ 2.6 4.1 0.4 -9.flag.5 -2.05 21.71 2.4 -9.4 26.m 保存。 数值分析与应用 .2 3.5 -2.1 -4.5 -3.4 4.[].64 0.8].3 3.6 0.5 5.54 3.3 ].20) %x 输入计算结果 %flag 判断运算是否成功 %relres 给出运算误差的范数 %iter 迭代次数 %resvec 每步迭代的误差范数 %默认期望误差为 1e-6 %允许迭代 20 次 plot(resvec) %作图画出误差范数变化 以文件名 lsqrFa.5 -7.5 -21.65 4.8 -5.2 7.54 15.4 4.3 1.5 15.7 -5.3 9.3 3.2 4.5 4.15 2.61 10.

24996967593684 -0.93566209662689 实验结论 如果直接调用最简单的形式,可能会显示运算并不能在指定的迭代次数内收敛,所以需 要多指定迭代次数。同时看到误差范数并不是非常接近 0,但这不表示计算失败,因为这里 的范数是相对范数。此例也说明了在使用中要会正确使用输入、输出参数并能对各种结果作 出判断是很重要的。下面给出误差范数的变化,见图 4.95615640851811 20.76954972316684 iter = 6 resvec = 27.91230994628952 -0.5。 .07570918543695 -0.07459936339388 -0.48570799233206 -0.93567320574129 20.94431040549329 22.43530063858994 21.78057317628723 20.20508040789440 22.MATLAB 189 数值分析与应用 步骤二:调用函数并显示运算结果。 在命令窗口直接输入 lsqrFa 回车得到运算结果 >> lsqrFa x= 0.25120643229241 flag = 0 relres = 0.

.relres.mifun.iter.tol.resvec] = minres(A.5 实验 4..relres.flag.) [x.relres.m2fun..iter] = minres(A.resvec....M2.tol...p1.) [x.b.x0.b.maxit) minres(A.maxit....) 参数的基本意义与前面两种方法基本一样,tol 对应指定的误差容限,如果缺省默认为 1E-6,maxit 是指定的最大迭代次数,如果缺省则去矩阵 A 的维数与 n 之间的小者。 x 用于输出运算结果、flag=0 表示指定的误差在运算最大迭代次数内满足要求。felres 为相对误差范数、iter 实际迭代次数、resvec 每次迭代的误差范数。 实验目的与要求 .b) minres(A.tol...b.b.iter.M1.M2) minres(A..b.tol.MATLAB 190 数值分析与应用 图 4.tol) minres(A.b.11 线性方程组的最小残差法 实验基本原理 x=minres(A.flag] = minres(A.resveccg] = minres(A.b.relres] = minres(A.b..M1..) [x.b.b..b)是线性方程组的最小残差解法的基本形式,用以解线性方程组 AX = b 。 其中 n 阶方阵 A 必须为对称矩阵,但是不必要为正定。minres 函数有许多扩展形式: x = minres(A.b.p2.tol.maxit.maxit.M) minres(A.x0) minres(afun.flag.flag.) [x.maxit.flag..) [x.

8 4.846 118.35 53.82 1.2]' 12.8 2.65 0.8 -7.853 -135.5 6.48  .387 -96.08 4.5 实验操作指导 光盘:\实验视频\chapter4.89 4.624  93.624 b =[-6.8 0.853 41.07 -4.197 463.173   -0.05 0.2 8.2 3.4 7.6].18 4.58 64.1 -4.5 103.8 05.3 1.62 0.19 41.48 2.35 2.831  -177.173 7.6 -3.098 -96.387 -44.846 103.3 7.495 -53.53 -3.986  58.4 -177.845 93.4 2.8 4.889 -135.6 1.rar\4-11.6 -6.831 -1.8 -3.37 7.845 64.18   140.197 -0.5 -4.54 -15.098 139.8 -6.3 53.09 2.5 -7.exe 光盘:\实验代码\chapter4\minresFa.04 -53.MATLAB 数值分析与应用 191 l 大致明白最小残差法计算原理。 l 会调用 MATLAB 中的最小残差法函数计算相关线性方程组问题。 l 知道最小残差法各输入、输出量的意义。 l 能够根据需要正确的利用输入、输出参数实现相关要求。 l 把迭代收敛情况用图象表示出来。 实验内容及数据来源 用 minres 方法计算线性方程组 AX = b 。 其中     A=     232.495 104.34 -53. -44.04 58.32 -3.986 -53.4 -9.889 12.m 步骤一:编写主函数。 打开 Editor 编辑器、输入以下语句 %最小残差法计算线性方程组 temp=[0.64 -9.5 5.2 7.

20) %x 返回运算结果 %flag 判断运算是否成功 %relres 运算的误差范数 %实际运算迭代次数 %resvec 每次迭代的误差范数 plot(resvec) %图形画出误差范数变化曲线 以文件名 minresFa.846 103.relres.2]'.8 2.b.846 103.624 93.831 -177.flag.MATLAB 数值分析与应用 192 A=temp*temp' b=[-6.11 -69.177 21.04 -53.624 2.173 x= 39.m 保存。 步骤二:调用函数,在命令窗口输入语句 >> minresFa 回车得到 A= 232.173 -0.751 135.48 .098 -96.18 140.[].986 118.387 -96.889 -135.986 58.19 41.495 104.02 27.853 -135.831 -44.35 53.4 7.197 463.resvec]=minres(A.04 58.098 139.5 %产生对称的方阵,系数矩阵 A 为题目所要求的矩阵 7. [x.253 flag = 0 relres = 2.4 -177.832 116.387 -44.845 93.495 -53.18 12.3 -1.58 64.34 -53.09 2.573 53.5 4.197 -0.2289e-010 iter = 5 resvec = 13.iter.853 41.889 12.35 -53.845 64.

AX b 其扩展的语法有多种: x = qmr(A.6。 图 4.9297 3.8346 其中 x 为运算结果,通过 flag 可以看到运算满足要求。 实验结论 同样,直接调用最简单形式可能会计算不能满足要求,这需要熟悉参数设置方法。同时 需要注意的是系数矩阵必须为对称矩阵,这是这个函数要求的。下面给出迭带过程中每步的 误差范数曲线,如图 4.b.12 线性方程组的标准最小残差法 实验基本原理 x = qmr(A.353 5.3036 3.tol) qmr(A.b)可以解线性方程组 AX = b 。其中 A 可以为大的稀疏矩阵,但必须为方阵。 如果计算收敛,会有消息提示。如果计算失败的话,会给出警告消息,并且给出迭代的相对 误差范数 b .b) qmr(A.6 实验 4.b.8583 3.MATLAB 193 数值分析与应用 8.maxit) .tol.

.tol.x0) qmr(afun.3  7.resvec]中 x 用于输出运算结果、flag=0 表示指定的误差在运算最大迭 代次数内满足要求。felres 为相对误差范数、iter 实际迭代次数、resvec 每次迭代的误差范数。 实验目的与要求 l 大致明白标准最小残差法计算原理。 l 能调用 MATLAB 中的相关函数处理线性方程组的问题。 l 能通过帮助文档了解函数各参数的意义于作用。 l 能根据需要通过参数设置,实现计算信息。 l 把迭代收敛情况用图象表示出来。 实验内容及数据来源 用标准最小残差法计算法线性方程组 AX = b 。 其中 6.p1.2  5.tol) 中 tol 为指定的误差容限,如果缺省默认为 1E-6。qmr(A.relres.tol.b.iter.5 4.4     5.6  3.M2.rar\4-12.8 A= 8.8 7.flag.b.4   4.flag.7 6.5 -4.) [x.7  实验操作指导 光盘:\实验视频\chapter4.M1.8 8.m1fun.) [x.) [x.resvec] = qmr(A.6 9.flag.8 4.MATLAB 数值分析与应用 194 qmr(A..iter.65 4.b =   -3.5   6.8 -7.5 7....maxit.relres.b.maxit.maxit..6  -7..5 0.p2.) qmr(A.1 3.2  7.b.8 -3.8 -4.tol..x0.6  -16..flag.5  6.4 25.b.3     25.6  -8.maxit)中 maxit 为指定的最大迭代次数,如果缺省默认为 n 和自然数 20 之间的小者。 在[x.exe .tol.b.3 4.42   .2 14.iter] = qmr(A..m2fun.05 4.4 -6..flag] = qmr(A.8 5.M1.relres..tol..) [x.6 5.M2) qmr(A.2 -7..maxit.4 3.2 -3.07 2.b.M) qmr(A.b..32 -6.relres] = qmr(A.b.3 -3.b.

05 14.b) %x 输入计算结果 %flag 判断运算是否成功 %relres 给出运算误差的范数 %iter 迭代次数 %resvec 每步迭代的误差范数 %默认期望误差为 1e-6 %允许迭代 20 次 plot(resvec) %作图画出误差范数变化 以文件名 qmrFa.flag.7 7.857 182.8 -7.8 4.1 -3.42 8.4 -4.274 -114.24 flag = 0 relres = 2.2 7.32 3.07 -4.8 8.5 5.43 -99.2 0.6 -6.3 7.2 5.5 -3.2 25.4 6.6 3.65 6.m 步骤一:编写主函数。 在命令窗口输入以下语句 %用标准最小残差法计算线性方程组 %A,b 为系数矩阵 A=[6.2 3.5 9.3 -3.resvec] = qmr(A.relres.8 4.6 -6.8 4.249 67. %调用函数计算 [x.6 -3.3 -16.5 6.8 -7.412 -41.3 7.7]'.iter.4 4.5541e-012 数值分析与应用 .5 -7.4 25.4 2.m 保存。 步骤二:调用函数。在命令窗口输入 >> qmrFa 回车得到运算结果如下: x= 70.MATLAB 195 光盘:\实验代码\chapter4\qmrFa.6].5 4.6 5.8 5. b=[-8.8 4.

7 标准最小残差法计算结果 从误差范数变化曲线也可以看出迭代的收敛速度还是比较快的。 实验 4.607 29.b)可以计算线性方程组 AX = b 。 A 可以为大的稀疏矩阵,但必须为方阵。 如果计算收敛,会有消息提示。如果计算失败的话,会给出警告消息,并且给出迭代的相对 误差范数 .13 线性方程组的广义最小残差法 实验基本原理 x = gmres(A.131 8.2944e-011 其中 x 为所要计算的运算结果,从 flag 与误差范数可以看出计算结果的有效果性。 实验结论 这节的几种方法在参数形式上都很相似,都需要注意输出参数的意义。并判断计算效果 如何。对于本算法,下面给出迭代的误差范数变化曲线,如图 4.402 27.474 32.7。 图 4.258 27.944 29.MATLAB 196 数值分析与应用 iter = 6 resvec = 32.

p1.M) gmres(A.tol.flag.m2fun..M2) gmres(A.tol.b.restart)在每次迭代后会重新启动,最大的外部迭代次数为矩阵 A 的维数 n、 restart 和 10 之间的最小数。如果 restart 缺省,则不会重新启动,而且最大的迭代次数为 10 和 n 之间的小者。gmres(A..b.tol..p2.b.tol.) [x.maxit...b.) 其参数意义与本节其他算法基本相同。 gmres(A.restart.M2.b.b.tol.b.tol) gmres(A.relres.) [x.x0) gmres(afun..tol)其中 tol 表示误差容限, 如果缺省, 则使用默认的 1E-6。 gmres(A.tol.x0.AX b 其扩展的语法有多种: x = gmres(A..restart) gmres(A.b.M1.relres.M1..b.b) gmres(A.) [x.resvec] = gmres(A.) [x.maxit.b..restart.restart.maxit) gmres(A.MATLAB 197 数值分析与应用 b .restart.b.restart..relres] = gmres(A.restart...restart.iter] = gmres(A.maxit.restart.iter..m1fun.b.flag.flag] = gmres(A.b.maxit)指定最大的迭带次数。x 用于输出运算结果、flag=0 表示指定的误 差在运算最大迭代次数内满足要求。felres 为相对误差范数、iter 实际迭代次数、resvec 每次 迭代的误差范数。 实验目的与要求 l 会调用 MATLAB 中的相关函数计算相关线性方程组问题。 l 知道广义最小残差法各输入、输出量的意义。 l 能够根据需要正确的利用输入、输出参数实现相关要求。 l 把迭代收敛情况用图象表示出来。 实验内容及数据来源 计算线性方程组 AX = b ,其中 .maxit..b..flag.

7]' [x.8 4.53 4.3  7.07 2.b =   -4.4 24.62 -6.9 A= 8.8 -7.exe 光盘:\实验代码\chapter4\gmresFa.4 -5.8 -7.2 -4.6   -4.05 4.07 -4.iter.resvec] = gmres(A.5 7.4    5.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %广义最小残差法计算线性代数方程组 %a.1 8.1 -4.5 6.6 4.3 -3.5    7.8   .MATLAB 数值分析与应用 198  25.53 -4.3 6.3 4.5 -4.37 8.62 0.4 -9.7 -3.6 -3.8 -5.2 3.9 -6.flag.rar\4-13.1 3.8 5.5 7.1     4.7  实验操作指导 光盘:\实验视频\chapter4.7 5.4 6.relres.5  6.54 6.65 6.m 保存。 步骤二:调用函数。在命令窗口输入: >> gmresFa .7 5.2 4. b=[-4.8 5.5  8.2 4.05 7.08 1.4 6.8 4.4  4.2 4.3 4.89 4.6  5.b) %x 返回计算结果 %flag 判断计算是否失败 %relres 迭代的相对误差范数 %iter 实际迭代次数 %resvec 每次迭代的相对误差范数 plot(resvec) %画出每次迭代的相对误差范数变化曲线 以文件名 gmresFa.5 6.54 4.6].5 0.4  -2.89 -3.4 2.08 5.4   24.3 -6.5 5.6 6.b 为系数矩阵 a=[25.2  5.37 6.7  -7.5 -7.4 -6.65 4.5 4.3 1.5 7.5 5.3 -2.4 -9.

183 26.365 10.8712e-016 iter = 1 6 resvec = 27.8678e-014 其中 x 为需要的运算结果,可以看到运算结果是可靠的相对而且计算误差是很小的。 实验结论 从上面的运算可以看出,这种方法效果还是不错的。下面给出误差范数变化曲线,如图 4.2224 1.4887 4.032 13.394 1.0804 1.789 7.7766 1.78053 -0.12284 flag = 0 relres = 6.8 广义最小残差法计算结果 .MATLAB 199 数值分析与应用 回车得 x= -0.8。 图 4.4422 -0.

4 MATLAB 中的矩阵与线性代数函数 .4 给出一些常用的函数,供读 者参考与查阅。 函数名 作用 函数名 作用 norm 向量与矩阵范数 normest 估计矩阵 2-范数 rank 矩阵秩 det 行列式 trace 矩阵迹 null 零空间 orth 正交化 rref 简化矩阵为梯形形式 subspace 两个子空间的夹角 \ 和 / 解线性方程 inv 矩阵的逆 cond 条件数 condest 1 条件范数估计 chol Cholesky 分解 cholinc 不完全 Cholesky 分解 lu LU 分解 luinc 不完全 LU 分解 qr 正交三角分解 lsqnonneg 非负的最小二乘 pinv 伪逆 lscov 知道协方差的最小二乘 eig 特征值和特征向量 svd 奇异值分解 eigs 特征值 svds 稀疏矩阵奇异值和向量 poly 特征多项式 polyeig 多项式特征值问题 condeig 特征值的条件数 hess 海森堡型 qz qz 分解 schur 舒尔分解 expm 矩阵指数 logm 矩阵对数 sqrtm 矩阵平方根 funm 一般矩阵函数计算 表 4.MATLAB 数值分析与应用 200 从误差范数变化曲线,也可以看出收敛速度还是非常快的。 本章小结 本章介绍了计算线性代数方程组的一些方法,其中第 2、3、4 节比较基础,也是一般大 学数值计算方法的标准内容,在实际工程中不一定会效果非常好,但这是理论基础,对于进 一步学习数值代数这是必须的。MATLAB 中有非常丰富的数值代数命令,希望读者既能学 到理论基础,也能用 MALTAB 快速解决实际的工程问题。 在实际应用中有时线性代数方程组甚至可以直接用求逆法快速计算。对于 AX = b ,可 以直接使用 x=A\b 或者 x=inv(A)*b 计算。可以看出 MALTAB 在数值代数方面的处理能力是 很强大的。 鉴于 MATLAB 中矩阵与代数函数与方法非常丰富,表 4.

y .1x1 + 3.2 z . 7 ) 5. 用列主元消去法计算线性方程组 5 x + 7. z .5.2 z + 5a = −21.9.16  -4 x .1.1 y .61  5 x .3 x + 7.1z .4 z + 5a = −4.1 y .6 y + 7.5.4 x .59  6.04  1 2 3 4  2.5 y .1 参考答案: ( x.8 x3 − x4 = −14.36  -4 x .4. −1.2 x2 − 0.5 x1 − 2.2 x + 4 x = 13.4 x2 − 8.6 y . 6.3a = 46.6. −4.5.1.2 z + 3a = −0.4 z .y=4. a ) = ( 5.7 ) 。 6. 用 LU 分解法计算线性方程组 数值分析与应用 . z .51 3 x .3 y .6.4.0.z=5。 2. 使用 Gauss-Seidel 迭代法计算线性方程组 4 x − 5 y − z = −5  3 x + 2 z = −8  x + y − 7 z = 55  参考答案:x=2,y=4.2.5. −4.MATLAB 201 上机操作题 1. 用 Jacobi 迭代法计算线性方程组 3 x + 4 y − 7 = −10  5 x − 2 y + z = 12 2 x + y + z = 15  参考答案:x=3.6 参考答案: ( x. a ) = ( 3.z=-7。 3. 使用逐次超松弛法计算线性方程组 2.4.4a = −19. −6.4a = 61. −6.5.22 2 x .2 ) T 4. 使用 Guass 消去法计算线性方程组 2.4 x − 1.3 x3 − 3 x4 = 20.2a = 6.6 z .4.1y + 3.1x + 4.96 4 x1 − 3x2 − 2 x3 + 2 x4 = 37. y .01 3. −3.3.8 z + 3a = 80.3 y .2 参考答案: x = (1.

2.16 5 x .7.2 z + 2.72 参考答案: ( x.1z .0.3m + 3n = 57.3 y .3 y .2.2.1y + 3.5. n ) = ( −7.4 y .1  4.36 5 x .2 x . n ) = ( 4.2.2n = 3.MATLAB 202 4 x + 5.4.2 z + 4m .3 y .2m + 2n = −91. −7.64  4.5m .2 x .6m .2n = −65.24 参考答案: ( x.6.2.4n = −28. y .4.3 y -8 z + 2. z .2 5 x .3.5. y . m.3) 。 7. 用 Cholesky 分解法计算线性方程组 6 x + 4 y .3. −3. m. −4 ) 数值分析与应用 .3 z .4 y + 2m .64  2 x .5.4 y .3m .3.6 y + 4 z + 4m + 3n = 13. z . 6.72  2 x .7.72 4 x .3m + 8.2 z .4n = 98.6 z .2.8n = −75.4n = 100.3. −11.2n = −1.

f 2 .L . L 这样便产生一个迭代序列。 对于迭代法,一般需要考虑迭代法的构造、收敛性、收敛速度与误差估计等问题。对于 非线性方程 f ( x ) = 0 一个迭代法产生的序列是否收敛于方程的一个根,通常于初值有关, 如果从任何可取的初值出发都能保证收敛,则称为大范围收敛。如果只是在初值选取充分接 近根时才收敛,则称为局部收敛。 为了衡量迭代的收敛速度,可以用收敛阶数作为一个衡量标准。设一个迭代法收敛, lim xk = p ,p 是方程 f ( x ) = 0 的一个解。令 k →∞ ek = xk − p 如果存在实数 m 和常数 C,使得 lim x →∞ ek +1 =C ek 就称迭代法为 m 阶收敛。M 的大小反映了收敛速度,如果 m=1,则是线性收敛的。对 于 m>1 的情况,称为超线性收敛。 为了控制迭代法的终止问题,通常可以选择以下的一些准则。 (1)如果 f ( xn ) < TOL (TOL 为误差容限)停止迭代。但是这样做有一个缺陷,有 可能会出现 f ( xn ) 很接近 0,但是 xn 与方程的根相差比较远。 (2) xn − xn −1 < TOL ,则停止迭代。缺点是可能出现 xn 与 xn −1 很接近,但是 xn 与方 程的根相差比较大。当然这样的情况是和上一种情况不同的,出现这些情况的原因和函数 f ( x ) 的性质有关。 (3)选择相对误差作为停止迭代的标准 xn − xn −1 < TOL 。 xn 实际应用中,应该考虑函数 f ( x ) 的性质,选择迭代停止的标准,同时比较好的措施可 .MATLAB 数值分析与应用 203 第五章 非线性方程求根 非线性方程的数值方法是数值计算课程的一个基本内容,同时也是广泛存在于科研问题 中。对于一个比较大的科研项目,在相当多的时候我们都要面对非线性方程的计算。在这一 章中我们按照计算的基本思想把计算方法分为二分法、不动点迭代、牛顿法、割线法等,针 对每一种计算思想又分别给出一些改进算法。 就本章介绍的方法而言本身并不难理解, 而且一般都有直观的几何意义。在工程实践中, 要实现这些方法也不会需要很多代码,比较容易实现。不过,这些方法的基本思想在数学理 论中往往有深刻的内涵。 这一章中,我们主要介绍非线性方程 f ( x) = 0 的数值计算方法。对于上述方程,除了一些比较特殊的方程可以直接给出根的表达式,一般 需要用到迭代法。所以本节需要对迭代法及其相关问题作一简单介绍。 设 f : A → A 是集合 A 到自身的一个映射,其中集合 A 可以是实数集合或复数集合。 这个映射把集合 A 映入自身。同样,我们考虑 f 对自身的复合映射: p a f ( f ( p )). ∀p ∈ A 。并记为 f 3 : A a A 。如此反复下去,便得到一个映射序列 f . ∀p ∈ A 可以把这个映射记作: f 2 : A a A 。这里 f 只是一个映射记号,而不是函数的平方。 2 如 果 把 映 射 f2:Aa A 又 可 以 复 合 以 f 而 得 到 新 的 映 射 : p a f ( f 2 ( p)). f 3 . f n .

p1 ] 与 [ p1 . b1 ] ,设 p1 为 [ a1 .1 波尔查诺二分法 实验基本原理 波尔查诺二分法又叫区间半分法是一种简单直观的方法,其基本的数学原理基于数学分 析中的介值定理。这里简要阐述二分法的数学原理。 对于实函数方程 f ( x) = 0 设函数 f ( x ) 在区间[a,b]上连续,而且 f ( a) f (b) < 0 ,则 f ( x ) 在区间[a,b]上至少有一个 根,这是很容易理解的。 记 [ a. p1 ] 这个区间里。这样我们就把原来的我们对根的寻找由 [ a1 . b1 ] 区间缩小了 一半,如此反复,不断缩小区间,当区间缩小到我们可以接受的范围内,我们就用区间里的 近似值代替真值。 上述过程是一个迭代过程,判断计算停止的条件之一是 TOL1,最好同时还要给出区间 容限 TOL2,既当区间缩小到一定范围以后停止迭代。 实验目的与要求 l 明白二分法基本思想。 l 能够给出二分法的伪代码。 l 能够编程实现二分法,处理非线性方程问题。 l 编程中,需要注意精度控制问题。 . b1 ] 中更细一步的寻找根,具体在哪个区间是很容易实现的。如果 f ( p1 ) f (b1 ) < 0 则表明则两点异号,则根必然在 [ p1 . b1 ] 这个区间里。如果 f ( p1 ) f (b1 ) > 0 则根必然在 [ a1 .MATLAB 204 数值分析与应用 以在程序设计时候考虑增加参数,控制迭代次数,当超过一定次数还没符合控制条件时给出 警告信息。 实验 5. b] = [ a1 . b1 ] 中点: p1 = a1 + b1 2 事先给定一个误差容限 TOL1(足够小) ,如果 f ( p1 ) < TOL1 ,则 p1 是原方程 f ( x ) = 0 一 个很不错的近似根。 如果 f ( p1 ) > TOL1 ,那么我们并不满足于 p1 作为近似的方程的根。二分法的思想是 我们在 [ a1 .

old.tol) %f 为 方程 f(x)=0 中的 f(x) %如果输入变量缺省 则默认误差为 1E-3 if(nargin==3) tol=1. function r=compute_gen(f.b). %采用递归方法 r=compute_gen(f.rar\5-1.b.exe 光盘:\实验代码\chapter5\Erfen.a.0e-3.a.tol).m 步骤一:编写二分法计算的函数文件。 打开 Editor 编辑器,输入以下语句: %二分法计算非线形方程 %08 年 6 月 17 日 function gen=Erfen(f. end gen=compute_gen(f.t. %区间中点 函数值 fzd=subs(f. 数值分析与应用 . %右端函数值 fb=subs(f.m. %sub 函数 R = subs(S.Erfen_main.b.a.a).b.MATLAB 205 实验内容及数据来源 使用二分法计算方程 f ( x ) = ( x − 1)3 − 3 x + 2 在区间[2,4]上的根,并把通过数值方法绘制函数比较计算结果是否正确。 实验操作指导 光盘:\实验视频\chapter5.(a+b)/2).b.new) %其中 S 为符号表达式,old 为老变量,new 为新变量 %sub 把老变量替换为新变量 if(fa*fzd>0) t=(a+b)/2.tol).tol) %计算左端点函数值 fa=subs(f.

4) %为了对比计算结果 我们作出函数图 %为了使效果更清晰 这里给出了区间[-1,4]上的函数图象 x=-1:0.^3-3*x+2.a.m 保存。 步骤三:调用主函数。在命令窗口输入: >> clear >> Erfen_main 回车得到运算结果。 x= 2. plot(x. f=(x-1). end end end 以文件名字 Erfen. else s=(a+b)/2.m 保存。 步骤二:编写检验函数文件。 打开 Editor 编辑器输入以下语句: function Erfen_main() %采用二分法 计算给出在[2,4]上的根 x=Erfen('(x-1)^3-3*x+2'.f) grid on 以文件名 Erfen_main.01:4. else if(abs(b-a)<=tol) r=(b+3*a)/4.2.879150390625 这就是我们在给定区间里的根。 实验结论 二分法计算对函数的要求是比较宽松的,而且方法从编程思想到实现都比较都比较容 易,但是二分法收敛速度不是太快。有时候,常常把这个方法计算的几个作为求根的初始近 .MATLAB 206 数值分析与应用 else if(fa*fzd==0) r=(a+b)/2.s.tol). %结果 r=compute_gen(f.

sym('d')}) %回车得到输出结果 z1 = sin(c)+cos(d) %把其中一个符号变量替换掉,另一个用数值替换 >> z2=subs(y.d 为符号变量 >> z1=subs(y. new) R = subs(S.1 检验二分法计算结果的函数图象 注:在程序中我们使用了函数 subs,因为在后面的几个程序中我们频繁的使用了该函数,这 里给读者补充一下改函数的功能与使用方法。 subs 主要用于符号表达式或者符号矩阵表达式中的变量替换,其基本语法为: R = subs(S) R = subs(S. %把符号变量 a,b 替换为 c,d,其中 c.b}.b}.{sym('c').MATLAB 207 数值分析与应用 似值。 读者可以自己尝试用二分法计算一些容易给出解析根的方程,然后比较自己做的程序是 否有问题。在这个题实验中,这里给出区间上的函数图象,如图 5.{sym('c').{a.1,从图象中也容易直观 的判断二分发的计算结果还是比较可靠的。 图 5.2}) %回车得到运算结果,仍然为符号表达式 z2 = sin(c)+cos(2) %把两个变量都用数值替换 .old.new) 调用格式可以采用第三种,其中 S 为符号表达式,old 为老的符号变量,new 为新的符号变 量。其作用为把 S 中的老的(old)符号变量替换为新的(new)符号变量,如果在 S 中替 换后的表达式已经无符号变量这时候会给出表达式 S 的数值。 [例]:在命令窗口输入: >> clear >> syms a b >> y=sin(a)+cos(b).{a.

L 如此产生序列 { xk } 。这种迭代方法称为不动点迭代,或 Picard 迭代。这个原理看似很容易 直观理解,但是却有相当深刻的数学内涵,数学系的学生在泛函分析与微分方程理论等多门 专业课程里都会遇到。如果 g ( x) 连续,而且 lim xk = p ,则 p 是 g 的一个不动点。因此 p k →∞ 为方程 f ( x ) = 0 的一个根。 下面的定理给出了迭代收敛性问题。假设 g ( x) 为定义在区间[a. 2.既存在正常数 L<1,使得 g ( x ) − g ( y ) ≤ L x − y .{a. b] 那么对任意的初始值 ∀x0 ∈ [ a.2}) %回车得到运算结果,为数值类型。 z3 = -1. b]. k = 1. b] ,由于 Picard 迭代产生的序列都收敛于唯一的不动点 p。 关于定理的证明这里不再给出,有兴趣的读者请参阅相关数值计算方法专著。 .b]上的实函数,它满足 以下条件: (1) g ( x ) ∈ [a.37507111121028 实验 5.2 不动点迭代法 实验基本原理 对于非线性方程 f ( x) = 0 常常可以化成等价的方程 x = g ( x) 可以选取一个初始近似值 x0 ,构造迭代序列 xk = g ( xk −1 ). y ∈ [a. ∀x ∈ [ a. ∀x.b}.{5.MATLAB 208 数值分析与应用 >> z3=subs(y. b] ; (2)利普希次条件,且利普希次常数 L<1.

5.3 附近的根,其中 4 阶的勒让德多项式为 1 P4 ( x ) = (35 x 4 − 30 x 2 + 3) 8 并通过计算函数值作出图形,作为迭代法计算结果的参考。 实验操作指导 光盘:\实验视频\chapter5. %用于记录迭代次数 while(wucha>tol) x1=subs(f.m. end %缺省情况下 误差容限为十的负五次方 wucha=0.time]=Picard(f.0e-5.MATLAB 209 数值分析与应用 实验目的与要求 l 熟悉不动点迭代的基本原理。 l 了解不动点迭代的计算流程。 l 能编程实现不动点迭代方法,计算非线性方程问题。 l 绘制函数零点图象,比较计算结果。 实验内容及数据来源 计算 4 阶的勒让德多项式等于 0 在宗量等于 0.rar\5-2.exe 光盘:\实验代码\Picard. %迭代计算 .x0.m 步骤一:编写 Picard 迭代法的函数。 打开 Editor 编辑器,输入以下代码: %08/06/18 %不动点迭代(Picard 迭代) function [x.tol) %结果给出迭代次数 %x0 为迭代初值 %tol 为误差容限 if(nargin==2) tol=1. %x1 与 x0 为前后两次计算结果 time=0.x0)+x0.Picard_main. %设置误差初值 x1=x0.

339985464476505 time = 61 实验结论 不动点迭代是迭代法里比较基本的一个方法,其原理也容易直观,方法容易理解。在很 多教材中也是讲的比较多的。当然其方法的收敛速度往往不是太快,但是不动点迭代是其他 迭代方法的基础,是读者应该掌握的。为了加快收敛速度,可以对方法进行一些变形,这是 后面将要介绍的。 在上面给出的结果中, x 就是 4 阶勒让德多项式 P4 ( x ) = 1 (35 x 4 − 30 x 2 + 3) = 0 在 x=0. %记下迭代次数 end x=x1.3 8 附近的一个根。time 表示在计算过程中总共迭代了 61 次。图 5.time]=Picard('1/8*(35*x^4-30*x^2+3)'. % 更新 x0 的值 在循环中 这一句非常重要 time=time+1.0. 以文件名 Picard.f) grid title('四阶勒让德多项式') 以文件名 Picard_main.MATLAB 数值分析与应用 210 wucha=abs(x1-x0). x0=x1.01:1. plot(x.2 中给出了 4 阶勒让德多项 式根的分布情况,可以看出计算结果是可以接受的。 .3 附近的根 [x.3) %通过直接计算函数值,画出其函数图形 x=0:0.m 保存。 步骤三:进行计算。在命令窗口输入: >> picard_main 回车得 x= 0.m 保存。 步骤二:编写主函数。 打开 Editot 编辑器,输入以下语句: %不动点迭代的测试主函数 %其中测试函数为 4 阶的勒让德多项式,计算其在 0.^2+3). f=1/8*(35*x.^4-30*x.

2 实验 5.3 数值分析与应用 211 4 阶勒让德多项式与 x 轴的交点情况 Aitken 加速方法 实验基本原理 不动点迭代法虽然简单,容易实现,但往往有时候收敛速度不够快。在这样的情况下, 我们通常会考虑加速收敛。 假一个序列 { xn } : x0 . (λ ≠ 0) xn − p 当 n 足够大时,有 xn+1 − p xn + 2 − p ≈ xn − p xn+1 − p 把上式展开,我们可以得到 p ≈ xn − ( xn+1 − xn ) 2 xn+ 2 − 2 xn+1 + xn 这样我们可以定义 x%n+1 ≈ xn − ( xn+1 − xn ) 2 xn+ 2 − 2 xn+1 + xn 作为迭代方法,这就是 Aitken 迭代。 如果我们采用差分符号那么记法会更简洁。可以定义一阶差分 . x2 L 线性收敛于 p,则有 lim n →∞ xn +1 − p = λ .MATLAB 图 5. x1 .

rar\5-3.m. Aitken_main.1 附近的根,其中 4 阶的勒让德多项式为 1 P4 ( x ) = (5 x3 − 3x) 2 并通过计算函数值作出图形,作为迭代法计算结果的参考。 实验操作指导 光盘:\实验视频\chapter5.MATLAB 数值分析与应用 212 ∆xn = xn +1 − xn 二阶差分 ∆ 2 xn = ∆(∆xn ) = xn+ 2 − 2 xn+1 + xn 那么 Aitken 迭代可以表示为 x%n+1 ≈ xn − (∆xn ) 2 ∆ 2 xn 实验目的与要求 l 理解 Aitken 加速方法的基本原理。 l 能自己推导出 Aitken 加速方法。 l 能用数字计算机实现 Aitken 加速方法,处理非线性方程问题。 l 画出函数图象的零点,用以分析计算结果。 实验内容及数据来源 计算 3 阶的勒让德多项式等于 0 在宗量等于 0.tol) %如果输入参数 误差容限缺省 %默认误差为 10 的-5 次方 if(nargin==2) .m 步骤一:编写 Aitken 方法函数。 打开 Editor 编辑器,输入以下语句: %Aitken 加速收敛方法 %输出值 time 用来记录迭代次数 function [gen.time]=Aitken(func.x0.exe 光盘:\实验代码\chapter5\Aitken.

0e-5. %设置误差初值 while(wucha>tol) t=t+1.MATLAB 213 数值分析与应用 tol=1.temp)+temp. x(1:2)=[0. f=1/2*(5*x. time=t.0.^3-3*x).1) %使用 Picard 迭代计算 同样的问题 计算精度和上面同 [x_picard. %迭代超过两次 使用 Aitken 加速 if(t>2) m=m+1. %记下累积一次迭代次数 x1=x2.1. x2=x0.m 保存。 步骤三:在命令窗口输入: >>Aitken_main . %给出两次迭代误差 wucha=abs(x2-x1).1) %计算函数值,并化出函数图象 用以对比 x=-1:0. %记录迭代次数 以文件名字 Aitken.f) grid 以文件名 Aitken_main. end end gen=x2.time_Aitken]=Aitken('1/2*(5*x^3-3*x)'. x2=x(m)-(x(m+1)-x(m))^2/(x(m+2)-2*x(m+1)+x(m)). t=0. wucha=0. x(t)=gen.01:1. %记录迭代次数 m=0. plot(x. temp=gen. end gen=x0.0.time_picard]=Picard('1/2*(5*x^3-3*x)'.m 保存。 步骤二:编写测试主函数。 打开 Editor 编辑器,输入以下语句: %使用 Aitken 加速方法计算,三阶勒让德多项式的根,计算精度为 10 的-5 次方 [x_Aitken.0]. gen=subs(func.

3 中给出了函数图象与 x 轴交点情况,从图中也可以直观的看出计算的结果是有效 的。 图 5.3 三阶勒让德多项式与 x 轴的交点情况 实验 5.1. 2L .85594955533468e-006 time_picard = 15 实验结论 在上面给出的计算结果中 x_Aitken 与 x_picard 分别是误差范围内的计算结果,我们可 以接受,因为我们要求的精度是10−5 ,而实际给出的精度是 10−6 、 10−7 。 可以看出使用 Aitken 加速的方法迭代的次数为 5 次,而没加速需要迭代 15 次。如果精 度要求高的话两者的差别更能体现。这充分说明 Atiken 方法的有效果性。 图 5. k = 0.MATLAB 214 数值分析与应用 回车得到: x_Aitken = -6.4 Steffensen 迭代法 实验基本原理 Steffensen 迭代法解方程 x = g ( x) 可以看成是另一种不动点迭代: xk +1 = g ( xk ).6893680121527e-007 time_Aitken = 5 x_picard = -2.

2L z k − 2 yk + xk 实验目的与要求 l 理解 Steffensen 迭代法的基本原理。 l 比较 Steffensen 方法与 Aitken 方法的异同,分析为什么前者迭代收敛要快。 l 能在计算机上实现该加速方法,计算非线性方程。 l 画出方程函数的零点,用以分析问题。 实验内容及数据来源 采用 Steffensen 迭代方法计算非线性方程 x 2 − 5cos(2 x) − 4 = 0 在 x=1 附近的根。对根的结果采用函数图象与 x 轴的交点分布情况进行分析。 实验操作指导 光盘:\实验视频\chapter5. zk = g ( yk ) xk +1 = xk − ( yk − xk ) 2 .time]=Steff(fun.MATLAB 215 数值分析与应用 其中迭代函数为 ϕ ( x) = x − [ g ( x ) − x]2 g ( g ( x )) − 2 g ( x ) + x 得到迭代公式为 yk = g ( xk ). k = 0.Steff_main. .rar\5-4.m.m 步骤一:编写 Steffensen 函数方法。 打开 Editor 编辑器,输入以下语句: %Steffensen 加速方法 计算非线性方程 function [gen.exe 光盘:\实验代码\chapter5\Steff.x0.1.0e-5.tol) %如果缺省误差参数,默认为 10 的-5 次方 if(nargin==2) tol=1.

% 迭代次数 以文件名 Steff.02:4. time=time+1.time_steff]=Steff('x^2-5*cos(2*x)-4'. z=subs(fun.1. wucha=abs(gen-x1). %加速公式 gen=x1-(y-x1)^2/(z-2*y+x1).MATLAB 216 数值分析与应用 end %设置误差初值 time=0. y=x.y)+y.08527331222438 time_steff = 5 其中 x_steff 就是我们需要的在 x=1 附近的根,time_steff 为迭代 5 次以后满足我们需要的精 度。 .^2-5*cos(2*x)-4. %迭代加一次的记录 end gen.m 保存。 步骤三:运行程序。在命令窗口输入 >> clear >> Steff_main 回车得到 x_steff = 1. plot(x.y) grid 以文件名 Steff_main. %计算结果 time.m 保存。 步骤二:编写主函数文件。 打开 Editor 编辑器,输入以下语句: % 使用 Steffensen 迭代方法计算 function Steff_main() [x_steff. y=subs(fun.x1)+x1. %设置前后两次迭代的误差 gen=x0.1) %画出函数图象曲线 观测其与 x 轴的交点情况 x=-4:0. %记迭代次数 wucha=0. while(wucha>tol) x1=gen.

MATLAB 217 数值分析与应用 实验结论 一般而言 Steffensen 方法比没有加速迭代法收敛要快很多。Steffensen 迭代法可以看成 是解方程 x = g ( x) 的另一种不动点迭代: xk +1 = ϕ ( xk ).4 实验 5. 其中迭代函数为 [ g ( x ) − x]2 ϕ ( x) = x − g ( g ( x )) − 2 g ( x ) + x 关于 Steffensen 迭代法有以下的局部收敛性定理。假设方程 x = g ( x) 有解 p,p 点的一 次导数不等于 1。如果存在一个正数 r,似的对一切 x ∈ [ p − r . k = 0.L . 2. p + r ] 是二阶收敛的。 从函数图象与 x 轴的交点情况,也可以直观的看出计算结果是有效的,如图 5.1.4 图 5.5 Steffensen 迭代法原方程函数与 x 轴的交点情况 Newton-Rahpson 迭代方法 实验基本原理 Newton—Rahpson 迭代方法是解非线性方程比较著名而且也比较有效的方法之一。如果 初值比较接近根,收敛速度是很快的。Newton—Rahpson 迭代法也是工程上广泛采用的方法。 Newton 迭代法有比较直观的几何意义。函数方程 f ( x ) = 0 的根是曲线 y = f ( x ) 与 x 轴的 交点的横坐标。通过当前的点做曲线的切线(与一次导数有关) ,切线方程为 y = f ( xk ) + f '( xk )( x − xk ) 在上式中令 y=0 得到切线与 x 轴交点的横坐标 . p + r ] (即 x 充分接近根)g (x)连续三次可微,则 Steffensen 迭代法对任意的初值 x0 ∈ [ p − r .

MATLAB 数值分析与应用 218 x = xk − f ( xk ) f '( xk ) 于是我们可以构造迭代公式 xk +1 = xk − f ( xk ) f '( xk ) 如此反复迭代便可以比较快的得到方程的根,所以 Newton 法又叫切线法。 关于 Newton 迭代法如果函数 f ( x ) 有二阶以上连续倒数,p 是方程 f ( x ) =0 的单根,则 当 x0 充分接近 p 时,Newton 迭代法收敛,而且最少二阶收敛。 实验目的与要求 l 理解牛顿迭代法的几何意义于数学内涵。 l 明白迭代函数构造原理。 l 牛顿迭代法是最重要的方法之一,所以要求熟练掌握,要编程实现。 l 画出函数图象的零点,分析迭代结果。 实验内容及数据来源 使用 Newton-Raphson 迭代方法计算方程 f ( x) = x 3 + 2 x 2 + 10 x − 20 = 0 在[1,2]区间内的一个根。并作出函数图象分析计算结果。 实验操作指导 光盘:\实验视频\chapter5.rar\5-5.m 步骤一:编写 Newton-Raphson 迭代法函数。 打开 Editor 编辑器输入以下语句: function [gen.Newton_main.tol) %x0 为迭代初值 %tol 为 指定误差容限 如果却省默认为 10 的-5 次方 %Newton-Raphson 迭代法是很重要而且比较实用的方法 .exe 光盘:\实验代码\chapter5\Newton.x0.time]=Newton(f.m.

plot(x. %给定一个误差初值 以方进入循环计算 while(wucha>tol) time=time+1.1.m 保存。 步骤三:运行程序。 在命令窗口输入: >> Newton_main 回车得到运算输出: 使用 Newton-Raphson 迭代情况: x= 1.1e-4) %画出函数图象与 x 轴交点情况 x=0:0. gen=x1-fx/df.x1).1.y) grid 以文件名 Newton_main. x1=x0. %把迭代后的值赋给 x1 end end 以文件名 Newton. fx=subs(f. end %计算原函数的导数 df=diff(sym(f)).^2+10*x-20. wucha=abs(gen-x1).^3+2*x. x1=gen.time]=Newton('x^3+2*x^2+10*x-20'.36880992354309 time = 4 数值分析与应用 . wucha=0. df=subs(df. %time 记次用 time=0.x1).5.01:2.MATLAB 219 % 希望读者掌握 if(nargin==2) tol=1.0e-5.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: disp('使用 Newton-Raphson 迭代情况:') [x. y=x.

5 中,也可以看出计算的结果是可以接受的。 图 5.6 重根的加速迭代问题 实验基本原理 . b] ; (c) f ''( x ) 在 [ a. x ∈ [ a. b] 都收敛与方程 f ( x ) = 0 有唯一的解,切收敛阶数为 2。 实验 5.MATLAB 220 数值分析与应用 其中 x 为要计算的方程的根,time 表示迭代 4 次得到这个结果。 实验结论 从计算结果可以看出 Newton 迭代法一般收敛还是比较快的,并不需要迭代很多次。在 图 5.5 Newton-Raphson 迭代法函数与 x 轴的交点情况 如前所言,Newton 法是实用性很强的一种算法,被普遍采用。需要说明的是在实际问 题中,一般可以提供接近根的初值,但有的问题难以确定初值,对于初值的选取,有如下定 理。 设函数 f ( x ) 在有限区间[a. <b−a f '(a ) f '(b) 则对任意的初值 x0 ∈ [ a.b]上存在二阶倒数,且满足条件: (a) f ( a) f (b) < 0 ; (b) f '( x) ≠ 0. b] 上不变号; (d) f ( a) f (b) < b − a.

time]=Newton(f.m 步骤一:编写加速迭带函数方法。 打开 Editor 编辑器,输入以下语句: function [gen.tol) %x0 为迭代初值 %tol 为 指定误差容限 如果却省默认为 10 的-5 次方 %Newton-Raphson 迭代法是很重要而且比较实用的方法 % 希望读者掌握 .MATLAB 221 数值分析与应用 Newton 迭代法是一种实用性比较强的算法,但是在处理重根运算时候往往效果不是太 好,有时候收敛速度会非常的慢。为了处理这一问题,往往我们需要对迭代法进行一些改造。 如果采取以下的迭代方法,计算效果会很不错,但是需要计算二次导数。 xk = xk −1 − F ( xk −1 ) f ( x) ,其中 F ( x ) = f '( x) F '( xk −1 ) 展开上市式,便得到迭代公式 xk = xk −1 − f ( xk −1 ) f '( xk −1 ) [ f '( xk −1 )]2 − f ( xk −1 ) f ''( xk −1 ) 实验目的与要求 l 理解公式的构造方法。 l 会正确使用该公式,知道计算步骤。 l 能编程实现该计算方法。 l 用图形表达计算结果。 实验内容及数据来源 分别使用 Newton 迭代法与本实验的加速方法计算以下方程在 x=1.m.exe 光盘:\实验代码\Newton_Tay. Newton_Tay_main.rar\5-6.5 附近的根。 f ( x) = x 4 − 4 x2 + 4 = 0 并作出函数图象分析计算结果。 实验操作指导 光盘:\实验视频\chapter5.x0.

x1). df2=subs(df2.x1).MATLAB 222 if(nargin==2) tol=1.1.^2+4. fx=subs(f. %迭带公式 wucha=abs(gen-x1). end %计算原函数的导数 df=diff(sym(f)).5.time1]=Newton('x^4-4*x^2+4'.0e-5.1e-4) disp('使用加速方法,计算情况:') [x2.m 保存。 步骤三:运行程序。 在命令窗口输入: >> Newton_Tay_main 回车得到: 使用 Newton-Raphson 迭代情况 x1 = 数值分析与应用 . %把迭代后的值赋给 x1 end end 以文件名 Newton_Tay. wucha=0.1.1.1e-4) %画出函数图象与 x 轴交点情况 x=-2:0.^4-4*x. gen=x1-fx*df/(df^2-fx*df2). df2=diff(df). %time 记次用 time=0.y) grid 以文件名 Newton_Tay_main. y=x.5.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: disp('使用 Newton-Raphson 迭代情况:') [x1. plot(x. %给定一个误差初值 以方进入循环计算 while(wucha>tol) time=time+1.time2]=Newton_Tay('x^4-4*x^2+4'.x1).01:2. df=subs(df. %2 阶导数 x1=x0. x1=gen.

6 中, 也可以看出计算结果是有效的。 图 5.41173276486676 time2 = 2 其中 x1,time1 为使用 Newton-Raphson 迭代情况的方程根于迭带次数,而 x2,time2 为使用加速方法计算的根与迭带次数。 实验结论 实验结果表明对于重根问题,本实验介绍的加速方法效果还是很明显的。在图 5.MATLAB 223 数值分析与应用 1.7 割线法 实验基本原理 .6 二次导数加速法函数与 x 轴的交点情况 程序设计是很灵活的,应该基于一些算法的基本思想,作出灵活的程序设计使程序与自 己其他程序比较好的衔接。同时还应该在分析具体问题的情况下, 对程序的一些控制条件等, 做出适当的调整。在有的教材中,作者甚至喜欢以主函数的形式介绍计算流程。所以读者要 学习的应该是算法思想,这是程序设计的灵魂。 实验 5.41837336771881 time1 = 39 使用二次导数加速方法,计算情况 x2 = 1.

7 x 2 -10 = 0 在区间[-2,2]上的根。并化出函数图象与 x 轴交点情况,以辅助分析计算结果。 实验操作指导 光盘:\实验视频\chapter5.exe 光盘:\实验代码\chapter5\gexian.MATLAB 224 数值分析与应用 在 Newton 法计算 f ( x ) = 0 中,迭代过程里下一步是用曲线 y = f ( x ) 的切线代替曲线 y = f ( x ) ,从而把切线与 x 轴的交点横坐标作为 f ( x ) = 0 的根,如此反复。要计算切线的 代价是需要计算函数 y = f ( x ) 的导数。事实上,我们可以考虑迭代前后两次的割线来代替 曲线,把割线与 x 轴的交点作为根的近似,如此反复,这样也得到一种求解 f ( x ) = 0 的计 算方法,而不需要计算一次导数。 割线的方程为 y = f ( xk ) + f ( xk ) − f ( xk −1 ) ( x − xk ) xk − xk −1 该直线方程与 x 轴交点横坐标容易算出: x = xk − f ( xk )( xk − xk −1 ) f ( xk ) − f ( xk −1 ) 我们就把这个 x 作为下一次迭代的初值,那么得到迭代公式 xk +1 = xk − f ( xk )( xk − xk −1 ) f ( xk ) − f ( xk −1 ) 实验目的与要求 l 从几何的角度理解割线法的几何意义。 l 比较割线法和牛顿迭代法。 l 能在数字计算机上实现割线法,解决非线性方程问题。 l 画出函数零点,辅助选择迭代初步值。 实验内容及数据来源 使用割线法计算方程 2e2 x .m.m 步骤一:编写割线法方法函数。 .gexian_main.rar\5-7.

gen=a-(b-a)*fa/(fb-fa). else gen=a-(x1-a)*fa/(fx-fa).time]=gexian('2*exp(2*x)-7*x^2-10'. end end 文件名 gexian. end time=0.MATLAB 225 打开 Editor 编辑器,输入以下语句: %08/06/21 %割线法计算非线性方程 %tol 为误差容限 function [gen. plot(x.-2. e=exp(1).a). %当误差大于给定的误差容限时候 ,进入循环 while(wucha>tol) time=time+1. fb=subs(sym(f).a. if(s>0) gen=b-(x1-b)*fb/(fx-fb). end wucha=abs(gen-x1).^(2*x)-7*x.b. y=2*e.01:2.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %使用割线法 计算方程在[-2,2]区间上的根 [x.y) grid on 以文件名 gexian_main.time]=gexian(f. fx=subs(sym(f). s=fx*fa.2) %作出函数图象与 x 轴的交点情况,用以检验计算结果 x=-2:0.x1).1. x1=gen. %任意给顶一个小的误差初值 以便进入循环 fa=subs(sym(f).^2-10.b).tol) %当误差容限缺省时 默认为 10 的-5 次方 if(nargin==3) tol=1. %记录循环次数,设置初值 wucha=0.0e-5.m 保存。 数值分析与应用 .

M )T ,其中 a 表示轨道半长径,e 表示轨道偏心率,i 表示轨道倾角, Ω 是升 交点赤经, ω 是近地点辐角,M 是平近点角。其中第六个积分常数,通常可以用其他的一 些量替换,如过近地点时刻 t p ,真近点角度 f 与偏近点角度 E。这几个是相互等价的关系, . ω .7 中,给出 了函数图象与 x 轴交点情况,可以看出计算结果是有效的。 图 5. i.7 割线法计算函数的图象与 x 轴交点情况 一般而言,割线法比牛顿法收敛速度要慢一些,但是割线法每一步只需要计算一次函数 值,而牛顿法则还需要计算导数值。这是相对于割线法比较苛刻的地方,好在很多实际问题 一般都可以直接计算导数。所以说两种方法各有所长,在面对具体问题时,应该先分析函数 性质,然后选择合适的计算方法。 实验 5.MATLAB 226 数值分析与应用 步骤三:运行程序。 在命令窗口输入: >> gexian_main 回车得到结果: x= 1. e.11971095143669 time = 39 其中 x 既需要的方程的根,time=39 表示经过迭代 39 次得到目前的计算结果。 实验结论 从计算结果可以看出迭代的次数相对而言还是比较多的,好在还能在可以接受的次数内 收敛。当然迭代的次数与函数本身有关,同时和初值的选取也是有关的。在图 5. Ω.8 kepler 方程的计算 实验基本原理 在人造卫星轨道理论中对应的二体问题是可积系统,其中有 6 个积分常数为 (a.

0e-14.n]=kepler_Newton(e.M. %设置初误差进入循环 .rar\5-8.exe 光盘:\实验代码\charper6\kelper_Newton. Ek=M. end %把输入参数由角度变为弧度计算 M=M*pi/180.01、平近点角为 32 度时计算出偏近点角。 Kepler 方程为 E − e sin E = M 实验操作指导 光盘:\实验视频\chapter5.m 步骤一:编写 Newton 微分改正方法函数。 打开 Editor 编辑器,输入以下语句: %Newton 微分改正方法计算 Kepler 方程 function [E.tol) %如果系统缺省误差容限参数 默认为 10 的负 14 次方 if(nargin==2) tol=1.MATLAB 227 数值分析与应用 我们这里要讲的就是平近点角 M 与偏近点角 E 的一个关系,有如下方程 E − e sin E = M 这就是著名的 Kelper 方程,是在人造卫星运动理论或者行星运动理论中最基本的方程 之一。因为如果我们已经知道卫星轨道量去计算卫星的星历时,第 6 个根数通常是使用平近 点角。这时候需要把平近点角化为偏近点角,也就是需要计算上述的 Kepler 方程。具体理 论这里不再阐述,而 Kepler 方程本身是我们这里感兴趣的。我们这里采用 Newton 迭代法计 算 Kepler 方程,在实际工程中,一般也是这样做的,因为 Newton 迭代法收敛速度快而且精 度比较高。 实验目的与要求 l 了解 Kepler 方程。 l 能够用牛顿迭代方法计算 Kepler 方程。 l 通过调节轨道偏心率 e 查看运算收敛情况。 实验内容及数据来源 编写解 kepler 方程的方法,给定偏心率为 0.

32.n]=kepler_Newton(0.MATLAB 228 数值分析与应用 wucha=0.01.306 n= 3 其中 E 为计算得到的偏近点角,n 表示迭代 3 次得到运算结果。 实验结论 Kepler 方程是行星与卫星运动理论的一个基本方程,历史上已经有很多计算方法,比较 著名的有图解法、级数展开法等。这里我们采用了 Newton 迭代方法,可以看出在偏心率很 小的情况下,收敛速度是比较快的。从计算的复杂度可以看出也是比较简单的,可以试想在 没有计算机的情况下, 我们甚至可以用手工的方法给出比较准的解,因为迭代收敛的非常快, 所以不需要很多次。但可以想象,如果没有计算机我们去计算三角函数,如 sin(x) 、 cos(x)是有些困难的。读者想一下应该如何计算?事实上可以采用级数展开的方法进行计 算。 上面的阐述只是想表明,其实数值计算方法并不神秘,它完全是按照我们人的思想进行 运算。很多著名的方法在计算机发明以前已经构造出来,并应用于科学计算中。比如科学家 要面对大量的微分方程(数学家证明很多微分方程是无法通过积分方法获得)在 19 世纪边 构造出 RK 方法,并应用于科研领域,而计算机的发明使这些计算方法得以更有效的发挥。 . 以文件名 kelper_Newton.1e-14) 回车得到: E= 32.m 保存。 步骤二:运行程序。 在命令窗口输入: >> [E. Ek=E. end %把输出转换为角度 E=E*180/pi. n=n+1. %迭代公式 wucha=abs(Ek-E). n=0. %记次 while(wucha>tol) E=Ek-(Ek-e*sin(Ek)-M)/(1-e*cos(Ek)).01.

49875576265241。 2. 采用不动点迭代方法计算非线性方程 x 3 + 4 x 2 − 10 = 0 在区间[1,2]上的一个根。 参考答案:x=1.18306301193336。 . −2] 。 参考答案:x= -2.MATLAB 229 数值分析与应用 本章小结 非线性方程的数值方法因为内容并不是很多,而且方法相对其他内容也比较简单一些, 所以在很多数值分析教材中往往被安排在导言之后的第一章或者教材的最后一章。 本书之所以把非线性方程放在数值计算的第二章也就是在线性方程组之后,主要是基于 以下的考虑。如果一开始就讲非线性方程,那么后续的一章非线性方程组的计算方法则不太 好衔接上,因为在非线形方程组一章需要用到非线性方程计算方法与线性方程组的方法。而 本书在线性方程组与非线性方程的解法具备之后紧接着介绍非线性方程组如此安排,使读者 有比较好的基础知识准备,而且衔接比较自然、紧凑。 就数值方法本身而言,目前的方法对于非线形方程的计算总体效果还是不错的,基本上 能满足一般的工程需求,而且在程序设计时一般比较容易实现。当然针对一些特殊的问题, 可能有时候还需要构造一些特别的方法。 在 MATLAB 中系统也内置了一些非常实用的非线形方程的计算方法,当然这些方法通 常实用于非线性方程组,所以会在下一章单独介绍。 上机操作题 1. 采用二分法计算非线性方程 x cos x − 2=0 查找区间为 x ∈ [ −4.3652300134141。 3. 采用 Neton-Raphson 迭代法计算非线性方程 exp ( x ) − sin x = 0 在区间[-4,-3]上的一个根。 参考答案:x=-3.

MATLAB 230 4. 采用割线法计算非线性方程 2 x3 − 5x − 1 = 0 在区间[1,2]上的一个根。 参考答案:x=1.67298164785494。 数值分析与应用 .

x2 ( k ) .MATLAB 数值分析与应用 231 第六章 非线性方程组与最优化方法 在上一章中,主要介绍了非线性方程的数值方法。相对而言,非线性方程组要复杂一些。 在工程中用的比较多的也是非线性方程组问题。从数学角度而言,线性方程组的理论与方法 要比非线性方程组的理论和方法成熟的多。对于非线性方程组没有一般的解析方法。客观世 界的非线性行为要比线性行为复杂的。20 世纪以来,随着数字计算机的发明,许多非线性 领域本身得到许多发展,非线性问题的多个领域也成为数学家和应用科学家研究热点。虽然 计算机不能取代最终的分析结果,但是却能给我们很多有益的启示。就非线性方程组而言, 也得到很大发展,许多新的计算方法都是在数字计算机发明以后提出来的。 本章系统的介绍了非线性方程组与最优化的数值方法,其中尤其以拟牛顿法比较重要, 实用价值也比较高。在实际应用时候,可能选择牛顿法也是比较多的,这需要视情况而定。 实验 6. xn ) = 0 (1)  x1 = ϕ1 ( x1 . xn( k ) )  xn . x2 . L .L .L . ) = 0 xn  f 2 x1 x2  M   f n ( x1 . xn ( k ) )  k +1 k k k  x2( ) = ϕ 2 ( x1( ) .L . x2( ) .L . x2 . x2 . x . xn ) (2) 可以构造如下形式结构 方程(2)的解 x∗ ,也是方程(1)的解。 x∗ 称为方程(2)函数向量的不动点。 可以构造如下迭代格式  x1( k +1) = ϕ1 ( x1( k ) . xn )  x = ϕ ( x .L .L . xn( ) )  M   ( k +1) = ϕn ( x1( k ) . xn ) = 0  ( . x2 ( k ) .L . x )  2 n 2 1 2  M   xn = ϕ n ( x1 . x2 .1 不动点迭代法 实验基本原理 对于非线性方程组  f1 ( x1 .L . .

MATLAB 数值分析与应用 232 选择初值向量 x (0) 0 0 0 = ϕ1 ( x1( ) .budong_fun.exe 光盘:\实验代码\chapter6\budong.2378  3  x − y − cos y = 0 x  y  0  0 初值取   =   。 实验操作指导 光盘:\实验视频\chapter6. x2 ( ) . budong_main.rar\\6-1.m . xn ( ) ) ,边可以逐步递推下去。这就是不动点迭代法的 基本原理。 记矩阵  ∂ϕ1  ∂x  1 ϕ '(x) =  M   ∂ϕ n  ∂x  1 ∂ϕ1  ∂xn   O M   ∂ϕ n  L ∂xn  K 可以证明如果 ϕ '( x) < 1 ,则上述迭代收敛。 实验目的与要求 l 熟悉不动点迭代法的基本原理,明白其计算流程。 l 能够把不动点迭代方法用程序实现,以计算一般的非线性方程组。 l 在程序中可以设置最大迭代次数,防止迭代次数过多而不收敛情况。 l 程序设计时候,要可以控制计算精度,这样用户可以根据需要自行调整。 l 对计算结果作出分析,并把计算序列绘制成图象。 l 给出实际迭代次数。 实验内容及数据来源 计算非线性方程组  x + x sin y = 2.m.L .m.

tol) %如果输入量少于两个 默认误差为 10 的-3 次方 if nargin==1 tol=1. n=1.MATLAB 233 步骤一:编写不动点迭代方法。 打开 Editor 编辑器,输入以下语句: %不动点迭代法计算非线形方程组 %08-6-26 %输入量 x0 为初值,tol 为误差容限 %输出量 r 为计算结果 n 为迭代次数 data1 为计算的中间数据 function [r. 以文件名 budong_fun.0e-3. f(2)=x(1)^3-cos(x(2)); f=[f(1) f(2)]. n=n+1.data]=budong(x0. [r.n)=x1.m 保存。 步骤二:编写要计算的函数文件。 打开 Editor 编辑器,输入以下语句: %不动点迭代测试函数 function f=budong_fun(x) f(1)=-sin(x(2))*x(1)+2. end r=x1. end x1=budong_fun(x0). x1=budong_fun(x0). 以文件名字 budong.2378.data]=budong(x0).n. %data1 用于存放计算的中间数据 这样可以分析运算收敛情况 data(:.n. %迭代过程 while (norm(x1-x0)>tol)&(n<500) x0=x1. disp('计算结果为') r disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 数值分析与应用 .m 保存。 步骤三:编写主函数文件。 打开 Editor 编辑器,输入以下语句: x0=[0 0].

0300000e+002 1.3075111e+002 5.1599627e+000 1.0666038e+001 3.2665741e+000 4.0000000e+000 4.1890053e+000 2.1208438e+000 1.0000000e+000 0.1。 迭代序列 x y 1.0400000e+002 1.0000000e+000 -1.4862365e+001 M M M 2.0000000e+000 6.0000000e+000 2.1922071e+000 .1708393e+000 -4.0926555e+001 6.3381939e+000 -6.MATLAB 数值分析与应用 234 subplot(2.:)) %以下为数据保存部分,注意查看当前工作空间 num=(1:n)'.2) plot(data(2.1) plot(data(1.1609639e+000 1.1.1.1593402e+000 1. save data1.0301109e+001 4.15970358667494 1.0600000e+002 1.0000000e+000 0.1369116e+000 7.5748695e+000 1.0500000e+002 1.1604269e+000 1.0000000e+000 2.0000000e+000 3.19256473358258 迭代次数为 n= 211 实验结论 系统输出已经给出了计算结果,从迭代次数来看总共迭代了 211 次。不动点迭代法收敛 速度相对而言还是比较慢的。 下面的数据给出了计算的中间结果,见表 6.:)) %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(2.0000000e+000 4.1962892e+001 8.1935945e+000 2.txt a -ascii 以文件名 budong_main.m 保存。 步骤四:运行主程序。 在命令窗口输入: >> clear >> budong_main 回车得到运算结果: 计算结果为 r= 1.0874530e-001 7. a=[num data'].0000000e+000 -3.1899136e+000 2.4505109e+000 2.

1100000e+002 1.1930099e+000 2.0800000e+002 1.1607857e+000 1.1925647e+000 表 6.0700000e+002 1.1 中给出了方程组根随时间的变 化图象,可以看出在一开始收敛速度非常慢,而且振荡比较厉害。大约在迭代 150 次以后解 基本趋于稳定,不再有大幅变变化。 图 6.1595464e+000 1.1902018e+000 2.1000000e+002 1.1919528e+000 2.2 高斯—塞德尔迭代 实验基本原理 非线性高斯-塞德尔迭代法的与线性方程组中的塞德尔迭代法出于对迭代改正值同样的 考虑。在不动点迭代过程中,我们是迭代时候用当前的近似根代入到每一个方程进行计算 。 迭代一次结束后,重新用新迭代得到的根一次性替换上一次的根。 而高斯-塞德尔迭代的思想是在计算第一个方程函数得到第一个自变量后,就把自变量 更新进入第二个方程的运算,计算完第二个方程函数时候已经算出了第二个自变量,把新的 自变量及时更新代入第三个方程,依次如此,便是高斯-塞德尔方法。 .1597036e+000 1.0900000e+002 1.1600208e+000 1.MATLAB 数值分析与应用 235 2.1 不动点迭代的数据分析 出于节省篇幅考虑,这里省略了大部分数据,只给出了开头几的几组数据,和接近收敛 时候的数据。为了更清楚的了解迭代收敛性情况,在图形 6.1603752e+000 1.1 不动点迭代法方程根的收敛情况 实验 6.1895076e+000 2.

data]=gseid_fun(x0.n.MATLAB 数值分析与应用 236 一般而言高斯-塞德尔要比简单的迭代法快许多。 实验目的与要求 l 熟悉高斯-塞德尔迭代法基本原理。 l 明白高斯-塞德尔为什么要比不动点迭代法收敛的快。 l 对于给定的非线性方程组会构造高斯-塞德尔迭代格式。 l 比较线性方程组与非线性方程组的高斯-塞德尔方法的联系与区别。 l 对计算结果做出合理分析,绘制出迭代序列的变化图象。 l 程序设计要求可以控制精度。 l 对于迭代次数过多,而没有收敛的情况,要及时跳出迭代,防止无穷循环。 l 输出实际迭代次数。 实验内容及数据来源 0  0  采用塞德尔迭代法计算非线性方程组的根,初值取 x0 =   4 x1 − x2 + 0.rar\6-2. gseid_main.tol) %如果参只有一个 那么默认误差精度为 10 的-10 次方 if nargin==1 tol=1e-10.m.exe 光盘:\实验代码\chapter6\gseid_fun.1e x1 = 1   1 2 − x1 + 4 x2 + x1 = 0 8  实验操作指导 光盘:\实验视频\chapter6.m 步骤一:编写方法实现函数。 打开 Editor 编辑器,输入以下语句: %P182 %n 用来存放 迭代次数 function [x. .

data]=gseid_fun(x0). x0=x1. x1(2)=(x1(1)-x1(1)^2/8)/4.1) plot(data(1. %迭代过程 while (wucha>tol)&(n<500) x1(1)=(1+x0(2)-0.title('y 在迭代中的变化') 以文件名 gseid_main.1.:)).n.title('x 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(2. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(2. [x. %data 只是用来存放数据,便于分析 data(:.0].:)).n)=x1. %给定误差初值 使之可以进入循环 wucha=0. n=n+1.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %高斯-塞德尔法计算 非线性方程组 主函数 x0=[0.1.1.m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear >>clc >> gseid_main 回车得到: 计算结果为 数值分析与应用 . 以文件名 gseid_fun.2) plot(data(2.MATLAB 237 end n=1. end x=x1. wucha=norm(x1-x0).1*exp(x0(1)))/4.

3256685e-001 5.0000000e+000 2.0000000e+000 2.6402523e-002 4.0000000e+000 2.0000000e+000 0.0000000e+000 2.6451520e-002 表 6.0000000e+000 2.4667969e-002 3.3256132e-001 5.3256700e-001 5.6451520e-002 8.2。 .3256700e-001 5.3256701e-001 5.0000000e+000 2.0000000e+000 2.3235892e-001 5.6450181e-002 5.6451520e-002 9.0000000e+000 2.0000000e+000 0.MATLAB 数值分析与应用 238 x= 0.2500000e-001 5.2 高斯—塞德尔方法的数据分析 为了更清晰的看出迭代收敛情况,这里给出了方程的根随着迭代序列增加的变化情况, 如图 6.2。 迭代序列 x1 x2 1.6451519e-002 7.0564515196521212 迭代次数为 n= 9 实验结论 为了让读者体会程序设计的灵活性,在实验中,作者有意改变前面的标准调用方法,既 先编写方法函数,再编写测试函数,而是直接把方法和函数放在一起。读者考虑,按照高斯 -塞德尔思想,如何编写一般的方法。认真体会其计算原理相信,这是很容易做到的。 从输出结果看,迭代 9 次就已经达到了要求的精度,其中的变化序列可以参见表 6.3256701e-001 5.232567005090585 0.0000000e+000 2.6451483e-002 6.

xn )  在x (k ) 处按照多元函数的泰勒展开,并取线性项得到  f1( k ) ( x1( k ) . x2 . xn ( k ) )   x1( k +1) − x1( k )   (k ) (k ) (k )   ( k +1)  (k ) − x2( k )   f 2 ( x1 . L .L .L . xn )  ( k )  x2   + f'(x )  =0 M M      f ( k ) ( x ( k ) . x ( k ) . x ( k ) )   x ( k +1) − x ( k )  n n 1 2  n   n  其中 ∂f1   ∂f1  ∂x K ∂x  n   1 f'(x) =  M O M     ∂f n L ∂f n   ∂x ∂xn   1 这样便得到迭代公式:  x1( k +1)   x1( k )   f1( k ) ( x1( k ) . x ( k ) )   n   n  1 2 n  n  这就是著名的牛顿迭代法。牛顿迭代法是工程上应用最多的一种非线形方程组的计算方 法。 . xn ( k ) )   (k ) (k ) (k )   ( k +1)   ( k )  (k )  x2  =  x2  − f'(x ( k ) )  −1  f 2 ( x1 .3 非线形方程组的牛顿迭代法 实验基本原理 和非线性方程解法情况类似,非线性方程组的牛顿迭代法是相当重要也是相当基础的方 法。很多重要算法也是在此基础上进行演变而得到的。 对于非线性方程  f1 ( x1 . x2 .MATLAB 239 数值分析与应用 图 6. x2( k ) .2 高斯-塞德尔方法根的收敛情况 从图形我们可以看到,经过一次迭代迅速进入“状态” ,精度越来越高,直到满足精度 要求。基本而言还是非常平稳的,这也是我们期望看到的数值算法的结果。 实验 6. xn )   f=   M    f n ( x1 .L . x ( k ) . xn )    f 2 ( x1 . x2 .L .L . x2 . L . x2 . x2 ( k ) . xn )      M   M   M        x ( k +1)   x ( k )   f ( k ) ( x ( k ) .L .L .

n.f1.5 = 0  2 2  x + 4 y − 4 = 0 x  y 1 1 初值取   =   。 实验操作指导 光盘:\实验视频\chapter6.m 步骤一:编写牛顿迭代法的基本程序。 打开 Editor 编辑器,输入以下语句: %牛顿迭代法 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x.data]=new_ton(x0.rar\6-3.m.tol) if nargin==1 tol=1e-10.exe 光盘:\实验代码\chapter6\ new_ton. end x1=x0-f1(x0)/df1(x0).df1.MATLAB 240 数值分析与应用 实验目的与要求 l 熟悉牛顿迭代法的基本原理,能够自己独立推导出来。 l 知道迭代公式中的每一各量在计算中如何实现。 l 对于不熟悉多元函数泰勒展开的,可以阅读微积分教材或者本书第二章相关实验。 l 能够实现牛顿迭代法思想,编程实现,并用以处理非线性方程。 l 对计算结果做出分析,给出迭代序列,以及绘制根的变化情况。 l 给出实际迭代次数信息。 l 方法函数要可以控制精度。 l 设置最大迭代次数,当迭代次数过多自动跳出,防止不收敛情况下,进入无穷循环。 实验内容及数据来源 计算非线性方程组  x 2 − 2 x − y + 0.m.m. .new_main.

%迭代过程 while (norm(x1-x0)>tol) x0=x1. x=x0(1). f1=x^2-2*x-y+0. disp('计算结果为') x disp('迭代次数为') n 数值分析与应用 . f=[2*x-2 -1 2*x 8*y]. y=x0(2).n. x1=x0-f1(x0)/df1(x0). %最后方程函数 以行向量输出 f=[f1 f2]. 以文件名 new_ton.MATLAB 241 n=1.m 保存。 (2)新打开 Editor 编辑器输入以下语句: %牛顿迭代法的 jacobi 矩阵 function f=df1(x0).data]=new_ton(x0). y=x0(2). end x=x1. [x. %data 用来存放中间数据 data(:.m 保存。 步骤二:编写方程函数与方程的 Jacobi 矩阵函数。 (1)打开 Editor 编辑器输入以下语句: %牛顿迭代法的 方程函数 function f=f1(x0) x=x0(1). f2=x^2+4*y^2-4.n)=x1. 以文件名 f1.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器输入以下语句: %牛顿迭代法的主函数 x0=[1 1].5. n=n+1. 以文件名 df1.

1000000e+001 -2.2221461e-001 9.2417453e+000 3.9380842e-001 .2248412e-001 9.0000000e+000 2.2221497e-001 9.1642673e+000 2.2221827e-001 9.0000000e+000 0.0000000e+000 -2.2221456e-001 9.6000000e+001 -2.9380842e-001 1.0000000e+000 -2.2221456e-001 9.993808418603981 迭代次数为 n= 16 实验结论 牛顿迭代法是一种基础且很重要的算法,并有着清晰的数学内涵和几何意义。从计算结 果看迭代进行到第 16 次时已经收敛。这里给出了计算的迭代数据情况,如表 6.9393058e-001 9.2445033e-001 9.0000000e+000 -3.2) plot(data(2.9381008e-001 1.2221456e-001 9.9380842e-001 1.0000000e+000 -1.9354034e-001 1.0027873e+000 7.MATLAB 数值分析与应用 242 %抽取 data1 中第一个变量数据 画出曲线 subplot(2.0365566e+001 -3.1.0000000e+001 -2.title('x 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(2.:)).3000000e+001 -2.2224505e-001 9.9489768e-001 8.title('y 在迭代中的变化') 以文件名 new_main.9380863e-001 1.2221456e-001 9.:)).7772623e-001 1.2000000e+001 -2.9382342e-001 1.0000000e+000 -1.0000000e+000 0.5000000e+001 -2.1.0000000e+000 -2.0000000e+000 1.4209867e-001 1.3 所示。 迭代序列 x y 1.0830395e+000 6.0000000e+000 -2.8124951e+000 4.222214555069498 0.9380844e-001 1.9380842e-001 1.4000000e+001 -2.5676266e+000 5.m 保存。 步骤四:运行程序。在命令窗口输入: >> clear >> new_main 回车后得到: 计算结果为 x= -0.1) plot(data(1.

4 简化的牛顿迭代法 实验基本原理 牛顿法具有比较高的收敛速度,但是从牛顿法的基本原理可以看到其计算量还是比较大 的。在每一步迭代中需要计算 n 个函数值,还要计算 Jacobi 矩阵的逆矩阵。在上一个实验 的结论部分,我们提到了改进一些算法的参考标准,当然有时候这些标准难以得兼,这时候 我们可能会考虑折中的方法。 为了减少牛顿迭代法的计算量可以把牛顿迭代法中的 k 次 Jacobi 矩阵换为常矩阵。这 .3 牛顿迭代法的收敛情况 实验 6.3 牛顿迭代法数据分析 为了获得更直观的迭代收敛信息,MATLAB 方便的画出了函数图形。如图 6.MATLAB 243 数值分析与应用 表 6.3 所示, 其中第一幅子图为 x 的迭代情况,第二幅为 y 的迭代情况。从图形中可以看到,迭代的前几 次有一些振荡情况,但是随着迭代序列增加,收敛效果还是不错的。 一般而言,我们不好单独的讲一种方法绝对比另一种优,就收敛速度而言也不能这样说。 不同的方法对不同的方程函数起到的收敛效果也是不同的,而且和初值选取有关系。但我们 期望的整体目标当然首先要考虑计算效果,还有计算量,计算要简单等,这些都可以作为一 个算法改进的目标。 图 6.

L .m. xn )      M   M   M        x ( k +1)   x (k )   f ( k ) ( x ( k ) .L .new2_main.m 步骤一:编写简化牛顿法的方法函数。 打开 Editor 编辑器,输入以下语句: %简化牛顿迭代法 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 数值分析与应用 .exe 光盘:\实验代码\chapter6\ new2_ton. x2 . x ( k ) )  1 2 n  n   n   n  如此一来,计算量大为减少,但是要付出的代价是大大降低了收敛速度。 实验目的与要求 l 理解简化牛顿法的基本出发点,与实现方法。 l 分析比较简化牛顿法与牛顿迭代法的优点和不足之处。 l 能够实现简化牛顿法,编写出合适的函数用之处理非线性方程组。 l 对方程的计算结果作出分析,根的收敛情况,绘制出根变化曲线。 l 给出迭代次数。 l 要求可以控制精度,并且限制最大迭代次数。 实验内容及数据来源 采用简化牛顿法计算非线性方程组 2  x − 2 x − y + 0. L .rar\6-4.5 = 0  2 2  x + 4 y − 4 = 0 实验操作指导 光盘:\实验视频\chapter6.m.m. x2 ( k ) .MATLAB 244 样迭代格式为:  x1( k +1)   x1( k )   f1( k ) ( x1( k ) .f1. xn( k ) )   (k ) (k ) (k )   ( k +1)   ( k )  (k )  x2  =  x2  − f'(x(0) ) −1  f 2 ( x1 .df1. x ( k ) .

n=1. x=x0(1). %注意这时候 Jacobi 矩阵为常数矩阵 cmat=df1(x0). n=n+1. 以文件名 new2_ton.MATLAB 245 数值分析与应用 function [x.m 保存。 (2)新打开 Editor 编辑器输入以下语句: %简化牛顿迭代法的 jacobi 矩阵 function f=df1(x0). y=x0(2).data]=new2_ton(x0. %data 用来存放中间数据 data(:. %最后方程函数 以行向量输出 f=[f1 f2]. x1=x0-f1(x0)/cmat.n)=x1. f1=x^2-2*x-y+0. 以文件名 df1.5.m 保存。 步骤二:编写方程函数与 jacobi 矩阵函数。 (1)打开 Editor 编辑器输入以下语句: %简化牛顿迭代法的 方程函数 function f=f1(x0) x=x0(1).n.m 保存 [注]如果上一个实验的程序没有被修改的话,可以直接使用,因为针对的是同一个算例。 . f=[2*x-2 -1 2*x 8*y]. 以文件名 f1. end x=x1. f2=x^2+4*y^2-4. y=x0(2).tol) if nargin==1 tol=1e-10. end x1=x0-f1(x0)/df1(x0). %以下为迭代过程 while (norm(x1-x0)>tol) &(n<500) x0=x1.

'). 改为 x0=[0 1.n.5].1.title('x 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(2.'-.').:).MATLAB 246 数值分析与应用 步骤三:编写主程序。 打开 Editor 编辑器,输入以下语句: %简化牛顿迭代法的主函数 x0=[1 1].:).2) plot(data(2.1. 保存主程序。再次运行,在命令窗口输入: >>clear >> new2_main 计算结果为 x= .1) plot(data(1.5     就是把主程序的第一行: x0=[1 1]. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(2.data]=new2_ton(x0).title('y 在迭代中的变化') 以文件名 new2_main. [x.'-.m 保存。 步骤四:运行程序。在命令窗口输入: >> clear >> new2_main 回车得到: 计算结果为 计算结果为 x= NaN -Inf 迭代次数为 n= 9 这让我们很失望,没有得到正确的结果。而在牛顿迭代法中已经收敛了。可是如果我们方法 函数与方程函数都没有错误的话,改变迭代初值。这一次选择更靠近真解的初值  x  0   y  = 1.

0000000e+000 -2.9380842e-001 1.7000000e+001 -2.5000000e+001 -2.9424798e-001 6.9380842e-001 2.0000000e+000 -2.0000000e+000 0.9380842e-001 2.2188365e-001 9.1000000e+001 -2.2221456e-001 9.9387255e-001 8.5036169e-001 9.8000000e+001 -2.2221456e-001 9.2243275e-001 9.0000000e+001 -2.2221456e-001 9.2221456e-001 9.1000000e+001 -2.4 中给出了迭代过程中的 方程的根的变化情况。 迭代序列 x y 1.1700255e-001 9.9380888e-001 1.2221456e-001 9.2223476e-001 9.9381715e-001 1.2221469e-001 9.9380843e-001 1.2219811e-001 9.0000000e+001 -2.0000000e+000 -2.9668607e-001 4.9384153e-001 9.9000000e+001 -2.9380844e-001 1.0000000e+000 0.2221456e-001 9.0000000e+000 -2.2221443e-001 9.9380842e-001 表 6.2221458e-001 9.6000000e+001 -2.9381231e-001 1.3000000e+001 -2.4000000e+001 -2.9380857e-001 1.0000000e+000 -2.9409786e-001 7.0000000e+000 -1.9644821e-001 5.9380848e-001 1.2221476e-001 9.0000000e+000 -2.222214555094034 0.0000000e+000 2.99380841863608 迭代次数为 n= 21 这一次得到了和牛顿迭代法一样的结果,当然小数点后面几位可能不同,如果需要精度 搞的话可以调整程序中的精度参数。 实验结论 从计算结果已经看出了,同样的方程,在牛顿迭代下收敛,而简化牛顿化因为初值因离 真值比较远所以迭代没有收敛。把初值改变以后,收敛到了与牛顿法一样计算结果,但是迭 代次数还是比牛顿法要多一些,这也证实了一开始的说法。在表 6.4 简化牛顿法迭代数据分析 同样为了获得更直观的数据分析情况,这里给出了根在迭代收敛过程中的变化情况。其 中第一幅子图为 x 变化过程,第二幅为 y 变化过程。可以看出,基本从这样的迭代效果还是 比较平稳的,是可以接受的。当然在实际工作中,可以根据需要选择合适的算法。 .2467905e-001 9.0000000e+000 -2.2000000e+001 -2.2221653e-001 9.9380842e-001 1.0219907e+000 3.MATLAB 数值分析与应用 247 -0.9380956e-001 1.4583333e-001 1.2221458e-001 9.

f(x k ) 拟牛顿法是 20 世纪 60 年代以来发展起来的算法,相对而言是比较新的一种方法,它克 .5 拟牛顿法(Broyden 方法) 实验基本原理 牛顿迭代法每迭代一次,计算当前一步的 Jacobi 矩形阵的逆矩阵,计算量还是比较大, 而简化牛顿法不失为一种方法,但有时候计算效果不能令我们满意。为了不每次迭代都计算 逆矩阵,我们设法构造 H k 逼近 f'(x k ) 的逆矩阵。这样迭代公式为 x k +1 = x k .H k y k )(Δx k ) H k k T  k +1 ( Δx k ) H k y k  其中 Δx k = x k +1 . y k = f(x k +1 ) .MATLAB 248 数值分析与应用 图 6.H k f(x k ) 选取不同的 H k 就得到各种类型的拟牛顿方法。这里主要介绍 Broyden 方法,Broyden 方法 的基本迭代格式为: x k +1 = x k .H k f(x k )  T H = H + (Δx k .x k .4 简化牛顿法的迭代收敛情况 实验 6.

1      初值取 y = 0.1 实验操作指导 光盘:\实验视频\chapter6.rar\6-5.MATLAB 249 数值分析与应用 服了牛顿法需要求导数和求逆的缺点,是目前实际使用非常有效的一种方法。 实验目的与要求 l 理解拟牛顿法的基本思想,比牛顿法改进的是针对什么问题。 l 理顺迭代公式,知道其中的量在计算过程中如何实现。 l 会正确使用作者给出的 Broyden 方法函数,如果可能尽量自己编写程序。 l 在编程时需要给出控制参数,比如误差容限,让用户可以自行根据需要进行调整。 l 对计算结果作出合理分析,绘制出方程组根的变化图象。 l 给出实际迭代次数。 l 给出迭代中的 H 矩阵变化情况。 l 控制最大迭代次数,防止不收敛时候,进入无穷循环状态。 实验内容及数据来源 计算非线性方程组 1  3 x − cos( yz ) − 2 = 0  2 2  x − 81( y + 0.m.1 。      z   −0.m.m.df2.m 步骤一:编写拟牛顿法的方法函数。 打开 Editor 编辑器,输入以下语句: %拟牛顿法 计算非线性方程组 %输入 x0 为迭代初值 .1) + sin z + 1.exe 光盘:\实验代码\chapter6\ broyden.broyden_main.06 = 0  10π − 3 e − xy + 20 z + =0 3   x   0.f2.

x1=x0-H0*f2(x0). %设置初始误差 使之可以进入循环 wucha=0. n=n+1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %这一段相当重要 技巧性也比较强 请体会 temp_x0=x0. end x=x1. %x1 的更新 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %更新 H 矩阵 H=H1. 以文件名 broyden.MATLAB 250 %tol 为误差容限 数值分析与应用 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x. dx=x1-x0. fenzi=dx'*H0*y. %data 用来存放中间数据 data(:.n. %循环迭代 while (wucha>tol)&(n<20) &(n<500) wucha=norm(x1-x0). x1=temp_x0-H1*f2(temp_x0).tol) if nargin==1 tol=1e-5.m 保存。 步骤二:编写方程组函数与 Jacobi 矩阵函数。 (1)打开 Editor 编辑器,输入以下语句: %拟牛顿法的方程组函数 %注意方程组输出为列向量函数 . n=1. y=f2(x1)-f2(x0). H0=inv(H0).data]=broyden(x0. x0=x1.1. %是标量 H1=H0+(dx-H0*y)*(dx)'*H0/fenzi.n)=x1. end H0=df2(x0).

1) plot(data(1.1]'.:)). z=x0(3). f2=x^2-81*(y+0.1 -0.axis(v). %用于控制坐标轴范围 使图象更清晰 plot(data(2. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(3.MATLAB 251 function F = f2(x0) x=x0(1).n.3) plot(data(3.06.1 0.1) cos(z) -y*exp(-x*y) -x*exp(-x*y) 20].f3]. 以文件名 df2.:)).m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %拟牛顿法的主函数 x0=[0.:)).f2. [x.1.1.05]. F=[f1. f1=3*x-cos(y*z)-1/2. f3=exp(-x*y)+20*z+(10*pi-3)/3.1.title('x1 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(3. f=[3 z*sin(x*y) y*sin(y*z) 2*x -162*(y+0. z=x0(3). y=x0(2).title('x3 在迭代中的变化') %以下为数据存储部分 数值分析与应用 .2) v=[1 n -0.m 保存。 (2)打开 Editor 编辑器,输入以下语句: %Jacobi 矩阵 %方程输出为(3,3)维 方阵 function f=df2(x0) x=x0(1). y=x0(2).data]=broyden(x0).05 0.1)^2+sin(z)+1. 以文件名 f2.title('x2 在迭代中的变化') %抽取第三个变量数据 subplot(3.

2359878e-001 表 6.2359783e-001 5.2359878e-001 7.5。 迭代序列 x1 x2 x3 1.5 拟牛顿法迭代序列 为了更清晰的迭代序列随时间变化情况,实验中还给出了迭代序列的收敛图象,方程的 有 3 个根,所以是三条曲线,如图 6.0000000e+000 5.523598775598299 迭代次数为 n= 7 实验结论 本节的 Broyden 方法和接下来两个实验的 DFP,BFS 方法都是相当重要的方法,因为 其有广泛的实在用性,所以为了增强对比,这几个实验,我们采用三维方程组,增加了复杂 度。其实这里给出的方法,不限于方程的维数,这几个方法可以直接应用于工程实践,所以 这几个实验都是本章中相对难一点实验,也是比较重要的实验。 计算机输出结果来看,经过 7 次迭代已经收敛。为了强调计算效果,以及分析实验情况, 我们用数据记录了每次迭代的结果,如表 6.0000000e+000 0.0000000e+000 5.18322554219361e-015 -0.0000000e+000 5.2357450e-001 4.2317450e-001 3.0000000e-001 3.0000000e+000 2.5。 .2211591e-011 -5.0000000e+000 5.0000000e+000 0.6228628e-007 -5.0000000e+000 4.0000033e-001 3.1832255e-015 -5. save data1.0000000e+000 5.0000000e-001 2.2359877e-001 6.0000000e+000 0. a=[num data'].0000000e-001 1.txt a –ascii 以文件名 broyden_main.MATLAB 数值分析与应用 252 num=(1:n)'.0000665e-001 8.4957485e-004 -5.5 2.m 保存。 步骤四:运行程序。在命令窗口输入: >>clear >>broyden_main 回车得到结果: 计算结果为 x= 0.6894065e-005 -5.7357473e-003 -5.9997948e-001 8.

1303e-006 7.0052313  0.058888 0.0030565 -0.0015358  0.061549 0.6229e-005  0.002197   0.566e-006 1.00013882 -0.0018733 -0.3334 -9.8572e-005 -6.5939e-005  0.0001651 0.050141  H5 =    0.0043549  0.00015286 0.33333 1.0015427 0.MATLAB 253 数值分析与应用 图 6.0044891 0.0068284 -0.001024 -0.0013047 0.0020213 -0.030948 0.06182 0.0072323 -0.0015358 0.05011   0.33333 2.0018906 -0.2362e-005  0.050181   H 4 =    0.053288 0.33334 6.7181e-005  0.0082432   0.0015593 -0.001705 -0.1072e-006    H1 =  -0.0016605 -0.0021086 -0.050134  .6195e-005 1.030869 0.5 拟牛顿法解非线性方程组根的收敛情况 在迭代过程中,H 矩阵的更新是非常重要的,这也是拟牛顿法的重要思想所在,在接下 来的两个实验里,我们都会对这个 H 做分析。分析矩阵 H,对于拟牛顿法是很有价值的。 下面给出 7 个 H 值的变化情况。  H 0 =    0.4284e-006    H 2 =  0.33333 2.050352     H3 =    0.33333 -1.1423e-007 1.0014679 0.050008  0.034e-005 1.

H k y k ) (  T H k +1 = H k + ( Δx k .1651e-009 1.050134  列出这 7 个矩阵,这样便于深入的研究拟牛顿算法。 当然这样做的另外一个更重要原因, 就具体的实验而言,方便读者在做程序设计时候比较自己的程序, 尤其是在程序调试过程中, 单步执行时候,比较这些矩阵是否与上面列出的差别很大,而这些都是与编程语言的选择无 关的。 实验 6.0018927 -0. y k = f(x k +1 ) .H k y k ) H k y k  其中 Δx k = x k +1 .6243e-005  0.0015429 0.0043439  0.x k .0072804 -0.f(x k ) 实验目的与要求 l (1)理解 Broyden 迭代公式中各量的基本关系,熟悉每一个量的含义。 l (2)理顺其递推序列产生情况,哪些量是标量,分析在迭代中是否进行了矩阵求逆运 算。 l (3)能够使用 MATLAB 或者其他高级语言编程实现 Broyden 方法,并能用之解决非 线性方程组。 l (4)在程序设计时,要考虑迭代次数的限制,以及可控制计算精度参数问题。 l (5)把计算序列图象化。 l (6)控制最大迭代次数,防止进入死循环。 l (7)给出实际迭代次数。 l (8)分析计算中的 H 矩阵问题。 .H k y k ) ( Δx k .6 Broyden 第二方法 实验基本原理 Broyden 第二方法和 Broyden 第一方法一样,推导起来比较麻烦一些,要求读者有良好 的数学修养,这里就不再介绍推导过程,直接给出计算公式。有兴趣的读者可以参考《现代 应用数学手册-计算与数值分析卷》 (清华大学出版社 2005 年) 。 x k +1 = x k .33333 5.061833 0.H k f(x k )  T Δx k .MATLAB 254  H 6 =    数值分析与应用 0.

end H0=df2(x0).1 实验操作指导 光盘:\实验视频\chapter6. %循环迭代 数值分析与应用 .tol) if nargin==1 tol=1e-5.data]=broyden2(x0.f2.m 步骤一:编写 Broyden 第二公式方法函数。 打开 Editor 编辑器,输入以下语句: %Broyden 第二方法 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x.m.df2. broyden2_main.m.m.1) + sin z + 1.MATLAB 255 实验内容及数据来源 采用 Broyden 第二公式计算非线性方程组 1  3 x − cos( yz ) − 2 = 0  2 2  x − 81( y + 0.n.exe 光盘:\实验代码\chapter6\broyden2. H0=inv(H0). n=1.06 = 0  10π − 3 e − xy + 20 z + =0  3  x   0. %设置初始误差 使之可以进入循环 wucha=0.rar\6-6.1.1 。      z   −0. x1=x0-H0*f2(x0).1      初值取 y = 0.

f3].06. temp3=(dx-H0*y)'*y.n)=x1. temp2=(dx-H0*y)'. dx=x1-x0. f2=x^2-81*(y+0. x1=temp_x0-H1*f2(temp_x0).MATLAB while 256 (wucha>tol)&(n<20) wucha=norm(x1-x0).m 保存。 步骤二:编写方程组及其 Jacobi 矩阵函数。 (1)打开 Editor 编辑器,输入以下语句: %broyden 第二方法的方程函数 function F = f2(x0) x=x0(1). f1=3*x-cos(y*z)-1/2.1)^2+sin(z)+1. f3=exp(-x*y)+20*z+(10*pi-3)/3. 以文件名 broyden_2. %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%第二公式的构造 %%H1 矩阵更新 temp1=dx-H0*y. z=x0(3). %%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% %这一段相当重要 temp_x0=x0. 以文件名 f2. %标量 H1=H0+temp1*temp2/temp3. %x1 的更新 %%%%%%%%%%%%%%%%%%% %更新 H 矩阵 H=H1. F=[f1. y=x0(2).m 保存。 (2)打开 Editor 编辑器,输入以下语句: 数值分析与应用 . %data 用来存放中间数据 data(:. end x=x1. n=n+1.f2. x0=x1. y=f2(x1)-f2(x0).

1 -0. save data1.1. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(3. z=x0(3).05].m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %broyden 第二方法的主函数 x0=[0.3) plot(data(3.1) plot(data(1.data]=broyden_2(x0).:)).2) v=[1 n -0.1]'.1) cos(z) -y*exp(-x*y) -x*exp(-x*y) 20]. a=[num data'].1 0. 以文件名 df2. f=[3 z*sin(x*y) y*sin(y*z) 2*x -162*(y+0.m 保存。 步骤四:运行程序。 在命令窗口输入: >>clear >> broyden2_main 回车得到 计算结果为 x= 数值分析与应用 .05 0. %用于控制坐标轴范围 使图象更清晰 plot(data(2.txt a -ascii 以文件名字 broyden2_main.:)).MATLAB 257 function f=df2(x0) x=x0(1).n.title('x1 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(3.1. y=x0(2).1. [x.title('x2 在迭代中的变化') %抽取第三个变量数据 subplot(3.axis(v).title('x3 在迭代中的变化') %以下为数据存储部分 num=(1:n)'.:)).

2359878e-001 表 6.0000000e-001 7.0000000e-001 1.5236 迭代次数为 n= 6 实验结论 从计算结果来看对上一个实验同样的问题, Broyden 第二公式方法迭代 6 次就已经收敛, 下面给出这六次迭代的数据序列情况,见表 6.5 1.6 Broyden 第二公式方程根的收敛情况 从图 6.0000000e+000 5.2359878e-001 6.0000001e-001 4.0000000e+000 5.0000264e-001 2.4760173e-009 -5.6 中可以看出,整个迭代过程还是比较平稳的,在迭代进行到第二次时候,已经 .6 Broyden 第二公式计算的中间数据 在程序设计中,直接给出了绘制出方程的根随时间变化的代码,所以在运行主程序时, 已经直接绘制出了方程的根随迭代序列增加的变化情况,如图 6.9558509e-006 -5.0000000e+000 5.0000000e+000 5.6。 图 6.0000000e+000 2.0000000e+000 0.0000000e+000 5.6。 迭代序列 x1 x2 x3 1.0000000e+000 0.3408e-011 -0.2408597e-001 3.2359468e-001 4.1481596e-004 -5.3408232e-011 -5.0006960e-001 2.0000000e+000 0.2359859e-001 5.MATLAB 数值分析与应用 258 0.8214778e-003 -5.

0014853 0.33333 3.034e-005 1.00020338  0.33333 -1.049945   H5 =    0.0021228 -0.050008   H1 =    0.782e-005  0.0014011 0.0666e-005  0.04959   H 2 =    0.0021784 -0.0021193 -0.9456e-005 2.7  H 0 =    0.33333 3.049945  DFP 方法 实验基本原理 DFP 方法全称是 Davidon-Fletcher-Powell 方法,也是拟牛顿法的一种。Broyden 方法及 其第二方法是秩 1 的拟牛顿方法,而本实验要介绍的 DFP 方法与下一个实验的 BFS 方法是 是秩 2 的校正方法。 这里给出迭代格式 .7667e-005  0.0011717  0.33333 5.060344 0.0016605 -0.84e-007 1.MATLAB 259 数值分析与应用 比较稳定,说明了这一方法的有效性。 为了方便读者在做程序设计时候,有对比资料,这里同样给出了每次变化的 H 矩阵。 当然,不同的人需求不同,如果是专门从事数值研究的人,可能对这些数字的内容比较有兴 趣,去分析它们的变化情况。而这里主要是方便一般的读者在程序调试时候,有可以比较的 参考资料。 实验 6.0016612 -0.0015399 0.0021194 -0.049945   H3 =    0.00028757  0.0023763 -0.00015286 0.049947   H 4 =    0.030869 0.0021086 -0.001661 -0.7999e-006 1.061766 0.05587 0.0017018 -0.0628e-007 1.00014195  0.7181e-005  0.00025734 5.33333 0.0028604 0.766e-005  0.00014883  0.0015468 0.0015358  0.33333 4.8434e-005  0.048437 -0.001664 -0.061859 0.001661 -0.

H k f(x k )  T Δx k )( Δx k ) H k y k y k T H k (  T H k +1 = H k + yk Hk yk Δx y ( ) k k  其中 Δx k = x k +1 .06 = 0  10π − 3 e − xy + 20 z + =0  3 实验操作指导 光盘:\实验视频\chapter6.rar\6-7.m .MATLAB 260 数值分析与应用 x k +1 = x k .1) + sin z + 1.f2.f(x k ) 其推导原理这里略去,有兴趣的读者可以阅读《数值计算方法(下) 》 (南京大学编 科学出 版社 林成森)或者《数值计算方法》(冯康等 国防工业出版社 1978 年) 实验目的与要求 l 了解 DFP 的计算流程,熟悉每一个量的含义,知道这些量在计算时如何实现。 l 会正确使用本实验中给出的代码,最好能自己编写出代码。 l 对于程序设计时候需要考虑控制的参数,给出最大迭代次数,防止不收敛情况。 l 给出可以控制精度的参数,用户可以根据需要调整。 l 限制最大迭代次数,防止进入无穷循环。 l 给出实际迭代次数。 l 分析方程的根是否有效。如果有效,分析其迭代序列过程。 l 给出每一次迭代得到的 H 矩阵。 实验内容及数据来源 计算非线性方程组 1  3 x − cos( yz ) − 2 = 0  2 2  x − 81( y + 0.df2.x k .m.exe 光盘:\实验代码\chapter6\ DFP. y k = f(x k +1 ) .m.DFP_main.m.

n. end H0=df2(x0). %循环迭代 while (wucha>tol)&(n<20) wucha=norm(x1-x0). %DFP 的 H 更新方法 H1=H0+dx*dx'/(dx'*y)-H0*y*y'*H0/(y'*H0*y).data]=DFP(x0. %%%%%%%%%%% %这一段技巧性比较强 temp_x0=x0. end x=x1. %设置初始误差 使之可以进入循环 wucha=0.1. n=n+1. x0=x1. n=1. %data 用来存放中间数据 data(:. x1=x0-H0*f2(x0). x1=temp_x0-H1*f2(temp_x0).tol) if nargin==1 tol=1e-5. %x1 的更新 数值分析与应用 . y=f2(x1)-f2(x0). H0=inv(H0). dx=x1-x0.n)=x1.MATLAB 261 步骤一:编写 DFP 方法函数。 打开 Editor 编辑器,输入以下语句: %拟牛顿法 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x. %%%%%%%% %更新 H 矩阵 H=H1.

m 保存。 (2)打开 Editor 编辑器,输入以下语句: function f=df2(x0) x=x0(1). f2=x^2-81*(y+0.1.title('x2 在迭代中的变化') %抽取第三个变量数据 subplot(3.1) cos(z) -y*exp(-x*y) -x*exp(-x*y) 20].1 0.f3]. f=[3 z*sin(x*y) y*sin(y*z) 2*x -162*(y+0.:)).1. 以文件名 f2. f3=exp(-x*y)+20*z+(10*pi-3)/3.1) plot(data(1.05].title('x1 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(3.1 -0.06. F=[f1. %用于控制坐标轴范围 使图象更清晰 plot(data(2. 以文件名 df2.data]=DFP(x0). z=x0(3).m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %DFP 的主函数 x0=[0. y=x0(2).1)^2+sin(z)+1.n. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(3.05 0. f1=3*x-cos(y*z)-1/2.title('x3 在迭代中的变化') 数值分析与应用 .2) v=[1 n -0.axis(v).:)).1.3) plot(data(3. y=x0(2). [x.1]'.m 保存。 步骤二:编写方程组函数与方程组的 Jacobi 矩阵。 (1)打开 Editor 编辑器,输入以下语句: %DFP 方法的方程函数 function F = f2(x0) x=x0(1).MATLAB 262 以文件名字 DFP.f2. z=x0(3).:)).

030242 0.034e-005 1.0027621  0.33333 -1.26125878261035e-012 -0.0016605 -0.0023296 -0.33444 -0.00081677 -0.050579    .00034443 0.MATLAB 263 数值分析与应用 %以下为数据存储部分 num=(1:n)'.0015358  0.0023144 0.050008  0.m 保存。 步骤四:运行程序。 在命令窗口输入: >>clear >> DFP_main 回车得到: 计算结果为 x= 0. a=[num data'].txt a –ascii 以文件名 DFP_main.52359877559838 迭代次数为 n= 7 实验结论 关于 DFP 方法,在一般的工科数值分析教材中都没有介绍,很多院校数学系的教材也 省略了这部分内容。 从计算结果来看,和 Broyden 方法就算一样,也是迭代 7 次收敛。计算结果和上一个实 验的结果比较接近,都是精度很不错的结果。当然如果要更高精度可以在程序中调整参数。 把自己需要的精度,放在调用函数时候的参数中。如果不去设置精度问题,我们的程序里默 认了一个参数。 和上一个实验一样,为了查看在计算过程中 H 矩阵的性能情况,这里给出了 H 矩阵的 变化序列。这对读者在程序调试时,深入程序内部变量变化情况提供了比较好的参考依据。  H 0 =    0.00015286 0.0021086 -0.7181e-005  0.00037419    H1 =  0.499999999999997 -2.030869 0. save data1.

9999972e-001 2.7352e-006    H 6 =  9.0000000e+000 5.0015962 -0.0016341 -0.1877e-007 5.04981   0.2713e-005 -0.0014736 -0.2783e-005 -0.9919291e-001 8.0000000e+000 5.2233579e-001 3.00062413 -0.062134 -0.0000000e+000 0.9806602e-005 -5.0000000e+000 4.33329 1.001562   0.4324e-005 -9.1848e-005 -0.7854e-005    H 4 =  2.049902    0.6921e-006 -2.7332e-005    H5 =  1.9623267e-003 -5.0015452   0.2359785e-001 5.2359877e-001 6.0014615 0.059197 -0.0013475 0.2357195e-001 4.2359878e-001 7.2612588e-012 -5.001548 0.0927e-005    H 2 =  0.33329 -3.001558 0.0000785e-001 7.049823    为了查看迭代效果,这里还给出了计算的迭代序列,这是在程序设计中完成的,包括对 变量的记录,以及计算完成后变量的保存,如表 6.7 DFP 方法的迭代序列 为了分析迭代效果的变化趋势,这里给出了迭代序列的变化曲线,如图 6.33328 6.MATLAB 数值分析与应用 264 0.05012   0.0000000e+000 5.061677 -0.5772e-007 -3.0000000e-001 -2.1249693e-010 -5.0000000e+000 0.0000000e-001 5.0000000e+000 4.0000000e+000 5.00010262 -0.2359878e-001 表 6.0015425   0.054495 -0.0000000e-001 3.4669e-005 -0.0015357 -0.061796 -0.0015391 0.0013636   0.7。可以看到 在迭代 3 次以后,根就比较平稳不再有大的起伏,向更高的精度逼近,所以说 DFP 方法也 是非常优秀的一种算法。 .00015772 -0.0000000e+000 0.33338 4.33424 -2.0014467   0.00022332    H3 =  0.7913103e-008 -5.4009242e-004 -5.0000000e+000 2.049929    0.7。 迭代序列 x1 x2 x3 1.

7 DFP 方法在迭代过程中根的收敛情况 实验 6. y k = f(x k +1 ) .H k y k ( Δx k ) .x k .f(x k ) 至于迭代过程的推导, 这里不再给出,如果读者需要可以参考前面两个实验中提到的参考书。 DFP 方法和 BFS 方法因为相对于其他方法比较复杂一些,所以在一般的数值分析教材中都 .( Δx k ) y k T H k  H k +1 = H k + T ( Δx k ) y k   T µ k = 1 + y k H k y k T  ( Δx k ) y k  其中 Δx k = x k +1 .MATLAB 265 数值分析与应用 图 6.8 BFS 方法 实验基本原理 上一个实验原理部分提到 BFS 方法也是秩 2 的校正方法。BFS 是 Broyden-Flether-Shanno 三位作者提出来的方法,也是拟牛顿法的方法范畴。前面已经说明拟牛顿法是实用价值和理 论价值都比较高的算法,前面介绍的三个算法都是比较优秀的。很多数值计算表明 BFS 方 法比 DFP 方法有更好的数值稳定性,是拟牛顿法里比较成功的算法。 这里给出迭代格式   x k +1 = xk .H k f(x k )  T T µk Δx k ( Δx k ) .

1      初值取 y = 0.BFS_main.MATLAB 266 数值分析与应用 不讲这两个算法,所以读者要找参考书的话,可能要找相对专业性比较强一些的参考书。前 面提到三本书都是不错的参考书,但是都有点过于数学化。 实验目的与要求 l 理解 BFS 算法的计算流程,清楚迭代公式中每一个量在计算中的具体实现问题。 l 分析在迭代过程中是否进行了矩阵求逆运算,是否达到拟牛顿算法的基本思想。 l 会正确使用作者给出的算法函数,最好能自己编写出程序。 l 对于程序设计中,要控制最大迭代次数,防止计算不收敛情况,程序设计时候要有可以 控制精度的参数,这样用户可以自己根据需要进行调整。 l 对计算结果作出合理的分析,画出根的变化曲线。 l 给出每步计算后的 H 矩阵情况。 l 限制最大迭代次数,防止不收敛时,计算机进入无限循环状态。 实验内容及数据来源 计算非线性方程组 1  3 x − cos( yz ) − 2 = 0  2 2  x − 81( y + 0.m.rar\6-8.f2.exe 光盘:\实验代码\chapter6\ BFS.1 实验操作指导 光盘:\实验视频\chapter6.df2.1 。      z   −0.m.1) + sin z + 1.m 步骤一:编写 BFS 方法函数。 打开 Editor 编辑器,输入以下语句: %BFS 法 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 .m.06 = 0  10π − 3 e − xy + 20 z + =0  3  x   0.

1. %data 用来存放中间数据 data(:. 以文件 BFS. H1=H0+(u*dx*dx'-H0*y*dx'-dx*y'*H0)/(dx'*y). dx=x1-x0.tol) if nargin==1 tol=1e-5. 数值分析与应用 . x1=temp_x0-H1*f2(temp_x0).data]=BFS(x0. y=x0(2). %设置初始误差 使之可以进入循环 wucha=0. %x1 的更新 %%%%%% %更新 H 矩阵 H=H1. x1=x0-H0*f2(x0).m 保存。 步骤二:编写方程组与 Jacobi 矩阵函数。 (1) 打开 Editor 编辑器,输入以下语句: function F = f2(x0) x=x0(1). end x=x1. x0=x1. n=n+1.MATLAB 267 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x. y=f2(x1)-f2(x0). end H0=df2(x0).n. %%%%%%%%%%% %这一段比较重要 temp_x0=x0.n)=x1. n=1. H0=inv(H0). u=1+y'*H0*y/(dx'*y). %循环迭代 while (wucha>tol)&(n<20) wucha=norm(x1-x0).

1) plot(data(1.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %BFS 的主函数 x0=[0.title('x1 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(3. save data1.f2.title('x2 在迭代中的变化') %抽取第三个变量数据 subplot(3. a=[num data'].:)). f1=3*x-cos(y*z)-1/2.05 0.data]=DFP(x0).title('x3 在迭代中的变化') %以下为数据存储部分 num=(1:n)'. f3=exp(-x*y)+20*z+(10*pi-3)/3.06. 以文件名 f2.1) cos(z) -y*exp(-x*y) -x*exp(-x*y) 20]. 以文件名 df2.2) v=[1 n -0.f3].m 保存。 数值分析与应用 .MATLAB 268 z=x0(3).m 保存。 (2)打开 Editor 编辑器,输入以下语句: function f=df2(x0) x=x0(1). y=x0(2). disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(3. f2=x^2-81*(y+0.1.n.1.1 -0.:)).1 0. [x.3) plot(data(3. F=[f1. %用于控制坐标轴范围 使图象更清晰 plot(data(2.txt a –ascii 以文件名 BFS_main.1.1]'. z=x0(3).1)^2+sin(z)+1.:)).axis(v). f=[3 z*sin(x*y) y*sin(y*z) 2*x -162*(y+0.05].

7531e-005 -4.049997    0.0015816 -0.00010594    H3 =  0.0015426   0.0015475 -0.050581    0.7181e-005  0.00078724 -0.0021086 -0.034e-005 1.0027722   0.00017794 -0.059196 -0.4773e-005 -0.5196e-006    H 4 =  2.0014875 0.03018 0.1978e-006 -0.054489 -0.0013458 0.00037497    H1 =  0.33444 -0.0023344 -0.1055e-006 -2.43062354656595e-013 -0.00033801 0.523598775598313 迭代次数为 n= 7 实验结论 如原理部分叙述 BFS 方法和上一个实验 DFP 方法基本原理比较类似,也属于拟牛顿方 法。因为在迭代格式过程中的一些参数选取不同就得到不同的迭代格式。 许多数值计算实践表明, 本实验介绍的 BFS 方法相对于 DFP 方法有更好的数值稳定性。 和前面的两个实验一样,这里也给出了计算中 H 的变化情况。  H 0 =    0.33332 2.050008  0.030869 0.0016605 -0.MATLAB 269 数值分析与应用 步骤四:运行程序。在命令窗口输入: >> clear >> BFS_main 回车得到: 计算结果为 x= 0.0014668   0.061672 -0.33331 6.0646e-005    H 2 =  0.00015286 0.049886    .00015821 -0.0015358  0.0013616   0.002328 0.049833    0.3338 2.0015396 0.499999999999998 -7.0010797 -0.33333 -1.

0000000e-001 1.8 BFS 方法在迭代过程中根的变化序列 与前面的实验一样,为了分析根的收敛情况,这里给出了根随迭代序列增加的变化图象, 如图 6.9919127e-001 8.061966 -0.8 中给出了方程的根在迭代过程中的变化情况。 迭代序列 x1 x2 x3 1.9835755e-003 -5.33333 -2.0000000e+000 5.0000000e+000 0.092e-007 -1.0000000e-001 5.0000000e+000 0.0000000e+000 0.0000736e-001 7.5962e-005    H 6 =  3.2359878e-001 7.728e-009 1.0000001e-001 2.0000000e+000 5.1285e-005 -0.9840067e-005 -5.4306235e-013 -5.0016163 -0.2357209e-001 4.0000000e+000 5.0000000e+000 2.001573 -0.049876    可以看出,H 矩阵在每次迭代过程中变换一般都不会很大。当然,我们很关心的可能还 是方程的根的问题,在表 6.2233116e-001 3.0015443 0.2359815e-001 5.0000000e+000 5.0000000e-001 -7.8。 对比前面两个实验,可以看出这三种方法根的收敛情况都比较类似。我们也有意的采用 了从相同的初值迭代。三者的变化趋势都比较类似,收敛速度也相当,应该说都是实用性很 强的算法。但有数值研究表明,BFS 方法数值稳定性更强一些。 .0015454 0.6809e-005    H5 =  -8.049928    0.5636976e-010 -5.MATLAB 数值分析与应用 270 0.0000000e+000 4.33331 -4.061781 -0.2359878e-001 表 6.0015509   0.2475693e-008 -5.0000000e+000 5.2359877e-001 6.2965e-006 -0.0015443   0.4194500e-004 -5.

xn ) = 0  ( . x2 .L .L . p k = p(x k ) 就是所谓的最速下降法。最速下降法是大范围收敛的,h 在某 xk 出沿最速下降方向 p k (x) = -gradh(x k ) .9 最速下降法 实验基本原理 最速下降算法是最优化的一种思想,除了最速下降法以外还有其他一些下降方法。最速 下降算法是下降算法里最古老也最基础的一种算法。 对于非线性方程组  f1 ( x1 .8 数值分析与应用 BFS 方法在迭代过程中根的收敛情况 实验 6. x2 . .MATLAB 271 图 6.L . ) = 0 xn  f 2 x1 x2  M   f n ( x1 . xn ) = 0 实际上,我们求得的数值解一般不是严格的解。理论上讲,如果我们找的解是这个方程组的 严格解的话,那么代入方程组后,每一个方程都会等于零。但是因为解有误差,那么我们把 有误差的解代入方程后,右边不会严格等于零,而是等于一个很小的数,这里通俗的称为误 差。当然我们希望所有的这 n 个误差越小越好。 但是如何找到衡量这 n 个数误差“小”的标准呢?简单的想,如果这 n 个数和最小,是 否可行?实际上是不行的,比如我们期望两个数都在 0 附近,而一个是正的很大,一个是负 的很大,那么相加和虽然很小,但却不是我们想要的结果。 一个可以行的方法是希望这 n 个误差的平方和最小,这个思想很重要,虽然在这里看来 很简单。要使误差的平方和最小,我们可以把平方和用一个代价函数表示出来,令其为 h 。 那么 h = f12 + f 2 2 + L + f n 2 如果给定一个初值 x0 ,我们希望找到一条路线每一次 x 迭代以后代价函数都会比原来小一 些。 xk +1 = x k + λ p k λ 称为步长因子。 p k 的不同,就构成了不同的下降算法。如果取 p(x) = -gradh(x).

exe 光盘:\实验代码\chapter6\ tidu_fuhao.m.m.java.zuisu.MATLAB 272 数值分析与应用 下降的最快。但是整个过程而言,并不是这样,尤其在比较接近解的时候往往会变的非常缓 慢。有时候可以用最速下降法作为牛顿法或者拟牛顿法的初步近似。 实验目的与要求 l 理解最速下降法的数学原理与意义。 l 会使用符号工具箱运算出梯度函数,不熟悉的请阅读 MATLAB 在高等数学中的应用一 章。 l 能够实现最速下降方法,并处理非线性方程组。 l 能够对计算结果作出合理分析,并把结果绘制成用图象表现出来。 l 给出实际迭代次数。 l 限制最大迭代次数,防止无穷循环问题。 实验内容及数据来源 采用最速度下降法计算非线性方程组 2  x − 2 x − y + 0.rar\6-9.5 = 0  2 2  x + 4 y − 4 = 0 并对计算结果做出一些分析。 实验操作指导 光盘:\实验视频\chapter6.delphi 要使用梯度算法,对一般 用户可能必须依靠手工推导公式。而 MATLAB 则可以轻松实现这些方法。如果对梯度推导 不熟悉的,可以阅读第二章。 打开 Editor 编辑器,输入以下语句: %计算函数 f1 的梯度 %符号算法,用于推导计算 syms x y .zuisu_main.f1_tidu.m 步骤一:推导梯度公式。如果使用一般的语言如 c/c++.m.

001*f1_tidu(x0).MATLAB 273 数值分析与应用 f1=x^2-2*x-y+0. -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3] 其中 h 为代价函数,grad 为代价函数的梯度,由此我们便可以编写梯度函数。 步骤三:编写梯度函数。 打开 Editor 编辑器,输入以下语句: %选择输出为行向量 function f=f1_tidu(x0) x=x0(1).n. .5. grad=simple(grad) 以文件名 tidu_fuhao. end x1=x0-0.m 保存。 步骤四:编写最速下降法的方法函数。 打开 Editor 编辑器,输入以下语句: %最速下降法计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x. f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3]'.m 保存。 步骤二:运行符号推导程序。在命令窗口输入: >> clear >> tidu_fuhao 回车得到结果: h= (x^2-2*x-y+1/2)^2+(x^2+4*y^2-4)^2 grad = [ 8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2. h=f1^2+f2^2 grad=[diff(h. y=x0(2).data]=zuisu(x0.tol) if nargin==1 tol=1e-4.y)]. n=1.x). 以文件名 f1_tidu.diff(h. f2=x^2+4*y^2-4.

'-. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(2.21412 迭代次数为 n= 426 0.1. 以文件名 zuisu.001*f1_tidu(x0). %data 用来存放中间数据 data(:.:).m 保存。 步骤六:运行程序。 在命令窗口输入: >> clear >> zuisu_main 回车得到 计算结果为 x= -0.99395 数值分析与应用 .title('x 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(2.MATLAB 274 %迭代过程 while (norm(x1-x0)>tol)& (n<2000) x0=x1.n. [x.title('y 在迭代中的变化') 以文件名 zuisu_main.n)=x1.').1) plot(data(1. %0.:).').data]=zuisu(x0). n=n+1.001 为步长因子 x1=x0-0.1.2) plot(data(2.'-.m 保存。 步骤五:编写主函数。 打开 Editor 编辑器,输入以下语句: %下降算法的主函数 x0=[0 0]. end x=x1.

0241131e-003 3.7139312e-003 9.9395128e-001 表 6.9。 迭代序列 x y 1.9396497e-001 4.2400000e+002 -2.1800000e+002 -2.0079954e-002 5.0481054e-003 4.0000000e+000 8.1340130e-001 9.0080559e-003 2.1318305e-001 9.9395459e-001 4.0000000e+000 0.1600000e+002 -2.4166837e-002 8.0000000e+000 4.6221643e-002 9.2119567e-002 6.1307193e-001 9.2600000e+002 -2.8283847e-002 1.5744368e-003 6.MATLAB 数值分析与应用 275 实验结论 如基本原理所说,最速下降法对初值要求并不是很高,但是往往在靠近初值时迭代非常 慢。 当然如果开始就把步长因子取的非常小的话,那么开始时候会非常慢,其实只要理解最 速下降法的基本原理,这些都是可以理解的。 从计算结果来看总共迭代了 426 次,这已经是次数非常多的迭代了,考虑到篇幅问题, 我们只给出了一部分数据,就是起步时候时候的前几步,与迭代近收敛时候的情况。如表 6.9396676e-001 4.1412493e-001 9.9 最速下降法的迭代数据 如前面分析,如果步长取很小,则一开始会非常慢的靠近真值,但是如果步长取很大的 话,在靠近真值时可能会来回振荡难以收敛。所以在实际使用中,还可以对最速度下降算法 做改进,改进的一个着眼点就是步长因子。可以设计在开始时候步长放长,然后逐步变小。 .8799151e-003 7.1329283e-001 9.2200000e+002 -2.9395293e-001 4.0000000e+000 1.9395798e-001 4.0000000e+000 1.0000000e+000 0.1251735e-002 M M M 4.0000000e+000 1.1900000e+002 -2.2100000e+002 -2.1653552e-003 4.0000000e+000 1.1392439e-001 9.1382229e-001 9.2300000e+002 -2.9395970e-001 4.1700000e+002 -2.0000000e+000 2.0000000e+000 6.0540079e-003 3.9396857e-001 4.1402527e-001 9.2000000e+002 -2.9395628e-001 4.9396144e-001 4.1371894e-001 9.0000000e+000 1.2500000e+002 -2.3375795e-003 5.1361434e-001 9.9396319e-001 4.2582483e-003 8.1350846e-001 9.

9 中,给出了最速下降法的收敛情况图象,为了保证在迭代中能收敛,所以在本实验 里,一开始步长取的比较小,从图中也可以得到反映。 实验 6.9 最速下降法的收敛情况 在图 6.10 带松弛因子的牛顿下降法 实验基本原理 本实验要介绍的带松弛因子的牛顿下降法和上一实验的最速下降法都属于下降法范畴。 在上一个实验的基本原理叙述中,如果取 p(x) = −f '(x)−1 f(x) 则称为牛顿方向。如果步长因子取 λ = 1 ,则这时候的下降算法就是牛顿算法。所以,牛顿 法也是一种下降算法。只是这样有了最优化的含义,意义更为丰富。 如果我们选择搜索方向为牛顿方向,这时迭代公式为 x k +1 = x k − λk f '(x k )−1 f(x k ) 关于 λk ,要求它满足 min f ( x k − λk f '(x k )−1 f(x k ) ) = f ( x k − λk f '(x k )−1 f(x k ) ) λ 这样牛顿法的变形,称为带松弛因子的牛顿法。 实验目的与要求 .MATLAB 276 数值分析与应用 图 6.

m. 数值分析与应用 .rar\6-10.tol) if nargin==1 tol=1e-10.m. %下降因子 namda=0.data]=new_ton(x0. end x1=x0-f1(x0)/df1(x0).5 = 0  2 2  x + 4 y − 4 = 0 分析计算数据。 实验操作指导 光盘:\实验视频\chapter6.m 步骤一:编写下降法的方法函数。 打开 Editor 编辑器,输入以下语句: %下降法计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x.MATLAB 277 l 理解牛顿下降法的原理。 l 能够实现该方法。 l 理解下降算法在最优化中的含义。 l 对计算结果作出合理分析。 l 给出计算序列,并绘制成图象。 l 方法函数要可控制精度。 l 设置最大迭代次数,防止无穷循环问题。 l 给出实际迭代次数信息。 实验内容及数据来源 用本实验介绍的方法计算非线性方程组 2  x − 2 x − y + 0.xiajiang_main. n=1.f1.m.8.exe 光盘:\实验代码\chapter6\ xiajiang.n.df1.

MATLAB 278 %迭代过程 while (norm(x1-x0)>tol) &(n<500) x0=x1.n)=x1.1.1) plot(data(1. 以文件名 f1. 以文件名 xiajiang.title('x 在迭代中的变化') 数值分析与应用 .5. f=[f1 f2]. x1=x0-namda*f1(x0)/df1(x0).n. end x=x1. x=x0(1). %data 用来存放中间数据 data(:. y=x0(2). f=[2*x-2 -1 2*x 8*y].data]=xiajiang(x0). y=x0(2). f2=x^2+4*y^2-4.:).'-.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %基于最优化下降算法的主函数 x0=[1 1].'). n=n+1. [x. f1=x^2-2*x-y+0. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(2.m 保存。 步骤二:编写方程函数以及其 Jacobi 矩阵函数。 (1)打开 Editor 编辑器输入以下语句: %基于最优化下降算法的 方程函数 function f=f1(x0) x=x0(1).m 保存。 (2)打开 Editor 编辑器输入以下语句: %基于最优化下降算法的 jacobi 矩阵 function f=df1(x0). 以文件名 df1.

0000000e+000 2.1241089e-001 1.22221455507441 0.2233594e-001 9.0000000e+000 -9.0000000e+001 -2.3419360e-003 3.0000000e+000 -1.2225024e-001 9.2000000e+001 -2.0867994e-001 1.9622182e-001 1.9381336e-001 .2678878e-001 9.0000000e+000 -2.1000000e+001 -2.0000000e+000 9.1379207e+000 7.0000000e+000 -4.993808418606753 迭代次数为 n= 25 实验结论 在本章中,用两个实验介绍了下降算法。一般而言下降算法使用性来说,比拟牛顿算法 要差一些,如上一个实验所言,有时候用来作为迭代初值。 但是下降算法的思想是很有意义的,而且比较简单,容易实现。就本实验而言,MATLAB 的输出已经给出了计算结果,总共迭代了 25 次。下面给出迭代的中间数据,供读者参考, 如表 6.4000000e+001 -2.').1102150e+000 5.9448708e-001 1.0000000e+000 0.3639580e-001 1.MATLAB 数值分析与应用 279 %抽取 data 中的第二个变量数据 画出其变化曲线 subplot(2.title('y 在迭代中的变化') 以文件名字 xiajiang_main.2433962e+000 3.9386581e-001 1.0029638e+000 9.0311720e+000 8.'-.2262648e-001 9.2) plot(data(2.0000000e+000 -2.0000000e+000 -2.10 所示。 迭代序列 x y 1.9400479e-001 1.6066196e-001 1.0000000e+000 0.m 保存。 步骤四:运行程序。 在命令窗口输入: >> clear >> xiajiang_main 回车得到: 计算结果为 x= -0.4374303e+000 6.2360243e-001 9.1.3895442e+000 4.1351822e+000 2.2222504e-001 9.9382525e-001 1.8924528e+000 -2.:).3000000e+001 -2.0000000e+000 -3.

9380987e-001 1.9380842e-001 2.MATLAB 数值分析与应用 280 1.2221456e-001 9.2221463e-001 9.2000000e+001 -2.2221546e-001 9.2221456e-001 9.8000000e+001 -2.2221456e-001 9.9380843e-001 2.9380842e-001 2.1000000e+001 -2.7000000e+001 -2.9380842e-001 2.9380842e-001 2.0000000e+001 -2.9380842e-001 表 6.5000000e+001 -2.10 带松弛因子的牛顿下降法的中间数据 为了了解在迭代过程中方程组两个根的变化情况,在图 6.4000000e+001 -2.2221763e-001 9.9380842e-001 2.9000000e+001 -2.10 中给出了根的变化图形。 可以看到在迭代尹始方程组两个根的起伏都比较大,大约在迭代 6、7 次以后渐趋平稳。 图 6.2221456e-001 9.9380884e-001 1.6000000e+001 -2.9380846e-001 1.2221482e-001 9.2221456e-001 9.5000000e+001 -2.11 共轭梯度法(Fletcher-Reeves 方法) 实验基本原理 共轭梯度法属于最优化的范畴,但是如前面所叙述,我们定义了代价函数之后,就把非 线性方程转化为最优化问题。 最速下降法与牛顿下降法在下降算法系列中,各有优、缺点,而共轭梯度算法是这两种 方法的一个折中考虑。 .9380854e-001 1.10 带松弛因子的牛顿迭代法的根的收敛情况 实验 6.2221458e-001 9.2221456e-001 9.3000000e+001 -2.

5 = 0  2 2  x + 4 y − 4 = 0 迭代初值取 [ x.1] 。 实验操作指导 .MATLAB 281 数值分析与应用 共轭梯度法系列中,而有许多算法,本实验介绍的 Fletcher-Reeves 方法就是其中一种, 下面给出计算方法。 在最速下降实验中,迭代形式可以表示为: p k = -g k + β k p k −1 其中 p k 为搜索方向, g k 是目标方程函数的梯度。在 Fletcher-Reeves 算法中 gkT gk βk = g k −1T g k −1 那么整个计算流程是 x k +1 − x k = α k p k  p 0 = g 0 p = -g + β p k k k −1  k 实验目的与要求 l 理解共轭梯度法方法的基本思想。 l 理清楚在计算流程中,各个量的含义是什么,如计算这些量。 l 程序设计中会灵活调整相关参数。 l 程序设计有误差控制选择参数。 l 防止进如死循环。 l 给出实际迭代次数。 l 给出计算序列,并用图形表现出来。 实验内容及数据来源 采用 Fletcher-Reeves 方法计算非线性方程组  x 2 − 2 x − y + 0. y ] = [ 0.

while (wucha>tol)&(n<1000) p0=-gEf_tidu(x0). end x1=x0-0. %data 用来存放中间数据 data(:.001*gEf_tidu(x0). n=1.m.001*p1.m. f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3]. p1=p0+beta*p0.tol) if nargin==1 tol=1e-4.gEf_tidu. end x=x1. 以文件名 gongE. y=x0(2). x0=x1.1.gongE_main. x1=x0+0.rar\6-11. beta=gEf_tidu(x0)'*gEf_tidu(x1)/(gEf_tidu(x0)'*gEf_tidu(x0)).n)=x1.m 步骤一:编写 Flechter-Reeves 方法函数。 打开 Editor 编辑器,输入以下语句: %共轭梯度法 Fletcher-Reeves 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x.MATLAB 282 光盘:\实验视频\chapter6. wucha=norm(x1-x0).m 保存。 步骤二:编写方程函数的梯度函数。 打开 Editor 编辑器,输入以下语句: %共轭梯度法梯度函数 %选择输出为列向量 function f=gEf_tidu(x0) x=x0(1). n=n+1. %迭代过程 wucha=0.n.exe 光盘:\实验代码\chapter6\ gongE.data]=gongE(x0. 数值分析与应用 .

axis(v).1) plot(data(1. subplot(2.:).MATLAB 283 数值分析与应用 以文件名 gEf_tidu.1.'-. save data1.'). disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(2.title('x 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 %设置坐标范围 v=[0.data]=gongE(x0).1. [x.txt a -ascii 以文件名 gongE_main.n.1.'-.5. a=[num data'].0.21832 0.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %共轭梯度算法的主函数 x0=[0 1]'.2) plot(data(2.title('y 在迭代中的变化') %以下为数据存储部分 num=(1:n)'.n.:).').5].m 保存。 步骤四:运行程序。 在命令窗口输入: >> gongE_main 回车得到: 计算结果为 x= -0.11 给出了计算序列。 .99388 迭代次数为 n= 177 实验结论 从计算结果来来,在计算中总共迭代了 177 次。计算效果基本能够接受。为了分析根的 迭代变换情况,表 6.

9335708e-001 M M M 1.0000000e+000 -2.7000000e+002 -2.9388299e-001 1.1734180e-001 9.1769059e-001 9.9388666e-001 1.7100000e+002 -2.9361637e-001 9.7200000e+002 -2.7300000e+002 -2.0000000e+000 -1.11。 图 6.0000000e+000 0.9389050e-001 1.7500000e+002 -2.8692522e-003 9.7400000e+002 -2.11 共轭梯度算法的计算数据 为了从数据中获得更多的计算信息,程序设计中直接给出了数据的图形表现,如图 6.0000000e+000 -1.9386635e-001 8.1746094e-001 9.9345447e-001 1.0000000e+000 -3.0000000e+000 -2.1821760e-001 9.9423617e-001 7.1780124e-001 9.1811733e-001 9.3920550e-002 9.3059150e-002 9.1831544e-001 9.0000000e+000 -1.9388856e-001 1.9387949e-001 表 6.7600000e+002 -2.MATLAB 数值分析与应用 284 迭代序列 x y 1.1747431e-002 9.9552198e-001 5.1801455e-001 9.1757717e-001 9.0000000e+000 0.9340214e-002 9.1790921e-001 9.9388122e-001 1.9657466e-001 4.0000000e+000 2.0000000e+001 -3.6800000e+002 -2.9476871e-001 6.11 共轭梯度法计算的根的收敛情况 从图形中可以看出,在迭代一开始 y 很快接近收敛值,并且整个过程非常平稳,没有很 大的起伏。而 x 则缓慢的逼近收敛值,可以看出计算效果基本还是能够接受的。 近几十年来兴起的人工神经网络计算问题赋予了最优化问题新的内涵,关于计算中 α k .6900000e+002 -2.0348566e-002 9.9388481e-001 1.9321055e-003 9.9389452e-001 1.9803395e-001 3.0000000e+000 -3.9389660e-001 1.7700000e+002 -2.0000000e+000 -7.6728306e-002 9.9389249e-001 1.5570238e-002 9.

12 Polak-Ribiere 方法 实验基本原理 上一个实验中,提到对于 β k 的取值问题不同,就得到不同的共轭梯度算法。其中比较 著名的有 Fletcher-Reeves 方法,Hestenes-Stiefel 方法和本节要介绍的 Polak-Ribiere 方法。这 里给出 Polak-Ribiere 方法的算法,对于 Hestenes-Stiefel 方法就不在实验中给出,基本原理 和本实验类似,只是 β k 取值不同而已,我们会给出算法,有兴趣的读者可以自己在计算机 上实现。 对于 Polak-Ribiere 方法, βk = (g k − g k −1 )T g k g k −1T g k −1 其他步骤和 Fletcher-Reeves 方法相同。 对于 Hestenes-Stiefel 方法有 (g k − g k −1 )T g k βk = (g k − g k −1 )T p k −1 实验目的与要求 β k ,并熟悉整个计算流程。 l 会计算 l 程序设计中会灵活调整相关参数。 l 程序设计有误差控制选择参数。 l 防止进如死循环。 l 给出实际迭代次数。 l 给出计算序列,并用图形表现出来。 实验内容及数据来源 计算非线性方程组 .MATLAB 285 数值分析与应用 问题,我们在程序中采用了一个合适的量,这个量是已知结果测试出来的。如果有神经计算 知识,可以把这个量定义为一个学习因子,通过在迭代中学习获得比较优的取值。 实验 6.

%%%%%%%%%%%%%%%%%%%%%% %误差与 x 的更新位置很重要 wucha=norm(x1-x0). n=1. n=n+1. %p 更新 p1=p0+beta*p0.m.data]=polak_ribi(x0. while (wucha>tol)&(n<1000) p0=-gEf_tidu(x0).1] 。 实验操作指导 光盘:\实验视频\chapter6. 数值分析与应用 .5 = 0  2 2  x + 4 y − 4 = 0 迭代初值取 [ x.tol) if nargin==1 tol=1e-4.001*p1. end x1=x0-0. %bega 的计算 beta=dgef'*gEf_tidu(x1)/(dgef'*gEf_tidu(x0)). %迭代过程 wucha=0. y ] = [ 0.m 步骤一:编写 Polak-Ririere 方法函数。 打开 Editor 编辑器,输入以下语句: %共轭梯度法 Polak-Ririerel 计算非线性方程组 %输入 x0 为迭代初值 %tol 为误差容限 如果缺省 默认为 10 的-10 次方 %data 用来存放计算的中间数据便于计算收敛情况分析 function [x. %%%%%%%%%%%%%%%%%%%%% x1=x0+0.1.exe 光盘:\ 实验代码\chapter6\ polak_ribi.n.MATLAB 286 2  x − 2 x − y + 0.rar\6-12.gEf_tidu.m. dgef=gEf_tidu(x1)-gEf_tidu(x0). polak_main.001*gEf_tidu(x0). x0=x1.

end x=x1. subplot(2.1.1) plot(data(1.').m 保存。 步骤四:运行程序。 数值分析与应用 . 以文件名 gEf_tidu.txt a –ascii 以文件名字 polak_main.m 保存。 步骤三:编写主函数程序。 打开 Editor 编辑器,输入以下语句: %Polak-Ribiere 算法的主函数 x0=[0 1]'. 以文件名 ploak_ribi.5. [x.'-. disp('计算结果为') x disp('迭代次数为') n %抽取 data1 中第一个变量数据 画出曲线 subplot(2.').'-. f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3].m 保存。 步骤二:编写方程函数的梯度函数。 打开 Editor 编辑器,输入以下语句: %共轭梯度法梯度函数 %选择输出为列向量 function f=gEf_tidu(x0) x=x0(1). a=[num data'].1.0.2) plot(data(2. y=x0(2).5].:).MATLAB 287 %data 用来存放中间数据 data(:. save data1.n.axis(v).:).1.data]=polak_ribi(x0).n.title('y 在迭代中的变化') %以下为数据存储部分 num=(1:n)'.n)=x1.title('x 在迭代中的变化') %抽取 data 中的第二个变量数据 画出其变化曲线 %设置坐标范围 v=[0.

1839789e-001 9.0000000e+000 -5.0000000e+000 -3.9388517e-001 1.0000000e+000 0.7600000e+002 -2.0000000e+000 -9.0000000e+000 -2.1788766e-001 9.9387976e-001 1.9291109e-001 M M M 1.7000000e+002 -2.9383066e-001 6.9389096e-001 1.9559545e-001 4.9290464e-001 1.12。 迭代序列 x Y 1.9388332e-001 1.9640854e-002 9.9388705e-001 1.9453740e-001 5.MATLAB 数值分析与应用 288 在 MATLAB 命令窗口输入: >>clear >> polak_main 计算结果为 x= -0.0408197e-002 9.9337535e-001 7.2184 0.1830087e-001 9.6807149e-002 9.7733968e-003 9.99388 迭代次数为 n= 176 实验结论 从计算结果来看,总共迭代了 176 次,就本实验方程而言和 Fletcher-Reeves 方法计算效 果相当。如前面所说,这里给出了计算中间数据情况,如表 6.9310126e-001 8.9295761e-001 9.0000000e+000 0.1820140e-001 9.7200000e+002 -2.1809942e-001 9.2659226e-003 9.0000000e+000 -2.9388152e-001 1.1777775e-001 9.1766507e-001 9.12。 .2690309e-002 9.0000000e+000 -1.0000000e+001 -3.0000000e+000 2.7300000e+002 -2.3206935e-002 9.9711330e-001 3.7100000e+002 -2.9387804e-001 表 6.0000000e+000 -1.0000000e+000 -1.6135684e-002 9.6900000e+002 -2.12 Polak-Ririere 方法计算数据 因为篇幅问题,这里只给出了迭代起始与近收敛情况的中间数据。为了更清楚的看出方 程的根随时间变化情况,在程序设计中,直接给出了绘制出根变化的图象,如图 6.3985321e-002 9.7500000e+002 -2.7400000e+002 -2.9388898e-001 1.1799486e-001 9.

MATLAB 289 图 6.x0..fval.12 可以看出,方程中的 y 在前一两次以后精度迅速得到提高。从表 6.....output.12 中也有 反映,表 6.12 数值分析与应用 Polak-Ririere 方法计算的根的收敛情况 从图 6.) 其中的函数 fun 可以为向量函数,就是可以解决方程组问题。其中的参数设置和前面介 绍过的 fzero 类似,但是要比 fzero 复杂一些。虽然有很多不同,但是 MATLAB 参数设置风 格相对比较统一,需要的时候查看帮助文件就可以很轻松的解决问题。关于参数设置问题, 可以参考非线性方程数值方法的 fzero 实验一节。 至于 MATLAB 设计这些算法的思想,如果不是专业搞数值研究的可以不必深究,如果 需要深入研究的话,可以阅读 MATLAB 公司给出的一些专业的数值领域的文献。 下面通过实验示范 fsovle 的使用方法。 实验目的与要求 .12 中,y 的起步初值为 0,迭代一次以后迅速接近收敛值。因此中间多次迭代主 要耗费在 x 的校正上面,但是从图象看出 x 迭代还是比较平稳的。 实验 6.) [x.x0) x = fsolve(fun.jacobian] = fsolve(.exitflag.fval.13 MATLAB 中的 fsovle 函数方法 实验基本原理 前面的实验中介绍了一些求解非线性方程组的计算方法。但有时候我们需要快速有效的 计算非线形方程或方程可以使用 MATLAB 中内置的 fsovle 方法。其基本语法为: x = fsolve(fun.output] = fsolve(..) [x.fval.exitflag] = fsolve(.fval] = fsolve(..options) [x..exitflag.) [x.

f2=x^2-81*(y+0. y=x0(2). 以文件名 f2.1) + sin z + 1.f2.MATLAB 数值分析与应用 290 l 会正确使用 fsolve 函数方法,快速有效的处理非线性方程组问题。 l 能够正确设置计算中的参数问题,并根据需要作出合理调整。 l 对计算结果做出合理的分析。 l 如果需要查看计算效果问题,知道如何从输出参数中获得信息。 实验内容及数据来源 (1) 计算非线性方程组 1  3 x − cos( yz ) − 2 = 0  2 2  x − 81( y + 0.A2 =  7 6 8 实验操作指导 光盘:\实验视频\chapter6.m.06. z=x0(3).06 = 0  10π − 3 e − xy + 20 z + =0 3  (2) 计算已知道 A 是 2 × 2 矩阵。计算非线性矩阵方程 5 A3 .f2.m.m 保存。 步骤二:编写主函数文件。 .1)^2+sin(z)+1.rar\6-13.m. F=[f1. f3=exp(-x*y)+20*z+(10*pi-3)/3.f3].exe 光盘:\实验代码\chapter6\fsolve_main. 步骤一:编写方程函数。 打开 Editor 编辑器,输入以下语句: function F = f2(x0) x=x0(1).f3. f1=3*x-cos(y*z)-1/2.

TolFun.m 在后面追加以下内容: 0 0.m 保存。 步骤五:编写该部分的主函数。 打开 fsolve_main.77209358298569e-011 flag = 1 out = iterations: 4 funcCount: 20 algorithm: 'trust-region dogleg' firstorderopt: 2.25582886312259e-008 1.1 -0.76727247110874e-010 -0.MATLAB 数值分析与应用 291 打开 Editor 编辑器,输入以下语句: %非线性方程组 x0 = [0.523598775577995 fx = 2.8].1]. % 初值 [x.5 其中 x 为我们想要的计算结果,其他的输出在结论部分分析。 步骤四:编写矩阵方程函数。 打开 Editor 编辑器,输入以下语句: function F = f3(A) F = A^3-A^2-[5 6. 以文件名 f3.x0) 以文件名 fsolve_main.m 保存。 步骤三:运行程序。在命令窗口输入: >> clear >> fsolve_main 回车得到: Optimization terminated: first-order optimality is less than options.866025403141975 20 .500000000007109 7.out.13264961246296e-011 -1.03435432237348e-007 message: [1x76 char] jaco = 3 0 1 -16.jaco] = fsolve(@f2.flag.1 0.7.2000013440847 0 -0.fx. x= 0.

[A.39013497618595 1.56180107022419e-008 exitflag = 1 排版时候,关于非线性方程组的部分省略,因为前面已经给出输出结果了。而 A 是我 们想要的计算结果。 实验结论 第一题中输出 fx 表示得到结果时着时候原方程函数的值,可以看出都非常接近零,系 统默认的精度还是不错。当然我们也可以自己去修改参数,以达到更高的精度要求。Flag=1 表示成功收敛于计算给出的向量 x,out 是计算的一些基本信息,jaco 还给出了 jacobi 矩阵 结果。 在第二次输出时 A 就是我们要求的矩阵。可以把 A 代到原矩阵方程检验,会发现结果 是不错的,而 Fval 是这时候的矩阵函数方程取值,flag=1 表示计算成功收敛于以下的结果 0.62182413888026 1.62182413888026 1.'off').MATLAB 数值分析与应用 292 %非线性矩阵方程 x0 = ones(2.19440836402418e-008 -4.21544415327458e-008 5.31073043319452e-008 6.x0.options) 保存文件。 步骤六:运行程序。在命令窗口输入: >>clear >>clc >>fsolve_main 回车得到 A= 0.exitflag] = fsolve('f3'.2). % 初值 options = optimset('Display'.856455826826365 1.55152331491535 Fval = -7.Fval.39013497618595 1.856455826826365 A= 1.55152331491535  总之,fsolve 在计算非线性方程时候是很有效的函数,遇到这类问题时可以考虑使用。 实际上 fsolve 也可以处理线性方程,不过 MATLAB 建议在处理线性方程时不要使用这个函 数。 .

000188. z ) = (1.4239605. y .000388 ) 。 c) 采用拟牛顿法计算非线性方程组 . y .5.2374711) 。 b) 采用牛顿迭代法计算非线性方程组。  x − 5 y 2 + 7 z 2 + 12 = 0  3 xy + xz − 11x = 0 2 yz + 40 x = 0  迭代初值取 ( x. 6.1.7776719.1. 5. −5. y .1) 。 参考答案: ( x.000432. z ) = (1. z ) = (1.5. y .MATLAB 293 数值分析与应用 本章小节 在这一章中给出了非线性方程组的计算方法,主要可以分为以下几类基本方法:不动点 迭代法、牛顿迭代法、拟牛顿迭代法和下降算法。每种算法都有自己的特点与不足,总体而 言实用性比较高的牛顿迭代法和拟牛顿法,牛顿法虽然比拟牛顿法迭代速度要快一些,但是 计算量相对而言要大很多。 最后几个实验看到,还可以把非线性方程组求根的问题转化为最优化求极值问题,这是 很有意味的。二十世纪中叶以来,一度掀起了神经网络计算的热潮,其中就需要用到很多最 优化的知识,而这些计算方法的改进,理所当然的也可以应用到非线性方程组的计算问题上 来。但目前来说这些算法有时候还不能满足我们的需求。 因此,本章中拟牛顿算法是重点。当然,掌握 MATLAB 内置函数对于快速分析、处理 问题也是相当重要的。 上机操作题 a) 采用高斯-塞德尔迭代计算以下非线性方程组。  xy = z 2 + 1  2 2  xyz + y = x + 2 e x + z = e y + 3  迭代初值取 ( x.0 ) 。 参考答案: ( x. z ) = (1. −4.1.

y ) = ( 0. y . y ) = (1.3699228 ) 。 d) 采用最速下降法计算非线性方程组 2 2 4 x + y − 4 = 0   x + y − sin ( x − y ) = 0 迭代初值选 ( x.4966114.998607.MATLAB 294 x2 + y2 + z3 = 1  2 2 2 x + y − 4 z = 0  x2 2 3 − 4 y + z = 0 迭代初值选 ( x.1055305) 。 数值分析与应用 .1. 0 ) 。 参考答案: ( x.7851969. y . z ) = ( 0. 0. 0. −0. z ) = (1.1) 。 参考答案: ( x.

MATLAB 295 数值分析与应用 第七章 矩阵特征值及特征向量 特征值问题是数值代数基本问题之一,无论在理论上还是在工程技术上都非常重要。特 征值与特征向量理论发展也是相当丰富的。在这一章节中,主要介绍标准的特征值问题 Ax = λ x 的数值方法,在最后一个实验中介绍了广义特征值问题 Ax = λ Bx 对于具体的计算方法,这一章主要给出了经典的并行之有效的矩阵特征值计算方法。对 于一些效率比较低下的算法,这里不再给出。关于数值特征值与特征向量问题,需要一些准 备知识,读者可以翻阅线性代数与矩阵分析理论。 实验 7.1 乘幂法计算主特征值及其特征向量 实验基本原理 在许多工程与物理应用问题中,往往并不需要计算出矩阵的全部特征值与特征向量,而 只需要计算出矩阵的按模最大的特征值及其特征向量,通常按模最大的特征值称为主特征 值。对于这一类的问题采用乘幂法通常比较合适,乘幂法计算简单而且对于稀疏矩阵比较有 效,但有时候收敛速度不是太快。 设 A∈ R n× n 有 n 个线性无关的特征向量,主特征值满足 λ1 > λ2 ≥ λ3 ≥ L ≥ λn ,其 对应的特征向量为 x1 . L. x n ,那么对于任意的非零初始向量 v 0 = u 0 ,按照下面的方法 构造向量序列 v0 = u0 ≠ 0 v k = Au k −1 uk = vk max ( v k ) 则有 lim u k = k →∞ x1 max ( x1 ) lim max( v k ) = λ1 k →∞ max( v) 表示向量 v 中绝对值最大的分量。这个收敛定理,就已经包含了乘幂法计算主特征 值的计算方法。 . x 2 .

%x0 的向量长度 .exe 光盘:\实验代码\chapter7\mifa.MATLAB 296 数值分析与应用 实验目的与要求 l 理解乘幂法的基本思想。 l 熟悉计算流程,对于乘幂法的一些变形形式要知道。 l 在程序设计中灵活处理自己需求的变量。 l 程序设计时如果迭代了非常多的步数以后如果还没收敛要给出警告信息。 l 对计算结果做出合理分析。 l 把迭代计算的中间结果给出来,分析迭代收敛情况。 l 把迭代过程中的特征值与特征向量的变化情况用图形表现出来,以达到分析的目的。 实验内容及数据来源 设  −1 2 1  A =  2 -4 1 1 1 -6  计算 A 的主特征值与主特征向量。 实验操作指导 光盘:\实验视频\chapter7.tol.data_q]=mifa(A.m 步骤一:编写幂法计算主特征值方法函数。 打开 Editor 编辑器,输入以下语句: function [namda. temp=length(A).m.time.q.rar\7-1.data_na.mifa_main.x0) %namda 主特征值 %q 主特征向量 %time 迭代次数 %A 要计算的矩阵 %x0 迭代初值 如果缺省系统自动默认为 1 向量 %tol 误差容限 如果缺省 默认为 10 的-7 次方 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 if nargin==1 tol=1e-7.

data_q(:. q=u. time=time+1.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %幂法计算主特征值与主特征向量 主函数 数值分析与应用 . %如果缺省迭代初值 向量取 1 end %初值 m1=0. %data_na 用于存储中间数据 以分析计算效果 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 data_na(time.1)=m. %如果缺省迭代初值 向量取 1 end if nargin==2 temp=length(A).1). [vmax. u=x0.i]=max(abs(v)). m=v(i).1). time=0. end namda=m. %循环迭代 while time<500 v=A*u. %如果满足误差要求 则跳出循环迭代 u=v/m.MATLAB 297 x0=ones(temp. 以文件名 mifa. if abs(m-m1)<tol break. %x0 的向量长度 x0=ones(temp.time)=u. end m1=m.

MATLAB 298 %08 年 7 月 19 日 a=[-1 2 1 2 -4 1 1 1 -6].data_q]=mifa(a.2.data_na.2.data_na].xls temp1 -ascii save data_mifa_q. [namda.2) plot(data_q(:. %输出主特征向量 temp2=[n2.1)) title('主特征向量第一个分量') grid subplot(2.2. %n2 为数组 n2=(1:n1)'.data_q].2.2)) title('主特征向量第二个分量') grid subplot(2. %输出 主特征值 temp1=[n2. %保存计算的中间数据 save data_mifa_na.1) plot(data_na) title('主特征值变化曲线') grid subplot(2.3) plot(data_q(:. disp('主特征值为') namda disp('主要特征向量为') v disp('迭代次数为') time %用于输出数据 n1=length(data_na).1e-8).xls temp2 –ascii subplot(2.4) 数值分析与应用 .time.v.

0461455030428652 -0.374921093002661 1 迭代次数为 time = 61 程序运行后,注意查看当前工作路径下的文件,因为数据比较多以 xls 文件形式显示输 出数据。 实验结论 −7 在程序设计中,如果不输入计算精度参数则默认为 10 。在具体的应用中我们给出要 求计算精度控制在10−8 。在这样的情况下,实际迭代次数 61 次。 为了看出在计算中的主特征值与其特征向量的变化情况,在程序中考虑了中间数据的输 出情况,计算的中间数据如表 7.m 保存。 步骤三:运行主程序。 在命令窗口输入: >>clear >>clc >>mifa_main 回车得到 主特征值为 namda = -6.42106659021352 主要特征向量为 v= -0.3)) title('主特征向量第三个分量') grid 以文件名 mifa_main.1。 .MATLAB 数值分析与应用 299 plot(data_q(:.

4210664872 -6.2500000000 -6.2207792208 -6.00E+00 1.00E+00 1.266233770 -0.285874630 -0.179803370 -0.4210663225 -6.107044960 -0.374920320 -0.4210663931 -6.00E+00 1.160000000 0.045929019 -0.374920520 -0.125584860 -0.2 中给出了幂法计算的主特征向量的收敛情况。 迭代序列 1 2 3 4 5 6 7 8 9 10 M 50 51 52 53 第一个分量 -0.4210665590 -6.00E+00 1.4210664467 -6.045454545 -0.00E+00 1.4210665180 -6.149414040 -0.1 幂法计算主特征值变化情况 因为篇幅原因这里给出前后 10 次迭代的特征值变化情况,从表 7.00E+00 1.1600000000 -6.2640918580 -6.00E+00 .00E+00 1.046145905 -0.4210665825 表 7.00E+00 1.1 中可以看出收敛速 度并不是特别的快。在表 7.3485852626 -6.081673107 M -0.0000000000 -6.500000000 -0.177429170 -0.2991168139 -6.374920670 第三个分量 1.046145803 -0.374920070 -0.00E+00 1.046146040 -0.4210665724 -6.046145725 第二个分量 0.00E+00 1.4210661064 -6.218162840 -0.00E+00 M 1.3268432052 -6.320000000 -0.223000410 -0.00E+00 1.250000000 0.092707914 -0.119313450 -0.00E+00 1.306977710 M -0.4210662293 -6.4210665413 -6.258456310 -0.MATLAB 数值分析与应用 300 迭代序列 1 2 3 4 5 6 7 8 9 M 51 52 53 54 55 56 57 58 59 60 61 主特征值 -4.3655012665 M -6.

2 主特征向量的迭代收敛情况 从表 7.00E+00 1.MATLAB 数值分析与应用 301 54 55 56 57 58 59 60 61 -0.00E+00 1.00E+00 1.046145529 -0.1 与表 7.00E+00 1.1 中给出了特征值与特征向量的收敛情况。 图 7.046145509 -0.1 中可以看出,虽然收敛的速度不是非常快,但是计算效果比较稳定,基本没有 数据波动情况。 关于迭代条件的误差判断问题,可以选择相对误差方法,也可以选择绝对误差,在程序 设计我们采用了选择绝对误差方法,这样便直接知道计算结果与要求的误差范围有多大。当 然这一条件可以根据需要而定。判断标准还可以以特征值对应的特征向量作为依据,既以两 次迭代前后特征向量之间的误差向量范数作为与误差容限比较,如果误差向量范数小于给定 的误差容限,则停止迭代。 .046145544 -0.374920980 -0.374921020 -0.046145667 -0.046145622 -0.374920860 -0.046145563 -0.374921080 1.374920780 -0.046145589 -0.2 主要是方便读者在做程序设计时候可以比对自己的程序。为了更直 观的反映计算效果,在图 7.374921060 -0.00E+00 1.00E+00 1.2 可以看出用幂法计算主特征向量在精度比较高的情况下,并不是特别的快,当 然这与要计算的矩阵性质有关系。 给出表 7.00E+00 表 7.374921040 -0.046145518 -0.00E+00 1.1 幂法计算主特征值与特征向量的收敛情况。 从图 7.374920930 -0.

2.2 乘幂法的 2 范数单位化方法 实验基本原理 在用幂法计算时候迭代过程中 u k = Av k −1  uk  v k = m k  mk 是防止 λ1 > 1 时, v k 分量会趋于无穷,而 λ1 < 1 时, v k 分量会趋于零,这个过程叫规 范化或者单位化,实际上这个过程也可以取 2 范数。 下面给出伪代码算法: for k=1. L k k− z ( ) = Aq ( 1) q (k ) = z( z( k) k) 2 H λ ( k ) =  q( k )  Aq ( k ) end 当然在实际的编程时候,我们不会简单机械的运算一定的次数,而是给出满足精度的 判断标准。当运算满足一定精度以后迭代停止,同时如果迭代足够多的次数以后如果还没收 敛要给出警告信息。 实验目的与要求 l 理解本实验基本原理部分伪代码的含义。 l 能够准确的把伪代码编程实现。 l 能够给出合理判断迭代停止条件。 l 如果迭代超过一定次数还没收敛,要停止迭代,防止进入死循环。 l 对计算结果做出恰当的分析。 l 把计算中迭代过程里的中间变量以图象形式表现出来,便于分析问题。 实验内容及数据来源 .MATLAB 数值分析与应用 302 实验 7.

time=0.x0) %namda 主特征值 %q 主特征向量 %time 迭代次数 %A 要计算的矩阵 %x0 迭代初值 如果缺省系统自动默认为 1 向量 %tol 误差容限 如果缺省 默认为 10 的-7 次方 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 if nargin==1 tol=1e-7.1).m. %x0 的向量长度 x0=ones(temp. %x0 的向量长度 x0=ones(temp.tol.1). temp=length(A).data_na. %如果缺省迭代初值 向量取 1 end if nargin==2 temp=length(A). %如果缺省迭代初值 向量取 1 end %初值 m1=0. u=x0.rar\7-2.data_q]=mifa_2(A.q. %循环迭代 .MATLAB 数值分析与应用 303 计算矩阵 2 A = 10 3 3 2 3 4  6 1  的主特征值及其对应的特征向量。 实验操作指导 光盘:\实验视频\chapter7.time.exe 光盘:\实验代码\chapter7\mifa_2.mifa_2_main 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: function [namda.

以文件名 mifa_2. end namda=m. if abs(m-m1)<tol break. disp('主特征值为') namda disp('主要特征向量为') v disp('迭代次数为') time %画出主特征值变化曲线 数值分析与应用 . u=v/norm(v).data_q]=mifa_2(a.MATLAB 304 while time<500 v=A*u. time=time+1.1)=m.v.:)=u. end m1=m. %data_na 用于存储中间数据 以分析计算效果 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 data_na(time. m=u'*A*u.time.data_na.1e-8).m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %采用 2 范数单位化的幂法计算主特征值方法 %主函数 a=[2 3 2 10 3 4 3 6 1]. [namda. q=u. data_q(time.

m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear >>clc >> mifa_2_main 回车得到: 主特征值为 namda = 11.5000 1.2.7500 数值分析与应用 .0000 主要特征向量为 v= 0.2.2) plot(data_q(:.4) plot(data_q(:.1)) title('主特征向量第一个分量') grid subplot(2.1) plot(data_na) title('主特征值变化曲线') grid %画出各个分量的变化曲线 subplot(2.2)) title('主特征向量第二个分量') grid subplot(2.3)) title('主特征向量第三个分量') grid 以文件名 mifa_2_main.3) plot(data_q(:.0000 0.2.2.MATLAB 305 subplot(2.

04979951 10.00002279 10.3 可以看出迭代还是比较平稳的,第一次迭代完成以后就迅速靠近 11。给出这些 计算的中间值不只是为了分析迭代收敛情况,更重要的是读者在做程序设计时候可以作为比 对资料。鉴于此,本书在编写过程中考虑读者做程序设计时会遇到的问题,尽可能的给出中 间数据。在表 7.00000001 11 表 7.470588235E+00 1.083163539E+01 11.99999376 11.00030258 10.3 中给出了主特征值随 迭带序列的变化情况。 迭代序列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 主特征值 1.588235294 0.00000013 10.527950311 1 第三个分量 0.411764706 1 0.826086957 .99890329 11.99999997 11.4 中给出了主特征值对应的特征向量随时间的变化情况。 迭代序列 1 2 第一个分量 第二个分量 0.0000017 10.99999953 11.MATLAB 数值分析与应用 306 迭代次数为 time = 18 实验结论 在要求精度为10−8 的情况下迭代 18 次就已经满足要求,在表 7.3 主特征值随迭代序列变化 从表 7.98590609 11.158385093E+01 1.00395312 10.700000000E+01 9.99991685 11.

2 主特征值及其向量的迭代变化曲线 从图 7.500011053 0.499999983 0.502004851 0.2 中给出了主特征值及其特征向量的变化曲线。 图 7.499996986 0.492761394 0.2 中直观的反应了该方法还是比较平稳的,迭代几次以后就接近收敛值并不以后 不再有大的变化。 需要注意的是,乘幂法在最大特征值与次大特征值的绝对值相差较小时,收敛会很慢, .5 0.750616681 0.749999994 0.757437751 0.50014864 0.749986749 0.5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.4 中可以看出迭代到最后两次特征向量已经满足精度需求。为了更直观的反应迭 代收敛情况,在图 7.MATLAB 数值分析与应用 307 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 0.747837306 0.5 0.749999925 0.499999999 0.500000061 0.499959477 0.500000822 0.75 表 7.75 0.750000002 0.749999001 0.750000273 0.749827131 0.4 主特征值对应的特征向量变化情况 从表 7.750048013 0.500000005 0.499999776 0.726005362 0.499455687 0.750003642 0.75000002 0.

A ) = ( Ax. x( k −1) . L 做(3)到(6) (3) y ( ) = Ax( (4) mk Ax( ( = ( x( (5) x( k ) = k k −1) k −1) k −1) . 2.1 也是同样存在的。 实验 7.3 Rayleigh 加速方法 实验基本原理 上一个实验指出乘幂法在最大特征值与次最大特征值的绝对值比较接近时往往收敛速 度会不是很快,针对这样的情况计算数学家发展了一些加速方法,本实验介绍其中比较典型 的一种加速方法,Rayleigh 加速方法。 Hermitian 矩阵 A ∈ C n×n 的 Rayleigh 商(也叫 Rayleigh-Ritz 比)是一个标量,定义为 R ( x ) = R ( x. x ) = x H Ax ( x.MATLAB 308 数值分析与应用 这一问题对于实验 7. x( k −1) ) ) y(k ) mk (6) 如果 mk − mk −1 < TOL ,跳出循环。 (7) 结束。 上面的算法已经详细的描述了计算流程,只要把这个算法翻译成程序设计语言就可以。 在第(6)步循环判断时,可以选择相对误差 mk − mk −1 < TOL mk . x ) x H x 通常 x 是待选择的向量,目的是使用 Rayleigh 商达到机值。 由此,我们可以把 Rayleigh 商应用到主特征值计算的乘幂法当中,提高乘幂法的收敛 速度。 这里直接给出 Rayleigh 加速方法的算法: (1) 任意给定 x (0) ∈ R n ,给定误差容限 TOL(小量)。 (2) 对于 k = 1.

rar\7-3.q.x0) %幂法的 Rayleigh 加速方法计算主特征值 %namda 主特征值 %q 主特征向量 %time 迭代次数 %A 要计算的矩阵 %x0 迭代初值 如果缺省系统自动默认为 1 向量 %tol 误差容限 如果缺省 默认为 10 的-7 次方 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 .mifa_ray_main.data_na.time.m 步骤一:编写 Rayleigh 加速方法的主函数。 打开 Editor 编辑器,输入以下语句: function [namda.exe 光盘:\实验代码\chapter7\mifa_ray.tol.data_q]=mifa_ray(A.MATLAB 数值分析与应用 309 当然也可以用迭代前后两次特征向量的误差向量范数作为迭代停止条件。 实验目的与要求 l 知道 Rayleigh 商的相关概念。 l 明白 Rayleigh 加速原理。 l 能够正确的编程实现加速算法,并处理相关特征值计算问题。 l 处理好迭代次数与迭代停止条件,注意不能进入死循环。 l 对结果作出分析。 l 把迭代计算中间过程用图象表现出来。 实验内容及数据来源 已知矩阵  −261 209 A =  -530 422  -800 631 -49  -98  -144  计算 A 的主特征值及其对应的特征向量。 实验操作指导 光盘:\实验视频\chapter7.m.

u=x0.MATLAB 310 if nargin==1 tol=1e-7. %如果缺省迭代初值 向量取 1 end if nargin==2 temp=length(A). u=q. %data_na 用于存储中间数据 以分析计算效果 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 data_na(time. %记次 time=time+1.:)=u. %x0 的向量长度 x0=ones(temp. %如果缺省迭代初值 向量取 1 end %初值 m1=0. end 数值分析与应用 . end m1=m.1). q=v/m.1)=m. %rayleigh 商 m=u'*v/(u'*u). if abs(m-m1)<tol break.1). data_q(time. %x0 的向量长度 x0=ones(temp. temp=length(A). %循环迭代 while time<500 v=A*u. time=0.

1)) title('主特征向量第一个分量') 数值分析与应用 .data_q]=mifa_ray(a.1e-8.1) plot(data_na) title('主特征值变化曲线') grid subplot(2.data_na. %保存计算的中间数据 save data_ray_na.dat temp1 -ascii save data_ray_q.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %幂法的 Rayleigh 加速方法计算主特征值与主特征向量 主函数 %08 年 7 月 19 日 a=[-261 209 -49 -530 422 -98 -800 631 -144].v.[1 0 0]'). [namda. %n2 为数组 n2=(1:n1)'.data_q].2) plot(data_q(:.2. %输出主特征向量 temp2=[n2.2. 以文件名 mifa_ray.MATLAB 311 namda=m.dat temp2 -ascii subplot(2. %输出 主特征值 temp1=[n2. disp('主特征值为') namda disp('主要特征向量为') v disp('迭代次数为') time %用于输出数据 n1=length(data_na).data_na].time.

2.03671977525235 3.2)) title('主特征向量第二个分量') grid subplot(2.3)) title('主特征向量第三个分量') grid 以文件名 mifa_ray_main.05507966346134 迭代次数为 time = 20 程序运行后,注意查看当前工作路径下的文件情况,会发现已经多了两个文本文件。因 为输出数据比较多,在程序设计中把输出数据以文件方式存储于两个文本文件中。 实验结论 .01835988750934 2.0000000042464 主要特征向量为 v= 1.2.m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear >> mifa_ray_main 回车得到: 主特征值为 namda = 10.4) plot(data_q(:.MATLAB 312 数值分析与应用 grid subplot(2.3) plot(data_q(:.

0632836698198 6 10.2072898264179 5 10.7191389740989 4 10.0182790359 1.0550926580 .0367069673 第三个分量 3.0347985764 2.0183269313 1.0366451496 2.0366886865 2.0006715860955 10 10.0358120756 2.0000000712513 19 10.000001295427 16 10.0551563602 3.0000000108049 表 7.0117973747 1.0363127971 2.0572609142 3.0181628202 1.0000771920262 12 10.0000004866659 17 10.0555096219 3.0597409738 3.5 中 给出了特征向量在计算过程中的中间值。 迭代序列 1 2 3 4 5 6 7 8 9 第一个分量 1.0651340996 3.5 Rayleigh 加速方法的主特征值变化情况 从表 7.MATLAB 数值分析与应用 313 从计算结果可以看出实际迭代了 20 次特征值精度已经在 10−8 。这时的主特征值为 10.0329822577 2.0020395554168 9 10.5。 迭代序列 主特征值 1 -261 2 13.0306513410 2.5 中可以看出,主特征值在一开始收敛速度是很快的,但是后面相对比较缓慢一 些。但是,一般而言要比幂法快许多。为了看出特征向量在计算中的变化情况,在表 7.0198035279698 7 10.0000035011088 15 10.0000000000 1.0000096279234 14 10.0178835697 1.0000001852133 18 10.0183465193 第二个分量 2.0172196494 1.0560641677 3.0604800100301 3 10.0002253981757 11 10.0063036760606 8 10.0552628640 3.0000269870324 13 10.0551113740 3.0156477467 1.0000000276511 20 10.0000000042464。 为了读者在做程序设计时候可以有比对资料,这里给出了迭代过程中的特征值变化情 况,如表 7.0365434722 2.

0550805294 3.6Rayleigh 加速方法特征向量变化情况 为了看出主特征值及其特征向量的变化情况,在程序中还给出了计算结果的图形输出, 如图 7.0183598650 1.0367197193 2.0367145403 2.0550818077 3.0183598841 1.0550796669 3.3。 图 7.0183577096 1.0183595357 1.0550796647 3.0367197719 2.0550800122 3.0183598311 1.0183598872 2.0183598787 1.0367197529 2.0367197664 2.0367197749 3.0550796723 3.0550849544 3.0183598863 1.0183544845 1.0367189143 2.0550797196 3.0183590115 1.3 中可以看出 Rayleigh 加速方法计算还是比较平稳的,是一种很不错的计算主特 征及其特征向量的方法。 实验 7.3 Rayleigh 加速方法计算主特征值与特征向量 从图 7.0367197740 2.MATLAB 数值分析与应用 314 10 11 12 13 14 15 16 17 18 19 20 1.0550796858 3.0550798036 3.0183597465 1.0367196356 2.4 修正的 Rayleigh 加速方法 实验基本原理 .0550796638 表 7.0367176478 2.0367194280 2.

x ) = x 中, x (k ) 2 2 = 1 时, R ( x ) = ( Ax. L 做(3)到(6) (3) y ( k ) = Ax( k −1) (4) mk = Ax( k −1) .MATLAB 数值分析与应用 315 修正的 Rayleigh 加速方法与 Rayleigh 加速方法差别不是很大,主要差别在于迭代初值 的选择,当然由此引起 Rayleigh 商计算上的一些简化,当然客观的说这减少了计算机的运 算量,在迭代过程中减少了向量点乘与与代数除法运算,从这个角度而言修正的算法也是有 意义的。 在 Rayleigh 加速方法中,当 ( x. 2.L . x( k −1) = y ( k ) (5) x( k ) = y ( k ) / y ( k ) ( ) ( ) T x( k −1) 2 (6) 如果 mk − mk −1 < TOL ,跳出迭代循环。 (7) 结束。 可以看到这几个算法差别不是特别大,当然从算法构造的出发点的思想是有意义的, 本实验中可以把可以把迭代初值直接用程序方式生成。在迭代过程中对 Rayleigh 商做一些 简化。 实验目的与要求 l 明白修正的 Rayleigh 加速方法的原理。 l 能够快速的把基本原理部分的算法用计算机编程语言实现。 l 能用编写好的程序处理相关特征值计算问题。 l 在编程中需要直接用程序生成迭代初值。 l 对计算结果作出合理分析。 l 把计算结果用图形化表示。 实验内容及数据来源 用修正的 Rayleigh 加速方法计算矩阵 . x ) 。如果在迭代过程中 用欧氏范数规范化,就是修正的 Rayleigh 加速方法,下面给出具体的算法。 (1) 给定误差容限 TOL>0 和 x (0) ∈ R 使 x( 0 ) 2 0 = 1 ,如 x( ) = 1 T (1.1) 。 n (2) 对于 k = 1.

tol. . %x0 的向量长度 x0=ones(temp.rar\7-4. temp=length(A).data_q]=mifa_ray2(A.1). %x0 的向量长度 x0=ones(temp.exe 光盘:\实验代码\mifa_ray2.time.x0) %修正的 Rayleigh 加速方法计算主特征值 %namda 主特征值 %q 主特征向量 %time 迭代次数 %A 要计算的矩阵 %x0 迭代初值 如果缺省系统自动默认为 1 向量 %tol 误差容限 如果缺省 默认为 10 的-7 次方 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 if nargin==1 tol=1e-7.MATLAB 316 数值分析与应用 1 2 3  A =  2 3 4 3 4 5  的主特征值及对应的特征向量。 实验操作指导 光盘:\实验视频\chapter7.mifa_ray2_main 步骤一:编写修正的 Rayleigh 加速方法函数。 打开 Editor 编辑器,输入以下语句: function [namda.1). end if nargin==2 temp=length(A). %如果缺省迭代初值 向量取 1 end %初值 m1=0.data_na. %如果缺省迭代初值 向量取 1 %使始向量的 2 范数为 1 %计算方法可以参考《现代应用数学手册-计算与数值分析卷》P439 清华大学出版社 x0=x0/sqrt(temp).q.

if abs(m-m1)<tol break. %记次 time=time+1. time=0.MATLAB 317 u=x0.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %修正的 Rayleigh 加速方法计算主特征值与主特征向量 主函数 %08 年 7 月 22 日 a=[1 2 3 234 3 4 5]. u=q. %循环迭代 while time<500 v=A*u. data_q(time. end m1=m. 以文件名 mifa_ray2. %data_na 用于存储中间数据 以分析计算效果 %data_na 存储主特征值中间数据 %data_q 存储主特征向量中间数据 data_na(time. 数值分析与应用 .1)=m. end namda=m. %rayleigh 商 m=v'*u.:)=u. q=v/norm(v).

data_na].time.2.3) plot(data_q(:.2.1) plot(data_na) title('主特征值变化曲线') grid subplot(2. disp('主特征值为') namda disp('主要特征向量为') v disp('迭代次数为') time %用于输出数据 n1=length(data_na). %输出 主特征值 temp1=[n2.4) plot(data_q(:.2) plot(data_q(:.MATLAB 318 [namda. %保存计算的中间数据 save data_ray2_na.2)) title('主特征向量第二个分量') grid subplot(2.2.3)) title('主特征向量第三个分量') grid 数值分析与应用 .2. %n2 为数组 n2=(1:n1)'.1)) title('主特征向量第一个分量') grid subplot(2.v.1e-8). %输出主特征向量 temp2=[n2.txt temp2 -ascii subplot(2.data_na.data_q].txt temp1 -ascii save data_ray2_q.data_q]=mifa_ray2(a.

559510214927759 0.7 中给出了主特征值随迭代序列的变化情况。 .62347538297893 主特征向量为 v= 0.559510214927759   0.385089805894758  v =  0.m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear >>clc >>>> mifa_ray2_main 回车得到: 主特征值为 namda = 9.MATLAB 319 数值分析与应用 以文件名 mifa_ray2_main.73393062396076 迭代次数为 time = 5 程序运行后,注意查看当前工作路径下的文件,在程序设计中直接把一些输出结果用文 件保存,可以用一般的文本编辑器打开。 实验结论 计算结果显示主特征值为 9.62347538297893,对应的特征向量是  0.73393062396076  从输出结果可以看到迭代 5 次已经收敛,所以说修正的加速算法还是不错的。在表 7.385089805894758 0.

733928200 0.385032501 0.6206896552 9.8。 迭代序列 1 2 3 4 5 第一个分量 0.8 主特征向量随迭代序列的变化 从表 7.371390676 0.7 主特征值随迭代序列的变化情况 从表 7.733930792 表 7.6234753339 9.4 给了我们更直观的信息,可以看出主特征值及其特征向量的各个分量在迭代一次 以后便迅速接近收敛值。可见,修正的 Rayleigh 加速方法在乘幂法中是一种不错的选择。 .4 主特征值及其特征向量变化曲线 图 7.0000000000 9.742781353 0.385093502 0.559500354 0.559510851 0.6234636872 9.559662042 0.MATLAB 320 迭代序列 1 2 3 4 5 数值分析与应用 主特征值 27.557086015 0.7 中也可以直接反映出经过一次迭代以后主特征值便迅速收敛到 9.62 附近。在计 算中还直接给出了主特征值对应的特征向量随迭代序列的变化情况,见表 8.6234753828 表 7.8 中可以看出,迭代收敛还是比较平稳的。在图 7.4 中给出了主特征值及其对应的特 征向量随迭代序列的变化曲线。 7.559510171 第三个分量 0.733968206 0.733350262 0.385973822 0.385089550 第二个分量 0.

2.5 反幂法 实验基本原理 −1 −1 非奇异矩阵 A 的逆矩阵 A 的特征值是 A 的特征值的倒数。因此 A 的主特征值的倒 数变是 A 的模数最小的特征值。由此可以构造逆迭代方法来计算矩阵按模最小的特征值及 其特征向量,以及计算对应于一个给定近似特征值的特征向量。下面给出具体的算法。 (1) 给定 x0 ∈ R n 和误差容限 TOL。 (2) 对 A 做 LU 分解使 A=LU (3) 对 k = 1.MATLAB 数值分析与应用 321 实验 7. L 做(4)到(7) (4) 计算 LUy (5) (k) = x( k −1) (L 为单位下三角矩阵,U 为上三角矩阵) ( ) mk = max y ( k ) (6) 如果 mk − mk −1 < TOL 跳出循环 (7) x( k ) = y (k ) mk (8) 结束。 ( ) k (k ) 算法中 max y ( ) 表示 y 按模最大的分量。 反幂法的收敛速度决定于 λn ,对于反幂法同样可以构造一些加速方法,如原点位移反幂 λn −1 法。 实验目的与要求 l 了解反幂法的基本思想与数学原理。 l 理解原理部分的算法的计算流程。 l 给出合理的跳出循环的条件防止进入死循环。 l 把计算中的中间数据输出,以用于分析计算效率。 l 合理分析计算结果。 l 把计算结果图象化。 .

q. %x0 的向量长度 x0=ones(temp.MATLAB 322 实验内容及数据来源 已知矩阵  2 1 0 A = 1 3 1  0 1 4  计算 A 的最小特征值及其对应的特征向量。 实验操作指导 光盘:\实验视频\chapter7.m 步骤一:编写反幂法的主函数。 打开 Editor 编辑器,输入以下语句: function [namda.x0) %反幂法计算最小特征值及其特征向量 %输入参数中 A 为线性变换的矩阵 %tol 为要求的误差容限 %x0 为迭代初值 %如果输入误差容限缺省 则默认为 10 的-7 次方 %如果输入参数中的迭代初值缺省 则默认为单位向量 if nargin==1 tol=1e-7.time.data_na.rar\7-5. %如果缺省迭代初值 向量取 1 end %如果迭代初值缺省 则默认为单位向量 if nargin==2 temp=length(A).tol. %x0 的向量长度 x0=ones(temp.1).1). temp=length(A).fanmi_main. 数值分析与应用 . %如果缺省迭代初值 向量取 1 end q = x0.data_q]=fanmi(A.m.exe 光盘:\实验代码\chapter7\fanmi.

1e-8.MATLAB 323 数值分析与应用 m = 0. else if(time==1000) disp('迭代超过 1000 次,可能不收敛'). %同时记录迭代次数,如果已经满足精度 则退出迭代 for time=1:1000 y = A\q. end end %存储中间数据 data_na(time. disp('模最小特征值为') namda disp('其对应的特征向量为') v disp('迭代次数为') . if(abs(m . namda = 1/m. data_q(time. [namda. else namda = m.data_q]=fanmi(a.:)=q. m = max(y).[1 1 1]').1)=m.v.time.namda)<eps) namda = 1/m. %m 为按模最大的分量 q = y/m. %如果迭代超过 1000 次仍然没有收敛 则退出迭代给出未收敛信息 %不再进入下一次迭代 增强程序稳定性 防止进入死循环 break.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %反幂法 计算线性变换的最小特征值与特征向量 %08 年 7 月 19 日 a=[2 1 0 131 0 1 4]. end 以文件名 fanmi. %到所需精度,退出,l 为按模的最小特征值 return.data_na. namda = 0.

%n2 为数组 n2=(1:n1)'.2.2) plot(data_q(:. %保存计算的中间数据 save data_fanmi_na.2.m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear 324 数值分析与应用 .1) plot(data_na) title('模最小特征值变化曲线') grid subplot(2. %输出其对应特征向量 temp2=[n2.3) plot(data_q(:.2. %输出模最小特征值 temp1=[n2.txt temp1 -ascii save data_fanmi_q.2)) title('其特征向量第二个分量') grid subplot(2.2.3)) title('其特征向量第三个分量') grid 以文件名 fanmi_main.1)) title('其特征向量第一个分量') grid subplot(2.txt temp2 -ascii subplot(2.data_q].MATLAB time %用于输出数据 n1=length(data_na).data_na].4) plot(data_q(:.

785882908404155 8 0.747126436781609 5 0.78752378091519 9 0.69047619047619 4 0.781838316722038 7 0.26794919243112 其对应的特征向量为 v= 1 -0.MATLAB 数值分析与应用 325 >> fanmi_main 回车得到: 模最小特征值为 namda = 1.771794871794872 6 0.267949192431123 迭代次数为 time = 43 实验结论 从输出结果可以看出迭代了 43 次,实际上迭代计算进行了 42 次,最后一次判断满足精 度以后跳出循环,不再更新数据。在表 7.444444444444444 2 0.788675134594606 .788196651833015 10 0.9 中给出了逆幂法计算的最小特征值随迭代次数的 变化情况。 迭代序列 最小特征值 1 0.788675134594323 34 0.788475153470448 M M 33 0.732050807568877 0.583333333333333 3 0.

730197076 0.732050808 0.5 中给出了特征值及其特征向量的变化曲线。 .661538462 0.267949192 33 1 -0.720963173 0.732050808 0.732050808 0.731281086 0.267949192 37 1 -0.72754581 0.265244818 8 1 -0.732050808 0.788675134594797 38 0.788675134594725 36 0.267725217 M M M M 31 1 -0.267428418 10 1 -0.267949192 第二个分量 第三个分量 表 7.788675134594812 41 0.267949192 38 1 -0.24137931 4 1 -0.732050808 0.788675134594812 42 0.5 2 1 -0.732050808 0.26203966 7 1 -0.25 0.732050808 0.MATLAB 数值分析与应用 326 35 0.9 最小特征值的变化情况 为了节省篇幅,这里给出了前后几组的数据变化情况,从这几组变化大致看出迭代收敛 速度情况。在表 7.78867513459481 40 0.267949192 41 1 -0.267949192 42 1 -0.285714286 0.732050808 0.267949192 39 1 -0.704318937 0.285714286 3 1 -0.788675134594813 表 7.10 中还给出了特征向量的各个分量随迭代序列变化情况。 迭代序列 第一个分量 1 1 0.267949192 35 1 -0.732050808 0.732050808 0.732050808 0.267949192 34 1 -0.26675143 9 1 -0.255813953 6 1 -0.732050808 0.551724138 0.267949192 40 1 -0.788675134594776 37 0.788675134594806 39 0.731729217 0.267949192 32 1 -0.267949192 36 1 -0.10 相应的特征向量变化情况 鉴于篇幅原因,这里对于特征值及其向量都只给出了前后几组资料,在做程序设计时如 果前面几组资料没有问题的话,基本能够说明你的程序设计思想是没有大的问题。为了更直 观的看出反幂发的计算效果,在图 7.246153846 5 1 -0.

6 QR 方法 实验基本原理 QR 算法是计算矩阵特征值问题最有效的方法之一,也是普遍被用于工程实践中的一种 方法。 QR 方法基于对于任何实的非奇异矩阵都可以分解为正交矩阵 Q 和上三角矩阵 R 乘积, 而且当 R 的对角元素符号取定时,分解是唯一的。 QR 方法的基本计算步骤如下,令 A = A1 ,对 A1 正交分解,分解为正交矩阵 Q1 和上三 角矩阵 R1 的乘积 A1 = Q1 R1 然后将得到的因式矩阵 Q1 与 R1 反序相乘,得 A2 = R1Q1 以 A2 代替 A1 ,重复以上步骤得到 A3 ,所以得到 QR 算法的计算公式为 .MATLAB 327 数值分析与应用 图 7.5 反幂法计算相关特征值及其向量的计算效果 程序运行后,注意查看当前工作路径下的文件情况,注意查看当前工作路径下的文件情 况,在程序设计中把输出数据以文件方式存储于两个文本文件中,文件内容以 8 位的 ASCII 形式保存,可以用一般的文本编辑器打开。 实验 7.

m 步骤一:编写 QR 方法计算矩阵特征值的方法函数。 打开 Editor 编辑器,输入以下语句: function [namda.rar\7-6.time.MATLAB 328 数值分析与应用  Ak = Qk Rk   Ak +1 = Rk Qk 实验目的与要求 l 熟悉 QR 方法的基本思想。 l 理解 QR 方法的计算流程。 l 能够编程实现 QR 方法。 l 给出合理的迭代停止条件,防止进入死循环,如果迭代超过一定步数还没收敛,给出相 关信息。 l 把计算的中间数据输出,用于计算效率分析。 l 把计算结果图形化。 实验内容及数据来源 已知矩阵 2 1 0 A = 1 3 1   0 1 4  采用 QR 方法计算 A 的全部特征值。 实验操作指导 光盘:\实验视频\chapter7.qr_tz_main.tol) %qr 分解法计算线性变换的特征值 %A 为线性变换矩阵 %tol 为误差容限 %如果误差容限缺省 则默认为 10 的-7 次方 .exe 光盘:\实验代码\chapter7\qr_tz.data_na]=qr_tz(A.m.

m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %用 QR 方法计算矩阵特征值主函数 %08 年 7 月 20 日 a=[2 1 0 131 0 1 4]. %计算误差 tz0=diag(A1).time. %记录迭代次数 time=0.:)=tz1.MATLAB 329 %time 用来记录迭代次数 %data_na 用来记录计算的中间值 全体特征值组成的向量 if nargin==1. end namda=tz1. %迭代赋值 A=A1. disp('特征值为') namda 数值分析与应用 .data_na]=qr_tz(a). tz1=diag(A). wucha=norm(tz0-tz1). 以文件名 qr_tz. time=time+1. %存储中间数据 data_na(time. %如果误差没有满足精度 并且迭代次数在 500 次以内 可以循环迭代 %否则跳出循环 while (wucha>tol)&(time<500) [q.r]=qr(A). end %设置初始误差,使之能进入循环 wucha=1. A1=r*q. tol=1e-7. %调用方法函数 [namda.

%n2 为数组 n2=(1:n1)'.4) plot(data_na(:.1)) title('第一个特征值') grid %第二个特征值 subplot(2. %第一个特征值 subplot(2.2.2)) title('第二个特征值') grid %第三个特征值 subplot(2.3)) title('第三个特征值') grid 以文件名 qr_tz_main.data_na].2.m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear >> qr_tz_main 回车得到: namda = 4.1:2) plot(data_na(:.73205074468257 3.00000006288631 1.26794919243113 time = 数值分析与应用 . %temp1 为迭代序列与特征值组成的向量 temp1=[n2.3) plot(data_na(:.MATLAB 330 disp('迭代次数为') time %用于输出数据 n1=length(data_na).2.

11 中给出了特征值随迭代序列的变化情况。 .26794919243112  这里给出前 4 组和最后两组的 A 矩阵计算结果,一般而言,如果采用单步执行的方法 前几个矩阵计算结果没有问题的话,基本能说明程序设计思想是没有问题的。 如前所叙述,鉴于本教材重于实验强调动手能力,所以很多时候都尽量给出了计算的中 间结果,这在做程序设计时候可以比对。为了看出迭代序列中,特征值的变化情况,在表 7.95576922407482 3.00000000000000 A1 =  1.41621270158527 1.41621270158527   0 -0.MATLAB 331 数值分析与应用 22 实验结论 MATLAB 输出已经明确的给出了计算结果的许多信息,包括最后要求的全部特征值以 及实际迭代次数。 为了读者在编程时候有可以比对的资料下面给出了每次计算的矩阵更新情况,在许多数 值分析教材中不给出这些中间数据,事实上这些数据在程序调试时候比较有用,尤其是在单 步执行时候。  3.35532994923858  4.28228086710650  M  4.34164078649987   0 -1.00000000000000 A 22 =  0.70588235294118 0.00020923301798 3.00000002796550 1.09544511501033 -0.00000002527550 0.26902697997599 0.82843920181547 3.00000002796550   0 0.00000000000000  A 2 =  0.64215064001026 0.95576922407482 0.00000006616708 1.73205078229337 0.00020923301798 0.52139037433155 0.09544511501033 3.34164078649987 3.00000006288631 -0.73205074468257 0.00000000000000  3.00000000000000  A 21 =  0.44869215291751 0.82843920181547 -0.00000000000000 1.26794919243113   4.00000000000000 -1.77272727272727   4.64215064001026 3.15662650602410 0.00000000000000  A3 =  0.97383114934675   0 0.48804354473732 -0.97383114934675 1.16377060432306   0 0.00000000000000 A 4 =  0.16377060432306 1.00033003375007 3.00033003375007 -0.00000006616708   0 -0.

0000000000 2 3.7058823529 3.1566265060 3.6792065950 3.0000009686 1.0524176540 1.7320136933 3.7318210842 3.2679515892 11 4.4486921529 3.2679491924 21 4.7320498390 3.0000000000 4.3553299492 5 4.7320506511 3.2822808671 6 4.0005713702 1.2679626302 10 4.0000001565 1.2679491924 19 4.2679491929 16 4.6。 图 7.0000003893 1.2679491924 表 7.7232911410 3.7320507447 3.7727272727 4 4.7104188676 3.0035289918 1.7314793609 3.0000000000 3.7320358903 3.5213903743 1.2679496203 12 4.0000000000 3.7320448119 3.6062145205 3.0000371138 1.11 QR 方法计算矩阵特征值 为了更直观的反映特征值随迭代序列增加的收敛情况,在程序设计中直接给出了特征值 的图象表现,如图 7.2679491924 18 4.MATLAB 数值分析与应用 332 迭代序列 第 1 个特征值 第 2 个特征值 第 3 个特征值 1 2.2683757511 8 4.0215564333 1.0000000629 1.7306297264 3.0000149172 1.1233961222 1.2679491925 17 4.7320504183 3.4880435447 1.2679491924 20 4.2680246991 9 4.6 中可以看出在迭代前几次可能会有一些波动,但是逐渐趋于平稳,总体而言 QR 方法是计算矩阵特征值比较有效的一种方法。 .2703893573 7 4.0000923362 1.6 QR 方法计算矩阵特征值 从图 7.0002297097 1.2679491924 22 4.2690269800 1.2679492688 13 4.7319584690 3.0087462288 1.2679491949 15 4.0000059956 1.2679492061 14 4.7285194190 3.0014206532 1.7320483978 3.0000024098 1.0000000000 3 3.0000000000 3.

2.MATLAB 333 数值分析与应用 实验 7.7 拟上三角阵的 QR 方法 实验基本原理 在 QR 方法中,每一步都要进行一次 QR 分解,再作一次矩阵乘法。对于一般的矩阵, 这样的计算量是很大的。为了减少计算量,可以先把 A 作正交变换为拟上三角矩阵(下次 对角线以下的元素全为零) ,即上 Hessenberg 矩阵,然后对上 Hessenberg 矩阵应用 QR 方法, 求得矩阵 A 的全部特征值。下面给出具体的算法: (1) 将 A 正交变换为上 Hessenberg 矩阵 A1 。可以用 Householder 变换方法,当然在 MATLAB 中有内置函数 hess 直接可以帮助我们完成这一步。 (2) 对于 k = 1. L Ak = Qk Rk (对 A 做 QR 分解,可以选用 Givens 变换方法,当然 MATLAB 也有内置 函数直接可以进行 QR 分解。 ) Ak +1 = Rk Qk (3) 结束。 当然在实际计算中,不会只采用简单的 k 记次迭代,还需要给出满足精度的判断标准, 这和前面几个实验是类似的。 实验目的与要求 、 l 理解拟上三角阵 QR 方法的基本原理。 l 明白为什么比基本的 QR 方法要减少许多计算量。 l 合理的给出迭代循环方式,满足精度要退出循环。 l 如果迭代超过一定次数,还没有收敛则要停止迭代,防止进入死循环。 l 对计算结果作出合理分析。 l 把计算中的中间数据给出来,用于计算效果分析。 l 对计算结果图象化,给出迭代收敛的变化曲线。 实验内容及数据来源 .

%如果误差没有满足精度 并且迭代次数在 500 次以内 可以循环迭代 %否则跳出循环 A=hess(A).r]=qr(A). tol=1e-8. %计算误差 tz0=diag(A1). A1=r*q. 数值分析与应用 .tol) %拟上三角阵的 qr 法计算线性变换的特征值 %A 为线性变换矩阵 %tol 为误差容限 %如果误差容限缺省 则默认为 10 的-8 次方 %time 用来记录迭代次数 %data_na 用来记录计算的中间值 全体特征值组成的向量 if nargin==1. qr_hess_main. tz1=diag(A). %记录迭代次数 time=0.exe 光盘:\实验代码\chapter7\qr_hess.time. end %设置初始误差,使之能进入循环 wucha=1.data_na]=qr_hess(A.m. while (wucha>tol)&(time<500) [q.rar\7-7.MATLAB 334 设  −1 2 1  A =  2 -4 1 1 1 -6  采用拟上三角阵的 QR 方法计算 A 的全部特征值。 实验操作指导 光盘:\实验视频\chapter7.m 步骤一:编写拟上三角阵的 QR 方法函数。 打开 Editor 编辑器,输入以下语句: function [namda.

2)) title('第二个特征值') 数值分析与应用 . disp('特征值为') namda disp('迭代次数为') time %用于输出数据 n1=length(data_na). time=time+1. end namda=tz1.2. %调用方法函数 [namda. %迭代赋值 A=A1.data_na]=qr_hess(a.2. 以文件名 qr_hess.1:2) plot(data_na(:. %n2 为数组 n2=(1:n1)'. %存储中间数据 data_na(time.:)=tz1. %temp1 为迭代序列与特征值组成的向量 temp1=[n2.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %用拟上三角阵的 QR 方法计算矩阵特征值主函数 %08 年 7 月 20 日 a=[-1 2 1 2 -4 1 1 1 -6].MATLAB 335 wucha=norm(tz0-tz1).time. %第一个特征值 subplot(2.1)) title('第一个特征值') grid %第二个特征值 subplot(2.data_na].3) plot(data_na(:.1e-6).

5000000000 -6.4) plot(data_na(:.3854003054 第二个特征值 -0.12。 迭代序列 1 2 3 4 5 第一个特征值 -4.0000000000 -6.2000350315 -6.MATLAB 数值分析与应用 336 grid %第三个特征值 subplot(2.9025918300 第三个特征值 -6.5000000000 -5.2.2140691328 -5.0739215145 -5.m 保存。 步骤三:运行程序。 在命令窗口输入: >> clear >> qr_hess_main 回车得到: 特征值为 namda = -6.0873015873 -5.2873366188 0.2879921354 .2879906473 0.28799213896042 迭代次数为 time = 32 实验结论 输出的结果已经给出了全部特征值,在计算过程中迭代了 32 次,这时候满足精度10−6 , 当然在实际计算中可以根据需要调整计算精度。 这里给出特征值组成的向量随迭代序列的变化情况,如表 7.0000000000 -5.0000000000 0.3)) title('第三个特征值') grid 以文件名 qr_hess_main.42106563041398 -4.0000000000 0.86692650854643 0.

2879921390 0.4206295138 -6.6973995641 -5.2879921390 0.4210649017 -6.4210656304 -5.9029143721 -4.8738802565 -4.8669272372 -4.8692278911 -4.2879921390 0.2879921390 0.MATLAB 数值分析与应用 337 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 -5.2879921390 0.2879921390 0.3850777668 -6.1446766324 -5.2879921390 0.8669528881 -4.2938740214 -5.8669731535 -4.9710684932 -4.4187642479 -6.8670084267 -4.8669307134 -4.4209223187 -6.2879921390 0.2879921390 0.4210614256 -6.2879921390 0.2879921390 0.2879921390 0.4141118824 -6.8669285056 -4.2879921390 0.2483639650 -6.4210189854 -6.8709286866 -4.8669265085 0.2879921390 0.8671766718 -4.2879921390 0.8682490838 -4.8673626251 -4.8670698203 -4.8878071034 -4.2879921390 0.8669345563 -4.4197430552 -6.4203059452 -6.8789911088 -4.3169236458 -6.2879921390 0.9941181175 -6.4001850355 -6.5905925748 -5.4090010302 -6.4844414259 -5.2879921390 0.2879921390 表 7.4209837122 -6.4210636333 -6.4210508937 -6.2879921390 0.0396281739 -4.12 拟上三角阵的 QR 方法计算矩阵特征值 .2879921390 0.4210392508 -6.3594798059 -6.2879921390 0.4170634524 -6.4208154671 -6.1433155066 -6.2879921390 0.9285123330 -4.4210575827 -6.8676861938 -4.2879921390 0.8669412453 -4.8035507131 -5.2879921390 0.2879921390 0.2879921390 0.

54218606994456 -6.44721359549996 -0.00000000000000 A4 =  -0.00093727513129 -4.42106604905460 -0.28799213896042    -6.08730158730159 -0.64730330939949 -0.28799213896042  实验 7.00014826254740 0.06493984322449 0.38540030535022 -0.00000000000000  0 -0.00000000000000 -0.42106563041398 -0.54218606994456 0.00123657212388 0.'nobalance') d=eig(A)返回矩阵 A 的特征值,以向量形式输出。在[V.44721359549996 -6.00123657212388 -4.07392151448703 -0.00306206666675   0 -0.28733661881294   -5.00000000000000   -5.00000000000000 -1.D] = eig(A) 中计算输出矩阵 A .34164078649987   0 -1.34164078649987 0.00014826254740   0 -0.00000000000000 0.64730330939949 -6.21406913280776 -0.90259183000423 -0.00000000000000  A3 =  -0.D] = eig(A) [V.06493984322449   0 -0.D] = eig(A.00000000000000  A1 =  -0.73278022814194 -5.73278022814194 0.00000000000000 A2 =  -0.8 MATLAB 中的 eig 方法 实验基本原理 在前面的几个实验中介绍了计算矩阵特征值与特征向量的一些比较实用的算法。本实验 将介绍 MATLAB 中的 eig 函数,如果是用 MALTAB 做数值计算选择用 eig 函数方法可以满 足一般的需求,没有特殊的要求 eig 函数是首要的选择。 eig 基本语法有以下几种形式 d = eig(A) [V.00000000000000  A31 =  -0.00000000000000 A32 =  -0.00000000000000 0.7 拟上三角阵 QR 方法特值变化曲线  -5.86692608990581 -0.20003503151135 -0.28799064729479   -5.00000000000000  0 -0.00093727513129 -0.00306206666675 0.MATLAB 338 数值分析与应用 图 7.86692650854643 0.28799213535445  M  -6.

D] = eig(A.1 2eps  -eps   0   1  .5 -2 4 eps 2 -0.MATLAB 数值分析与应用 339 的特征值 D 以及相应的特征向量 V, 计算的目的是 AV = VD 。 如果矩阵中一些元素非常小, 可以考虑使用[V.'nobalance'),这样会提高精度。 矩阵特征值的计算是采用著名的 LAPACK 作为其内核的。eig 同时可以计算广义特征值 问题,这放在下一个实验中介绍。 实验目的与要求 l 熟悉 eig 基本语法。 l 弄清楚语法中各自量在计算中的关系。 l 对于输出参数要离清楚各自的关系,对于具体的特征值能够知道对应的特征向量。 l 知道在什么情况下需要采用 nobalance 格式。 l 对计算结果作出合理的分析与检验。 实验内容及数据来源 (1) 已知矩阵 3 1 0  A = 1 2 1   0 1 1 计算 A 的特征值。 (2) 已知矩阵 3 11  2  B =  -4  -1  3  -2  2 3 4 1 2 3 8 9 1 2 9 11 -2 -3 -1 2 3 4 -2 -3 -4 5 6 4 5 2 3 13 15 -1 -1 13 15 -5 -3 7  6  4   8  -1   8 -3  计算 B 的特征值与特征向量。 (3) 已知道矩阵 3  -2  C =  eps .5 -0.4   -0.9 1 -1 0.

m.egi_2.rar\7-8. %计算 B 的全部特征值及其特征向量 [nb.m 步骤一:编写(1)与(2)的主函数。 打开 Editor 编辑器,输入以下语句: %08 年 7 月 21 日 %A 矩阵 A=[3 1 0 121 0 1 1]. %计算 A 的全部特征值 na=eig(A) %B 矩阵 B=[ 3 234567 11 1 2 3 4 5 6 2 891234 -4 2 9 11 13 15 8 -1 -2 -3 -1 -1 -1 -1 3 2 3 4 13 15 8 -2 -2 -3 -4 -5 -3 -3 ].exe 光盘:\实验代码\chapter7\egi_1.m 保存。 步骤二:运行 egi_1 程序。 在命令窗口输入: >>clear >> eig_1 回车得到: na = 0.MATLAB 340 计算矩阵 C 的特征值与特征向量。 实验操作指导 光盘:\实验视频\chapter7.267949192431123 2 数值分析与应用 .vb]=eig(B) 以文件名 egi_1.

524358281985392i 0.035878868347139i 0.130478345913106i 0.252907413978454 0.262535913335478 0.105168289381923 + 0.831206497129884 -0.147770614822285i 0.241292986695022 -0.148125422234517 -0.642528726030861 0.197589184794527 0.73205080756888 nb = Column 1 -0.000757631686508277 -0.280457901543078 Column 3 0.0562645304556878 -0.296318009345686i 数值分析与应用 .420757248100261 Column 4 0.658924317373996 0.322215632665902i 0.589299309570444 -0.197370278186667 0.0877692386215495 -0.333792899976737 + 0.276028481562631 -0.387198225544195 0.387139417911047 -0.0379168178992885 -0.322388257931397 -0.MATLAB 341 3.108184811518408 0.216038318088682 -0.0835637019248653 -0.252887913926642 Column 2 0.561886070729929 0.0398971903272591 0.

468911893861173 -0.130478345913106i 0.233673672350888 vb = Column 1 18.327844148378695 0.197370278186667 + 0.MATLAB 342 Column 5 0.035878868347139i 0.190511053262997 -0.0221902811354791 0.561886070729929 0.524358281985392i 0.0877692386215495 + -0.045040573473926 -0.333792899976737 0.555367075783136 0.0379168178992885 + -0.0126762093075904 -0.411282846153999 0.147770614822285i 0.123582041504375 Column 7 -0.350581211356674 -0.296318009345686i 数值分析与应用 .4123185390661 0 0 0 0 0 0 0.105168289381923 Column 6 -0.768177329665022 -0.570802079043313 0.217676266715753 0.322215632665902i 0.0835637019248653 + -0.

70992818926671 + 0 0 0 4.49831918927813 0 0 0 0 Column 4 0 0 0 1.1805196555492 0 0 0 0 0 Column 3 0 0 4.70992818926671 0 0 Column 6 0 0 4.25219686219268i 数值分析与应用 .25219686219268i Column 5 0 0 0 0 1.MATLAB 343 Column 2 0 11.

5 -.m 保存。 步骤四:运行 C 矩阵特征值及特征向量的计算函数。 在命令窗口输入: >>clear >>clc >> eig_2 数值分析与应用 .VC*DC %采用 nobalance 格式计算 [VN. %调用 eig 计算 没有用 nobalance 格式 [VC.DN] = eig(C.9 4 eps/2 2*eps 1 -1 -.1 -eps 0 1 ].VN*DN 以文 eig_2.5 .23266683394613 0 Column 7 0 0 0 0 0 0 -0.278346928480688 这就是需要的计算结果,在实验结论里给出分析。 步骤三:编写 C 的特征值计算函数。 打开 Editor 编辑器,输入以下语句: %eig 计算矩阵特征值问题 %设置 nobalance C=[ 3 -2 -2 -eps/4 -.MATLAB 344 0 0 0 -2.DC] = eig(C) %查看计算效果 xg_1=C*VC .'nobalance') %查看计算效果 xg_2=C*VN .

1475 0.0000 xg_1 = -0.0000 0.0000 0 0 0 0 -1.0000 0.0000 0.0000 -1.0000 -0.0000 0 0.7881 0.0000 0.4924 -0.0000 0.6153 0.5616 0 0 0 0 1.3261 0.0000 0.0000 0.0000 0 0 0 0 -1.0000 数值分析与应用 .0000 -1.0000 0.MATLAB 345 回车得到: >> format short >> eig_2 VC = -0.4176 0.0000 0.0000 -0.0000 -0.0000 0.0000 -0.2639 DC = 5.0000 1.1298 -0.0000 0.0000 -0.0000 0.3845 -0.7808 -1.0000 -0.1563 0.0453 VN = 0.1375 -1.4423 -0.0000 -0.0000 0.4384 0 0 0 0 1.8481 0.9443 0.0000 0.0000 -0.0240 DN = 5.0000 0.5616 0 0 0 0 1.0189 0.4384 0 0 0 0 1.0000 0 -0.

25219686219268i  1.2665 0 -0.9.0444 0.267949192431123  λ =  2  3.49831918927813  λ=  1.1110 0.0056 -0.4441 0.3.0444 0. ξ1 = k (3.0250 0.MATLAB 346 数值分析与应用 xg_2 = 1.0028 0.70992818926671 + 4.0007 0 0. ξ2 = k (1 + i.1)T λ3 = 1 − 3i.4.0042 -0.0e-014 * -0.4123185390661  11.0002 0.0022 0.1)T 采用 MATLAB 计算可以用如下语句: >> S=[-2 -1 9 -9 4 0 .1805196555492     4. 2)T λ2 = 1 + 3i.70992818926671 .25219686219268i     -2.0083 运行后已经给出了计算结果,其中第一次计算结果并不可靠,而应该取第二次计算结 果,原因在结论中叙述。 实验结论 从计算结果来看,对于矩阵 A 特征值为 0.3.73205080756888  在调用函数的过程中直接给出特征值,没有给出特征矩阵。 计算 B 的特征值与特征向量时采用了第二种调用格式,输出结果 λ 为全部的特征值组 成的向量。 18.0323 -0. ξ 2 = k (1 − i.23266683394613  在程序中各自的特征向量在 nb 矩阵中。 各自特征值对应的特征向量可以按照 eig 函数中的定义进行识别,当然也可以从简单 的实验中给出示例。如对于矩阵 -2 S = -9 -3 -1 9  4 0  1 1  已知三个特征值与特征向量分别为 λ1 = 1.

0000000000  对应的特征向量为  -6.639261291E-01  VC 中各列为 DC 的对角元素所各自对应的特征向量。 按照特征值的定义矩阵 S1 = ( C )( VC ) .y]=eig(S) 回车得到的结果为 1+3i y=  0  0  0.260697711E-01 2.176224697E-01 4.338771637E-18 -5.440892099E-16 3.298420649E-01  -9.28868i 0.7145e-017 1.220446049E-16 5.8818e-016 S1 =   4.1102e-016 2.4384471872 0.500937404E-33 -8. >> [x.4513e-031 1.0000000000 4.0000000000  0.893677997E-02 -1.8818e-016 8.0000000000 1.880640995E-01 VC =  1.0000000000  0.000000000E+00 0.'nobalance')格式计算,计算结果显示特征值为: .9304e-032  9.28868 0 0  1  0 1-3i 0 0.28868 -0.0000000000   -1.0000000000   0.0000000000 0.( VC )( DC ) 应该接近零,但是验证结果为  -8.0000000000 0.2204e-016  2.1002e-032 0 6.7756e-016 1.0000000000 0.20628 可以看到 y 的对角元素为各特征值,x 的各列分别对应其特征向量。 关于矩阵 C 特征值及特征向量的运算是为了说明一些矩阵“nobalance”作用。从矩阵 元素可以看出,满足 eig 函数定义中的要求,采用普通方法计算可能会误差特别大。首先采 用普通方法计算结果,得到特征值为 5.D] = eig(A.0000000000 1.0000000000 DC=  0.480978582E-01 -1.443059266E-01  2.44227  可以看出 S1 中明显有元素不接近 0,这说明计算结果并不是十分理想。所以考虑使用 [V.92828 -0.2326e-032 4.475478010E-01 1.853963667E-17   -1.28868 +0.0000000000 0.86603  0.2204e-016   0.3838e-016  -2.86603 0.153018556E-01  7.0000000000 0.8608e-032 3.30943  -0.4409e-016 9.28868-0.MATLAB 数值分析与应用 347 -3 1 1].5615528128 0.28868i x =  0.

38447 -7.2346e-016 -2.045313 为了验证计算效果我们同样可以计算矩阵 S2 = ( C )( VN ) .00000000 0.00000000 DN =  0.56155281 0.6645e-015  4.49242 -0.4409e-016 8.00000000 0.6847e-017  0.00000000 0.00000000 0.15625  0.3267e-017  可以看出 S2 已经是我们期望的结果。通过上面的分析,可以把 DN,VN 作为 C 的特征值 以及其对对应的特征向量。 在实际计算时,应该先判断矩阵特性然后选择合适的调用方式,实际上作为同样的函数 名,有时候参数不同其内核往往是采用不同的算法,这是应该注意的。 实验 7.78078 -1 VN =  -2.43844719 0.4409e-015 1.00000000 1.00000000 -1.B) .00000000 0.4409e-016 -3.1375   -1  0.498e-016   6.00000000 1. B) = {λ | det( A − λ B) = 0} 针对广义特征值已经有一些比较实用的算法,如 Lanczos 算法,QR 方法和 Cholesky 方 法等。这里给出使用 MATLAB 的 eig 函数作为一个范例计算一个广义特征值问题。 在上一个实验的基础上,eig 语法还可以有如下形式: d = eig(A.00000000       相应的特征向量为: 0.00000000 0.00000000 0.8112e-018  5.7756e-017  4.0378e-018 1 0 -5.3148e-018 -1 -0.( VN )( DN ) ,如果矩阵元素都 接近 0,表示计算是有效的。在程序中直接给出了计算结果为: 0 -2.00000000 0.1795e-017 1.024029 -0.6297e-018 0  4.MATLAB 数值分析与应用 348 5.9 一些广义特征值问题 实验基本原理 前面的实验中给出了矩阵特征值与特征向量的一些算法,本实验介绍广义特征值与特征 向量问题。 对于 n × n 实对称矩阵 A 与 n × n 实对称正定矩阵 B 考虑寻找非零向量 u 和标量 λ 使 Au = λ Bu 这就是广义特征值问题。随着 λ 的变动, A − λ B 定义了一 矩阵束(或称矩阵对) ,现在的 任务是确定 λ ( A.5511e-017 -4.00000000  0.8821e-017 -3.2267e-017 -2.1102e-015 S2 =   2.

exe 光盘:\实验代码\chapter7\gy_tz.MATLAB 数值分析与应用 349 [V.B)可以计算广义特征值与特征向 量,计算的目的是满足 AV = BVD 。对于[V.D] = eig(A.B) [V.m 步骤一:编写计算主函数。 打开 Editor 编辑器,输入以下语句: %广义特征值计算问题 %08 年 7 月 21 日 %矩阵 A A=[ -56  -61  42  .B.B)就是直接给出广义特征值,而[V. B) 的广义特征值问题。 实验操作指导 光盘:\实验视频\chapter7.D] = eig(A.rar\7-9.D] = eig(A.flag)格式,flag 用来指明选择的算 法。可以选择‘chol’ ,这样的话在是选择对 B 进行 Cholesky 分解的方法。如果选择‘qz’ 那么可以计算 A 、 B 为非对称非 Hermitian 矩阵情况。 实验目的与要求 l 了解广义特征值与特征向量问题。 l 了解广义特征值相关的数学理论基础。 l 会使用 eig 计算广义特征值与特征向量。 l 对于不同类型的矩阵能正确的进行输入参数配置。 l 能根据需要对输出参数配置。 l 对于计算结果作出合理分析。 实验内容及数据来源 已知  29 A =  44 36 63 -11 -7 12  81  -15 , B = 59  24 53  59 43 -37 计算 ( A.B.D] = eig(A.flag) d = eig(A.

%查看计算效果 disp('广义特征值为:') V disp('广义特征向量为:') D %检验计算效果 S=A*V -B*V*D 以文件名 gy_tz.35978298963673 -0.829312089261579 广义特征向量为: V= -0.56167224369415 -1 -1 -0.642082657272154 0.94973368753189 0 0 0 0. %矩阵 B B=[ 81 59 -56 59 43 -61 24 -37 42].86202010863856 -1 S= .359895326837385 -0.'qz').m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >>>> gy_tz 广义特征值为: D= 3. [V.B.MATLAB 350 数值分析与应用 29 63 12 44 -11 -15 36 -7 53].19732626749086 0 0 0 1.713255194302593 -0.D]=eig(A.

56167224369415   -1  -1   λ3 = 0.BVD , 在程序设计中直接给出了这个 矩阵的计算结果,从输出来看结果是可靠的。 这个实验简要的介绍了广义特征值与特征向量问题,鉴于广义特征值与特征向量问题 并不是数值计算最基本的内容,所以在很多教材中都没有介绍,需要深入这一理论的读者可 能需要参阅一些专著,如 Golub 的《MATRIX COMPUTATION》 ,1996 The Johns Hopkins University Press。 本章小结 在这一章中介绍了矩阵特征值与特征向量的常用方法,鉴于不是一本矩阵分析教材,因 此本章省略了一些基础内容,同时也省略了一些数学理论。矩阵特征值问题内容是很丰富的, 所以在这一章中介绍的也只是一些比较常用而且实用的算法,对于一些计算效率比较低下的 方法比如 Jacobi 方法这里不再介绍。 计算特征值与特征向量主要有两类方法,一是从原始矩阵出发,求出其多项式,再求出 .5527136788005e-015 实验结论 计算结果已经给出了广义特征值为: -0. u2 =  -0.03961325396085e-014 0 2.35978298963673 λ1 = 3.8421709430404e-014 1.359895326837385.105427357601e-015 -2. u3 = -0. u1 = -0.829312089261579  检验计算结果是否有效的方式可以计算矩阵 S = AV .94973368753189.19732626749086.8421709430404e-014 3.713255194302593 λ2 = 1.MATLAB 数值分析与应用 351 2.4210854715202e-014 -7.8421709430404e-014 6.95399252334028e-014 1.642082657272154  0.86202010863856 -1   -0.

3 4. 0.1   4.6411.7379 .8664.MATLAB 352 数值分析与应用 多项式的根。这个方法虽然理论上上可行,但实际上效率一般并不高,所以基本上不被采用。 比较实用的是把特征值和特征向量作为一个序列极限来求得。了解这一思想可以有助于理解 本章中各种算法。 当然,除了熟悉给出的一些算法之外,会用 MATLAB 的内置函数也是很重要的, 这在快速分析问题时尤其重要。如果一个工程项目中工作语言就是 MATLAB,那么就可以 直接调用 MATLAB 的内置函数,减少工作量。 上机操作题 1. 用幂法计算矩阵 A 主特征值及其对应的特征向量,其中  2. 0.2    参考答案: λ = 10. v = ( 0.7 2.3942.4 1.6585 ) 。 2.用反幂法计算矩阵 A 最小特征值及其对应的特征向量,其中  -3 1 0  A = 1 -3 -3   0 -3 4    参考答案: λ = -2. −2. 0.2 5. v = ( 0. 4 ) 。 .7  A =  3.4771.6 3.3 5. 0.4531.2098 ) 3.用 QR 方法计算矩阵 A 的全部特征值,其中  -3 1 -1  A =  -7 5 -1   -6 6 -2    参考答案: λ = ( −2.

L . n xi − x j 对于没有接触过插值方法的读者,一个比较好的快速熟悉拉格朗日插值方法是把上面的多项 . x1 . x1 . 2. L .1 拉格朗日插值方法 实验基本原理 拉格朗日插值方法是比较基础的方法,方法本身比较容易实现,而且效果还不错。也容 易理解。 通过平面上不同两点可以确定一条直线经过这两点,这就是拉格朗日线性插值问题,对 于不在同一条直线的三个点得到的插值多项式为抛物线。 这里给出一般的插值公式,拉格朗日插值的基多项式为: n li ( x) = ∏ j =0 j ≠i x − xi .L .L . xn 是区间上一系列的点,而且这些点上 的值 y0 .1. xn 称为插值基点或者节点。我们期望的目标是对 于区间上其他点 r ( x) = f ( x) − g ( x) 尽量小,其中 r ( x) 称为插值多项。如果要计算的点在区间范围内就称为内插,如果在 区间范围之外就称为外插。 比较常用的插值函数有多项式、分段多项式、三角函数式等。 实验 8. yn 已经知,插值的任务是构造一个函数 g ( x) ,使 g ( xi ) = yi 这样 g ( x) 就称为插值函数,x0 .b]上, x0 .MATLAB 353 数值分析与应用 第八章 插值与函数逼近 插值就是定义在一个特定点取特定值的函数过程。在工程与实验中,经常会遇到计算函 数问题,就数值方法本身而言很多问题最后都转化为函数值的计算。但往往有时候函数关系 非常复杂,甚至没有明确的表达式或者有表达式但是我们无从知晓。比如,我们的数据来自 多组的观测资料或者实验数据,插值的基本思想是通过这些已知道的资料确定一种近似的函 数关系,这样我们就可以推测未观测的数据。 设函数 y = f ( x ) 定义在区间[a. i = 0. y1 .

m 步骤一:编写拉格朗日插值方法函数。 打开 Editor 编辑器,输入以下语句: %拉格朗日插值方法 .MATLAB 数值分析与应用 354 式展开一下,看看如何计算基函数。 有了基函数以后就可以直接构造插值多项式,插值多项式为: n pn = ∑ f ( xi )li ( x ) i =0 实验目的与要求 l 熟悉简单的一阶和二阶拉格朗日插值方法。 l 会计算插值基函数。 l 能正确构造插值多项式。 l 把上面的思想用计算机程序实现。 l 要求程序能针对一般问题,既任意阶插值问题。 l 能够给出插值多项式表达式,当然这不一定需要程序设计的语言具备符号推导功能,如 果是象 c/c++、pascal、java 等高级语言可以用数组存储插值多项式系数。 l 能够对插值结果作出合理分析,给出插值多项式函数图象。如果是已知函数作为实验, 要能够给出原函数与插值多项式在区间上的对比。 实验内容及数据来源 o 已经知道 cos 30 = 3 2 1 o o o 、 cos 45 = 、 cos 60 = 、 cos 90 = 0 ,使用拉格朗日多项 2 2 2 o 式插值法计算 cos( −40o ).并给出插值多项式。 实验操作指导 光盘:\实验视频\chapter8.m. cos 53o . cos174 . lag_main. cos 47o .rar\8-1. cos 79o .exe 光盘:\实验代码\chapter8\lag.

s=s+la. else %读取 t 长度 m=length(t).'p'.'x').y.t(i)). for(k=1:n) la=y(k). end. for(j=k+1:n) la=la*(p-x(j))/(x(k)-x(j)).'p'.4). s=0. simplify(s). end %对输入参数个数做判断,如果只有两个参数 %直接给出插值多项式 %如果三个参数 则给出插值点的插值结果 %第三个参数可以为向量 if(nargin==2) s=subs(s. %读取 x 向量维数 n=length(x).MATLAB 355 %可以同时对多点插值 %t 可以为向量 function s=lag(x. %展开多项式 s=collect(s). end %得到的是系列插值点的插值结果 %既得到的是向量,赋值给 s s=temp. %分别对 t 的每一个分量插值 for i=1:m temp(i)=subs(s. %构造基函数 for(j=1:k-1) la=la*(p-x(j))/(x(k)-x(j)). end. end 数值分析与应用 .t) %采用符号推导,这样可以给出插值具体公式 syms p. %把系数取到 6 位精度表达 s=vpa(s.

[-pi/4. %需要插值点 t=[-40*pi/180.pi]).pi/2]. hold off 以文件名 lag_main.MATLAB 356 以文件名 lag.pi/6.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %lagrange 方法主函数 %同时计算多点插值 %已有点 x ,y x=[pi/4.t) %cos 函数值 disp('cos 函数值') yreal=[cos(-40*pi/180) cos(40*pi/180) cos(50*pi/180) cos(70*pi/180) cos(170*pi/180)]' disp('插值与函数值误差') dy=yt-yreal %给出插值多项式,需要显示的话 去掉下行的分号 yt=lag(x.170*pi/180].cos(pi/3).[-pi/4.pi/3.pi]) hold on %画出 cos 函数图形 ezplot('cos(t)'.cos(pi/2)].cos(pi/6).50*pi/180.40*pi/180.m 保存。 步骤三:运行程序。 在命令窗口输入: >> clear >> lag_main 回车得到 角度 数值分析与应用 . y=[cos(pi/4).y) %画出插值多项式图形 ezplot(yt. disp('角度') du=[-40 40 50 70 170] %插值计算结果 disp('插值结果') yt=lag(x.70*pi/180.y.

99452 cos 函数值 yreal = 0.682 0. 47o .53873 0.19081 -0.11759 yt = . 53o .136*x^3-.22732 -4.9e-1*x+.174 五个点列,分别计算了插值结果,并与函数结果做了 比较,对应误差分别为 -0.2351e-005 -0.68196 0.60182 0.76604 插值与函数值误差 dy = -0.136*x^3-0.1121 0.19146 -1.00064885 、-0.9e-1*x+0.00010309 0.2351e-005 、-0.00064885 -0.11759。 注意到,我们插值给的原始数据范围是 [30o .00010309 、0.984 o 我们取了 −40o .66*x^2+.79o .MATLAB 数值分析与应用 357 du = -40 47 53 79 174 插值结果 yt = 0.66*x^2+0.22732、 -4.984 实验结论 通过程序设计的作用, 我们把计算结果要做的很多分析都直接输出了。结果已经很清晰。 一般在做插值程序时候,运算一次只对一个点插值。而本实验为了方便用户有可能需要 同时对多点插值,在程序设计时做了一些考虑。所以本程序在输入时需要插值计算的点可以 是一系列点,这样程序运行一次就可以同时把这些结果计算出来,既节省机时,避免重复计 算,又方便操作实现。 本实验中,我们已经知道余弦函数中一些特殊点的函数值,那么使用插值法可以计算非 特殊点的函数值,同时给出了与真实函数值的比较。 程序可以直接给出插值多项式的表达式: yt = 0.1。 .90o ] ,落在这个区间里有三个点,我们看 到精确度都到了小数点后面 4 位以上,这个精度还是比较高的。如果是做粗略估计用,已经 o o 足够了。再看一下区间外的两点 −40 和 174 误差相对要大一些。 上面的分析说明:外推效果要比内插差。从函数图象中,也可以直接反映出来,为了比 较结果我们给出了插值多项式的曲线与 cos 函数曲线的比较,如图 8.60171 0.

L . xk −1 . xk ] = f [ xk ] − f [ xk −1 ] xk −1 − xk f [ xk − 2 . xk ] − f [ xk − 2 .1 拉格朗日插值法对 cos 函数的插值效果 从图 8.2 牛顿插值法 实验基本原理 拉格朗日插值多项式是一种很优秀的方法,其理论在很多方面都有应用。但是就插值问 题而言,如果增加一个插值基点,原先计算的插值多项式 pn ( x) 对 pn +1 ( x) 没有用,这样必 然增加计算工作量,尤其在没有计算机的情况下这个问题更加突出。我们期望增加插值基点 时原先的计算结果对后面的计算仍然有用,本实验的牛顿插值方法具备这样的特点。在介绍 牛顿插值之前先要了解一下差商的基本概念。 函数 f ( x ) 的差商定义为: f [ xk ] = f ( xk ) f [ xk −1 .L . xk − j +1 . xk ] − f [ xk − j .L . xk ] = f [ xk − j +1 . xk −1 ] 有了上面的准备,便可以给出牛顿插值多项式为: xk − xk − j . xk ] = f [ xk −1 .MATLAB 数值分析与应用 358 图 8. xk −1 ] xk −2 − xk M f [ xk − j .1 可以看出在插值区间范围内,两个图象几乎重叠了,非常接近。为了区分插值 效果与实际函数图象,我们对区间做了扩大,如果在插值区间范围内画出插值多项式图象与 原函数图象,因为非常靠近,人眼几乎难以分辨。这也充分说明了外推的效果比内插要差。 实验 8.

L . x2 ] ( x − x0 )( x − x1 ) + L + f [ x0 .6200860 0. x1 . xn ]wn 有了上面的牛顿插值公式,就可以对给定的数据处理了,实验中的程序设计正是围绕这个公 式展开的。 实验目的与要求 l 熟悉差商、均差的基本概念。 l 比较牛顿插值方法与拉格朗日插值方法。 l 能够正确构造牛顿插值公式。 l 能够把牛顿插值方法用计算机程序实现。 l 要求程序中可以同时实现对多数据的一次处理。而不是只对单个数据处理。 l 能够给出插值多项式。 l 对计算结果进行分析,能够给出插值多项式的函数图象。 实验内容及数据来源 (1) 已经知零阶 Bessel 函数 f ( x ) 在若干点出的函数值如下: x 1.8 0.4 0.46 0.3 0.9 2.1103623 用牛顿插值法计算 x 在 1. x1 .MATLAB 数值分析与应用 359 N n ( x) = f [ x0 ] + f [ x0 .24 -0.2818186 0.7 0 -0. x2 ]w2 + L + f [ x0 . 根据 5 阶勒让德多项式,算出这 9 个点的值。 b. n ,则牛顿插值可以表达为: N n ( x) = f [ x0 ] + f [ x0 .4 -0.L . k = 1.5 处的近似值。 (2)5 阶勒让德多项式为 1 P5 = (63x 5 − 70 x 3 + 15 x ) 8 任意在 x ∈ [ −1.7 1] ,不在乎取点顺序。 a.7651977 0. 2. x1 .83] 时的近似结果,并与真实结果比较。 .2 f(x) 0. xn ] ( x − x0 )( x − x1 )L ( x − xn −1 ) 如果记 wk = ( x − x0 )( x − x1 ) L ( x − xk −1 ). x1 .4554022 0.0 1. x1 ]w1 + f [ x0 . 依据牛顿插值,计算出 x=[0.6 1. 依据这 9 个点作牛顿插值。画出插值多项式图象,并与勒让德多项式图象比较。 c.1] 上取 9 个点, x=[-1 -0. x1 ]( x − x0 ) + f [ x0 .3 1.L .

4).exe 光盘:\实验代码\chapter8\niudun.'p'.rar\8-2.t) %定义符号变量 syms p. end simplify(s). end temp1(i)=xishu(i+1). niudun_main.m.m 步骤一:编写牛顿插值方法函数。 打开 Editor 编辑器,输入以下语句: %牛顿插值方法 %如果参数要计算的点列参数缺省,则直接给出插值多项式 %其中要计算的插值点可以是向量 %就是说可以对一系列点 进行一次计算完成 function s=niudun(x. %%%%%%%%%%%%%%% %%构造牛顿插值方法 for(i=1:n-1) for(j=i+1:n) xishu(j) = (y(j)-y(i))/(x(j)-x(i)). else 数值分析与应用 . xishu=0. %读取 x 的长度 n=length(x). %%%%%%%%%%%%%% %如果插值点函数缺省 则直接输出多项式 if(nargin == 2) s=subs(s. s=collect(s).y. dxs=1. dxs=dxs*(p-x(i)). s=y(1).'x'). y=xishu. s=vpa(s.MATLAB 360 实验操作指导 光盘:\实验视频\chapter8. s=s+temp1(i)*dxs.

5) %%%% %%勒让德插值问题 clear %清楚工作空间其他变量干扰 syms x %勒让德多项式 fx=(63*x^5-70*x^3+15*x)/8. %得到插值表达式 yt=niudun(x0.1).2.9 2.3 1.y0).2.-1. end 以文件名 niudun.6200860 0.1.7 1]. v=[-1.7651977 0.1]. y=[0.7 %插值点的函数值 y0=subs(fx.y.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %Bessel 函数 x=[1.2818186 0.6 1.1103623]. yt=niudun(x.4 0. 0 -0. ezplot(fx). for i=1:m temp(i)=subs(s. subplot(1.3 0.MATLAB 361 %读取要插值点向量长度 %可以直接对多点插值计算 m=length(t).4 -0.2].grid on title('5 阶勒让德多项式') axis(v) %画出勒让德多项式图象 %%%%%%%%5 %%%%%%%插值基点 x0=[-1 -0. 数值分析与应用 .8 0.0 1.4554022 0.t(i)).1.x0). subplot(1.2). end %得到的是系列插值点的插值结果 %既得到的是向量,赋值给 s s=temp.'p'.

grid title('插值效果') %画出插值图形 %%%%%%%%%%%%%%%% t=[0.m 保存。 步骤三:运行程序。 在命令窗口输入: >> clear >> niudun_main 回车得到 yt = 0.344891743637501 0.3353105664 -0.83].axis(v).83 legen5 = 0.44089209850063e-016 -2.46 0.24 -0.t) wucha=legen5-chazhi %两者误差 以文件 niudun_main.t) %计算插值结果,本句可以利用已经得到的符号表达式直接计算 %但是为了说明问题,这里重新调用牛顿插值方法 chazhi=niudun(x0.344891743637487 4.512857,可以看出计算精度 还是很不错的。 第二题关于勒让德多项式插值问题,对于我们给定的一组要求计算数据,从输出的最后 一行,可以看到误差在 10 的-15 到-16 次方,这个精度是非常高的。如果直接把原函数图象 与插值结果图象放在一张图上根本分辨不出来,所以我们把结果分别画在两个子图上,如图 8.5 时,真值为 0.y0.37667655053519e-014 chazhi = wucha = 实验结论 其中第一题的零阶 Bessel 函数在自变量为 1. %计算真值 legen5=subs(fx.511819994238683 t= 0.3353105664 -0.4980018054066e-016 -1.24 -0.1730058436 -0.MATLAB 数值分析与应用 362 ezplot(yt).2。 .1730058436 -0.46 0.

2 数值分析与应用 牛顿插值效果 实验 8.MATLAB 363 图 8.3 插值中的龙格现象 实验基本原理 通过前面两个实验,相必读者对插值方法已经有了一定的了解。这个实验介绍一个龙格 曾经在 20 世纪初考虑过的一个问题。当 N 增加时,En = f ( x) − PN ( x ) 是否会趋近 0?也就 x 是如果采用普通的插值方法,是否阶数越高插值效果越好,对于类似 sin(x)或 e 这样的 函数,所有的导数有同样的常数界,答案是肯定的。但是对一般问题,答案却为否定。 考虑函数 y= 1 1 + x2 如果用在[-5,5]上取 1 为单位长度的等距节点作为插值基点,用拉格朗日方法插值,结 果表现为在区间中部,函数值与 10 阶多项式比较接近,而在靠近端点处,则相差非常大。 这个函数也成了插值理论中的一个经典范例,在很多数值方法教材中都给予了阐述,或者在 有的教材里做了一些改变,考虑函数 y= c 为一个常数。 1 1 + cx 2 .

exe 光盘:\实验代码\chapter8\runge.y). y=subs(f.rar\8-3.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %插值中的 Runge 现象 %定义符号变量 syms x f=1/(1+x^2). %取插值点 x=-5:5. %获得插值点的 y 值 %%% chazhi=niudun(x. .MATLAB 364 数值分析与应用 实验目的与要求 l 知道龙格现象描述的主要内容。 l 能够正确选取插值基点,获得插值所需要的数据。 l 能够对获得的数据进行插值。 l 上面的方法事实上可以在手工情况下完成,这里需要读者能编程序实现。 l 给出插值多项式的函数图象,并在同一张图象上给出原来函数图象。 l 比较插值结果与原来函数图象,注意两端点出的插值效果。 l 能对变形的龙格函数同样实现上面的步骤。 l 知道如何处理这一现象,这里仅需要知道用什么方法,具体方法在后面的实验中实现。 实验内容及数据来源 考虑函数 y= 1 1 + x2 在区间[-5,5]上以单位长度 1 为节点,计算出函数值,以这两组数据进行插值。 实验操作指导 光盘:\实验视频\chapter8.x).

MATLAB 365 数值分析与应用 %得到符号表达式子 %控制坐标范围 v=[-5.grid hold on %画出原函数图象 t=-5:0. %采用符号作图 ezplot(chazhi).5.axis(v).05:5.2].3 中明显的看出,当插值点位于插值区间的中部时,插值误差相对而言比较小一 .5. yt=subs(f.t).3 插值中的 Runge 现象 实验结论 实验旨在揭示插值中这一重要现象,对于实际工程与应用的插值问题实际上很少采用很 高阶插值方法。 从图 8.yt. plot(t.-0.m 保存。 步骤二:运行程序。在命令窗口输入: >> clear >> runge 回车既可得到图象 8.3 图 8.':') 以文件名 runge.

L . x1 . L xn ∈ [ a.1. b] 是互异的,那么存在唯一的多 项式 H 2 n +1 ( x) 满足多项式在这些点上的值与函数 f ( x ) 的值相等、多项式在这些点的一阶导 数值与函数的一阶导数值相等。 这个多项式可以表示为 n H 2 n +1 ( x) = ∑ f ( xi )[1 − 2( x − xi )li '( xi )]li 2 ( x ) i =0 n + ∑ f '( xi )( x − xi )li 2 ( x) i =0 其中 ( x − xi ) .4 Hermite 插值 实验基本原理 前面几个实验中介绍的插值公式都要求插值多项式在插值点出的取值和函数值相等。有 些实际问题,不仅要求插值多项式在插值点与函数值相同,而且还要求导数相同,这类问题 就是 Hermit 插值问题。 如果 f ( x ) 在区间[a. i = 0.1.b]上连续可以导,x0 .L .i = 0. n xi − x j 这就是 Hermite 插值的基本公式。 在程序设计中我们给出了两种风格的程序,第一种是 MATLAB 风格的程序,其中的插 值运算是以符号方式进行的,这样的优点是可以直接以符号方式输出插值多项式的表达式, 如果需要计算结果的话,也可以直接输出计算结果。但是有一个缺点是,这种风格的程序可 移植能力相对弱一些,只适合于能进行符号运算的语言,而一般的高级语言是不具备这个特 点的。 为了适应一般的需求,比如在学习这个方法之后,很容易把程序改编成 Fortran,Delphi, C/C++,Java 等程序。但是这样做是纯数值方法,也就是一般高级语言的程序设计采用的方 法。 .MATLAB 366 数值分析与应用 些,但是靠近两端处误差非常大,到难以接受的地步。这说明,n 取很大未必能保证插值多 项式很好的逼近求插函数。 对于插值中的龙格现象,一般可以采用分段插值的方法,在后面的实验中我们将对此做 介绍。如果采用 Chebyshev 方法也可以有效的处理这一问题。 实验 8. n n li ( x) = ∏ j =0 j ≠i (x − x ) i n li ' ( xi ) = ∑ j =0 j ≠i j 1 .

8 3. 2.6.4 ) 的每个元素。 (2) 计算出这个函数在以下点列中的函数值与 人为的制造一个函数 g = x 2 sin x , 导数值。 X = ( −3.2.exe 光 盘 : \ 实 验 代 码 \chapter8\herm.2 -1.5.3 2.1.1.3) 利用上面的三组数据进行插值计算以下点列的函数近似值。 p = ( -5.-3. herm2. 向量 X = ( -5.1.4. −1. herm_main.m.m 步骤一:编写 Herimite 插值的方法函数。 . −2. 0.4 -4.MATLAB 367 数值分析与应用 实验目的与要求 l 理解 Hermite 插值方法的基本思想。 l 掌握 Hermite 插值的计算步骤。 l 会使用作者提供的程序代码。 l 有兴趣的读者可以自己编写代码。 l 调用 Hermite 插值函数进行一些数据插值试验,并分析运算结果。 实验内容及数据来源 (1) 人为的制造一个函数 f = x 2 。任意取点列 1、3 、-8 、6、-4(不需要按照 大小顺序排列) ,计算这些点上的函数值,在计算这些点上的导数值。有了这 三组值以后,利用 Hermite 插值方法进行插值计算以下一些点(或点列)的 情况。 a.  9 10   中的每个元素。  25 75  矩阵  b.3) 算出这些点的真函数值,比较不同点的误差情况。 实验操作指导 光盘:\实验视频\chapter8.m. -1.rar\8-4.

0.x0) %定义符号变量 syms s. end end %计算方法可以参看《数值计算方法(上) 》P171 %南京大学数学系编 科学出版社 %或者实验基本原理部分 temp1=1-2*(s-x(i))*lp.4). end if(nargin==4) f=subs(f. for i=1:n la=1. if(nargin==3) %为了阅读习惯,把变量替换为 x f=subs(f. lp=lp+1/(x(i)-x(j)).y.s.x0).'x'). temp2=y(i)*temp1*la^2. for j=1:n if (j~=i) la=la*(s-x(j))/(x(i)-x(j)). %取精确到 4 位小数 ,给出多项式表达式 f=vpa(f.s. temp3=dy(i)*(s-x(i))*la^2. f=f+temp2+temp3. end %此时 多项式已经计算完毕 f=simplify(f).MATLAB 368 数值分析与应用 这里先采用第一种风格。具体做实验时,步骤一和步骤二两者选一,就可以。 打开 Editor 编辑器,输入以下语句: %Hermite 插值的符号计算版 %如果 输入向量只有三个 没有最后要插值的点 %那么函数直接输出多项式 %如果包含插值点,那么给出插值结果 %其中要插值的点,可以是一个数,一个向量,甚至是一个矩阵 function f = Hermite(x. f=0. end .0. lp=0. n=length(x).dy.

m 保存。 步骤三:编写主函数。 %Hermit 插值方法的主函数 数值分析与应用 . temp3=dy(i)*(t(k)-x(i))*la^2. end end f=g. 以文件名 herm2.t) %输入量的维数 n=length(x). for i=1:n la=1.m 保存。 步骤二:编写 Hermite 插值方法函数(二) 。 打开 Editor 编辑器,输入以下语句: %数值版 Hermite 插值方法 %可以改编为其他语言 %可以同时处理多个数据的插值问题 %既 t 可以为向量 function f = Hermite(x.dy. lp=lp+1/(x(i)-x(j)). for j=1:n if (j~=i) %《数值计算方法(上) 》P171(南京大学编) % 计算出多项式的相关系数 la=la*(t(k)-x(j))/(x(i)-x(j)).0. m=length(t).MATLAB 369 以文件名 herm. temp2=y(i)*temp1*la^2. %整体多项式 g(k)=g(k)+temp2+temp3.0. for k=1:m %设置初值 g(k)=0. end end temp1=1-2*(t(k)-x(i))*lp.y. lp=0.

%画出函数图形 figure(2) ezplot(p) hold on %选择插值基点 t=-3:3.t). %获得系列点的函数值 yt=subs(y.2 -1.t).xc) plot(xc. z3=herm2(t. %计算出插值点的函数值与一阶导数值 数值分析与应用 .4].z3.MATLAB 370 syms x y=x^2. %直接给出拟合多项式 z1=herm(t.yt. %随意取的一些离散点 不需要按照大小顺序排列 t=[1 3 -8 6 -4].x) ezplot(z1). %获得系列点的函数的导数值 dy=subs('x*2'. z2=herm(t. %得到函数的一阶导数 q=diff(p).grid on hold on %采用符号法绘制出 插值多项式的函数图象 %调用一般的方法编写的插值函数 xc=[-5.'o') %第二个实验 clear %清除工作空间的变量干扰 %定义变量 syms x %定义函数 p=sin(x)*x^2.dy) %如果输入矩阵 也是可以的 给出每一个元素的插值结果 x=[9 25 10 75].3 2.8 3.yt.dy.dy.4 -4.yt.

%需要计算的插值点 x0=[-5.5247 .2400 11.5600 0.MATLAB 数值分析与应用 371 y=subs(p.x0) %真实结果 zhen=subs(p.chazhi. %计算结果 chazhi=herm2(t.9315 2.t).2206 chazhi = 25.6400 3.0900 5.m 保存。 步骤四:运行程序。 在命令窗口输入: >> format short >> herm_main 回车得到 z1 = x^2 z2 = 81 100 625 5625 z3 = 28.dy.'*') grid 以文件名 herm_main.y.4 1. dy=subs(q.2 -1.6 5.5978 -1.x0) %两者误差 wucha=chazhi-zhen plot(x0.5589 -26.1 -3.3].t).7600 17.

4443 -0.0000 0.4。其实就是二次抛物线。 图 8.0000 2.9315 0.0000 -2.0804 0.4 Hermit 插值函数图象 图形中的圆点是插值结果,而二次曲线是原来的函数图形,图形中也直接反映了这些点 都分布在曲线上。 在实验的第二题中,我们选择了[-3,3]区间上一些等距的点,作为插值基点,然后对一 些点做了插值。并给了误差情况,输出结果表明,如果被插值点在区间范围内,符合精度会 比较高,而如果在范围外,则明显偏离了插值曲线。这一点在图形中也有反映,如图形 8.MATLAB 数值分析与应用 372 zhen = 24.8422 实验结论 从输出结果看,结果是让我们非常满意的。前面我们提到如果是外推,而不是内插的话 一般效果不是太好,但是这里我们看到,外推也非常准确,请读者考虑一下为什么? 其实答案就是我们对插值的对象就是多项式,如果是其他函数,甚至未必是函数的离散 点列可能就没这么好的效果了。但是这也可以看出 Hermite 插值结果是很不错的,令人满意 的。 第一题而言,给出了插值的函数图象,如图 7.5978 -1.5589 -23.5。 .3784 wucha = 1.

3 中,已经指出当插值基点很多时,使用高次插值多项式未必能取得非常好的 效果。本实验介绍分段插值方法,基本思想就是将插值区间分为若干子区间,然后在各子区 间上使用低次插值多项式,如使用线性插值多项式和二次插值多项式。这就是分段插值多项 式。 但是分段插值多项式有一个缺点,就是容易导致插值函数在子区间的衔接出不光滑,用 数学语言描述就是导数不连续,而样条插值可以有效的处理这一问题。 三次样条插值方法可以选择 MATLAB 内置函数 spline。spline 的基本语法为: yy = spline(x.5 中,曲线是原函数图象,而“*”则是离散的插值点,可以看到在区间内符合精度非 常高,肉眼很难分辨,而在区间外误差会迅速扩大,甚至很快失效。 实验 8.MATLAB 373 数值分析与应用 图 8.xx) pp = spline(x.5 Herimite 插值效果 图 8.5 三次样条插值 实验基本原理 在实验 8.y.y) 插值基点是 x 与 y,插值结果是给出 yy 的近似函数值。其中 y 可以是矩阵,如果 y 是 矩阵的话,那么那么插值分别是对每一行的 y 作为基值插值。不过这样的情况并不太多。如 果 xx 缺省的话,则返回一些插值信息。 实验目的与要求 .

2 0.038462 实验操作指导 光盘:\实验视频\chapter8. .MATLAB 数值分析与应用 374 l 理解三次样条插值的基本原理。 l 会正确使用 spline 函数。 l 能用三次样条插值方法有效果的处理类似龙格现象的插值问题。 l 对插值结果作出合理分析。 l 把插值结果与原被插函数用图象语言表达出来。 l 比较用三次样条插值方法与一般插值方法的插值效果。 实验内容及数据来源 采用三次样条插值方法处理实验 8.058824 0. %%此句以上 用于获得插值数据 %对一般问题 数据可以从外界获得 %%%%%%%%%%%%%%% xx=-5:0.x).5 0.25:5.038462 0.3 中的龙格现象采用三次样条插值处理。既对观测数据进 行三次样条插值,画出插值效果。 x -5 -4 -3 -2 -1 0 1 2 3 4 5 y 0. %取插值点 x=-5:5.exe 光盘:\实验代码\chapter8\yangtiao_main.1 0.2 0.5 1 0. %获得插值点的 y 值 %%% y2=subs(f2. f2=1/(1+5*x^2).x).m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %样条插值情况的 Runge 现象 %定义符号变量 syms x f1=1/(1+x^2).058824 0.1 0.rar\8-5. y1=subs(f1.

grid %插值基点与插值效果 subplot(2.'o'.grid 以文件名 yangtiao_main.3) plot(x. yt2=subs(f2.t).6。 375 数值分析与应用 .grid %画出原函数图象 t=-5:0.2. %画出插值基点与 插值结果 subplot(2. yt=subs(f1.2.05:5.yt2).xx.MATLAB yy=spline(x.2) plot(t.yt).grid %原函数图象 subplot(2.y2.'o'.4) plot(t.xx).y2.xx).1) plot(x.yy2).m 保存。 步骤二:运行程序。 在命令窗口输入: >>yangtiao_main 回车既得到运行结果,如图 8.y1.2.yy). %原函数图象 subplot(2.xx.y1. yy2=spline(x.t).2.

6 三次样条插值处理龙格现象问题 实验结论 这里对输出图形做一些解释,其中第一幅子图为三次样条插值处理函数 f ( x) = 1 1 + x2 的情况。其中圆点圈是取的插值基点,而线是由于插值结果给出的数据绘制而成的图象。第 二幅子图是原函数图形,可以看出处理效果是比较理想的。之所以分成两个图形,是因为插 值效果和原函数非常逼近,所以在一张图形上很难用眼睛分辨。 当然样条处理也不是效果总是非常的完美,为了说明情况给选择了函数 g ( x) = 1 1 + 5 x2 其插值效果在第三幅子图形中,而原函数是最后一幅子图。选择的插值基点的 x 值完全同 f(x)。但是插值效果明显比 f(x)要略微差一些。 实验 8.MATLAB 数值分析与应用 376 图 8.6 保形分段三次插值 .

MATLAB

数值分析与应用

377

实验基本原理
在 MATLAB 中还提供了与三次样条插值非常类似的一个函数 pchip。pchip 的原意就是
分段三次 Hermite 插枝值多项式。 pchip 的函数的基本语法为:
yi = pchip(x,y,xi)
pp = pchip(x,y)
其参数设置方法与三次样条意义大抵相同。x,y 为插值基点,插值的结果范围 xi 的近似
函数值。其中 y 也可以为矩阵,情况同三次样条插值。
实际上这两个函数的区别并不是很明显,都属于分段三次 Hermit 插值多项式,只是对
斜率限制条件不同。
一般二言,spline 插值效果要比 pchip 要好一些,更加光滑,而且也更加精确一些,spline
的二阶导数是连续的。

实验目的与要求

l

知道 pchip 方法与 spline 方法的相同点与区别。

l

理解 pchip 方法的主要思想。

l

会正确使用 pchip 函数。

l

合理分析 pchip 插值结果。

l

对于具体的问题,分别使用 pchip 方法和 spline 方法插值,对插值结果进行比较。

l

对于要插值点参数缺省问题,了解输出信息含义。

实验内容及数据来源
已知观测数据如表 8.1,分别使用 spline 和 pchip 方法插值,比较插值效果。
x

-8

-6

-4

-2

0

2

4

6

8

y

1

2

-1

-3

0

1

-1

2

3

表 8.1 观测数据

实验操作指导
光盘:\实验视频\chapter8.rar\8-6.exe
光盘:\实验代码\chapter8\baoxing.m

步骤一:编写主函数。

MATLAB

378

数值分析与应用

打开 Editor 编辑器,输入以下语句:
%分段三次 Hermite 插值法主函数
x = -8:2:8
y = [1 2 -1 -3 0 1 -1 2 3]
%生成插值基点
t = -8:.01:8;
%pchip 插值方法
p = pchip(x,y,t);
%spline 插值方法
s = spline(x,y,t);
plot(x,y,'o',t,p,'-',t,s,'-.')
legend('data','pchip','spline',4),grid
以文件名 baoxing.m 保存。

步骤二:运行程序。
在命令窗口输入:
>>clear
>>baoxing
回车得到结果,如图 8.7。

图 8.7 pchip 与 spline 插值比较

实验结论
在图 8.7 中,给出了 pchip 与 spline 插值结果的比较。从图中也可以直观的看出 spline
比 pchip 要光滑一些。

MATLAB

379

数值分析与应用

实际上两者的差别并不是特别明显,如实验原理部分叙述,样条函数的一阶导数是光滑
的,而 pchip 的一阶导数是连续的,但是表现出一些扭结。样条函数的而阶导数是连续的,
而 pchip 的二阶导数是在结点出出现了跳变。由于两个函数都是分段三次多项式,它们的三
阶导数都是常数。样条函数的三阶导数前两个子区间和后两个子区间分别取同一常数,这也
反应了样条两端点满足非结点条件。

实验 8.7

MATLAB 中 interp1 函数

实验基本原理
前面几个实验已经涉及到一些 MATLAB 的内置函数,这里再详细的介绍一下 interp1
函数。interp1 函数是功能比较强大的多种插值函数的一个集合,改变其参数设置,其实已
经涉及到内置算法的选择问题。
interp1 的基本语法主要有以下几种情况:
yi = interp1(x,Y,xi)
yi = interp1(Y,xi)
yi = interp1(x,Y,xi,method)
在 yi = interp1(x,Y,xi)中,返回值为插值结果,x,Y 为插值基点,其中 Y 可以为矩阵。
其中 x 可以缺省,如果 x 缺省的话,那么默认 x 为自然数一到 n,n 为 Y 的维数。
除了这三种以外还有一些扩展形式。method 参数是选择插值方式,其实选择一种方式
就是选择一种计算方案。
这里提供几个常用的插值方式:
nearest,最临近点插值。
linear,线性插值。
spline,三次样条插值。
pchip 或 cubic,分段三次 Hermite 插值。
v5cubic,MATLAB5 中给出的一种三次插值方法。
在 MATLAB 中,如果方法参数缺省则使用线性插值。需要说明的在是在‘nearest’、
‘linear’和‘v5cubic’方法插值时,如果插值点在区间范围之外,则系统返回 NaN(不是
一个数)
,对于其他方法则返回外插结果。
鉴与 interp1 在插值中的重要应用,这里通过一个具体的实验,介绍一下 interp1 选择各
种方法对数据的插值效果,以对各种插值情况加深了解。当然这里给的方法不一定是非常好
的预测方法,实际上完成这一课题,有时候使用时间序列分析往往会取得不错的效果。
与前面一些插值问题不同的是,实验中插值数据 Y 使用了矩阵,读者可以体会如何对
插值基点进行插值的。
需要说明的是,对于类似本实验的问题,最好不要试图根据插值方法外推预报。这样做
往往得到的结果不太理想,如果需要预报的话另外有数学方法处理。当然如果对于资料中的
中间数据缺省可以采用插值方法进行估计、猜测,结果还是有一定的可性度。

MATLAB

数值分析与应用

380

实验目的与要求

l

加深对 interp1 方法的了解与使用。

l

会对插值问题中的矩阵情况进行处理。

l

给出不同插值方法的图形表达。

l

比较不同插值方法的效果。

l

对结果做初步分析。

l

对于中间数据的缺省部分能够使用插值方法做出猜测。

实验内容及数据来源
已知某城市 1991 年到 1996 年每个季度的民用煤消耗量(单位:顿)
,如表 8.2。
使用不同的插值方法,对已有数据插值,比较插值效果。
年份

1 季度

2 季度

3 季度

4 季度

1991

6878.4

5343.7

4847.9

6421.9

1992

6815.4

5532.6

4745.6

6406.2

1993

6634.4

5658.5

4674.8

6645.5

1995

7413.5

5863.1

4997.4

6776.1

1994

7130.2

5532.6

4989.6

6642.3

1996

7476.5

5965.3

5202.1

6894.1

表 8.2 某城市用煤消耗量

实验操作指导
光盘:\实验视频\chapter8.rar\8-7.exe
光盘:\实验代码\chapter8\yongmei.m

步骤一:编写脚本程序。
打开 Editor 编辑器,输入以下语句:
%interp1 的使用

主函数

%原始数据
origin_data=[
1991 6878.4 5343.7 4847.9 6421.9
1992 6815.4 5532.6 4745.6 6406.2

MATLAB

381

数值分析与应用

1993 6634.4 5658.5 4674.8 6645.5
1995 7413.5 5863.1 4997.4 6776.1
1994 7130.2 5532.6 4989.6 6642.3
1996 7476.5 5965.3 5202.1 6894.1
];
%x 为年份 y 为各年各季度的实际用煤数据
%作为插值基点
x=origin_data(:,1);
y=origin_data(:,2:5);
%采用 nearest 方法插值
t=1991:0.2:1996;
y1=interp1(x,y,t,'nearest');
plot(x,y,'o',t,y1),title('nearest 插值效果'),grid
%采用默认的 linear 方法插值
figure
y2=interp1(x,y,t);
plot(x,y,'o',t,y2),title('linear 插值效果'),grid
%采用 pchip 方法插值
figure
y3=interp1(x,y,t,'pchip');
plot(x,y,'o',t,y3),title('pchip 插值效果'),grid
%采用 spline 方法插值
figure
y4=interp1(x,y,t,'spline');
plot(x,y,'o',t,y4),title('spline 插值效果'),grid
以文件名 yongmei.m 保存。

步骤二:运行程序。
在命令窗口输入:
>> clear
>> yongmei
回车得到运行结果,如图 8.8-8.11。

实验结论
这里省略了插值的中间数据,直接给出图形分析。首先采用的是 nearest 方法,插值效

MATLAB

382

数值分析与应用

果如图 8.8

图 8.8 nearest 插值效果
从图 7.8 中可以看出采用 nearest 插值效果还是很不理想的,没有整个图形都是在间断
的起伏中。
如果在插值中缺省参数,则选择默认的分段线性插值方法,分段线性插值方法,直观言
就是把邻近的点用线段连接起来,没有光滑而言。当然分段线性插值方法和 nearest 方法计
算量都是非常小的。分段线性插值效果,如图 8.9

图 8.9 linear 插值效果
看来来比较舒畅的插值效果是 pchip 和 spline 插值方法。其中 pchip 插值结果如图 8.10
所示。可以看到使用 pchip 插值的曲线已经比较光滑。pchip 插值样条函数的一阶导数是连
续的。

MATLAB

383

图 8.10

数值分析与应用

interp1 中 pchip 方法插值效果

在图 8.11 中使用的变是 spline 插值方法,在这几种插值方法里这是最光滑的一种曲线。
spline 插值方法关于而阶导数也也是连续的。

图 8.11

interp1 中 spline 方法插值效果

通过这个实验相信已经对 interp1 插值的几种方法有了更加具体的了解,一般而言建议
使用相对光滑一些的曲线插值效果会比较好些,当然这也不是绝对的。
再次强调,对于本实验中类似的问题,最好不要使用插值方法外推预报,这样做往往效
果会很令人失望,甚至不如我们眼睛看了资料后主观的猜测结果。当然如果必须要外推预测
的话,另外有数学方法处理这一类问题,有兴趣的读者可以阅读有关时间序列分析专著或相
关文献。

MATLAB

384

数值分析与应用

实验 8.8 二元函数插值

实验基本原理
前面的实验主要是针对的是一元插值问题展开的,一元插值问题插值函数是一元函数。
有时候需要处理插值函数是二元函数的问题,这就是二元插值问题。就基本原理而言二元插
值和一元插值问题类似,但是算法要复杂许多。除非了二元插值以外,还有三元插值方法以
及多元插值。实际上用的比较多的还是一元函数插值问题,所以在数值分析教材里一般不提
及二元以及多元插值问题。
在 MATLAB 中可以使用 interp2 进行二元函数插值。interp2 的基本语法为:
ZI = interp2(X,Y,Z,XI,YI)
ZI = interp2(Z,XI,YI)
ZI = interp2(Z,ntimes)
ZI = interp2(X,Y,Z,XI,YI,method)
基本意义和 interp1 类似,在 interp2 中提供了以下几种插值方法:nearest、linear、spline
和 cubic 插值方法。其基本意义和一元插值类似。在下面的实验中,我们分别演示各种插值
方法的具体效果。
在二元素插值问题中,可以使用 meshgrid 方法实现插值点矩阵的生成,在格式
[a,b]=meshgrid(x,y)
中 x,y 为向量,输出矩阵 a 的各行为向量 x,矩阵 b 的各列为向量 y。

实验目的与要求

l

知道二元插值的基本含义。

l

会正确使用 interp2 函数。

l

知道 meshgrid 函数方法的意义,并能正确使用。

l

能够根据需要有效的设置 interp2 的相关输入、输出参数。

l

能够对输出结果作出分析。

l

比较不同的插值方法产生的插值效果。

实验内容及数据来源
在区间 [ −3,3] × [ −3, 3] 上使用 peaks 生成点列,然后使用二元函数的几种插值方法进行
插值,比较插值效果。

MATLAB

385

实验操作指导
光盘:\实验视频\chapter8.rar\8-8.exe
光盘:\实验代码\chapter8\interp_2.m

步骤一:编写主函数。
打开 Editor 编辑器,输入以下语句:
%二元函数插值问题
[X,Y] = meshgrid(-3:0.6:3);
Z = peaks(X,Y);
[XI,YI] = meshgrid(-3:.125:3);
ZI = interp2(X,Y,Z,XI,YI);
subplot(2,2,1)
surf(X,Y,Z)
axis([-3 3 -3 3 -5 5])
title('插值数据')
%化出使用 nearest 方法插值结果
subplot(2,2,2)
ZI = interp2(X,Y,Z,XI,YI,'nearest');
surf(XI,YI,ZI)
title('nearest')
axis([-3 3 -3 3 -5 5])
%画出使用 linear 方法的插值结果
subplot(2,2,3)
ZI = interp2(X,Y,Z,XI,YI,'linear');
surf(XI,YI,ZI)
axis([-3 3 -3 3 -5 5])
title('linear')
%画出使用 spline 方法的插值结果
subplot(2,2,4)
ZI = interp2(X,Y,Z,XI,YI,'spline');
surf(XI,YI,ZI) ,title('spilne')
axis([-3 3 -3 3 -5 5])
以文件名 interp_2.m 保存。

步骤二:运行程序。
在命令窗口输入:
>>clear

数值分析与应用

MATLAB

386

数值分析与应用

>> interp_2
回车得到函数图象,如图 8.12 和图 8.13。

实验结论
在图 8.12 第一幅子图中,给出的是原始数据,为了更好的比较不同插值方法的计算效
果,在实验中选择了区间[-3,3]上间隔 0.6 作为离散的插值基点。在第一幅子图中,可以粗
略的看出这些数据描述的函数图象,当然这是我们事先知道的。
在图 8.12 第二幅子图中,给出的是采用 nearest 方法的插值结果,可以看出结果是很粗
糙的,跳跃性很强,如果对比一元插值方法中的 nearest 方法(如图 8.8)
,可以看出两者有
类似的地方。

图 8.12 原数据与使用 nearest 方法插值效果
在图 8.13 中,第一幅子图给出了使用 linear 方法插值效果,这也是 interp2 中默认的方
法,其插值效果比 7.12 好一些,但整个曲面还是不够光滑,这是很明显的。在图 8.13 的第
二幅子图中,给出了使用 spline 方法插值效果。可以看出这个图形已经很光滑了,如果读者
直接用更密集的点画出原函数,会发现在图 8.13 中的第二幅子图已经非常接近了。

MATLAB

387

数值分析与应用

图 8.13 使用 linear 方法与 spline 方法插值效果
在 MATLAB 中还提供了 interp3 可以进行三元函数插值,
interpn 可以进行 n 元函数插值,
因为这些方法使用并不太多,这里就不再介绍。其基本用法和一元、二元情况类似。但是对
于多元函数插值问题,如果采用图形化方法表现往往比较困难。

实验 8.9

Chebyshev 最佳一致逼近

实验基本原理
在开始本实验之前,首先对几个概念要明确一下。函数逼近问题与插值问题是两个不同
的问题,但是又有一定的联系。
设 f ( x ) 是定义在区间[a,b]上的函数,寻求另一个构造简单,计算量小的函数 ϕ ( x ) 来近
似的代替 f ( x ) 的问题就是函数逼近问题。通常我们会取一些线性无关的函数系来达到函数

MATLAB

数值分析与应用

388

逼近的目的。

{

}

对于给顶的函数系 ϕ j ( x ) ,寻求函数
n

ϕ ( x ) = ∑ c jϕ j ( x)
j =0

使 lim max f ( x) − ϕ ( x) = 0 的函数称为一致逼近。使
n →∞ a ≤ x ≤ b

p

b

lim ∫ f ( x ) − ϕ ( x ) W ( x)dx = 0
n →∞ a

p

的函数称为关于权 W ( x) 的 L 逼近。比较常用的 p=2,称为平方逼近。
设 f ( x ) 是区间[a,b]上的连续函数,则任给定 ε > 0 ,存在一多项式 pε ( x) ,使不等式

f ( x) − pε ( x) < ε
对所有 x ∈ [ a, b] 一致成立,这就是著名的 Weierstrass 定理。
对于集合 H n = span{1, x,L , x n } ,如果 pn ( x) ∈ H n ,则称

max f ( x) − pn ( x )
a ≤ x≤b

为原函数多项式的偏差。

En = min max f ( x) − pn ( x )
pn ( x )∈H n a ≤ x ≤ b

称为 n 次最佳逼近或最小偏差。由于 Weierstrass 定理可以知当 n 趋向无穷时偏差趋近 0。

如果 H n 中存在一个多项式 p( x) 使得

max f ( x) − pn ( x ) = En
a ≤ x≤b

则 p(x)称为 f(x)的 n 次最佳一致逼近多项式。
求最佳一次逼近多项式的一种方法是可以采用 Chebyshev 节点插值,Chebyshev 节点为

( 2 j + 1) π + b + a], j = 0,1, 2,L , n
1
x j = [(b − a) cos
2
2 ( n + 1)
实验目的与要求
l

了解函数逼近的基本大意。

l

知道函数逼近的 Weierstrass 定理,证明不要求掌握,但是要理解定理描述的内容。

l

知道最佳一次逼近的基本定理以及相关的定义。

l

会使用 Chebyshev 插值多项式对函数进行近似的最佳逼近。

MATLAB

389

数值分析与应用

l

使用不同的阶对函数逼近,比较逼近效果。

l

原 Chebyshe 逼近方法是针对区间[-1,1]上给的,对于不是这个区间上的函数要会变换
到这个区间上。

实验内容及数据来源
求函数 f ( x) = xe x 在区间 [ −6, 6] 上的 3、5 和 12 次近似最佳逼近多项式(Chebyshev 插值多
项式)
。分别给出不同阶逼近多项式的函数图象,比较个阶逼近效果。

实验操作指导
光盘:\实验视频\chapter8.rar\8-9.exe
光盘:\实验代码\chapter8\
cheby.m,lag.m, cheby_main.m

步骤一:编写逼近多项式的方法。
打开 Editor 编辑器,输入以下语句:
%08 年 07 月 03 日
%Chebyshev 节点插值法
function g=cheby(f,n,a,b)
%n 是要求的阶数
%节点
for j=0:n
temp1=(j*2+1)*pi/2/(n+1);
temp2=(b-a)*cos(temp1)+b+a;
temp3(j+1)=temp2/2;
end
x=temp3;
%求得节点函数值
y=f(x);
%多节点插值
g=lag(x,y);
以文件名 cheby.m 保存。

步骤二:编写拉格朗日插值方法,如果实验一中的函数保留了,这里可以直接调用。
打开 Editor 编辑器,输入以下语句:
%拉格朗日插值方法
%可以同时对多点插值

%分别对 t 的每一个分量插值 for i=1:m temp(i)=subs(s. for(j=k+1:n) la=la*(p-x(j))/(x(k)-x(j)).MATLAB 390 %t 可以为向量 function s=lag(x. %构造基函数 for(j=1:k-1) la=la*(p-x(j))/(x(k)-x(j)). %展开多项式 s=collect(s). end %得到的是系列插值点的插值结果 %既得到的是向量,赋值给 s s=temp. s=0. s=s+la. end. %把系数取到 6 位精度表达 s=vpa(s.'p'.'x'). else %读取 t 长度 m=length(t). end %对输入参数个数做判断,如果只有两个参数 %直接给出插值多项式 %如果三个参数 则给出插值点的插值结果 %第三个参数可以为向量 if(nargin==2) s=subs(s. for(k=1:n) la=y(k).y.'p'. end. %读取 x 向量维数 n=length(x). simplify(s).4). end 数值分析与应用 .t) %采用符号推导,这样可以给出插值具体公式 syms p.t(i)).

2.6) z3=cheby(f.ezplot('x*exp(x)').40*x z2 = .2.1420e-5*x^10+.-6.25 z3 = -.1 813e-2*x^7+.'x').ezplot(z1).2405e-16+.9981*x^2+.8007e-2*x^6+.6439e-6*x^11+.0+4.2287e-3*x^8+.*exp(x)'.'color'.5187e-7*x^12+.126*x+40.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句 %08 年 07 月 03 日 %切比雪夫最佳一致逼近主函数 %构造函数 f=inline('x.020*x^3-18. %分别调用逼近函数 z1=cheby(f.2.grid subplot(2.3709e-1*x^5+.ezplot(z3).56*x^2+6.6) z2=cheby(f.grid %改变背景为白色 set(gcf.m 保存。 步骤四:运行程序。 在命令窗口输入: >> clear >> cheby_main 回车得到: z1 = -133.5.1682*x^4+.6) %作出逼近函数图形 subplot(2.MATLAB 391 数值分析与应用 以文件名 lag.1).'white') 以文件名 cheby_main.5209*x^3+.3.grid subplot(2.6201e-5*x^9+.-6.359*x^4-2.2.3).4).ezplot(z2).12.822*x^3+27.9729*x 实验结论 计算结果已经直接给出了逼近的多项式。在其他高级语言中可能需要直接输出一个向 .38*x^2-20.grid subplot(2.-6.2).2001*x^5+1.

14 中给出了各阶多项式逼近的效果。其中第一幅子图为原函数图象,第二幅子 图而 3 次逼近,第三幅为 5 次,最后一幅为 12 次逼近。可以看出前面的两个逼近还是比较 粗糙的 ,而 12 次逼近效果在区间范围内效果是非常不错的。 实验 8.10 Chebyshev 多项式与第二类 Chebyshev 多项式 实验基本原理 鉴于正交多项式在数值分析里的重要应用,本实验和接下来的一个实验分别介绍几个比 较常用的正交多项式。 首先介绍 Chebyshev 多项式和第二类 Chebyshev 多项式。 考虑函数 .14 Chebyshev 最佳一致逼近效果 在图 8.MATLAB 392 数值分析与应用 量,这个向量对应多项式各阶的系数。在 MATLAB 中这个问题可以灵活处理。对于被调用 的插值问题,事实上如果不采用符号法运算,而是默认的数值方法编写方法函数,但是在调 用时输入量为符号变量,那么输出结果同样为符号变量。 图 8.

x ∈ (−∞. x ∈ [−1.MATLAB 数值分析与应用 393 Tn ( x ) = ( ) ( ) n n 1  2 2 x + x − 1 + x − x − 1   .1] 区间内是为多项式,就是第二类 Chebyshev 多项式,第二类 Chebyshev 多项式 也有许多重要的性质,在实验结论部分作一些介绍。 实验目的与要求 l 知道 Chebyshev 多项式的定义。 l 熟悉 Chebyshev 多项式的递推方法。 l 能够编程计算 Chebyshev 多项式,并画出低阶多项式函数图象。 l 了解 Chebyshev 多项式的重要性质。 l 知道第二类 Chebyshev 多项式的定义,递推方法。 l 编程计算第二类 Chebyshev 多项式,画出低阶多项式函数图象。 l 了解第二类 Chebyshev 多项式的重要性质。 实验内容及数据来源 用 MATLAB 算出 Chebyshev 多项式和第二类 Chebyshev 多项式表达式,然后分别绘出 前几阶的多项式函数图象。 其中 Chebyshev 多项式满足以下递推关系 Tn+1 = 2 xT0 ( x) − Tn−1 ( x)  T0 = 1 T = x 1 第二类 Chebyshev 多项式满足以下递推关系 U n +1 = 2 xU 0 ( x ) − U n−1 ( x)  U 0 = 1 U = 2 x  1 . +∞) 2 上式的中间变量 x 2 − 1 是复数。这就是 Chebyshev 多项式,Chebyshev 多项式有很多重要 的性质,在结论分析部分将介绍一些这些性质。 考虑函数 Un = sin [(n + 1) arccos x ] 1 − x2 .1] 在 x ∈ [ −1.

t= simplify(t). t(2)=x. t(2)=2*x.exe 光 盘 : \ 实 验 代 码 \chapter8\cheby_p. end.n) t(1:n+1)=x. t(1)=1.rar\8-10. t(1)=1.MATLAB 394 实验操作指导 光盘:\实验视频\chapter8. chep_main.m.m 步骤一:编写 Chebushev 多项式的方法函数。 打开 Editor 编辑器,输入以下语句: % CHebyshev 多项式递推函数 function t=cheby_p(x. t= simplify(t). end.m 保存。 步骤二:编写第二类 Chebyshev 多项式方法函数。 打开 Editor 编辑器,输入以下语句: %第二类 Chebyshev 多项式递推函数 function t=cheby2_p(x.n) t(1:n+1)=x. %计算一般项 for i=3:n+1 t(i)=2*x*t(i-1)-t(i-2). cheby2_p. %计算一般项 for i=3:n+1 t(i)=2*x*t(i-1)-t(i-2). %实际上给出的是 1, , ,n+1 项 以文件名 cheby_p. %给出的下标是 1, , ,n+1 以文件 cheby2_p.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %chebyshev 多项式主函数 数值分析与应用 .m.

3].2).axis([-1.ezplot(T1(2)).2).2.grid subplot(3.5.ezplot(T2(1)).6).m 保存。 步骤四:运行程序。 在命令窗口输入: >> clear >> chep_main 回车得到: 第一类 Chebyshev 多项式为 1 x 2*x^2-1 4*x^3-3*x 数值分析与应用 .1.ezplot(T2(2)).grid 以文件名 chep_main.ezplot(T1(4)).1.2.axis(v). subplot(3.4).2.5]).grid subplot(3.grid subplot(3.grid subplot(3.ezplot(T1(6)).-0.1).grid %第二类 chebyshev 多项式 disp('第二类 Chebyshev 多项式为') T2=cheby2_p(x.grid subplot(3.axis(v).1.1.2.-1.2.MATLAB 395 % chebyshev 多项式 syms x T1=cheby_p(x.grid subplot(3.ezplot(T2(5)).2.1].2.grid subplot(3.2. disp(' Chebyshev 多项式为') for i=1:6 disp(T1(i)) end v=[-1.grid subplot(3.3).axis(v).axis(v).ezplot(T2(4)). subplot(3.6).2.4).3).grid subplot(3.-0.ezplot(T1(5)).-3.5).axis(v).axis(v).ezplot(T2(6)).grid subplot(3.1.2.5).ezplot(T2(3)).5.5).2.2. for i=1:6 disp(T2(i)) end figure v=[-1.5]).axis(v).axis(v).1).ezplot(T1(3)).ezplot(T1(1)).1.5).axis([-1.axis(v).axis(v).

15 Chebyshev 多项式 容易证明对于 Chebyshev 多项式有首项系数为 2 般项可以从递推关系式中看出。 n−1 ,从前几项中可以直接看出。对于一 .MATLAB 数值分析与应用 396 8*x^4-8*x^2+1 16*x^5-20*x^3+5*x 第二类 Chebyshev 多项式为 1 2*x 4*x^2-1 8*x^3-4*x 16*x^4-12*x^2+1 32*x^5-32*x^3+6*x 实验结论 输出结果已经给了我们明确的答案,在主函数中,直接给出了各阶多项式的函数图象, 其中第一种类型的多项式函数图象见图 8.15。 图 8.

MATLAB 数值分析与应用 397 对于 Chebyshev 多项式还有奇偶性,当 n 为奇数时,多项式为奇函数,当 n 为偶数时, 多项式为偶函数。 ( 还有一个重要的性质是直交性,Tn 是在区间[-1,1]上关于权函数 1 − x 1 2 −2 ) 的的直交多 项式。 ∫ 1 −1 Tm ( x ) Tk ( x ) (1 − x 1 2 −2 ) 0. π  dx =  .16 第二类 Chebyshev 多项式 第二类直交多项式是在区间[-1,1]上关于权函数 1 − x 2 的直交多项式,既有 0. m≠k m=k ≠0 m=k =0 Chebyshev 多项式还有一些其他性质,这里就不再介绍了。为了看清楚各阶多项式的性 态,我们把这些图象分别画在不同的子图中。习惯上一般会记程序中输出结果的第一项为第 零阶多项式。在图 8.16 中,给出了第二类 Chebyshev 多项式的函数图象。 图 8. 2 π .  ∫−1U m ( x )U k ( x ) 1 − x dx =  π .  2 1 m≠k 2 m=k 第二类 Chebyshev 多项式还有其他一些重要的性质,这里就不做介绍了。 .

11 Legendre、Laguerre 和 Hermite 多项式 实验基本原理 在实验 8.L .10 中介绍了两个重要的直交多项式,这一实验继续介绍三个比较重要的直交 多项式 Legendre、Laguerre 和 Heimite 多项式。 Legendre 多项式 Pn ( x) 定义为 Pn ( x) = 1 d n ( x 2 − 1) n . 2n n ! dx n Legendre 多项式有如下的递推关系 Pn +1 ( x) = P0 ( x) = 1 2n + 1 n xPn ( x) − Pn −1 ( x ) n +1 n +1 P1 ( x) = x Laguerre 多项式 Ln ( x) 定义为: Ln ( x) = e x d n ( xn e− x ) dx n . 0 ≤ x < +∞ Laguerre 多项式有如下的递推关系: Ln +1 ( x ) = (1 + 2n − x ) Ln ( x ) − n 2 Ln −1 ( x) L0 ( x) = 1 L1 ( x) = 1 − x Hermite 多项式定义为: H n ( x) = ( −1) e x n 2 ( ) . n = 1. −∞ < x < +∞ d n e− x 2 dx n Hermite 多项式有如下的递推关系: H n+1 ( x ) = 2 xH n ( x ) − 2nH n −1 ( x ) H 0 ( x) = 1 H1 ( x) = 2 x 实验目的与要求 . 2.MATLAB 数值分析与应用 398 实验 8.

lague_p. p= simplify(p). t(2)=1-x. herm_p. dxs_main.m. t(1)=1.m.MATLAB 399 数值分析与应用 l 明白 Legendre、Laguerre 和 Hermite 多项式在科学与工程中的重要作用。 l 会正确使用递推方法计算上述三种多项式。 l 了解这三种正交多项式的重要性质。 l 能够给出多项式的表达式。 l 能够对把计算结果用图形表现出来。 实验内容及数据来源 计算 Legendre、Laguerre 和 Hermite 多项式。并把低阶多项式分别用图象表现出来。 实验操作指导 光盘:\实验视频\chapter8.m 保存。 步骤二:编写 Laguerre 多项式方法函数。 打开 Editor 编辑器,输入以下语句: %拉盖尔多项式 function t=lague_p(x. 以文件名 leg_p.exe 光盘:\实验代码\chapter8\leg_p. p(1)=1.n) p(1:n+1)=x.n) t(1:n+1)=x. %计算一般项 for i=3:n+1 p(i)=(2*i-3)*p(i-1)*x/(i-1)-(i-2)*p(i-2)/(i-1).m 步骤一:编写 Legendre 多项式方法函数。 打开 Editor 编辑器,输入以下语句: %Legendre 多项式 function p=leg(x. %计算一般项 for i=2:n .m. end. p(2)=x.rar\8-11.

1.ezplot(T1(3)).axis(v).axis(v).axis(v).5). end. subplot(3.ezplot(T1(2)).axis(v). 以文件名 lague_p.2.MATLAB 400 t(i+1)=(1+(i-1)*2-x)*t(i)-(i-1)^2*t(i-1).axis([-1.grid subplot(3.2). t(2)=2*x. t= simplify(t).-0. t= simplify(t).3).2.5. disp('Legendre 多项式为') for i=1:6 disp(T1(i)) end v=[-1.-1.6).4).2. %计算一般项 for i=2:n t(i+1)=2*x*t(i)-(i-1)*2*t(i-1).1.2.grid %Laguerre 多项式 disp('Laguerre 多项式为') T2=lague_p(x.grid subplot(3. for i=1:6 数值分析与应用 .grid subplot(3.1].grid subplot(3.5).ezplot(T1(5)).2. t(1)=1.ezplot(T1(6)).n) t(1:n+1)=x.5). 以文件名 herm_p.m 保存。 步骤四:编写主函数。 打开 Editor 编辑器,输入以下语句: %Legendre、 Laguerre、Hermite 多项式主函数 %Legendre 多项式 syms x T1=leg_p(x.1.m 保存。 步骤三:编写 Hermit 多项式方法函数。 打开 Editor 编辑器,输入以下语句: %Hermit 多项式 function t=lague_p(x.ezplot(T1(4)).1).5]).grid subplot(3.axis(v). end.ezplot(T1(1)).2.

4).ezplot(T3(6)).2.ezplot(T2(6)).ezplot(T3(1)).5).20]).1).grid subplot(3.grid subplot(3.2.2.2.3).5]).2.grid subplot(3.2.-20.ezplot(T3(5)).1.-0.2.2).axis([-1.grid subplot(3.5).2.grid subplot(3.2.ezplot(T2(4)).2.grid subplot(3.2.ezplot(T2(1)).grid subplot(3.grid %Hermite 多项式 disp('Hermite 多项式为') T3=Herm_p(x.axis([-2.1.2).m 保存。 步骤五:运行程序。 在命令窗口输入: >>clear >> dxs_main 回车得到 Legendre 多项式为 1 x 3/2*x^2-1/2 5/2*x^3-3/2*x 35/8*x^4-15/4*x^2+3/8 63/8*x^5-35/4*x^3+15/8*x Laguerre 多项式为 1 1-x 数值分析与应用 .4).ezplot(T2(2)).3).grid subplot(3.2.2.5.MATLAB 401 disp(T2(i)) end figure(2) subplot(3.axis([-2.100]).-0.ezplot(T3(3)).1.6).ezplot(T3(2)).5.axis([-1.6).grid subplot(3.-20.1.axis([-2.-100.ezplot(T2(3)).grid 以文件名 dxs_main.ezplot(T3(4)).5]).2.20]). for i=1:6 disp(T3(i)) end figure(3) subplot(3.ezplot(T2(5)).2.1).grid subplot(3.5).

17 中给出了各阶多项式的函数图象, .MATLAB 402 数值分析与应用 2-4*x+x^2 6-18*x+9*x^2-x^3 24-96*x+72*x^2-16*x^3+x^4 120-600*x+600*x^2-200*x^3+25*x^4-x^5 Hermite 多项式为 1 2*x 4*x^2-2 8*x^3-12*x 16*x^4-48*x^2+12 32*x^5-160*x^3+120*x 实验结论 因为这些多项式都经常用到,而且比较重要,为方便参考,这里把输出结果整理一下。 对于 0 到 5 阶多项式为: P0 = 1 P1 = x 1 2 ( x − 1) 2 1 P3 = ( 5 x 3 − 3x ) 2 1 P4 = ( 35 x 4 − 30 x 2 + 3) 8 1 P5 = ( 63x 5 − 70 x3 + 15 x ) 8 P2 = 在图 8.

17 Legendre 多项式函数图象 可以看出奇次 Legendre 多项式只含有 x 的奇次幂,而偶次多项式只是 x 的偶次幂的线性组 合。 还可以验证 Legendre 多项式是区间[-1,1]上关于 W ( x) = 1 的直交多项式 ,既 0  ∫−1 Pm ( x) Pk ( x)dx =  2  2m + 1 1 这是 Legendre 多项式非常重要的性质。 m≠k m=k .MATLAB 数值分析与应用 403 图 8.

18 Lagueere 多项式函数图象 计算结果也直接给出了 Laguerre 前几阶多项式的表达式,为方便阅读,这里也整理如下: L0 ( x) = 1 L1 ( x) = 1 − x L2 ( x ) = x 2 − 4 x + 2 L3 ( x ) = − x 3 + 9 x 2 − 18 x + 6 L4 ( x ) = x 4 − 16 x 3 + 72 x 2 − 96 x + 24 L5 ( x) = − x 5 + 25 x 4 − 200 x3 + 600 x 2 − 600 x + 120 −x 也可以验证 Laguerre 多项式是在区间 [0.19 中给出了 0 到 5 阶的 Hermite 多项式函数图象,为了看出函数性态的一些变 化情况对其中的一些坐标进行了控制。如果使用默认的坐标,我们会看到相对整体一点的大 范围图象,但是对小区间上变化细节却不明显,因为这些变化在大尺度下会显得不明显,相 反如果我们关注这些细节,却难以从得到整体的图象,除非图象非常庞大。不过读者在输出 结果时,可以不断改变参数查看,同时可以用图象浏览器上的手型图不断移动图象查看。 .MATLAB 数值分析与应用 404 图 8.18 中给 出了 0 到 5 阶的 Laguerre 多项式函数图象,程序中对部分输出坐标进行了控制。 在图 8. +∞ ] 上是关于权函数 e 的直交多项式。既 0 −x L ( x ) L ( x ) e dx =  2 ∫−1 m k ( m !) 1 m≠k m=k 从表达式中容易看出对每一项的奇、偶次幂的系数正、负号是交替出现的。在图 8.

+∞ ] 上关于劝 e − x2 的直交多项式,既 0 − x2 H ( x ) H ( x ) e dx =  m ∫−1 m k 2 m ! π 1 m≠k m=k Hermite 多项式也是奇次项由 x 的奇次幂线性组合而成,而偶次项由 x 的偶次幂线性组合而 成。 这些直交多项式不只是在计算方法中非常重要,在理论科学中如量子力学、电动力学等 学科中也非常重要。 .MATLAB 数值分析与应用 405 图 8.19 Hermite 多项式函数图象 这里整理出了 Hermite 多项式的前几阶表达式,如下 H 0 ( x) = 1 H1 ( x) = 2 x H 2 ( x) = 4 x 2 − 2 H 3 ( x ) = 8 x 3 − 12 x H 4 ( x ) = 16 x 4 − 48 x 2 + 12 H 5 ( x) = 32 x 5 − 160 x3 + 120 x Hermite 多项式是在区间 [ −∞.

f ) = ∫ Pj g f dx −1 j +1 一般而言,系数部分需要用数值积分方法获得。从泛函分析的角度来说,可以认为这是 一种广义的 Fourier 级数。Fourier 级数的基函数选择的是三角函数系,而这里选择的是 Legendre 正交多项式作为基函数系。 实验目的与要求 l 了解最佳平方逼近的含义。 l 知道如何函数在区间上的最佳平方逼近函数是存在的而且是唯一的。 l 清楚使用 Legendre 多项式作为最佳平方逼近方法时的计算步骤。 l 理解正交函数系展开的意义。 l 对计算结果做出合理分析,给出逼近的效果图象。 实验内容及数据来源 求 f ( x) = e x 在[-1,1]上的三次最佳平方逼近多项式 . Pj ) ,而 ( Pj . Pj ) = 1 2 , ( Pj .MATLAB 406 数值分析与应用 实验 8. f ) ( Pj .12 Legendre 最佳平方逼近 实验基本原理 { } 设 ϕ j ( x ) 是[a.b]上的线性无关函数系, ϕ j ( x ) 在区间上都连续,设 W ( x) 为区间上的 一个权函数,确定广义多项式 n ϕ ( x ) = ∑ a jϕ j ( x) j =0 的系数,使 2 ∫a [ f ( x) − ϕ ( x) ] W ( x)dx = min ,这样的函数 ϕ ( x) 称为 f ( x) 在区间上关于权 b 函数 W(x)的最佳平方逼近或最小二乘逼近。 对于 Legendre 多项式作为基函数的最佳平方逼近,可以按照如下方法计算: n P( x) = ∑ a j Pj ( x) = a0 P0 ( x ) + a1P1 ( x ) + L + an Pn ( x ) j =0 其中 a j = ( Pj .

rar\8-12.-1. %计算系数 for i=1:n+1 g(i)=f1(i)*f.n) syms x %调用 Legendre 多项式 f1=leg_p(x. end %累计各系数与 legendre 多项式乘积 pf=0. 以文件 pingfang.exe 光盘:\实验代码\chapter8\ pingfang.1.8).m.MATLAB 407 P( x) = a0 P0 ( x) + a1P1 ( x) + a2 P2 ( x ) + a3 P3 ( x ) 其中 Pi 是 i 次 Legendre 多项式, i = 0. a(i)=(2*i-1)*temp(i)/2.n).m. 2.m 保存。 步骤二:编写主函数。 数值分析与应用 . pingfang_main.1). end %化简 pf=simplify(pf). %取前 8 位有效数字 pf=vpa(pf. temp(i)=int(g(i). 步骤一:编写最佳逼近方法函数。 打开 Editor 编辑器,输入以下语句: %legendre 最佳平方逼近 %其中系数采用符号积分方法 function pf=pingfang(f.3 。 实验操作指导 光盘:\实验视频\chapter8. for i=1:n+1 pf=pf+a(i)*f1(i).

20 中给出逼近效果。逼近区间为[-1,1],如前面实验遇到的一些情况类似,如 果直接在区间[-1,1]上画出原函数与逼近函数,两条线几乎重复,难以分辨。为了更清楚的 看出效果,这里给出了更大区间上的函数图象,而对逼近区间上的一段使用了‘^’作出图 形,可以看到在逼近段效果是比较理想的。而且逼近的函数图象覆盖了原函数图象。 在泛函的理论框架下,函数系的展开问题比普通微积分教材里阐述的有了更深刻的理论 内涵,而且有比较高的实用价值。从这里读者也可以初步领略到泛函的威力。 .1036 P1 ( x) + 0.m 保存。 步骤三:运行程序。 在命令窗口输入: >> clear >> pingfang_main 回车得到 px = . y=f(x).MATLAB 408 数值分析与应用 打开 Editor 编辑器,输入以下语句: %Lengder 最佳平方逼近主函数 f=inline('exp(x)'.grid hold on %画出原函数在给定区间上的函数图象 x=-1:0.53672140*x^2+.17614068*x^3 实验结论 结果输出直接给出了多项式的表达式,如果采用 Legendre 多项式表示的方法结果为 P( x) = 7.3) ezplot(px). px=pingfang(f. plot(x.152 P0 ( x) + 1.y.'x').07046 P3 ( x) 在图 7.3578P2 ( x ) + 0.01:1.99629405+.'^') 以文件 pingfang_main.99795482*x+.

20 Legendre 多项式最佳平方逼近 实验 8.13 Chebyshev 最佳平方逼近 实验基本原理 在最佳平方逼近理论中经常会遇到 Hilbert 矩阵问题,这里给出 Hilbert 矩阵  1  1/ 2 H =  M  1/(n+1) 1/2 L 1/(n+1)  1/3 L 1/(n+2)   M  1/(n + 2) L 1/(2n + 1)  按照最小二乘理论,最佳平方逼近的法方程系数就是 Hilert 矩阵。但是当 n 比较大时,矩阵 是病态的。计算中舍入误差会非常的大,计算的效果也是不尽人意的。这时候就需要用正交 多项式作为基,才能求得最小平方逼近多项式。 上一个实验介绍了 Legendre 多项式作为基函数的最佳平方逼近问题,这一实验介绍另 一个广义 Fourier 级数问题。 计算的步骤和上一个实验相仿。这个实验需要一些数学技巧,这样可以省去中间的数值 积分运算。所以,从机器运算的角度来说,这个实验所消耗的计算机资源其实是很少的。与 上一个实验不同的是,上一个实验的权函数为 1,而这个实验的权函数为 1 1 − x2 。 .MATLAB 409 数值分析与应用 图 8.

ping_che_main.m 步骤一:分析问题。 在平方逼近方法中 aj = 2 1 dx T j ( x) f ( x) ∫ π −1 1 − x2 做变量替换 x = cos(θ ) ,得到 π a j = ∫ f ( cos θ ) cos jθ dθ 0 则 π a j = ∫ θ cos jθ dθ = 0 2  (−1) j − 1 2  πj 如此一分析,则整个过程的计算量减小了很多,省略了积分计算。 .m.rar\8-13.exe 光盘:\实验代码\chapter8\ ping_che.MATLAB 数值分析与应用 410 实验目的与要求 l 加深正交多项式逼近的计算流程。 l 熟悉 Chebyshev 正交多项式逼近的计算方法。 l 对计算中出现的一些特殊问题,如果可以用手工方式快速化简的话对于问题的处理是有 益的。 l 对计算结果作出合理分析。 l 计算结果以图形方式表现出来。 实验内容及数据来源 求函数 f ( x ) = arccos x( −1 ≤ x ≤ 1) 关于权函数 1 1 − x2 的 5 次最佳平方逼近。 实验操作指导 光盘:\实验视频\chapter8.

%实际上给出的是 1, , ,n+1 项 以文件名 cheby_p. 以文件名 ping_che. t(2)=x.n) t(1:n+1)=x. f=a(1)/2.n).MATLAB 411 步骤二:编写方法函数。 打开 Editor 编辑器,输入以下语句: %chebyshev 多项式 最佳平方逼近 function f=ping_che(n) %定义符号变量 %pip 表示 pi ,因为 pi 在 MATLAB 中已经有含义 这里回避 syms x pip %计算系数 for i=2:n+1 a(i)=((-1)^i-1)*2/pip/i^2. %计算一般项 for i=3:n+1 t(i)=2*x*t(i-1)-t(i-2). t= simplify(t). for i=2:n+1 f=f+a(i)*che(i).-4/pip.m 保存。 步骤四:编写主函数。 打开 Editor 编辑器,输入以下语句: 数值分析与应用 .m 保存。 步骤三:编写 Chebyshev 多项式函数。 打开 Editor 编辑器,输入以下语句: %第一类 CHebyshev 多项式递推函数 function t=cheby_p(x.a(2:n)] %调用 chebyshev 多项式 che=cheby_p(x. end %化简 f=simplify(f). end. t(1)=1. end %组成 新向量 下标从一开始 a=[pip.

pi) ezplot(f7).'pip'. %把 pip 换为 pi f5=subs(f5.21。在图 8.m 保存。 步骤五:运行程序。 在命令窗口输入: >> ping_che_main 回车得到: f5 = -1/450*(-225*pi^2+1560*x-640*x^3+1152*x^5)/pi f7 = -1/22050*(-11025*pi^2+63840*x+69440*x^3-145152*x^5+115200*x^7)/pi 实验结论 在实验中,分别采取了 5 次多项式最佳平方逼近与 7 次多项式最佳平方逼近。逼近效果 如图 8.01:1.2.'pip'. %把 pip 换为 pi f7=subs(f7.grid.f1. %画出原函数图象 subplot(1.grid %7 次最佳平方逼近 subplot(1.21 中,第一幅子图给出的是 5 次最佳平方逼近,第二幅子图给的是 7 次 最佳平方逼近。 .2).2. f7=ping_che(7).title('7 次逼近') 以文件名 ping_che_main.MATLAB 412 数值分析与应用 f=@(x) acos(x). f1=f(t).'*') hold on %5 次最佳平方逼近 %画出逼近图象 f5=ping_che(5).1) plot(t.pi) ezplot(f5).title('5 次最佳平方逼近'). t=-1:0.

14 全球变暖数据分析 实验基本原理 前面的实验讲了一些具体的计算方法。本实验针对一个具体的科学小课题,展开分析。 实验的内容包括拿到实验数据,如何实现把数据文件载入 MATLAB 工作空间、如何从原始 数据中抽去有价值的数据,对数据进行综合分析、处理以及如何发布分析报告。问题是针对 一个大家都比较熟悉的全球温度变暖的问题,既有实验价值也有科学意义。 为了让读者有一个比较综合的处理技能,在实验中我们采取了比较详细的操作步骤说 明,几乎每一步都给出了具体的操作方法。当然也许实验的内容本身并不一定是读者感兴趣 的,但是处理步骤与方法是应该可以借鉴的。 .21 Chebyshev 最佳平方逼近 对于逼近函数图形在实验里采用的是符号作图方法,而原来函数区间段上使用的是离散 点作图方法。粗线段部分,实际上是原函数的离散点密集情况,可以看出已经在区间内逼近 效果是不错的。 对于程序的输出结果,这里也是直接给出了逼近多项式,都可以直接改为原正交函数多 项式展开市表示,如 5 阶逼近可以表示为: p5 ( x) = π 4 4 4 − T1 ( x) − T3 ( x) − T5 ( x ) 2 π 9π 25π 实验 8.MATLAB 413 数值分析与应用 图 8.

22。 图 8.MATLAB 414 数值分析与应用 实验目的与要求 l 了解用 MATLAB 处理科学小课题的基本流程。 l 要比较熟练的掌握,MATLAB 如何与外界数据沟通。 l 能从原始数据中,提取感兴趣的数据进行实验分析。 l 能够正确有效的对数据进行处理,分析,画出分析结果。 实验内容及数据来源 全球变暖问题日趋严重,我们从 East Anglia 大学的环境研究学院的气候研究中心收集 了一些数据。在这份数据 HadCRUT3 中选择了全球 13 个陆地和海洋气象站关于北半球从 1850 年到 2006 年的记录情况。 原始的数据是以文本格式给出的,数据中包含时间信息,和观测资料。用 UltraEditor 打开如图 8.22 原始的数据资料 实验操作指导 光盘:\实验视频\chapter8.exe .rar\8-14.

23 当前工作目录 2.鼠标由击数据,弹出菜单,如图 8.25。 .24 8.24 导入数据 3.选择“Import Data”菜单,弹出对话框,如图 8.MATLAB 415 数值分析与应用 光盘:\实验代码\chapter8\temperature\fenxi.m 步骤一:数据的导入,导出问题。使用 Import Wizard Import Wizad 可以多种文件类型,如标准数据文件,波型文件,图象文件等。 1. 复制数据文件到当前工作目录,查看你的当前工作目录,如图 8.23。 图 8.

27 .MATLAB 416 数值分析与应用 8.25 Import Wizard 对话框 4.直接点 Next,如图 8.26 创建导入数据变量 这时候可以把鼠标右击数据,修改数据名称。这里先不修改,保持默认。单击“Finish” , 完成数据导入。 5.查看工作空间,如图 8.26 8.

后面加分号,是为了不让数据显示出来,否则数据会很多,占满了你的屏幕。这时候查 看工作空间,如图 8.txt').29。 .MATLAB 数值分析与应用 417 图 8.28 查看工作空间 我们可以看到文件数据已经导入到工作空间的变量中。也可以使用 whos 命令查看变量 情况。 在命令窗口输入: >>whos 回车得到查看情况,如图 8.27 工作空间 查看完以后把变量名改为 origin_data。 当然这些步骤也可以通过程序语句实现,作为一名程序员,应该习惯如何用语句实现 相应的操作,而不是仅仅停留在界面操作上。 可以在命令窗口输入: >>clear >> origin_data=importdata('HadCRUT3 Northern Hemisphere.28。 图 8.

MATLAB 418 数值分析与应用 图 8.29 变量信息 这正是我们想要的数据。当然,这些数据中包含了很多信息。下面的操作里我们将要讲 到如何在这些数据中选择我们“感兴趣”的信息进行分析。 如前面所述,导入数据类型还可以有其他很多种,如果想了解详细信息,可以在命令窗 口输入: >> doc fileformats 回车后,系统运行如图 8.h 中可以看到包括数据文件、图象文件、视听文件等多种文件的详细说明与使用方 法。 步骤二:从原始数据中提取有价值数据。 1.在 origin_data 数据中,包含了时间和温度信息,可以在数据编辑器中查看 origin_data, .30 MATLAB 中的文件处理信息 在 y.30。 图 8.

MATLAB 419 数值分析与应用 如图 8.31。 图 8.33。 .31 数组编辑器 可以看到在数据中,第一行表示年份,从第二行开始才是我们想要的数据。 2. 鼠标左键单打第一行的行标“1” ,等数据变色以后,点右键。弹出菜单,如图 8.32。 图 8.32 创建新变量 选择“create Variable from Selction”。这时候已经生成了新的变量,默认的变量名为 unnamed。 查看工作空间,如图 8.

35 重命名后的变量空间 保存了年份数据以后,保存记录数据。在数据编辑器中,选择第 2 到 14 行的数据,方法是 先左击第 2 行行标,按住“shift”拖动鼠标到第 14 行行标,这时候数据颜色改变,如图 8.36。 .34。 图 7.m。 图 8.33 查看工作空间中的变量 这时候可以修改变量名,在工作空间中鼠标右击 unnamed,弹出菜单,如图 8.MATLAB 420 数值分析与应用 图 8.34 变量的重命名 选择 Rename 就可以修改变量名。这里修改为 year。修改工作空间如,图 8.

38。 .36 数组编辑器选择数据 单击鼠标右键盘,弹出菜单,如图 8.37 创建变量 annual 选择“create Variable from Selection” ,这时候工作空间已经生成了新的变量,把变量名改为 “annual” ,如图 8.MATLAB 421 数值分析与应用 图 8.37 。 图 8.

MATLAB 422 图 8.40 选择保存路径 保存后,一般在当前工作目录会显示保存后的文件名,如图 8.41 数值分析与应用 .39。 图 7.40。 图 8.38 查看变量空间 步骤三:保存与加载数据。 选择工作空间里的三个数据,点亮后单击右键弹出对话框,如图 8.39 保存数据 选择要保存的文件名保存,如图 8.

mat 查看工作空间,数据已经生成。或者在命令窗口输入: >> clear all >> load shuju 这时候数据已经加载到工作空间,查看结果如图 8.38。 步骤四:数据分析。 为了对数据进行多方面的分析,下面给出了程序,这些内容很容易从注释中获得。至于具体 内容并不一定重要,重要的是读者要掌握分析的流程。 打开 Editor 编辑器,输入以下语句: %全球变温分析 %数据来源于全球 13 个观测台站的真实数据 % 载入数据 .41 一样,已经保存了数据。 加载数据的方式很简单,也可以使用窗口操作方式或者命令方式。 先清空工作空间里的变量, 在命令窗口输入: >>clear all 鼠标双击图 8.42。 图 8.mat annual origin_data year 查看当前工作目录,结果和 8.42 IE 浏览器查看 mat 数据文件 当然,这也可以使用命令完成。只需要在命令窗口输入: >> save shuju.MATLAB 423 数值分析与应用 图 8.如图 8.41 在当前工作目录中的 mat 数据文件 但有时候系统反应并不是很快,可能没有显示, 不过没关系,用资源管理器打开你的当前 工作目录,查看已经保存的文件.41 中的 shuju.

'b'.above_zero. grid bar(year.5).'r'.annual).'EdgeColor'.'none') hold off % 解除保持图象 title('Positive vs Negative Temperature Annomaly') xlabel('Year') ylabel('Temperature Anomaly ') 数值分析与应用 .'FaceColor'.below_zero.'LineWidth'.* (annual_avg < 0).annual_avg.'EdgeColor'. % Values Above Zero below_zero = annual_avg .* (annual_avg >= 0).0.annual_avg).mat %%数据可视化 %画出所有年温度 figure plot(year.MATLAB 424 load shuju.'FaceColor'. % 画出年平均温度 figure area(year.'none') bar(year. % Values below Zero % 生成一个新的图形 figure hold on %保持原图象 加如新图象 plot(year.grid title('HadCRUT3 Temperature Anomaly Measurements from 13 Weather Stations') xlabel('Year') ylabel('Temperature Anomaly ') %%计算年平均温度 annual_avg = mean(annual).'--k'.grid title('Average Annual Temperature Anomaly') xlabel('Year') ylabel('Temperature Anomaly ') % 把数据按分为两类: above_zero = annual_avg .

five_year_avg.'Location'..3) grid hold off % Annotate figure title('Comparing the Annual Temperature Anomaly and the Five Year Moving Average') xlabel('Year') ylabel('Temperature Anomaly') legend('Annual Average'.'SE') text(1850.. five_year_avg = convn(annual_avg..0.MATLAB 425 数值分析与应用 legend('Annual Average'.1.'valid').'r-'. 'LineWidth'.'LineWidth'.'Above Average'. yr = year(ceil(span/2):length(five_year_avg)+ceil(span/2)-1)..5.span)/span.'--ko'..'k'. %比较每年温度与平滑情况 figure %生成新图象窗口 hold on plot(year.'Location'...'SE') 以文件名 fenxi.'Below Average'.annual_avg...'Five Year Average'..'b'..3) plot(yr. 'MarkerFaceColor'.. 'MarkerSize'.window. 'MarkerEdgeColor'.m 保存。 步骤五:运行程序。 在命令窗口输入: >>clear >>fenxi 回车得到运行结果: . window = ones(1.'\bfNorthern Hemisphere') %每间隔 5 年平滑 span = 5.

44 中我们获得了更直观的信 息,可以看出温度高于平均温度的年份从 1950 年之前的几年开始是一个分水岭。 .43 中给出了每年的温度情况,使用了原始数据横坐标为年份。从图中可以粗略 的看出温度总体而言有声高的趋势。 图 8.MATLAB 426 数值分析与应用 图 8.43 年平均温度 在图 8.44。在作图中采用 earea 函数。在图 8.44 以平均温度为限划分温度分布情况 在图形 8.43 中,数据非常多,而且看起来比较乱。为了对数据进一步有效的分析,这 里对所有年份的温度求平均,然后在图形中画出高于平均温度于低于平均温度的分界线把温 度分为两个区域,如图 7.

45。从图中可以看到在 1880 年的前几年里, 有一次温度比较高, 而之后的整个 1840 年到 1940 年的前的近一百年间温度都低于平均水平。 从图象中红色条纹很容易看到 1980 年后是温度上升的高峰,非常醒目。 图 8.MATLAB 427 数值分析与应用 图 8.46 所示。可以看出温度在逐年升高。对人类赖以生存的地球环境,这也是一个非常 严峻的信号。事实上,从资本主义工业化开始,地球的环境就已经在悄悄的改变。 实验结论 .46 以 5 年为区间取平均温度 为了看出温度变化的整体趋势,这里给出了每间隔 5 年的平均温度,并以红色线表示, 如图 8.45 对图形的进一步分析 为了更清楚的反应问题,对温度高于平均温度的情况和低于平均温度的情况给予区分, 如果高于平均温度,则以红色作为标记,而低于平均温度的情况则以蓝色做为标记。采用 bar 函数方法对数据重新给出图象分析,如图 7.

2.MATLAB 428 数值分析与应用 在实验中,给出了比较详细的操作说明,从基本数据开始,到获得实验结论,都做了介 绍。整个分析过程也有意的没有采用比较复杂的数学方法,对分析过程获得一个感性的认识。 读者可以根据自己的具体课题,做类似的分析。 面对具体的科研课题,要能有效的对问题进行分析,提炼有意义的信息,通过猜想、计 算验证等手段获得实验结果。当然,合适的图形化表示会为你的报告添加色彩。 本章小结 在这一章中,主要介绍了多种插值方法和函数逼近问题。插值问题和函数逼近问题是两 个不同,但又有联系的课题。在插值方法中,很难说哪一种方法一定比另一种优秀,每种方 法都有自己的特点。Lagrange 方法、Netown 插和 Hermite 插值方法是基础,掌握了这三种 方法以后,学习一般的插值理论就不会觉得很吃力。 对于函数逼近部分,主要介绍了最佳一致逼近和最佳平方逼近,就具体问题而言会计算 方法固然很重要,但是这两个课题的理论问题也是很重要的。 本章的最后一个实验,给了一个较综合的具体问题,虽然在这个实验中所用的数学理论 并不是很复杂,但是体现了 MATLAB 做数据分析时的一些基本步骤,希望对读者有一定的 借鉴作用。 最后讲一下关于程序设计的问题,MATLAB 作为一门优秀的数学语言其在处理数学问 题上的优势不言而喻,但是在做程序设计的时候有时候应该适当的把程序做的“一般化”这 样在学会了计算方法之后,很容易把编程思想用其他高级语言实现。 上机操作题 1. 人为制造一个函数 f ( x ) = x2 − 2 x 在函数上取离散点 x = ( −3. 7. 9.5. 4 ) ,计算出 f(x)后利用这些点进行拉格朗日插。 .

然后计算 t=[3.MATLAB 数值分析与应用 429 用插值函数计算 t = ( −2.15853 7 2 -0. 6 ) 时的值。 参考答案: y ( t ) = ( 8.0272 使用 Hermite 插值,近似绘制出原函数图像。 参考答案(图象) : 原离散点列图形,如图 8.8415 5 0 0 6 1 -0.47。插值后的函数图象如图 8.47 原始数据离散点列 .48。 图 8.4234 3 -2 3.5766 9 4 -7. 24 ) 。 2. 已知离散点列如下 x -4 -2 0 2 4 y 20 8 0 -4 -4 使用牛顿插值法对点列插值.6550 ) 。 3. 已知某函数离散点列如下 序列 x y 1 -4 0.1.8186 4 -1 1.4800 -1.97279 2 -3 3.18141 8 3 -2. −1.2 5.3]时的值。 参考答案: y ( t ) = ( -4.5 4.3750 -3.

MATLAB 430 数值分析与应用 图 8.1303 T1 ( x ) + 0.48 插值后的函数图象 4. 求区间[-1,1]上逼近函数 f ( x ) = e x 的切比雪夫多项式 P3 ( x ) 。 参考答案: f ( x ) = 1.2715T2 ( x ) + 0.0438T3 ( x ) 。 .2661T0 ( x ) + 1.

b 2 在 x = x s 时达到最小,则 x s 称为方程 Ax = b 的最小二乘解。 x s 是方程组最小二乘解的充 分必要条件是 x s 是方程组 AT Ax = AT b 的解。这个方程称为原方程的法方程,这时候可以转化为一般线性方程组问题,可以用前面 章节中的相关方法处理。当然线性最小二乘问题还有其他一些计算方法。事实上,在 MATLAB 中对于适定方程与超定方程都可以直接使用“\”方法计算。 本实验介绍通过求解法方程求得最小二乘的解,当然还有其他的方法,如下一节介绍的 .1 超定方程组的最小二乘解 实验基本原理 设线性方程组 Ax = b 是实数域上(m,n)阶的方程。由线性方程组的数值方法一章中知道,上述方程组有解的 充分必要条件是方程组的系数矩阵的秩与增广矩阵的秩相同,既 rank ( A ) = rank ([A.b]) 但有时候方程组不满足上述条件,于是就没有通常意义下的解,这样的方程组称为矛盾方程 组。 如果存在 x s ,使 f (x) = Ax .MATLAB 数值分析与应用 431 第九章 估计、滤波与数据拟合 数据处理问题是大部分实验科学需要面对的问题。早在 18 世纪,伟大的数学家 Gauss 在研究天体运动轨道问题时就提出了最小二乘的估计方法。由于最小二乘法简单、实用,所 以一直到今天依然在许多领域广泛使用。随着数字计算机的发明,这些数据处理方法又有了 很多新的发展,如 1980 年 Gloub 提出总体最小二乘,60 年代 Kalman 提出了著名的 Kalman 滤波理论。 在这一章节中主要介绍三个问题,超定线性方程组与最小二乘的估计问题、数据拟合问 题和滤波问题。 实验 9.

数值分析与应用 .exe 光盘:\实验代码\chapter9\zx2c. %形成法方程 A=a'*a.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %最小二乘计算超定线性方程组 a=[1 -2 1 0 1 -1 2 -4 3 4 -7 4].MATLAB 432 奇异值分解方法。 实验目的与要求 l 能判别超定、适定与欠定线性方程组。 l 理解最小二乘解的意义。明白求解最小二乘解是为了达到什么目的。 l 知道法方程的形成,对于给定的超定方程能够写出法方程的表达式。 l 对于给定的超定线性方程组,能够求出最小二乘意义下的解。 实验内容及数据来源 求超定方程组的最小二乘解 1 0  2  4 -2 1 -4 -7 1 -1 3 4   x1   −4    x  3  g 2  =     x3   −1        x4   −6  实验操作指导 光盘:\实验视频\chapter9. B=a'*b.rar\9-1. b=[-4 3 1 -6]'.

7142857142856 12.85714285714285 x2 = 10.7142857142858 12.85714285714279 实验结论 在计算中,分别采用形成法方程后计算适定线性方程组和直接采用 MATLAB 中的“\” 计算,可以看出计算是有效的。实际上,在 MATLAB 中对于超定方程, “\”给出的就是最 小二乘解。 在描述以及计算中我们采用了矩阵的方法,这样显得很简洁明了,而且便于程序设计。 如果采用标量描述的方法将会比较烦琐。当然 MATLAB 面向矩阵计算的优势在这里得以比 较好的体现,如果采用一般的高级程序设计语言则需要定义数组然后通过下标计算矩阵问 题。而 MATLAB 的程序设计和我们的表达式非常接近。 在下一个实验中,将介绍最小二乘作为一种参数估计方法的意义,以及如何使用奇异值 分解计算最小二乘问题。 .m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc 回车得到: >> zx2c x1 = 10.5714285714285 9.5714285714286 9.MATLAB 433 数值分析与应用 %按求解法方程 x1=A\B %直接采用 MATLAB 中的“\”计算 x2=a\b 以文件名 zx2c.

vi 分别是 U 和 V 按列划分的向量。 实验目的与要求 uiT b vi σi .X] = ( H T H )-1 H T E[V] = 0 [X 还可以确定其协方差 P。 ( )( ) µ-X X µ .X ] = ( H T H )-1 H T RH ( H T H )-1 P = E[ X T 如果 V 的各分量互不相关且有相同的方差时,表达式可以更简单一些既 R = σ 2 I , R = σ 2I 在这个实验中给出了最小二乘法作为估计方法的理论基础,同时介绍一中 SVD 分解方 法计算最小二乘问题。关于最小二乘的计算方法有多种,如 QR 分解、SVD 方法、计算法 方程、迭代等。设 A 可以分解为 A = UΣV T ,则 r X LS = ∑ i =1 其中 ui .MATLAB 数值分析与应用 434 实验 9.HX 要使用目标函数最小则 E[V] = 0 最小二乘问题是无偏的,既 µ .2 最小二乘法估计的 SVD 分解计算方法 实验基本原理 在实际工程中常常需要面对估计问题。Gauss 估计是最小二乘估计的最早形式,是在 n 个观测子样的随即误差为等方差且不相关条件下的最优线性无偏估计。 设 X 为一状态量,维数为 n。有时候我们不能对 X 进行直接测量,而是可以测量 X 的 线性组合量。设量测方程为 Y = HX + V 其中 X 为测量矩阵,而 V 为随机噪声。V 为零均值协方差阵为 R E [V] = 0 Cov[V ] = E[VV ] = R 为了使误差最小可以定义目标函数 gf = Y .

56 0.0 4.8 3.9 0.9 0.exe 光盘:\实验代码\chapter9\qyfj_f.2 找出 y 对应 x 的一个近似公式。 实验操作指导 光盘:\实验视频\chapter9.6 3.y.7 3.2].9 4.0 4.1 4.9 0. x=[3.1。 .00 0.x 函数图象。 在命令窗口输入: y=[1.60 0.m 步骤一:画出 y.9 4.9 0.1 4.81 0.60 0.35 x(%) 3.56 0. qyfj_main.MATLAB 数值分析与应用 435 l 理解最小二乘估计方法的基本原理与意义。 l 明白观测误差的统计量是如何在状态量之间传递的。 l 能够把最小二乘估计问题转化为超定方程组问题处理。 l 能够用数字计算机实现上面的算法。 l 能够用奇异值分解的方法计算最小二乘问题。 实验内容及数据来源 已知某种材料在生产过程中的废品率 y 与某种化学成分 x 有关。下表记载了工厂生产中 y 与相应的 x 的几次数值: y(%) 1. plot(x.rar\9-2.7 3.8 3.m.81 0.00 0.'^') 回车得到运行图 9.35].6 3.

x=0. [m. %计算结果 for i=1:n x=x+u(:.0000    0.0   4.m 保存。 步骤三:编写主函数。 .7  3.1 y 与 x 的关系图 从图中可以看出 y 与 x 粗略的成线性关系,可以选择 y=ax+b 作为近似公式,a、b 待定。 那么原问题转化为以下超定方程问题。 3.B) %奇异值分解 [u.5600   0.8  3.9000  1  a   1 g   =  0.MATLAB 436 数值分析与应用 图 9.9  4.3500  1   步骤二:编写 SVD 计算最小二乘问题的方法函数。 打开 Editor 编辑器,输入以下语句: %奇异值分解方法计算最小二乘问题 %07 年 7 月 function x=qyfj_f(A.s. end 以文件名 qyfj_f.n]=size(A).2  1  1.9000  1    0.v]=svd(A).i)'*B*v(:.i)/s(i.i).6 3.6000     1  0.8100  b 1    0.1  4.

1456 -0.2511 -0.4509 -0. %B 矩阵 B=[1.0901 0.1401 -0.0 0.8125 实验结论 如果用线性函数表示表示 y 与 x 之间的关系可以取 y=-1.1900 -0.4048 -0.3253 0.6852 -0.0464x+4.1651 -0.2302 0.3957 -0.0464 4.3866 -0.6 1 3.2400 -0.3994 -0.8148 -0.0854 -0.1304 0.8 1 3.56 0.3684 -0.1 1 4.9 0.0756 -0.0513 -0.v]=SVD(A) : u= -0.9 0.9 1 4.0950 -0.2996 0.0998 -0.0611 -0.1706 0.3594 0.2069 -0.s.2 1].0 1 4.3775 -0.5481 -0.8849 -0.2753 -0.3510 0.3767 -0.5845 -0.B) 以文件名 qyfj_main. %调用方法函数 x=qyfj_f(A.7 1 3.8954 -0.3897 0.m 保存。 步骤四:运行程序。 在命令窗口输入: >>clear >>clc >> qyfj_main 回车得到 x= -1.2947 -0.0902 -0.3503 -0.8125。SVD 方法的主 要计算量集中在 A 的矩阵分解上。A 矩阵的 SVD 分解为[u.81 0.1609 -0.35]'.MATLAB 数值分析与应用 437 打开 Editor 编辑器,输入以下语句: %SVD 方法处理最小二乘问题 主函数 %A 矩阵 A=[3.3594 -0.0182 0.3957 -0.4959 .6506 -0.0465 -0.2740 0.1484 0.60 0.

9688 -0.2478 -0.HX 2 W .MATLAB 数值分析与应用 438 s= 10.0464  x=   4.HX ) = Y .2478 0.1313 0 0 0 0 0 v= -0.9688 关于最小二乘法的计算方法就主要介绍这两种,其中 SVD 分解法是最常用的方法之一。 这两个实验都属于直接计算法,实际上在形成法方程以后也可以采用迭代法计算。具体可以 参考线性方程组数值方法一章。 计算结果显示原来方程的最小二乘意义下的解为  -1.3 Gauss-Markov 估计 实验基本原理 在实际应用中加权最小二乘法是应用相对比较广泛的估计方法。直观的来说,我们认为 在估计问题中,如果一些资料精度非常好,可能我们希望这些资料得到在估计理论中得到更 大的考虑,而如果观测精度比较低可能我们会不太希望这些资料对观测结果影响很大,这就 是加权问题。 对于精度不同的观测资料我们可以通过权矩阵的方式对于精度比较高的资料给予更大 的比重,设权矩阵为 W。这时候我们考虑的目标函数为 ( Y .HX )T W ( Y .6646 0 0 0 0 0 0 0 0.8125  在观测中,我们认为每次观测的精度都是一样的而且两次观测之间的误差是没有关系的,事 实上如果考虑每次观测精度不同,那么最小二乘估计方法效果可能并不能太令人满意,这就 是下一实验要介绍的加权问题。 实验 9.

y4 分别为第一、二、三和四个传感器。测量结果如下 观测序列 观测结果 1 8 2 7.MATLAB 数值分析与应用 439 根据多元函数的极值理论要使上述目标函数最小则 µ = ( HT WH )−1 HT WY X 误差的方差阵为 P = ( HT WH ) HT WH ( HT WH ) −1 −1 -1 如果取 W = R 这时候加权的最小二乘估计问题就叫 Gauss-Markov 估计,它的误差方差阵 使用加权的估计误差方差阵达到最小,这时状态量的估计值为 µ = ( HT R −1H )−1 HT R −1Y X 误差的协方差阵为 P = ( HT R −1H ) −1 下面以具体的实际范例说明 Gauss-Markov 估计的优越性。 实验目的与要求 l 知道加权最小二乘的估计方法。 l 能够给出加权最小二乘法的协方差阵。 l 对比一般的最小二乘误差传播规律。 l 明白 Gauss-Markov 加权方法。 l Gauss-Markov 加权方法会使误差的方差阵达到最小。 l 比较最小二乘与 Gauss-Markov 估计方法的计算结果并给出精度分析。 实验内容及数据来源 已知 4 个传感器对观测量 Y 分别进行了次数不等的测量,第一个和第二个传感器分别测量 两次,第三个传感器和第四个传感器分别测量了一次。Y 是状态量 X 的函数。其函数关系 如下  y1 = x1 + x2  y = x − 2x  2 1 2   y3 = 2 x1 + x2  y4 = 3 x1 − x2 其中 y1 .1 5 10 6 4. y2 .8 3 -7 4 -7. y3 .2 .

0400 0 0 0  0 0 0 0.exe 光盘:\实验代码\chapter9\ gs_mark.8 x1 x2 −7 = x1 − 2 x2  −7.MATLAB 440 数值分析与应用 各传感器的观测精度不同,即便是同一传感器由于人为的技术因素等每次观测的精度也不 同,观测的噪声是零均值方差阵为 R 的随机向量,其中     R=     0.0200 0 0 0 0  0 0 0.3000  请通过观测数据估计状态量 X,分别采用最小二乘法和加权最小二乘法估计,并比较估计结 果。 实验操作指导 光盘:\实验视频\chapter9.0030 0 0 0 0 0 0 0.2 = 3 x1 − x2 采用最小二乘法计算时不顾及观测数据的精度问题,直接采用实验一中的方法给出计算 结果,在 MATLAB 中可以直接采用 x=H\Y 计算。 如果采用加权方法可以把误差的方差阵的逆作为权系数,加权采用实验基本原理部分介 绍的方法给出计算结果。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %Gauss—Markov 估计方法 %系数矩阵 H=[1 1 11 1 -2 .1000 0  0 0 0 0 0 0.rar\9-3..1 = x1 − 2 x2 10 = 2 x1 + x2  4.m 步骤一:分析问题。 原问题等价为超定方程组问题,方程组如下: 8 = x1 + x2  = + 7.0100 0 0 0 0 0 0 0.

1 10 4. disp('权矩阵') W=diag(R1) disp('加权最小二乘结果') x_g_m=inv(H'*W*H)*H'*W*Y disp('加权估计的方差阵') P_g_m=inv(H'*W*H) disp('加权方差阵的迹') trace_g_m=trace(P_g_m) 以文件名 gs_mark.3]).02 0.02 0.003 0.2]'.01 0.0 7. %观测数据的方差阵 R=diag([0.1 0.3]) disp('最小二乘计算结果') x_g=H\Y disp('估计结果的方差阵') P_g=inv(H'*H)*H'*R*H*inv(H'*H) disp('方差阵的迹') trace_g=trace(P_g) R1=1.01 0.003 0..MATLAB 数值分析与应用 441 1 -2 21 3 -1].8 -7 -7.1 0./([0. %观测矩阵 Y=[8.m 保存。 步骤三:运行程序。 在命令窗口输入: >>clc >>clear >> gs_mark 回车得到: R= 0.04 0.0100 0 0 0 0 0 .04 0.

8769 4.0140 权矩阵 W= 100.0000 0 0 0 0 加权最小二乘结果 x_g_m = 2.9877 .0000 0 0 0 0 0 0 50.0400 0 0 0 0 0 0.3333 0 0 0 0 0 0 10.0004 0.3333 最小二乘计算结果 x_g = 2.0004 -0.0200 0 0 0 0 0 0.0030 0 0 0 0 0 0.3000 0 0 25.1000 0 0 0 0 0 0.0107 -0.0000 0 0 0 0 0 0 333.8821 4.MATLAB 数值分析与应用 442 0 0 0 0 0 0.8692 估计结果的方差阵 P_g = 0.0000 0 0 0 0 0 0 3.0033 方差阵的迹 trace_g = 0.

0026 P=  0.0035 实验结论 程序输出部分已经给出了比较详细的计算结果以及中间信息。最小二乘给出的结果为  2.0009 0.8692  估计结果的方差矩阵为  0.0009 加权方差阵的迹 trace_g_m = 0.0009 0.0009  方差阵的迹为 0.0004  P=   -0.0035,明显比最小二乘法要小很多。 一个传感器,无论精度如何低,既它的观测误差方差无论如何大,都会提高 Gauss-Markov 精度,这是最小二乘法所无法具备的。 如果第一组资料观测数据精度非常高,几乎接近真值,第二组数据精度比较低,还有一 个前提条件是第一组观测数据能够估计出状态向量。如果我们采用第一组数据估计出状态量 应该是不错的,因为精度非常高接近真实真,那么估计出的结果也是接近真值的。如果这时 候把第二组数据加进来,两组数据一起进行最小二乘估计,可能结果远不如第一组数据估计 结果了,因为第二组数据的质量很“坏” 。而如果采用 Gauss-Markov 估计就完全可以处理这 个问题,如果第一组数据精度比较高,第二组数据精度比较低,那么第二组数据获得的“权 重”将会非常轻。 .9877  状态量的估计方差阵为  0.8821  x=   4.MATLAB 数值分析与应用 443 加权估计的方差阵 P_g_m = 0.0004 0.0140,而采用加权的方法计算结果为  2.0033  矩阵的迹为 0.0026 0.0009 0.0009  0.0107 -0.8769  x=   4.

Qn.P.P] = kalman(sys.Nn.P] = kalman(sys.Qn.MATLAB 444 数值分析与应用 取极端情况,第一组数据是精确的,第二组数据有误差。那么第一组数据给出的估计就 是真值,而两组数据联合一起用最小二乘估计效果肯定不是真值,那么数据越多反而估计质 量变差了。而如果是用 Gauss-Markov 估计方法,因为第一组数据是精确的,第二组有误差, 那么相对的权利重是第一组数据获得无限大的权重,第二组获得的权重为零,那么给出的估 计结果依然是真值。 实验 9.L.Qn.Rn.Nn) [kest.L.4 Kalman 滤波 实验基本原理 在应用学科如卫星轨道、姿态确定等领域,一般把前面实验中介绍的最小二乘方法和加 权的最小二乘方法或者其他的一些改进、变形的估计方法统称为批处理方法。相对于批处理 方法的另外一种算法叫序惯处理方法。 从字面意思基本就能理解这两种方法的基本区别,批处理是对一批资料统一的一次行给 出估计结果,这样做的优点是方法一般比较稳定,精度也很可靠。缺点是计算机要存储大量 的数据,尤其是每次运算结束以后,再次有数据过来时候需要重新计算,前面的计算结果不 能有效的利用。这种方法一般用在事后精确处理中。但是在适时性要求比较高的情况下,往 往不能满足工程需求,序惯方法可以有效的处理这一问题。 关于序惯方法,已经发展起来的有很多,比如最小二乘问题就可以构成递推滤波。当然, 在众多的理论中 Kamlan 滤波无疑是相当出色的。Kalman 滤波采用状态空间的估计方法, 比较适合于在电子计算机上实现。Kalman 滤波理论提出来以后,经历了许多的发展,这里 简单介绍一下线性定常系统的 Kalman 滤波。 Kamlan 滤波理论证明相对比较烦琐,计算方法相对而言也有些烦琐,在 MATLAB 中给 出了滤波函数,这里直接给出调用方法。 设线性系统为 x& = Ax + Bu + Gw y = Cx + Du + Hw + v 其调用格式为 [kest.Rn.Z] = kalman(sys.sensors.L.M.Nn) 最后一种调用格式只限于离散系统。当然这里不可能详细的展开介绍 Kalman 滤波,关 于其理论甚至可以是一本专著,要会正确使用并明白其意义需要具备一定的基础知识。这里 主要介绍如何使用 Kalman 滤波方法快速度处理问题,以范例说明。 范例部分不只是一个计算问题,这个范例还在于表现,如果要研究一个问题如何去构造 一个系统进行仿真,并对仿真结果进行分析。 .Rn.known) [kest.

9    假设 x1 的真值 x1 = 8.401 -0.MATLAB 445 数值分析与应用 实验目的与要求 l 理解批处理与序惯处理的区别。 l 理解 Kalman 滤波方程。 l 明白滤波计算流程。 l 对于能够调用 MATLAB 中的相关函数处理滤波问题。 l 有效的构造仿真模型,产生模拟数据。 l 对仿真模型进行数据处理,得出结论。 实验内容及数据来源 已知离散系统 0.412  0.L 30 的数据 xk ,构造时加上系    −4.401 0.3  统噪声干扰,再由观测方程构造出观测数据并加观测噪声干扰,并以此作为仿真数据。用 Kalman 滤波对仿真数据进行滤波处理,并与真实的结果比较。 实验操作指导 光盘:\实验视频\chapter9.rar\9-4.992 0.exe 光盘:\实验代码\chapter9\lvbo.49  x k +1 = 0.296  yk = x ( 2) k + vk 2 第一式为系统方程,第二式为观测方程, x ( ) 表示状态量 x 的第二个分量。 e 与 v 是互不相 关的高斯白噪声。 10.391 0.298 0. 2.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %%%%%%%%系统描述 .391  x k + e k -0.481 ,由此系统方程构造出 k = 1.

296]. H=zeros(1. %人为的制造观测数据的误差 z0(:.2).481 -4.3).i)+v.391 -0.401 -0.3).i)=C*x1(:.298 0.i)=x(:.3 20. %B 矩阵 B=zeros(3.1)=[10. %产生正态分布数据 v=randn(1.i-1).1).7]'. %进入循环 for i=2:30 %产生 正态分布数据 w=randn(3.412 0.MATLAB 446 数值分析与应用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % x[n+1]=Ax[n]+Bu[n]+Gw[n] % y[n]=Cx[n]+Du[n]+Hw[n]+v[n] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %状态转移矩阵 A=[0. D=[0 0 0].401 0.49 0. Nn=0.1 21. Rn=1. Qn=eye(2.i)=A*x(:.3]'.391 0. .1). %状态向量初值---真值 %在实际工程中 一般我们并不知道真值,这里是为了产生数据 用于仿真 x(:. %人为的制造系统误差 x1(:.3).i)+w.992 0. %真实的数据 如果模型准确的话 x(:. %状态向量的初始估计值,如从其他粗略估计方式得到 guji=[20. % G 矩阵 G=eye(3.9 8. %C 矩阵 这里实为向量 C=[0 1 0].

Qn.':m') hold off legend('real of x1'.Z]=kalman(sys.'estimate of x2') grid subplot(2.C.Nn).[B G].i)-C*A*guji(:.2. %得到估计数据 guji(:.':m') hold off legend('real of x1'.':m') hold off legend('real of x2'.m 保存。 数值分析与应用 .:)) hold on %作出在噪声污染情况下的滤波估计值曲线 x3 plot(guji(3.'estimate of x1') grid 以文件名 lvbo.L.i-1)).2) %作出真值曲线 x2 plot(x(2. [kest.Rn.[D H].:).:)) hold on %作出在噪声污染情况下的滤波估计值曲线 x1 plot(guji(1.2.:).'estimate of x1') grid subplot(2.2.MATLAB 447 %建立 Kalman 的系统参数 sys=ss(A.P.3:4) %作出真值曲线 x2 plot(x(3.1) %作出真值曲线 x1 plot(x(1.i-1)+L*(z0(:.:)) hold on %作出在噪声污染情况下的滤波估计值曲线 x2 plot(guji(2.:).M. end subplot(2.i)=A*guji(:.-1).

2 Kalman 滤波处理的与真实值的比较 实验结论 这个实验其实给出的是一个完整的小型课题,在没有资料的情况下,我们如何人为的制 造仿真平台,产生仿真数据,然后用我们期望的数学方法去处理,并得到有价值的结果分析。 这个实验正是围绕这样的基本思想展开的。 当然最后的结果信息我们反应在图 9.684719 3 -0.626471 -8.096738 -0.MATLAB 数值分析与应用 448 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >>lvbo 回车得到图形 9.2 中,当然这只是结果的直观反应,跟多的时候我 们是需要计算结果,在表 9.481 -4.9 8.503808027 -2.1 中给出了真实的运动轨迹,因为数据是我们按照自己的方式产 生的。 时间序列 第 1 个分量 第 2 个分量 第 3 个分量 1 10.137404671 .2 图 9.777390966 -0.70598303 -8.3 2 6.869855791 4 -4.245685102 -3.

422692466 1.71090286 5 -8.7 2 22.763631785 -4.364838315 6.148129668 7 0.003891391 0.294063284 9 1.00995029 28 -0.35802446 0.007825788 -0.027711608 0.023785332 0.571933183 -0.7252488 9.045826416 23 0.92653024 1.213601806 -0.064098975 -0.56099626 4.299227376 4.006552008 0.011455399 0.11650681 -0.728682279 -21.738722592 12 -0.357407994 1.015996991 -0.40961964 -0.171518442 2.40651623 3.016186945 29 0.553088326 9 2.013016194 0.787030676 7 -2.095678165 22 0.017504042 -0.005069134 -0.2 中给出了三个分量的滤波处理结果,如果对比表 9.156538231 16 0.184438354 13 -0.071270755 0.17402082 6 -1.08197512 -0.895469285 0.2791037 0.378077639 5.116009694 0.027544456 0.501827329 -1.090332082 0.001438153 -0.392673342 2.101132157 -0.494219162 -6.04500158 0.2 中体现。 时间序列 第 1 个分量 第 2 个分量 第 3 个分量 1 20.788182459 -6.005131216 -1.252180869 0.060426476 -0.168256014 2.039339322 25 -0.033206766 26 -0.003042386 -0.007414731 0.021701416 -0.957777626 6 -6.51149455 8 1.014468676 20 -0.010452388 30 0.198556849 -4.612040224 14 0.000850519 表 9.153820209 17 0.614322881 -4.011486563 24 0.60265909 8 1.179045599 0.036455178 0.MATLAB 数值分析与应用 449 5 -4.10563016 4 -1.1 真实的运动状态数据 在表 9.837848068 0.316169216 3 10.118879723 -14.004032099 0.288549473 0.21792072 -1.1 与表 9.164554228 19 -0.377019368 10 0.255140209 18 -0.3 20.046206675 0.41495801 -0.063509021 -0.484606051 11 -0.376969821 -0.004070781 0.526538396 15 0.009949297 27 -0.224864281 .08582491 21 -0.1 21.2 可以看出在序列 靠后的地方真实状态与估计状态的绝对误差是比较小的。这已经在图 8.76E-05 0.274145979 0.70666762 -0.005691504 3.011143959 -0.

472086999 26 0.517263742 -0.22549466 17 0.413558092 25 0.601259193 0.113843039 12 -0.453268751 1.434915463 -0.398859291 0.658297751 0.329369401 -0.077156563 27 -0.536391476 30 -0.618625591 0.53368178 -0.479427729 0.521953811 -0.861692101 0.664868843 19 -0.11295527 -0.7140655 -0.258081817 1.783860719 1.003343612 -0.198301503 21 -0.063405251 0.032585161 -0.448919666 -0.7137889 24 0.852877938 0.624252831 0.394725491 0.179721431 -0.551591054 28 0.391235191 0.581682628 -0.893963618 表 9.276887725 20 -0.707212838 0.072338102 -1.553204215 0.518760826 22 -0.290993037 15 -0.023365338 23 0.559150432 16 -0.593150559 -0.n) .225133574 -1.648547414 -1.2 Kalman 滤波处理结果 为了阐述 Kalman 滤波的基本计算思路,在实验中选择了最简单的一种系统模型,线性 定常动力系统。在实际应用中很多时候面对的都是非线性而且时变系统,这有时候性质要复 杂一些。 在使用时要注意 Kalman 滤波发散问题, 当然针对发散问题已经有一些有效的处理方法, 如衰减记忆、限定记忆等,还有从算法上改进。 事实上,针对不同的需求科学工作者发展了不同的改进算法,如针对非线性问题有扩展 Kalman 滤波方法,还有近年流行的不敏 Kalman 滤波等。有兴趣的读者可以阅读相关专著。 实验 9.357835159 -0.233014025 29 -0.y.MATLAB 450 数值分析与应用 10 1.279207237 0.045343222 1.164664887 14 -0.202906809 0.122123626 13 -0.5 MATLAB 中的多项式拟合 实验基本原理 MATLAB 中提供了一种快速实现多项式拟合的方法函数 polyfit()函数。与插值方法不 同,多项式拟合不要求所有样本数据全部落在拟合的曲线上,而是整体的拟合误差达到最小。 在 MATLAB 中 polyfit 函数的基本调用格式为: p = polyfit(x.165157579 18 -0.014970698 -0.436205036 11 0.01125328 -2.025564549 -0.975064648 0.524824267 0.58022756 -0.

3).exe 光盘:\实验代码\chapter9\dxs_main. y=sin(x)+x.5 为间隔取离散点列,计算出函数值。然后用这两组数据采用三次多项 式拟合,绘制出拟合效果图象。 实验操作指导 光盘:\实验视频\chapter9.rar\9-5.5:3.10) . %给出表达式 vpa(poly2sym(p3).m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句。 %多项式拟合 x=-3:0.MATLAB 451 数值分析与应用 其中 x,y 为样本数据向量,而 n 为拟合的多项式的项数。使用 polyval()函数可以直接计 算出多项式的值。如果要查看拟合的多项式表达式,则可以使用符号工具箱中的 poly2sym 函数,这时多项式按照幂次的高低排列。 在做实验时,如果我们实现知道离散数据的函数关系,则可以通过计算拟合的函数值与 之比较,然后查看拟合结果是否理想。polyval 函数使用方法是直接输入拟合的多项式变量 及要计算函数值的点列。 实验目的与要求 l 会调用 MATLAB 的系统函数进行多项式拟合。 l 会使用 polyval 函数进行拟合函数值的计算。 l 能够调用符号工具箱给出拟合函数表达式。 l 能对分析拟合效果情况给出分析。 实验内容及数据来源 制造函数 f ( x ) = sin x + x 在区间[-3,3]上以 0. %进行数据拟合 p3=polyfit(x.y.

x.y.MATLAB 452 数值分析与应用 x1=-3:0.851366521*x+.y1) grid 以文件名 dxs_main.1856830267e-15 实验结论 从系统输出可以看到拟合的函数为 ϕ ( x ) = −0.3 三次多项式拟合 .1:3.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >>dxs_main 回车得到 ans = -.9180150775e − 1x 3 − .3 中给出了拟合函数与原来函数及离散点列的图象。从图形中,很容易看出拟合 的效果还是不错的,和在指定的区间上原来函数非常接近。其中星号点为取的离散点列。 图 9.1038199528e-15*x^2+1.x1.851366521x + 0.9180150775e-1*x^3-.x1). %采样点 y1=polyval(p3.y.%计算采样点的拟合结果 plot(x.1856830267e − 15 在图 9.'*'.1038199528e − 15 x 2 + 1.

.) [x..x0.exitflag.ydata) x = lsqcurvefit(fun..residual.) [x.lb.) [x.resnorm.exitflag.x0.output] = lsqcurvefit(.residual..xdata.exitflag.options) [x.resnorm.lambda] = lsqcurvefit(.ydata.resnorm. x _ d ) − y _ d 2 2 2 是为最小二乘曲线拟合问题。在 MATLAB 中可以使用 lsqcurvefit 函数进行最小二乘法 曲线拟合。其基本的语法为: x = lsqcurvefit(fun.exitflag] = lsqcurvefit(...output.residual..MATLAB 实验 9..resnorm] = lsqcurvefit(.residual] = lsqcurvefit(.jacobian] =lsqcurvefit(..ydata.residual.x0.) 下面分别阐述这些参数的意义,实际上在做拟合之前需要定义拟合的基函数。x0 是基 函数在希尔伯特空间坐标的初值,xdata、ydata 是要给定的数据。 在输出项中 x 是输出的基函数在希尔伯特空间的坐标的,也就是要拟合各函数的系数。 其他一些参数可以查看帮助文档案。 实验目的与要求 l 明白 lsqcurvefit 能处理的问题类型。 l 知道各参数的具体含义。 l 对函数的一些可选择参数,根据实际问题如果需要的话能够正确设置。 l 对输出结果做出合理分析。 l 画出原数据与拟合函数图象。 实验内容及数据来源 .lambda.) [x.resnorm. y _ d ) ,采用 一函数系使 min x 1 F ( x..6 数值分析与应用 453 MATLAB 中的 lsqcurvefit 函数 实验基本原理 最小二乘曲线拟合问题是一个基本的数学问题,对于给定的数据 ( x _ d .lb.ub.) [x.xdata.xdata.output...ub) x = lsqcurvefit(fun.resnorm.

5 5 5.5 -4 -3.49300822 -2.912559575 -1.080384316 -1.898102117 -6.71474987 27.^2+c(3)*exp(x).5 1 1. 以文件名 fun_nihe.567569969 4.191909502 -2.44077449 -47.rar\9-6.21494064 19.MATLAB 数值分析与应用 454 已经知离散数据 x -6 -5.415889835 9.5 0 y 38.5 3 3.72526736 -26.57887831 -12.5 2 2.m 步骤一:编写函数文件。 打开 Editor 编辑器,输入以下语句: %最小二乘法曲线拟合函数 function f=fun_nihe(c.749766907 -2.5 4 4.247630195 -7.869970417 10.10978871 10.exe 光盘:\实验代码\chapter9\fun_nihe.5 6 y 2.84982659 34.58268605 5.17440033 24.655131444 x 0.5 -2 -1.74885434 30.79552224 8.5 -1 -0.06416166 用 ϕ0 = sin ( x )  2 ϕ1 = x  x ϕ1 = e 作为基函数对上面的数据进行最小二乘拟合。 实验操作指导 光盘:\实验视频\chapter9.m.319659194 0.x) f=c(1)*sin(x)+c(2)*x. nihe.186611205 6.5 -5 -4.m 保存。 步骤二:编写主函数。 主函数第一部分为模拟数据的产生,在实际应用中我们可能直接就是拿到原始数据,所以不 需要模拟产生数据。第二部分为最小二乘曲线拟合。 打开 Editor 编辑器,输入以下语句: .5 -3 -2.

%画出离散数据点 plot(x. y_g=g(x_g). %调用函数 [c.y_g) hold off 以文件名 nihe.y.1:6.5:6.y) %新的函数 g=@(x)c(1)*sin(x)+c(2)*x.MATLAB 455 %%最小二乘法曲线拟合 %产生数据 f=@(x)8*sin(x)+x.r]=lsqcurvefit(@fan_nihe.^2-0.2*exp(x). %对新函数作图 plot(x_g.'*') grid hold %%以上为产生模拟数据 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 %迭代初值 c0=[1 1 1]. x_g=-6:0.^2+c(3)*exp(x).c0.x.79656819481932 Current plot held 数值分析与应用 . %计算 y 并加干扰项 ,高斯分布的噪声音 y=f(x)+2*randn(size(x)). f(2) x=-6:0.m 保存。 步骤三:运行程序。 在命令窗口输入: >> clear >> nihe 回车得到 ans = 9.

203088890284279 r= 93.MATLAB 456 数值分析与应用 Optimization terminated: relative function value changing by less than OPTIONS.TolFun.95542904102721 0.997246158847839 -0.4 最小二乘曲线拟合 拟合结果显示还是令人比较满意的,这些点不在拟合函数曲线上,但是分布在函数曲线 两侧。从输出的函数可以看到,与原产生模拟数据的函数还是比较接近的。当然也不是要求 严格等于原函数,因为毕竟我们在产生数据时加了噪声。 .4 中给出了离散数据,与 拟合函数的图象。 图 9.04797547706 实验结论 在实验中与上一个实验类似,先产生模拟数据。在确定的函数下,加正态分布噪声去干 扰。事实上,如果我们噪声取的比较小的话,最后拟合结果会表现出与原先数据非常接近, 甚至类似于插值,为了看出效果,实验中把噪声放的很大。在图 9. c= 7.

y 2 2 如此最小二乘拟合问题就转化为超定线性方程组 Aa = y 的最小二乘解问题。可以利用实验 8. aij = ϕ j ( xi ) , 那么 E = Aa . an ) =0 ∂ai 设  a0  a  a =  1 . M     an  以及 A =  aij  m× ( n +1)  y1  y  y= 2 M     ym  .MATLAB 数值分析与应用 457 实验 9.7 最小二乘曲线拟合计算方法 实验基本原理 上一个实验给出了如何使用 MATLAB 快速有效的处理最小二乘曲线拟合问题。但是读 者可能更关心究竟最小二乘曲线方法是如何实现的,本实验给出详细的计算方法,并结合范 例计算流程和结果。 有了最小二乘法的基本知识,其实最小二乘的曲线拟合是很容易理解的。关于最小二乘 法的数学原理可以给出很多漂亮的解释,比如可以直接使用多元函数极值的观点,也可以使 用高等代数中向量到子空间距离的观点。对于拟合问题,如果建立在泛函的基础上把基函数 系看成是对代数空间的一种拓展,可以给出最小二乘一种比较简洁的解释。但这里还是选择 第一种方法。 对于给定的一组数据 {( x . a1 .1 中的方法处理。 2 .L . y )} m i i i =1 ,假设拟合函数 ϕ ( x ) = a0ϕ 0 ( x ) + a1ϕ1 ( x ) + L + anϕn ( x ) 其中基函数为线性无关的函数系。最小二乘拟合问题就是求系数, 使下面的表达式取极小值。  n  E = ∑  ∑ a jϕ j ( x ) − yi  i =1  j = 0  m 根据多元函数极值问题,E 取极值的必要条件是 ∂E ( a0 .

c 为要求的变量 %形成线性方程的系数矩阵 a=[ zx_nh_f(x(1)) zx_nh_f(x(2)) .MATLAB 数值分析与应用 458 实验目的与要求 l 熟悉最小二乘问题的基本原理。 l 了解计算方法。 l 能够正确的编程处理最小二乘拟合问题。 l 对计算结果做出合理分析。 l 尝试用不同的基础函数处理拟合问题,比较效果。 l 把给出离散数据与拟合函数的函数图象。 实验内容及数据来源 求数据 x -3 -2 -1 0 1 2 3 y 4 2 3 0 -1 -2 -5 的最小二乘拟合 f ( x ) = a0 + a1 x + a2 x 2 实验操作指导 光盘:\实验视频\chapter9.m.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %最小二乘拟合的主函数 x=[-3 -2 -1 0 1 2 3]'. y=[4 % 2 3 0 -1 -2 -5]'.zx_nh_f.rar\9-7.exe 光盘:\实验代码\chapter9\zx_nh.

130952380952381 数值分析与应用 . f(2)=x. c=A\B %% %在 MATLAB 中实际上可以直接使用 c=a\b 其实已经进行了最小二乘 %为了突出最小二乘思想 这里先形成法方程 再计算 %c 就是拟合基函数系数 %作出原离散数据 与拟合函数图象 x_n=-3:0. 以文件名保存。 步骤三:运行程序。 在命令窗口输入: >>clear >>clc >> zx_nh 回车得到: c= 0. %法方程 A=a'*a.m 保存。 步骤二:编写拟合的基函数。 打开 Editor 编辑器,输入以下语句: %最小二乘的拟合基函数 function f=zx_nh_f(x) f(1)=1. b=y. y_n=c(1)*1+c(2)*x_n+c(3)*x_n. f(3)=x^2.39285714285714 -0.MATLAB 459 zx_nh_f(x(3)) zx_nh_f(x(4)) zx_nh_f(x(5)) zx_nh_f(x(6)) zx_nh_f(x(7))].'*'.02:3.y_n) grid 以文件名 zx_nh.666666666666666 -1.y.x_n. plot(x.^2. B=a'*b.

666666666666666 -1.MATLAB 460 数值分析与应用 实验结论 从程序输出来看最后拟合的函数为 f ( x) = 0.5 了原离散数据与拟合函数的图象,数据拟合与插值的区别是拟合不需要函数经 过原来数据的每一点,而是要求偏差平方和最小。从图形可以看出,在二次多项式拟合的情 况下这个表达式在有限的精度内是最优的。 图 9.130952380952381x 2 在图 9.5 最小二乘数据拟合 关于基函数的选择,一般是根据所给的数据的曲线图象来判断基函数的特征,有时候是 根据实际经验判断要选择什么样的函数。 与插值方法类似,在不知道函数性态的情况下,有时候如果选择正交多项式作为拟合的 基函数效果往往会很不错。 本章小结 在这一章节中主要介绍了数据处理中的一些方法,内容不是特别多但都是比较典型的问 题在数值分析理论与工程实践中都是比较重要的。 .39285714285714x − 0.

MATLAB 数值分析与应用 461 从超定方程组的解引入本章,接着介绍一般的估计理论。在最后个实验中介绍了如何用 最小二乘的方法处理曲线拟合问题。而在中间的一些实验中,则比较实用,如加权最小二乘 问题以及 Kalman 滤波问题。 关于估计理论、滤波理论都是实用性比较强的理论,在大学一些本科或研究生专业中都 是单独作为一门课程来开设,可见其内容的广泛性与重要性。而这些方法本身并不局限在某 一具体领域,是普遍性的。处理这些方法比较重要的手段是矩阵分析能力。这些学科的发展 都比较丰富,本章中介绍的理论和方法是比较基础的,有了这些基础会比较容易的学习这些 理论的新发展,并应用到各自的领域。 上机操作题 1. 计算以下超定方程组最小二乘意义下的解。          参考答案: x = (1.0935 -7.5 -3.5 。 3. 已知一组实验数据如下 .4161 4 -1.5274 ) 。 3 3 -1 -10 1 8 5 -8 0 -3 -5 -6 1 -2 0 -2 -2 2 2. 已知离散数据如下 x 2 4 6 8 y 2 11 28 40 序列 x y 1 -3 -3.4293 使用一次多项式拟合这组数据。 参考答案: y ≈ 6.8725 4   -7   11   x1   2    -7   x2   8  =   -5   x3   4    5   x4   10     -2   3 T 0.4699 -1.55 x − 12.5 -1.3011 3 -2 -2.99 2 -2.

9692912747e − 16 x3 − .37758 7 0 1 8 0.5839 12 2.5 1.2221378251x 2 + x + 0.7438422527 。 函数图象如图 9.3776 9 1 1.01 采用三次多项式拟合,并绘制出拟合图象。 参考答案: ϕ ( x ) = 0.6 所示。 图 9.MATLAB 数值分析与应用 462 5 -1 -0.4597 6 -0.6 三次多项式拟合图象 .5403 10 1.5 0.6989 13 3 2.5707 11 2 1.5 1.5 1.

∫ dx.MATLAB 463 数值分析与应用 第十章 数值积分 在工程问题中,经常会遇到定积分的计算问题 S = ∫ f ( x )dx b a 部分积分问题可以通过求原函数的方法计算而得,这也是微积分中的重要内容。但是也 有相当多的一些积分问题,找原函数是很困难的,甚至根本就不能用初等函数表为闭形式。 即使有些函数看上去很简单,但是其原函数却无法用初等函数表示,如 sin x cos x dx. ∫ ln xdx. ξi ∈ [ xi . b] 分为 n 个相等的子区间,在每个子区间上 f ( x)dx = h h3 [ f ( xi ) + f ( xi+1 )] − f '' (ξi ) . ∫ ln x dx ∫ 数学上可以证明上面的函数的原函数不能用初等函数表示,这时候就需要考虑使用数值 方法,正是这一章要介绍的内容。 实验 10. xi+1 ] 2 12 于是有 ∫ b a n f ( x)dx = ∑ ∫ i =1 xi +1 xi n f ( x)dx = ∑ i =1 n h h3 [ f ( xi ) + f ( xi+1 )] − ∑ f '' (ξi ) 2 i =1 12 如果函数的二次导数在区间上连续,则开区间内必然存在一点 ξ ,使得 . e ∫ x ∫ dx.1 复合梯形求积法 实验基本原理 梯形公式计算积分问题是最基本的方法,几何意义也比较直观,但是单独的梯形公式是 不会被用来作为数值积分方法的。事实上,如果我们把积分区间等分为很多小区间,这就得 到复合梯形公式,如果划分比较稠密,则计算结果相对可靠一些。下面给出复合梯形法的计 算方法,对于积分问题 使用梯形公式得到 ∫ xi +1 xi ∫ b a f ( x)dx ,把区间 [a. ∫ sin x 2 dx x x ex x 1 x2 dx .

m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %复合梯形法计算积分问题 %by song .rar\10-1. fun_tixing.m.MATLAB 464 数值分析与应用 1 n ∑ f '' (ξi ) = f '' (ξ ) n i =1 从而有 ∫ n −1 h  nh3 f ( x)dx =  f (a) + f (b) + 2∑ f ( a + ih ) − f '' (ξ ) 2 i =1  12 b a 于是近似的 ∫ b a n −1 h b−a  f a f b f ( a + ih )  .exe 光 盘 : \ 实 验 代 码 \chapter10\tixing. tixing_main.m. h = ( ) + ( ) + 2 ∑  2 n i =1  f ( x)dx ≈ 这就是复合梯形的基本计算方法。 实验目的与要求 l 知道简单梯形法的几何意义。 l 了解复合梯形法的构造步骤。 l 能编程实现复合梯形方法,并计算积分问题。 l 分析区间划分细度与积分精度情况。 实验内容及数据来源 计算积分 ∫ (x 2 −2 2 + sin( x ) )dx 要求先用分析方法给出计算结果,然后分别把区间分为 20、40、80 和 200 个小区间,比较 计算精度情况。 实验操作指导 光盘:\实验视频\chapter10.

2.40) disp('80 子区间数值积分为') s_80=tixing(-2.m 保存。 步骤二:编写函数文件。 打开 Editor 编辑器,输入以下语句: %梯形法的计算函数 function f=fun_tixing(x) f=x^2+sin(x). s=0. s=s+fun_tixing(x).2. 以文件名 tixing. 以文件名 fun_tixing.MATLAB 465 %08 年 8 月 7 日 function s=tixing(a. end s=h*(fun_tixing(a)+fun_tixing(b))/2+h*s. %循环 for k=1:(n-1) x=a+h*k.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %%复合梯形法计算函数积分主函数 disp('20 子区间数值积分为') s_20=tixing(-2.80) disp('200 子区间数值积分为') s_200=tixing(-2.n) % a,b 为积分区间 % n 为区间划分细度 h=(b-a)/n.200) %%%采用符号法计算出积分的严格结果 disp('真实结果为:') 数值分析与应用 .20) disp('40 子区间数值积分为') s_40=tixing(-2.b.2.2.

2) %取前 12 位有效数字 s=vpa(fenxi_s.y) grid 以文件名 tixing_main.34 80 子区间数值积分为 s_80 = 5.m 保存。 步骤四:运行程序。 在命令窗口输入: >>clear >>clc >> tixing_main 回车得到: 20 子区间数值积分为 s_20 = 5.MATLAB 466 fenxi_s=int('x^2+sin(x)'.^2+sin(x). s_200-s] %%%%作出函数图象,与积分面积 x=-2:0.05:2. s_40-s.12) %误差情况 TOL=[s_20-s. y=x.-2. area(x.36 40 子区间数值积分为 s_40 = 5. s_80-s.335 200 子区间数值积分为 数值分析与应用 .

3336 0.36 0.34 0.266666666700000000000000000000e-1 .166666667e-2 200 5.1。 区间划分细度 积分结果 误差 20 5.33333333333 TOL = .2666666700000000000000000000e-3 实验结论 为了便于分析问题,这里把区间区分情况与积分结果分别输出了,同时还给出了与真实 结果的误差,如表 10.1 复合梯形法计算积分问题 从表 10.1 中也可以粗略的看出,一般而言区间划分越细积分精度越高。积分的几何意 义是函数与自变量坐标轴和积分区间所围城的图形面积的代数和。本实验的积分几何意义如 图 10.MATLAB 数值分析与应用 467 s_200 = 5.3336 真实结果为: fenxi_s = 16/3 s= 5.26666667e-3 表 10.16666666700000000000000000000e-2 .2666666667e-1 40 5.335 0.66666666700000000000000000000e-2 .666666667e-2 80 5.1 中 x 轴以上的黑色面积减 x 轴以下区域的黑色面积。 .

m 。设子区间 的中点为 x2i −1 ,且 x2i − x2i −2 = 2h = b−a m 则在区间[a. x2 i ].2 复合 Simpson 积分 实验基本原理 复合 Simpson 公式是一种比较实用的积分方法,可以给出误差估计。下面阐述方法的基 本原理。用 n+1 个点将区间[a.MATLAB 数值分析与应用 468 图 10.1 定积分的几何意义 实验 10.L . i = 1.b]划分为 m 个相等的子区间 [ x2i −2 .b]上有, n −1 I = ∫ f ( x ) dx = ∑ ∫ b a = 或可以表达为 k =0 xk +1 xk f ( x ) dx  h n −1   x + xk +1  f ( xk ) + 4 f  k + f ( xk +1 ) + Rn ( f ) ∑   6 k =0  2    .

MATLAB 数值分析与应用 469 ∫ b a m x2 i i =1 x2 i −2 f ( x)dx = ∑ ∫ f ( x )dx m h = [ f (a) + f (b) + 4∑ f (a + 2(i − 1)h) 3 i =1 m −1 + 2∑ f (a + 2ih)] − i −1 mh5 ( 4) f (ξ ) 90 a <ξ <b 这样就得到复合 Simpson 公式为 ∫ b a f ( x)dx ≈ Sm ( f ) m h = [ f (a) + f (b) + 4∑ f (a + 2(i − 1)h) 3 i =1 m −1 + 2∑ f (a + 2ih)] i −1 h= b−a 2m 离散误差为 Em ( f ) = − mh5 ( 4) h 4 (b − a ) ( 4 ) f (ξ ) = − f (ξ ) 90 180 a<ξ <b 由此,已经给出了复合 Simpson 的计算方法。在实际应用时,可以先根据离散误差估计出需 要划分的区间数,然后调用 Simpson 公式进行积分计算。 实验目的与要求 l 了解单独的 Simpson 公式原理及几何意义。 l 了解复合 Simpson 公式的构造步骤。 l 理解复合公式中的各项的意义,会正确计算之。 l 能够编程实现复合公式。 l 能够给出误差分析,并根据误差分析给出在指定精度下需要划分的子区间个数。 实验内容及数据来源 用复合 Simpson 公式计算积分 2 I ( f ) = ∫ 3ln xdx 1 .

1 < ξ < 2 Em ( f ) = − f (ξ ) = − ( ) 180 2880m 4 5 因此 Em ( f ) (b − a ) = 5 2880m max f ( 4) ( x ) 4 x∈ 1.b 为积分区间 . xps_main.MATLAB 数值分析与应用 470 要求精度在10−5 之内,并把计算结果与积分的准确结果比较。 实验操作指导 光盘:\实验视频\chapter10.2] 由复合 Simpson 公式的离散误差为 h4 ( b − a ) ( 4 ) ( b − a ) f ( 4) ξ .m 步骤一:分析问题。 设 f ( x ) = 3ln( x ) ,则 f ( x ) 的 4 阶导数 f ( 4) ( x ) = − 18 x4 且 max f ( 4) ( x ) = 18 x∈[1.2 [ ] 即 18 ≤ 10−5 4 2880m 因此 m ≥ 5 ,取 m=5, h = b−a = 0.m.m.2 [ ] 要使 Em ( f ) ≤ 10−5 则要 (b − a ) 5 2880m max f ( 4) ( x ) ≤ 10−5 4 x∈ 1. f_xps.b.exe 光盘:\实验代码\chapter10\xps.n) %a.1 。 2m 步骤二:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Simpson 计算定积分问题 %08 年 8 月 function s=xps(a.rar\10-2.

s2=s2+f_xps(x). 以文件名 f_xps. %设初值 s1=0. for k=1:n x=a+h*(2*k-1). 以文件名 xps. end for k=1:(n-1) x=a+h*2*k.5) syms x %符号积分 int_f=int(3*log(x)).2. end %结果相加 s=h*(f_xps(a)+f_xps(b)+4*s1+2*s2)/3. s2=0. end %子区间长度 h=(b-a)/(2*n). s1=s1+f_xps(x).MATLAB 471 %n 为划分的子区间个数 %如果 n 缺省 则默认划分 100 个区间 if nargin<3 n=100.m 保存。 步骤四:编写主函数。 打开 Editor 编辑器,输入以下语句: %Simpson 方法主函数 disp('积分结果为') s_1=xps(1. 数值分析与应用 .m 保存。 步骤三:编写函数程序。 打开 Editor 编辑器,输入以下语句: %复合 Simpson 方法计算积分问题 function f=f_xps(x) f=3*log(x).

02:2. y=3*log(x).1). %准确值与 Simpson 方法的误差 ds=s-s_1 %画出积分函数与积分区域 x=1:0.15888021141442 ds = 2. area(x.y) grid 以文件名 xps_main.2)-subs(int_f.m 保存。 步骤五:运行程序。 在命令窗口输入: >> xps_main 回车得到 积分结果为 s_1 = 1.15888021141442,并给出了数值方法与精确值的误差情 况,可以看出误差是满足要求的。在图 10.MATLAB 472 数值分析与应用 s=subs(int_f.2 中给出了积分区域与积分函数,其中积分结果 的几何意义即为图形中阴影部分面积。 .87194525427914e-006 实验结论 实验已经给出了输出结果为 1.

2 数值分析与应用 积分函数与积分区域 实验说明这是一种行之有效的方法,但缺点是要进行误差估计,需要的分析内容比较多, 在实际使用中不太方便。 实验 10.3 变步长的梯形积分方法 实验基本原理 复合梯形法虽然方法简单,但是却不能估计积分精度,这有时候是很不方便的。要想控 制积分精度,可以采用如下的方法,设积分区间已经划分为 n 个子区间,这时再把区间划分 更细,给出新的积分结果,如果前后两次积分的差比给定的误差容限小的话,则停止细华, 否则继续增加积分区间。这种方法原理很简单,也容易实现,但是实际计算中一般采用的比 较少,因为这种方法比较机械效率不是太高,实际上采用比较多的通常是后面将要介绍的 Romberg 方法。 给定义误差容限小量 TOL,对于 ∫ b a ∫ b a f ( x)dx ,有复合梯形公式 n −1 h f ( x)dx ≈ [ f (a) + f (b) + 2∑ f ( xk )] 2 k =1 如果前后两次的划分的积分计算结果大于给定的误差 TOL,则增加划分区间,如果满足精 度,则停止细化,并输出结果。 实验目的与要求 .MATLAB 473 图 10.

rar\10-3.m.b.exe 光盘:\实验代码\chapter10\ kong_tixing.m. . end n=1.MATLAB 数值分析与应用 474 l 理解可控精度的梯形方法的基本思想。 l 知道如何控制精度。 l 能够编程实现这一方法。 l 分析这一方法的计算量大小。 l 能够给出不同精度下的积分区间划分情况,比较不同精度下的化分细度。 实验内容及数据来源 计算定积分问题 1 T = ∫ e − x dx 2 0 要求输出在精度要求为10−4 。 实验操作指导 光盘:\实验视频\chapter10.tol) % a.b 为积分区间 %tol 为积精度 默认为 10 的-3 次方 if(nargin==3) eps=1.m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %可控精度复合梯形法计算积分问题 %8 月 7 号 function [jifen.kong_t_f. int_1=0.num] = kong_tixing(a.0e-3. kong_t_main. %调用方程函数 int_2=(kong_t_f(a)+kong_t_f(b))/h. h=(b-a)/2.

以文件名 kong_t_f.num_3]=kong_tixing(0.02:1.1. %区间化分细度 num=n.num_1]=kong_tixing(0.001 [s_1.1e-1) %精度为 0.1 [s_1. h=(b-a)/n. int_1=int_2. 以文件名 kong_tixing.01 [s_2. end end %%%% %积分结果 jifen=int_2. y=exp(-x.1.num_2]=kong_tixing(0.^2). for i=0:n-1 x=a+h*i.1.y) grid 数值分析与应用 . int_2=int_2+(h/2)*(kong_t_f(x)+kong_t_f(x1)).m 保存。 步骤三:编写主函数文件。 打开 Editor 编辑器,输入以下语句: %可控精度的梯形积分方法 %精度为 0.1e-4) %精度为 0.MATLAB 475 %如果前后两次 误差小于给定的精度 则停止细化积分区间 while abs(int_2-int_1)>tol n=n+1. int_2=0. x1=x+h.m 保存。 步骤二:编写函数文件。 打开 Editor 编辑器,输入以下语句: function f=kong_t_f(x) f=exp(-x^2).1e-7) %画出积分图形 x=0:0. area(x.

746398247893441 num_2 = 12 s_1 = 0.746818876175303 num_3 = 108 实验结论 从输出结果可以看到,要达到10−4 精度,需要把区间划分为 12 个子区间,而要达到10−7 精度,则需要把区间划分为 108 个子区间。事实上,函数的积分总区间跨度不是很大,所以 .m 保存。 步骤四:运行程序。 在命令窗口输入: >>clear >> kong_t_main s_1 = 0.MATLAB 476 数值分析与应用 以文件名 kong_t_main.739986475276682 num_1 = 3 s_2 = 0.

3 给出了积分的几何意义,积分的结果既图形中的蓝色区域面积,从输出结果可以看 到区域面积约为 0.746818876175303。 图 10.MATLAB 477 数值分析与应用 在化定为 108 个子区间以后已经是很对函数取点已经很密了。 图 10. b ] 上,把区间分为 n 等分,则有复合 Simpson 公式 n −1 I = ∫ f ( x ) dx = ∑ ∫ b a = k =0 xk +1 xk h n −1  ∑ f ( xk ) + 4 f 6 k =0  f ( x ) dx   xk + xk +1  + f ( xk +1 ) + Rn ( f )   2    在上一个实验中 n 是在调用到这个方法函数时候事先给定的,而有时候我们希望计算机 能自动找到一个合适的 n,满足我们的计算精度,这可以通过前后两次的计算误差作为一种 估计误差方法。既如果 n 等分的情况下计算出结果,把区间划分更细,再次计算出结果,如 果两次计算结果的差小于给定的误差标准,则可以接受计算结果, 通常取第二次为最后结果。 如果差值大于给定的误差容限则划分区间再加细,知道满足精度为止。 实验目的与要求 .4 变步长的复合 Simpson 方法 实验基本原理 在上一个实验中介绍了复合 Simpson 方法,使用起来有时候不太方便,故希望能有一种 方法直接通过计算估计误差估计,并逐步自动调整,知道满足计算精度为止,这就是本实验 的基本思想。 在积分区间 [ a.3 变步长梯形积分方法 实验 10.

.b 为积分区间 %tol 为积精度 默认为 10 的-3 次方 if(nargin==3) eps=1.0e-3.tol) % a. end n=1.b.m.exe 光盘:\实验代码\chapter10\kong_xps.m. kong_xps_f.num] = kong_xps(a. kong_xps_main. h=(b-a)/2. %调用方程函数 int_2=(kong_t_f(a)+kong_t_f(b))/h.MATLAB 数值分析与应用 478 l 知道精度控制方法。 l 能够编程实现可以控制精度的 Simpson 方法。 l 能对计算结果的误差做出合理分析。 l 图形化表达积分区间与积分函数。 实验内容及数据来源 使用可控精度的 Simpson 方法计算 ∫ ( − x − x ) dx 2 2 −1 实验操作指导 光盘:\实验视频\chapter10.rar\10-4. int_1=0.m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %可控精度复合 simpson 法计算积分问题 %9 月 function [jifen.

-1.2) %画出积分图形 x=-1:0. for i=0:n-1 x=a+h*i.^2. area(x.m 保存。 步骤三:编写主函数。 打开 Edior 编辑器,输入以下语句: %可控精度的梯形积分方法 %精度为 0. x1=x+h. int_2=int_2+(h/6)*(kong_xps_f(x)+4*kong_xps_f((x+x1)/2)+kong_xps_f(x1)).y) grid 以文件名 kong_xps_main. %区间化分细度 num=n.m 保存。 步骤二:编写积分函数。 打开 Editor 编辑器,输入以下语句: %可控精度的 Simpson 方法 积分函数 function f=kong_xps_f(x) f=-x-x^2. 以文件名 kong_xps. end end %%%% %积分结果 jifen=int_2.2.1e-5) %精确结果为 real_ans=int('-x-x^2'.1 [s_1. int_2=0.m 保存。 步骤四:运行主函数。 在命令窗口输入: .num_3]=kong_xps(-1. y=-x-x. 以文件名 kong_xps_f. h=(b-a)/n. int_1=int_2.05:2.MATLAB 479 数值分析与应用 %如果前后两次 误差小于给定的精度 则停止细化积分区间 while abs(int_2-int_1)>tol n=n+1.

4 中,x 轴以上的阴影部分与 x 轴以下的阴影部分的面积之差。 图 10.5 num_3 = 3 real_ans = -9/2 实验结论 从计算结果可以看出,采用复合公式此时计算结果为-4.4 中给出了积分的函数与积分区间,积分的几何意 义为在图 10.MATLAB 480 数值分析与应用 >> kong_xps_main 回车得到: s_1 = -4.4 积分的几何意义 .5,而积分的精确结果就是-4.5, 这是采用符号方法给出的结果。在图 10.

1。 R(1,1) R(2,1) R(2,2) R(3,1) R(3,2) R(3,3) R(4,1) R(4,2) R(4,3) R(4,4) R(5,1) R(5,2) R(5,3) R(5,4) R(5,5) R(6,1) R(6,2) R(6,3) R(6,4) R(6,5) R(6,6) M M M M M M L 表 10. j ) =  1   f  a +  k −  hi −1  2    4 j −1 R ( m. 0 ) + i −1 ∑ 2 2 k =1 (3) R ( m.MATLAB 数值分析与应用 481 实验 10. j − 1) − R ( m − 1. j − 1) 4 j −1 − 1 如此便构成了 Romberg 积分的基本步骤,其计算步骤如表 5.5 Romberg 积分方法 实验基本原理 Romberg 方法是实用性很强的一种数值积分方法,其收敛速度是很快的,这里给出 Romberg 积分的计算方法。 (1) 计算 R ( 0. 0 ) = R ( i − 1.2 Romberg 计算步骤 可以证明 Romberg 方法是数值稳定的。下面通过实验阐述 Romberg 计算的详细步骤。 实验目的与要求 l 熟悉 Romberg 积分方法的计算流程。 l 能编程实现 Romberg 方法,并处理数值积分问题。 l 在程序设计中能够控制误差容限。 l 对计算结果用图形化表达。 实验内容及数据来源 . 0 ) = 1 ( b − a )  f ( a ) + f ( b ) 2 i −2 h 2 1 (2) 计算 R ( i.

end %前后两次值的差 数值分析与应用 .i))/(4^i-1).m. R=zeros(4.1)= R(k. h=b-a. for j=1:n x=a+h*(2*j-1). rombg_f.b.m. n=2*n.i)-R(k.MATLAB 482 用 Romberg 积分方法计算 S=∫ 1.i+1)=((4^i)*R(k+1. R(1. h=h/2. end R(k+1. k=0. s=0.5 0 x dx 4 + x2 要求误差控制在10−6 。 实验操作指导 光盘:\实验视频\chapter10.m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Romberg 积分方法函数 %08 年 中秋 %a. s=s+rombg_f(x). for i=1:k R(k+1.1)=h*(rombg_f(a)+rombg_f(b))/2.exe 光 盘 : \ 实 验 代 码 \chapter10\rombg.b 为积分区间 %TOL 为误差容限 %s 为最后积分面积 function s=rombg(a.4).1)/2+h*s. %设置设计误差初值 delt=1. while delt>TOL %如果两次计算的差值大于给定误差则进入循环 k=k+1.rar\10-5. rombg_main. x=a.TOL) n=1.

m 保存。 步骤二:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Romberg 方法 试验函数 function f=rombg_f(x) f=x/(4+x^2).k+1)./(4+x.02:1.5.111571784504289。 .k)-R(k+1.^2). area(x.MATLAB 483 数值分析与应用 delt=abs(R(k+1.k+1)).m 保存。 步骤四:运行程序。 在命令窗口输入: >> rombg_main 回车得到 s= 0. end s=R(k+1. y=x.1. 以文件 rombg_f. 以文件 rombg.y) grid 以文件 rombg_main.5 中给出了积分的几何意义,既图中阴影 部分为面积为 0.5.1.223143586093269 实验结论 计算结果已经给出了符合精度的数值,在图 5.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %Romberg 积分的主函数 % 08 年 9 月 11 s=rombg(0.e-6) %作出图形 x=0:0.

1) 3 (4) R ( 3. 2 ) 15 M 如此逐步递推。实际上,在实际使用中可能为了便于处理具体的实际问题,对同一个算 法,不同的作者在做程序设计时候会有一些不同,但作为数值分析方法一般主要在于说明计 算的数学思想,而不是成品的数学软件。 实验 10.1) − R (1.125 ) ) 2 (5) R ( 3.375 ) + f (1.1) + 1.5 − 0 ( f ( 0 ) + f (1) ) 2 1 (2) R ( 2.75)  2 (1) R (1.1) =  R (1. 2 ) = R ( 2.1) 3 (6) R ( 3.3) = 16 R ( 3.MATLAB 484 数值分析与应用 图 10. 2 ) − R ( 2.75 ( f ( 0.5 f ( 0.1) + 0.5 积分的几何意义 这里给出计算的前几步计算实况 1. 2 ) = 4 R ( 3.1) = (3) R ( 2.1) = 1  R ( 2.1) − R ( 2.6 Gauss-Legendre 积分 实验基本原理 从本实验开始,在接下来的几个实验中介绍 Gauss 型积分方法。其中需要用到正交多项 .

b ] 问题,可以做变换 x= ∫ b a f ( x ) dx = a +b b−a + t 2 2 b−a n ∑ Ak f 2 k =1  a+b b−a  + xk   2  2  结点与权可以通过程序计算出来,而很多计算手册中都直接给出了常用的计算零点与系数。 如这里采用的零点为:  -0.MATLAB 数值分析与应用 485 式的一些理论,正交多项式在数值分析中是基本的工具之一。本实验就介绍 Gauss-Legendre 积分方法。 Gauss-Legendre 求积公式为 ∫ n 1 −1 f ( x ) dx ≈ ∑ Ak f ( xk ) k =1 其中 xk 为 Legendre 多项式在 [ −1.5688888889     0.2369268851    即采用 5 阶的 Legendre 方法。 实验目的与要求 .9061798459    相对应的权系数为:  0.1] 区间上的零点。 n 阶 Legendre 多项式定义为: n 1 dn  2 t − 1)  n n (  2 n ! dt  Pn ( t ) = Ak 为权系数, Ak = 2 (1 − xk ) 2  Pn ' ( xk )  2 = 2 (1 − xk ) 2 n 2  Pn ( xk )  2 对于一般的积分区间为 [ a.9061798459   -0.4786286705   0.2369268851   0.4786286705    A =  0.5384693101      x= 0    0.5384693101   0.

0. %结点对应的权 quan=[0.9061798459].5688888889. gau_leg_f.m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Gauss-Legendre 方法 %08 年 9 月 %a,b 为积分区间 function s=gau_leg(a.m.m 保存。 步骤二:编写测试函数。 打开 Editor 编辑器,输入以下语句: .0.0.0.4786286705. 以文件名 gau_leg.0. gau_leg_main.m.b) %5 阶 Legendre 多项式结点 node=[-0.2369268851.5384693101.exe 光盘:\实验代码\chapter10\gau_leg. %t 为 (1,5)的行向量 ,整个区间上的结点 t=(b+a)/2+(b-a)*node/2.0.4786286705.-0.0. s=((b-a)/2)*sum(quan.5384693101.MATLAB 486 l 了解 Gauss 系列方法的基本原理。 l 熟悉 Legendre 多项式的定义及性质。 l 能够计算出 n 阶 Legendre 多项式的零点及权系数。 l 能利用已知道的零点及对应的权系数快速计算相关积分问题。 数值分析与应用 实验内容及数据来源 用 Gauss-Legendre 积分方法计算定积分 π S = ∫ 2 x 2 cos xdx 0 实验操作指导 光盘:\实验视频\chapter10.2369268851].9061798459.*gau_leg_f(t)).rar\10-6.

pi/2) %画出图形 x=0:0.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %Gauss-Legendre 方法的主函数 disp('计算结果为:') s=gau_leg(0.MATLAB 487 数值分析与应用 %Gauss-Legendre 计算函数 %注意 f 的数组形 function f=gau_leg_f(x) f=(x.46740109740108 实验结论 在图 10. bar(x. 以文件名 gau_leg_f.y) grid 以文件 gau_leg_main.01:pi/2.*cos(x).m 保存。 步骤四:运行程序。 在命令窗口输入: >> gau_leg_main 计算结果为: 回车得到: s= 0.6 中给出了实验中计算内容的几何意义,即图 10.^2). y=(x.6 中有色部分的面积为积分计 算的结果。 .*cos(x).^2).

7 Gauss-Laguerre 方法计算反常积分 实验基本原理 对于区间在 [ 0.6 Gauss-Legendre 积分 从运算结果来看,Gauss-Legendre 方法是行之有效的。Legendre 多项式是处理很多问题 的有力工具,在最佳逼近理论中,我们也给了许多关于 Legendre 多项式的介绍。 采用 Gauss-Legendre 方法求积的多项为: 22 n+1 ( n !) R( f ) = f ( 2n ) (ξ ) . ∞ ] 上的积分 ∞ S = ∫ f ( x )dx 0 n 个结点 Gauss-Laguerre 求积公为 n S ≈ ∑ Ak f ( xk ) k =1 其中 xk 为零点, Ak 为权系数 Ak = Laguerre 多项式为 xk ( n + 1) 2  Ln +1 ( xk ) 2 .MATLAB 数值分析与应用 488 图 10. ξ ∈ [ −1.1] 3 2n + 1 ( 2n !)    4 高阶 Legendre 方法的零点和权系数可以通过查表得到,也可以通过编程计算而得。这 里不作过多介绍。 实验 10.

MATLAB 489 Ln ( x ) = e x d n n −x ( x e ).6408    相应的权系数为  0.rar\10-7.2635599  1.6790941054   1. 0 ≤ x < ∞ dx n 这里采用 5 阶的 Laguerre 多项式,其零点为  0. gau_lag_f.769426772     4.315944   7.4134029     x = 3. 数值分析与应用 .0858099  12.10489623    实验目的与要求 l 知道 Laguerre 多项式的定义。 l 熟悉 Laguerre 多项式的重要性质。 l 能够计算出 Laguerre 多项式的零点以及相应的权系数。 l 能利用已知的零点及权系数进行相关反常积分的数值运算。 实验内容及数据来源 计算反常积分 ∞ S = ∫ xe− x dx 0 实验操作指导 光盘:\实验视频\chapter10.596246     7.638487956    A =  2.exe 光盘:\实验代码\chapter10\gau_lag.m.m.

%权重向量 quan=[0. %求和 s=sum(quan. 以文件名 gau_lag_f.*exp(-x).6790941054.10489623].638487956.640800].1:20.*gau_lag_f(node)) %%%%%%%%%%% %以下为画出积分示意图 clear x=0:0.7。图 10.1.41340290.7 中函数在区间上与坐标轴围成的图像面积是为积 分结果。 .*exp(-x).769426772.31594400.7.y) grid 以文件名 gau_lag.08580990.m 保存。 步骤二:编写要计算的测试函数。 打开 Editor 编辑器,输入以下语句: %Gauss-Laguerre 方法测试函数 function f=gau_lag_f(x) f=x.12.3. area(x.59624600.7. y=x.m 保存。 步骤三:运行程序。 在命令窗口输入: >> s=gau_lag 回车既得到: s= 1.4.2.26355990.00003075881944 实验结论 本实验计算的积分区间是为 0 到无穷,所以不方便在图像上画出积分的几何意义,但是 可以画出积分示意图,如图 10.MATLAB 490 数值分析与应用 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Gauss-Laguerre 方法计算反常积分 %可直接当主函数调用 function s=gau_lag() %多项式结点 node=[0.1.

Ak 分别为结点以及相应的权系数。这里取 5 阶的 Hermite 多项式作为基函数,其相 应的结点为 . ∞ ) 上的积分问题 S=∫ ∞ −∞ f ( x ) dx n 个结点点 Guass-Hermite 求积公式为 n S ≈ ∑ Ak f ( xk ) k =1 其中 xk .7 反常积分的几何意义示意图 Gauss-Laguerre 求积公式余项为 ( n !) f ( 2 n) ξ .8 Gauss-Hermite 方法计算反常积分 实验基本原理 Gauss-Hermite 方法可以计算区间在 ( −∞.MATLAB 491 数值分析与应用 图 10. 0 ≤ ξ < ∞ R( f ) = ( ) ( 2n ) ! 2 Gauss-Laguerre 方法对于形如 ∫ ∞ 0 e − x g ( x ) dx 的积分尤为有效。 实验 10.

9865791417    A =  0.9585719     x= 0    0.rar\10-8.020182   -0.181469599   0.m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Gauss-Laguerre 方法计算反常积分 %可直接当主函数调用 .9453089237     0.9865791417   1.020182    对应的权系数为  1.m.exe 光盘:\实验代码\chapter10\gau_herm. gau_herm_f.181469599    实验目的与要求 l 熟悉 Hermite 多项式定义及其性质。 l 能采用数值方法获得多项式的值、零点、权系数。 l 能构造出低阶次的 Gauss-Hermite 求积公式。 l 能根据已知的零点及其对应的权系数用数值方法实现 Gauss-Hermite 法求积分。 实验内容及数据来源 采用 Gauss-Hermite 方法计算反常积分 ∞ S = ∫ e − x dx 2 −∞ 实验操作指导 光盘:\实验视频\chapter10.9585719   2.MATLAB 数值分析与应用 492  -2.

181469599 ].181469599 0. y=exp(-x.9865791417 1. 以文件名 gau_herm_f.77245292373229 数值分析与应用 .95857190 0. %权重向量 quan=[ 1.9865791417 0.02018200].95857190 2. area(x.m 保存。 步骤三:运行程序。 在命令窗口输入: >> gau_herm 回车得到: ans = 1.m 保存。 步骤二:编写测试函数。 打开 Editor 编辑器,输入以下语句: %Gauss-Laguerre 方法测试函数 function f=gau_herm_f(x) f=exp(-x.9453089237 0.y) grid 以文件名 gau_herm. %求和 s=sum(quan. %% %画出反常积分的示意图 clear x=-6:0.02018200 -0.^2).MATLAB 493 function s=gau_lag() %多项式结点 node=[ -2.*gau_herm_f(node)).00000000 0.1:6.^2).

n ≥ 2 实验 10.8 积分的几何意义示意图 Gauss-Hermite 求积方法,尤其实用于形如 ∞ S = ∫ e − x g ( x ) dx 2 −∞ 的积分。 Hermite 多项式是微分方程 d2y dy − 2 x + 2ny = 0 2 dx dx 的一个特解,可以表示为 ( ) d n − x2 H n ( x ) = ( −1) e e dx n n x2 H n ( x ) 有如下的递推关系 H0 ( x) = 1 H1 ( x ) = 2 x H n ( x ) = 2 xH n−1 ( x ) − 2 ( n − 1) H n − 2 ( x ) .9 Gauss-Chebyshev 方法计算瑕积分 .8 中曲线在全区间上与 x 轴围成的图形面积是为积分的结 果。 图 10.8 所示。图 10.MATLAB 数值分析与应用 494 实验结论 实验中积分区间是为无穷情况,不方便画出全区间上的几何意义,但可以画出几何意义 的示意图,如图 10.

b ] ,则可以做变换得到 1 f ( x) −1 1− x ∫ 2 dx ≈ (b − a ) π 2n n  a+b b−a  + xk  2 2  ∑ f  k =1 实验目的与要求 l 熟悉 Gauss-Chebyshev 积分方法。 l 对积分区间不在 [ −1.L n xk = cos   2n  Ak = π n Gauss-Chebyshev 求积公式的余项为 R( f ) = 2π f ( 2 n ) (η ) . −1 < η < 1 2 ( 2n ) ! 2n 如果积分限不在 [ −1. 2.1] 上,而为 [ a.1] 上的,要能够变换到该区间上。 l 比较不同阶次的积分结果。 实验内容及数据来源 采用 Gauss-Chebyshev 方法计算瑕积分 .MATLAB 数值分析与应用 495 实验基本原理 由正交多项式理论,在区间 [ −1. k = 1.1] 上,取权函数 ρ ( x) = 1 1 − x2 则可以建立 Gauss-Chebyshev 积分公式 1 f ( x) −1 1 − x2 ∫ n dx ≈ ∑ Ak f ( xk ) k =1 其中结点  2k − 1  π  .

m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %Gauss-chebyshev 方法的主函数 for i=1:9 s(i)=gau_cheb(-1.rar\10-9. s=(b-a)*pi/2/n*sum(gau_cheb_f(t)).MATLAB 数值分析与应用 496 S=∫ 1 −1 ex 1 − x2 dx 实验操作指导 光盘:\实验视频\chapter10. t=(b+a)/2+(b-a)/2*x. k=1:n. 以文件名 gau_cheb_f.i).1.m. .m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: %Gauss-chebyshev 方法计算积分问题 %08 年 9 月 function s=gau_cheb(a.b 为积分区间 %n 表示结点个数 这里取 5 个结点 if nargin==2 n=5. 以文件名 gau_cheb.n) %a.m.exe 光盘:\实验代码\chapter10\gau_cheb. gau_cheb_main. x=cos(pi*(2*k-1)/(2*n)).m 保存。 步骤二:编写测试函数。 打开 Editor 编辑器,输入以下语句: %Gauss-chebyshev 方法测试函数 function f=gau_cheb_f(x) f=exp(x).b. gau_cheb_f. end.

^2).9 所示。 图 10.9 瑕积分的几何意义示意图 . area(x./sqrt(1-x.97746326050642 实验结论 本实验是为瑕积分情况,在相关点出函数的值出现异常,和前面几个实验类似不方便画 出函数图像的几何意义,但是可以画出积分意义的示意图,方法是画出逼近瑕点的区间的有 限积分情况,如图 10.MATLAB 497 数值分析与应用 end disp('积分结果为') s=s' %画出积分几何意义示意图 clear x=-0.y).99.99:0.m 保存。 步骤四:运行程序。 在命令窗口输入: >> gau_cheb_main 回车得到: 积分结果为 s= 3.02:0. grid 以文件名 gau_cheb_main. y=exp(x).

2L .97746263466196 5 3.97746326050316 7 3.97746326050642 8 3.97732196008232 4 3. k = 1.14159265358979 2 3.96026605279076 3 3.97746326050642 9 3.97746326050642 表 10.3。 结点数 积分结果 1 3.3 不同结点数的积分结果 当结点为 9 时候可以给出误差估计 R( f ) ≤ 2π e 2 × 18! 18 可以看出计算精度非常高。 实验 10. n 如果随机数数目非常大,则有 .10 蒙特卡洛方法 实验基本原理 蒙特卡洛方法类似于机械求积方法,采用随机数的方法产生结点,然后把各区间段上的 函数值与区间段相乘再相加。而实际上如果均匀分布的随机点比较密集,则随机数产生的区 间近似均分整个积分区间段。具体方法如下: 对于积分 S = ∫ f ( x ) dx b a 用函数产生 0 到 1 之间均匀分布的随机数 t (1× n ) 向量。做区间转换 xk = a + ( b − a ) tk .97746325877669 6 3.MATLAB 数值分析与应用 498 被积分函数含有因子 1 ρ ( x) = 1 − x2 时采用 Gauss-Chebyshev 方法比较有效果。这里给出了不同阶级的数值效果,如表 10.

4 2.exe 光盘:\实验代码\chapter10\ monte_carlo.monte_carlo_main.MATLAB 499 S = ∫ f ( x ) dx ≈ b a 数值分析与应用 b−a n ∑ f ( xk ) n k =1 该方法的使用原则是 n 要比较大,否则计算误差会比较严重,另外实际上还可以对这一 方法做一些改进,既直接由随机数产生的区间对函数分别使用梯形或其他牛顿—柯特斯公式 积分,最后把各区间的积分相加。 实验目的与要求 l 理解蒙特卡洛方法的思想。 l 注意使用中获得可靠积分的原则,既对 n 的限制。 l 能够编程实现蒙特卡洛方法。 l 把积分函数用图象化表达。 实验内容及数据来源 给出数据文件光盘素材路径 使用蒙特卡洛方法计算定积分问题 S=∫ 8.5 (x 2 + sin x ) dx 实验操作指导 光盘:\实验视频\chapter10.n) %Monte_carlo 方法计算定积分问题 %08 年 9 月 16 if nargin==2 . monte_carlo_f.m.m.m 步骤一:编写方法函数。 打开 Editor 编辑器,输入以下语句: function s=monte_carlo(a.b.rar\10-10.

y1=exp(3*x1).5.4) s_ex=vpa(s_ex. 以文件名 monte_carlo_f.MATLAB n=10000.4) %符号积分,求精确结果 s_format=int('exp(3*x)*cos(2*x)'.m 保存。 步骤三:编写主函数。 %monte_carlo 方法主函数 %08 年 9 月 %by song yezhi format short s=monte_carlo(0.^2+sin(x).0.m 保存。 步骤二:编写积分函数。 打开 Editor 编辑器,输入以下语句: function f=monte_carlo_f(x) %monte—carlo 方法的 积分函数 f=x. 以文件名 monte_carlo.y1) grid on 以文件名 monte_carlo_main. plot(x. end %产生均匀分布的随机数 t=rand(1. s=s*(b-a)/n.6) x=-0.*cos(2*x1).4. s=sum(monte_carlo_f(x)).*cos(2*x).0. %区间变换 x=a+(b-a)*t. area(x1.5:0.01:0.m 保存。 500 数值分析与应用 .01:0.y) hold on %画出积分区间 x1=0:0.n).0. y=exp(3*x).

669451 实验结论 可以看出采用蒙特卡洛方法是可行的,但是一般精度不会太高。为了对比计算结果,采 用符号积分法给出严格的分析解。 在图 10.10 积分的几何意义 因为结点的产生是随机数,所以每次运行程序的结果可能会不同,但是对于 n 比较大的 情况积分结果是相对稳定的。 .6693 s_format = 3/13*exp(6/5)*cos(4/5)+2/13*exp(6/5)*sin(4/5)-3/13 s_ex = .10 中,给出了积分的几何意义,图形中有色部分面积,即为积分函数在积分区 间上的积分结果。 图 10.MATLAB 501 数值分析与应用 步骤四:运行程序。 在命令窗口输入: >> monte_carlo_main s= 0.

b) q = quadl(fun.b.trace) [q..a..Y) Z = trapz(Y)是采用梯形法计算定积分的近似值。其中 Y 为等距结点上的函数值,其中 Y 可以为矩阵,则返回多列积分值。Z = trapz(X..fcnt] = quadl(fun.tol) q = quad(fun.tol..a.a..tol) q = quadl(fun.trace) [q.b.b.a.) 其中基本的参数 fun 的含义为被积分的函数,a.a.b.MATLAB 502 数值分析与应用 实验 10.fcnt] = quadl(fun.a..a.Y)即为采用梯形法计算 Y 在 X 点上的积分。 quad 函数的基本语法为: q = quad(fun.) 使用方法与 quadl 类似,但精度更高,是一种比较理想的积分函数。另外 MATLAB 较 早一些的版本还提供了 quad8 函数,quad8 采用 8 阶的 Newton-Cotes 方法,现在 Mahtworks 公司建议使用 quadl 函数代替 quad8 函数。 下面的实验分别以范例说明如何使用这些函数进行数值积分计算。 实验目的与要求 l 知道 trapz 函数方法,熟悉参数设置。 l 知道 quad 函数方法,熟悉参数设置,了解其函数运算的基本原理。 l 知道 quadl 函数方法,能正确配置参数,知道其函数的数学方法。 l 能够分别利用上面的三种函数进行数值积分计算。 .tol.b) q = quad(fun.b 为积分区间,tol 为允许的误差容限。 其他参数可以参看 MATLAB 的帮助文件。 Quadl 函数的基本语法为: q = quadl(fun.b.b.11 MATLAB 中的数值积分方法 实验基本原理 前面的实验中分别介绍了常用的积分方法,在这一实验中将介绍 MATLAB 中内置的数 值积分函数。 在 MATLAB 中提供了 trapz 和 quad 方法用于数值积分,另外还提供了精度更高的 quadl 函数,这里给出函数的使用方法。Trapz 函数的基本语法为: Z = trapz(Y) Z = trapz(X.a.

s=quad(f. y=sqrt(2*x-x.-pi/2.01:1.rar\10-11.^2).^2). s1=trapz(x.y) %s1 的精确结果 s1_ex=pi/4 %quad 方法 %定义函数 f=@(x)(x.^3+(sin(x)).exe 光盘:\实验代码\chapter10\tr_quad.pi/2) %s2 的精确结果 s2_ex=pi/8 .*cos(x).MATLAB 数值分析与应用 503 实验内容及数据来源 (1) 采用 trapz 方法计算下面的定积分问题。 S1 = ∫ 1 0 2 x − x 2 dx (2) 采用 quad 方法计算下面的定积分问题。 π S 2 = ∫ 2π ( x 3 + sin 2 x ) cos 2 xdx − 2 (3) 采用 quadl 方法计算下面的定积分问题。 S = ∫ x (1 − x 1 0 3 4 2 ) dx 实验操作指导 光盘:\实验视频\chapter10.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句 %MATLAB 中的数值积分方法 %梯形法计算定积分问题 %08 年 9 月 16 x=0:0.*cos(x).

2) area(x. y=x.*cos(x).1) area(x.0. subplot(3. y=(x.1.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >> tr_quad 回车得到 504 数值分析与应用 .^(3/2).^2).05:pi/2.^3+(sin(x)).3) area(x.^4).y) grid title('trapz method') %范例二图形的数据 x=-pi/2:0. subplot(3. s=quadl(g.y) grid title('quad method') %范例三数据 x=0:0.1.1.01:1.1) %s3 的精确结果 s3_ex=pi*3/32 %%%%%%%%%%%%%% %以下为作图部分 %范例一图形 subplot(3.MATLAB %quadl 方法 %定义函数 g=@(x)x.^4).*cos(x).^(3/2).*(1-x.y) grid title('quadl method') 以文件名 tr_quad.*(1-x.

78510425794476 s1_ex = 0.39269908169872 s= 0.29452431127404 实验结论 为了查看积分效果,在实验的输出部分直接给出了函数精确的值。范例 1 的精确积分结 果为 π π 3π ,范例 2 的积分结果为 ,范例 3 的积分结果为 。在图 10.29452507494360 s3_ex = 0.MATLAB 505 数值分析与应用 s1 = 0.39269910233665 s2_ex = 0.11 中给出了三个范例 4 8 32 积分的几何意义。 .78539816339745 s= 0.

ymin.xmax.xmax.xmin.tol.xmax.ymin.ymin.zmin.ymin.method) 其中 fun 为被积函数,积分区域为 [ x min.zmax.xmin.xmax.zmax) triplequad(fun. x max ] × [ y min.ymax) q = dblquad(fun.tol) q = dblquad(fun.12 二重与三重定积分的计算 实验基本原理 在 MATLAB 中给出了计算积分区域为矩形的二重积分函数,其基本语法为: q = dblquad(fun.xmin. x max ] × [ y min.11 数值分析与应用 积分的几何意义 第二幅子图 x 轴上下方之差为积分结果。 一般而言, 在 MATLAB 的数值积分函数中 quadl 方法为首选,而且原则上可以满足指定的精度。 实验 10.ymax.tol) triplequad(fun.ymax.zmin.ymax.zmax. y max ] ,method 为可以选 择的积分方法。 MATLAB 中还给出了长方体三重定积分的计算函数,其函数的基本语法为: triplequad(fun. z max ] .tol.MATLAB 506 图 10.ymax.method) 参数的基本意义与二重积分类似,积分区域为 [ x min.ymax.zmin. y max ] × [ z min.ymin.xmin.ymin.xmax.xmin.xmax.xmin.

MATLAB 507 数值分析与应用 tol 为积分的误差容限,method 为积分方法。下面以范例说明如何调用二重积分与三重 积分的函数进行二、三重定积分的计算。 实验目的与要求 l 熟悉二重积分运算的解析方法。 l 会正确使用调用 MATLAB 中的函数处理二重积分问题。 l 能根据需要正确设置函数参数。 l 熟悉三重积分运算的解析方法。 l 会正确调用 MATLAB 中的函数处理三重积分问题。 l 能正确配置函数参数。 实验内容及数据来源 (1) 计算二重积分 V =∫ π 2π ∫ ( y sin x + x cos y ) dxdy π 0 (2) 计算三重积分 M =∫ 2 1 ∫ ∫ (x 2 1 2 1 2 + y 2 + z 2 ) dxdydz 实验操作指导 光盘:\实验视频\chapter10.m 步骤一:编写主函数。 打开 Editor 编辑器,输入以下语句: %二、三重积分 %定义积分函数 %08 年 9 月 %%%%%%%%%%二重积分问题 f=@(x.rar\10-12.y)y*sin(x)+x*cos(y).exe 光盘:\实验代码\chapter10\d_int. v=dblquad(f.pi.pi) .2*pi.0.

MATLAB

508

数值分析与应用

%绘制积分函数曲面
x=pi:0.1:2*pi;
y=0:0.1:pi;
[x,y]=meshgrid(x,y);
z=y.*sin(x)+x.*cos(y);
waterfall(x,y,z)
%改变视角
view(-37.5,60)
grid
%%%%%%%%%%%%三重积分问题
%定义积分函数
g=@(x,y,z)x.^2+y.^2+z.^2;
%调用函数
m=triplequad(g,1,2,1,2,1,2)
以文件名 d_int.m 保存。
步骤二:运行程序。
在命令窗口输入:
>> d_int
回车得到:
v=
-9.86960437725457

m=
7.00000000000000

实验结论
实验的输出部分已经给出了计算结果,当然这是针对积分区域为矩形的情况。起物理意
义为,曲面 z = f ( x, y ) 与所在积分区域所围成的体积,如图 10.12 所示。

MATLAB

509

数值分析与应用

图 10.12 矩形积分区域上的二重积分
对于一般区域的二重积分问题,MATLAB 没有提供。在 Howard Wilson 与 Bryce Gardner
开发的数值积分工具箱(NIT)中提供了对于一般积分区域的二重积分函数,如果有需要的
读者可以直接从 The Math Works 公司的官方网站上下载。
对于三重积分 MATLAB 中同样没有提供一般区域的积分函数,在 NIT 中则提供了一般
区域的三重积分问题,还可以计算超维的积分问题。

小结

在这一章中介绍了定积分的数值计算方法,其中梯形法与 simpson 方法是 Newton-Cotes
方法 n 为 1 与 2 时的积分公式,这两个方法放在前面容易理解积分的基本方法。其中比较重
要的也比较实用的方法是 Romberg 方法,这是这一章中的重点。
另外还介绍了 MATLAB 中的数值积分函数,在实际应用中可以达到快速计算积分的效
果,其中实用性比较强的函数是 quadl,这是推荐大家使用的函数。
要想从数学上更清晰的把握数值积分的思想,以及许多变形算法的原理,需要插值理论
和多项式理论为基础。

MATLAB

数值分析与应用

510

上机操作题

a) 采用复合梯形公式计算定积分问题

I =∫

1

−1

(

x + 1 − x2

) dx
2

参考答案:积分的精确结果为 I=2。
b) 采用 Romberg 方法计算定积分

I =∫

π

1 − sin xdx

0

参考答案:积分的精确结果为 I= 4 2 − 4 。
c) 用 Gauss-Legendre 公式计算定积分
1.5

I = ∫ e − x dx
2

1

参考答案:I=0.1093642。
d) 计算二重积分问题

I=

∫∫

x∈[ −1,1]
y∈[0,2]

参考答案:-7.5989e-018。

sin x cos ydxdy

MATLAB

511

数值分析与应用

第十一章 常微分方程的数值方法

常微分方程数值方法是数值分析中最重要的内容之一,也是工程技术中最基本的工具。
常微分方程主要分为解析方法和数值方法,这里主要讲数值方法。常微分数值方法按计算类
型可以分为初值问题与边值问题就计算方法而言,初值问题可以主要可以分为单步法与多步
法,边值问题可以采用打靶法,有限差分法以及有限元方法。这一章主要介绍初值问题。在
学习数值方法之前,首先要熟悉一些微分方程的基本理论,建议阅读相关微分方程教材或专
著。

这里不再多做介绍基本知识,读者只需要承认这些理论事实,如微分方程的
存在唯一性定理。

实验 11.1 Euler 方法
实验基本原理
Euler 方法是最简单的一种显式单步法。对于方程

dy
= f ( x, y )
dx
考虑用差商代替导数进行计算,取离散化点列

xn = x0 + nh, n = 0,1, 2,L
则得到方程的近似式

y ( xn +1 ) − y ( xn )
h

≈ f ( xn , y ( xn ) )

yn+1 = yn + hf ( xn , yn )
便得到 Euler 方法。具体计算时由

实验目的与要求

x0 出发,根据初值,逐步递推而得到系列离散数值。

MATLAB

l

512

数值分析与应用

理解 Euler 方法的基本原理。

能用 Eluer 方法解决常微分方程初值问题。
对于能给出分析解的微分方程,给出分析解,并比较 Euler 方法精度。
把计算结果用图形表示出来。

实验内容及数据来源

计算常微分方程

 dx 2
2 t
 = x+t e
 dt t
t ∈ [1, 2], x (1) = 0
并把计算结果与分析解进行比较。

实验操作指导
光盘:\实验视频\chapter11.rar\11-1.exe
光 盘 : \ 实 验 代 码 \chapter11\Euler.m, Euler_fun.m,
Euler_main.m

步骤一:编写 Euler 方法函数。
打开 Editor 编辑器,输入以下语句:
function [t,x]= Euler(fun,t0,tt,x0,N)
%MyEuler 用前向差分的欧拉方法解微分方程
%fun 表示 f(t,x)
%t0,tt 表示自变量的初值和终值
%x0 表示函数在 x0 处的值,其可以为向量形式
%N 表示自变量在[t0,tt]上取的点数

h=(tt-t0)/N;

%步长 h

t=t0+[0:N]'*h;

%时间 t

x(1,:) = x0';

%赋初值

for k = 1:N
f=feval(fun,t(k),x(k,:));
f=f';
x(k+1,:) =x(k,:)+h*f;
end

MATLAB

513

以文件名 Euler.m 保存文件。

步骤二:编写函数文件。
打开 Editor 编辑器,输入函数内容:
function f=Euler_fun(t,x)
f=2/t*x+t^2*exp(t);
以文件名 Euler_fun.m 保存文件。

步骤三:编写主函数。
打开 Editor 编辑器,输入以下语句:
%Euler 方法的测试主函数
function main_Euler
[t,x]=Euler('Euler_fun',1,2,0,20);%欧拉法所的的解
fh=dsolve('Dx=2/t*x+t^2*exp(t)','x(1)=0'); %符号计算
for k=1:21

%时间离散化

ft(k)=t(k);

%取数值方法的离散的时间

fx(k)=subs(fh,ft(k));
end
subplot(1,2,1),plot(t,x,'*',ft,fx),grid on
% 图形表示数值方法 和分析方法的解
subplot(1,2,2),plot(t,x-fx'),grid on
%画出两种方法的计算误差随时间的变化
[t,x,fx',x-fx']
%t 离散的时间
%x 数值方法的计算结果
%fx‘ 分析方法计算结果
% x-fx‘ 两者的计算误差
以文件名 main_Euler.m 保存文件。

步骤四:运行主程序。
打开命令窗口输入:
>>main_Euler
可以得到运行结果关于
1.00000000000000

0

1.05000000000000

0.13591409142295

1.10000000000000

0.30638630848932

M

M

数值分析与应用

MATLAB

数值分析与应用

514

1.90000000000000

12.96207146777123

1.95000000000000

14.85108970238007

2.00000000000000
16.94901327235141
第一列为时间,第二列为所求函数值。

实验结论
为了对比较两种方法的计算情况,我们给出了数值解和分析法给出解的对比,并给
出了误差情况,见表 11.1。

n

tn

xn

x (tn )

xn − x (tn )

1

1

0

0

0

2

1.05

0.13591409142295

0.15365464178854

-0.01774055036559

3

1.1

0.30638630848932

0.34591987653974

-0.03953356805042

4

1.15

0.51599165370984

0.58178240492763

-0.06579075121779

5

1.2

0.76969599931610

0.86664253575960

-0.09694653644350

6

1.25

1.07288575102948

1.20634551406687

-0.13345976303739

7

1.3

1.43139965466354

1.60721507818074

-0.17581542351719

8

1.35

1.85156288882072

2.07608939732863

-0.22452650850791

9

1.4

2.34022359688479

2.62035955123583

-0.28013595435104

10

1.45

2.90479202198448

3.24801072380729

-0.34321870182281

11

1.5

3.55328241966640

3.96766629422779

-0.41438387456140

12

1.55

4.29435793472386

4.78863502080140

-0.49427708607754

13

1.6

5.13737864103491

5.72096152559634

-0.58358288456142

14

1.65

6.09245295642217

6.77548030151739

-0.68302734509521

15

1.7

7.17049265851352

7.96387347784497

-0.79338081933145

16

1.75

8.38327174241302

9.29873259561172

-0.91546085319870

17

1.8

9.74348937674285

10.79362466049060

-1.05013528374779

18

1.85

11.26483723135230

12.46316275820360

-1.19832552685133

19

1.9

12.96207146777120

14.32308153589100

-1.36101006811977

20

1.95

14.85108970238000

16.39031787247520

-1.53922817009520

21

2

16.94901327235140

18.68309708188640

-1.73408380953501

表 11.1 Euler 方法与解析方法的比较
为了更清楚的看出随时间变化,计算的精度问题,在上面的程序中给出了图形见图
10.1。由图可以看出,随这时间的推移误差会逐步累积。要说明的是,在第二幅子图中
误差被放大了倍数所以看起来比较显著。

MATLAB

数值分析与应用

515

图 11.1 Euler 方法计算微分方程

实验 11.2 改进的 Euler 方法
实验基本原理
Euler 方法计算量小,但是精度不高。为此我们可以构造梯形公式

h

 yn +1 = yn + [ f ( tn , yn ) + f (tn +1 , yn +1 )]
2

 y0 = η
其中 h=(b-a)/N。这是一个二阶方法,比 Euler 方法精度高。但是上述公式右边有
因而是隐式差分方程,可以用迭代方法计算

yn+1 ,

yn+1 。初值可以由 Euler 公式提供,一般而言迭

代一两次就即可。在计算中的迭代公式为

 y ( 0) n+1 = yn + hf ( xn , yn )

h
 ( k +1)
(k )
 y n +1 = yn +  f ( xn , yn ) + f xn +1 , y n +1 
2

( k = 0,1, 2,L)

(

)

容易看出这实际上是一中预估-校正方法。改进的 Euler 方法又称为 Henu 方法。

MATLAB

516

数值分析与应用

实验目的与要求
l

了解改进 Euler 方法的基本原理。

能编程实现该算法,并解决常微分方程初值问题。
比较 Euler 方法及其改进算法的计算效果。
把结果用图形化表现出来。

实验内容及数据来源

用改进的 Eluer 方法计算常微分方程的初值问题

 dx 1 2
 = ( x + x)
 dt t
t ∈ [1,3], x (1) = −2
并与 Euler 方法进行比较,给出可视化分析。分析取不同步长计算结果的变化情况。

实验操作指导
光盘:\实验视频\chapter11.rar\11-2.exe
光盘:\实验代码\chapter11\GjEule, GjEuler_fun.m,
GjEuler_main.m

步骤一:编写改进的 Euler 方法函数。
打开 Editor 编辑器,输入以下语句:
function [t,x]=GjEuler(fun,t0,tt,x0,N)
%用改进的欧拉法解微分方程
h=(tt-t0)/N;%计算所取的两离散点之间的距离
t=t0+[0:N]'*h;%表示出离散的自变量 x
x(1,:)=x0';
for i=1:N
f1=h*feval(fun,t(i),x(i,:));
f1=f1';
f2=h*feval(fun,t(i+1),x(i,:)+f1);
f2=f2';
x(i+1,:)=x(i,:)+1/2*(f1+f2);

MATLAB

数值分析与应用

517

end
以文件名 GjEuler.m 保存文件。

步骤二:编写函数文件。
打开 Editor 编辑器,输入以下语句:
function f=GjEuler(t,x)
f=1/t*(x^2+x);
以文件名 GjEuler_fun.m 保存。

步骤三:编写主函数文件。
打开 Editor 编辑器,输入以下语句:
function GjEuler_main()
%比较改进欧拉法,简单欧拉方法以及微分方程符号解
[t,x]=Euler('GjEuler_fun',1,3,-2,15);%Euler 方法
[tgj,xgj]=GjEuler('GjEuler_fun',1,3,-2,15);%改进的 Eule 方法所的的解
sh=dsolve('Dx=1/t*(x^2+x)','x(1)=-2','t'); %符号计算
for k=1:16

%时间离散化

st(k)=t(k);

%取数值方法的离散的时间

sx(k)=subs(sh,st(k));
end
plot(t,x,'*',tgj,xgj,'+',st,sx)
[t,x,xgj,sx']
%te 时间
%x Euler 方法计算结果
%xgj 改进 Euler 方法计算结果
% sx 符号计算结果 注意:sx 为行向量,合并矩阵时候要转置
[t,sx'-x,sx'-xgj]
%两种方法的计算误差
%plot(t,sx'-x,'+',t,sx'-xgj,'*')
以文件名 GjEuler_main.m 保存。

步骤四:运行程序。
在命令窗口输入:
>>GjEuler_main
运行结果如表 11.2。
t

Euler 方法

改进 Euler 方法

分析法

MATLAB

数值分析与应用

518

1

-2

-2

-2

1.1333

-1.7333

-1.7919

-1.7895

1.2667

-1.5838

-1.655

-1.6522

1.4

-1.4865

-1.5582

-1.5556

1.5333

-1.4176

-1.4863

-1.4839

1.6667

-1.3661

-1.4308

-1.4286

1.8

-1.3261

-1.3866

-1.3846

1.9333

-1.2941

-1.3506

-1.3488

2.0667

-1.2678

-1.3208

-1.3191

2.2

-1.2459

-1.2956

-1.2941

2.3333

-1.2274

-1.2741

-1.2727

2.4667

-1.2114

-1.2555

-1.2542

2.6

-1.1976

-1.2393

-1.2381

2.7333

-1.1854

-1.225

-1.2239

2.8667

-1.1747

-1.2123

-1.2113

3

-1.1652

-1.201

-1.2

表 11.2 改进的 Euler 方法计算微分方程初值问题
其中时间和改进的 Euler 方法两列的结果序列就是我们要的结果。为了分析问题,
我们同时给出了分析解和 Euler 方法的结果进行比较。

实验结论
从表 11.2 可以看出很明显,改进的 Euler 方法要更接近分析解,这也是我们想要
看到的结果。从图 11.2 中,也可以直观的说明问题,很多点上改进的 Euler 方法非常接
近真解,而 Euler 方法则达不到。

图 11.2

Euler 方法与改进的方法数值解比较

MATLAB

数值分析与应用

519

从图形中也证实了,改进的 Euler 方法比原方法要精确许多,在本例中的区间内,
几乎改进后的方法和分析方法重合,而 Euler 方法则有比较大的误差。
在表格 11.3 中给出了两种计算与分析解的误差比较。
Euler 法的 x (tn ) − xn

tn

改进 Euler 法的

x (tn ) − xn

1.00000000000000

0

0

1.13333333333333

-0.05614035087719

0.00242174062607

1.26666666666667

-0.06838306337028

0.00280267287422

1.40000000000000

-0.06909129597029

0.00268328752017

1.53333333333333

-0.06627449248420

0.00245014166524

1.66666666666667

-0.06245176126199

0.00221071205650

1.80000000000000

-0.05850877955396

0.00199417361542

1.93333333333333

-0.05476409482802

0.00180594179520

2.06666666666667

-0.05132079487735

0.00164424191367

2.20000000000000

-0.04819660606024

0.00150547093432

2.33333333333333

-0.04537581957138

0.00138594578253

2.46666666666667

-0.04283098563158

0.00128242314890

2.60000000000000

-0.04053212084758

0.00119219615258

2.73333333333333

-0.03845052092338

0.00111305261287

2.86666666666667

-0.03656018267450

0.00104319722111

3.00000000000000

-0.03483816339401

0.00098117330798

表 13.3 Euler 法与改进方法的计算结果
对于两种计算方法的误差图象图 11.3 更明显的说明问题

MATLAB

520

数值分析与应用

图 11.3 Euler 方法与改进的 Euler 方法与分析解的误差
当我们采取把步长缩小后 Euler 方法会得到一些改善,精度比原来要高一些,见图 11.4

图 11.4 改变步长后 Euler 方法与改进的 Euler 方法对比
从图中明显可以看出,在把步长变为 40 步以后,在同样的区间上 Euler 方法和改
进的 Euler 方法都比原来接近分析解。

实验 11.3 Runge-Kutta 方法
实验基本原理
Runge-Kutta 方法通常简称 RK 方法,
是 19 世纪末德国科学家 C.Runge 和 M.W.Kutta
提出来的一种常微分方程数值方法。其中尤其以 4 阶方法使用最为广泛,又称为经典的
RK 方法。这里给出方法公式:

MATLAB

数值分析与应用

521

h
yn+1 = yn + [ K1 + 2 K 2 + 2 K 3 + K 4 ]
6
 K1 =

K2 =


K =
 3
K =
 4

f (tn , yn )
h
h
f (tn + , yn + K1 )
2
2
h
h
f (t n + , y n + K 2 )
2
2
f (tn , yn + hK 3 )

除了经典的 4 阶公式,还有其他的 RK4 阶公式,如 Gill 方法,Gill 方法具有减小
舍入误差的优点。具体公式如下:

(

)

(

)

h
yn +1 = yn + [ K1 + 2 − 2 K 2 + 2 + 2 K 3 + K 4 ]
6
 K1 =

K2 =


K =
 3


K4 =


f (tn , yn )
h
h
f (tn + , yn + K1 )
2
2

h
2 −1
2
f (t n + , y n +
hK1 + 1 −
 hK 2 )
2
2
2 


2
2
f (tn , yn −
hK 2 +  1 +
 hK 2 )

2
2 

在具体使用中,可以根据需要选择。

实验目的与要求
l

理解 4 阶 RK 方法计算步骤。

能给出计算的伪代码。
能编程实现计算方法,并解决相关常微分方程问题。
了解 RK 方法基本构造步骤。

实验内容及数据来源
对于一阶初值问题的常微分方程

dy
= − y + t2 + 3
dt
y (0) = 1, t ∈ [0,3]

MATLAB

522

数值分析与应用

采用 RK4 方法给出计算结果,并用 MATLAB 符号计算方法计算其分析解,比较两者的计算
结果。

实验操作指导
光盘:\实验视频\chapter11.rar\11-3.exe
光盘:\实验代码\chapter11\
RK4.m, RK_fun.m,RK_main.m

步骤一:编写 RK4 方法。
打开 Editor 编辑器,输入以下语句:
% Runge-Kutta Methold to solve the ODE
% by Song yz
%2008/04/18
function [t,y] = RK4(func,t0,tt,y0,N,varagin)
%Rk 方法计算一阶级微分方程组,
%由微分方程知识可以知道,对于高阶微分方程可以化为一阶微分方程组。
% 初始时刻为 t0,结束时为 tt,初始时刻函数值为 y0
%N 为 步数
if nargin<4
N=200
end
% 如果没有输入 N 的话,那么默认计算步长为(tt-t0)/200
y(1,:) = y0(:)';
h = (tt-t0)/(

N-1); %步长

t = t0+[0:N]'*h;
for k = 1:N
f1 = h*feval(func,t(k),y(k,:));
f1 = f1(:)';
%

RK 中的 k1

f2 = h*feval(func,t(k) + h/2,y(k,:) + f1/2);
f2 = f2(:)';
%

RK 中的 k2

f3 = h*feval(func,t(k) + h/2,y(k,:) + f2/2);
f3 = f3(:)';
%

RK 中的 k3

f4 = h*feval(func,t(k) + h,y(k,:) + f3);

MATLAB

523

f4 = f4(:)';
%

RK 中的 k4

y(k + 1,:) = y(k,:) + (f1 + 2*(f2 + f3) + f4)/6;
%

所求结果

end
以文件名 RK4.m 保存。

步骤二:编写调用的函数。
打开 Editor 编辑器,输入以下语句:
%RK 方法的测试函数
function f=RK_fun(t,y)
f=-y+t*t+3;
以文件名 RK_fun.m 保存。

步骤三:编写主调用函数。
打开 Eidtor 编辑器,输入以下语句:
%rk 方法的主函数
x0=0;
xt=3;
y0=1;
%符号计算给出分析解
y=dsolve('Dy=-y+t*t+3','y(0)=1','t')
%RK4 方法给出计算结果
[x,yrk] = RK4('RK_fun',x0,xt,y0,20);
%对应于真解的离散数据
yreal=subs(y,x);
tol=yreal-yrk;

%RK4 方法与分析解的误差

plot(x,yreal,x,yrk,'+',x,tol,'*')
legend('分析解','RK4 计算结果','两者误差')
yrk
[x,yrk,tol]
%yrk 为所要计算的结果
以文件名 RK_main.m 保存。

步骤四:调用主函数。在命令窗口输入
>> RK_main
回车得到
y=
t^2-2*t+5-4*exp(-t)
yrk =

数值分析与应用

MATLAB

数值分析与应用

524

1
1.29338146919812
1.55129058151601
1.78619116002461

M
7.16014988985172
7.80086149708977
8.4864593145814
其中 y 为方程的分析解,yrk 为使用 RK4 方法获得的数值解。

实验结论
RK4 方法是使用的最广泛的一种计算常微分方程(组)方法,因为其算法比较简
单而且精度比较高,所以深为不同领域的人员所喜爱,广泛应用于工程技术,生物数学,
甚至许多专业领域。就本例而言给出了分析解与 RK4 方法的误差结果见表 11.4。
k

t(k)

RK4 方法

计算误差

0

0

1

0

1

0.157894736842105

1.29338146919812

1.14254596494945e-006

2

0.315789473684211

1.55129058151601

1.65270437579856e-006

3

0.473684210526316

1.78619116002461

1.69083369550016e-006

4

0.631578947368421

2.00872656756034

1.38393953408311e-006

5

0.789473684210526

2.2279856023052

8.31996673777979e-007

6

0.947368421052632

2.45172955678135

1.13135838475387e-007

7

1.10526315789474

2.68658611271397

-7.12108039202519e-007

8

1.26315789473684

2.93821491570005

-1.59732253690592e-006

10

1.42105263157895

3.21144896611772

-2.50738370066728e-006

11

1.57894736842105

3.51041535854462

-3.41614859822315e-006

12

1.73684210526316

3.83863838603276

-4.30458110134424e-006

13

1.89473684210526

4.19912758502056

-5.1592335630346e-006

14

2.05263157894737

4.59445292044586

-5.97102042920739e-006

15

2.21052631578947

5.02680898935604

-6.73423085739699e-006

16

2.36842105263158

5.49806984696849

-7.4457367302827e-006

17

2.52631578947368

6.00983582486212

-8.10436002574022e-006

MATLAB

525

数值分析与应用

18

2.68421052631579

6.5634735109254

-8.7103698787061e-006

19

2.84210526315789

7.16014988985172

-9.26508497833822e-006

20

3

7.80086149708977

-9.77056122852815e-006

21

3.15789473684211

8.4864593145814

-1.02293482573401e-005

表 11.4 RK 方法与分析方法的比较
为了看一下计算效果这里给出了分析解与 RK4 方法的计算效果,见图 11.5。从图
11.5 中也可以直观的看出计算结果还是很不错的。

图 11.5

RK4 方法计算微分方程

实验 11.4 变步长的 RK 方法
实验基本原理
RK 方法是很优秀的方法,但是有时候对于某些特殊领域问题往往还是精度有些不
足,数学家一直在寻求更高精度且容易实现的方法。就 RK 方法而言,由 Fehlberg 提出
的变步长方法最为著名,一般称为 RKF 方法,广泛应用于对精度要求较高的专业领域,
如航天器飞行力学。变步长的基本原理是用 p 阶和 p+1 阶嵌套方法估计局部截断误差,
从而改变步长。看似要计算两组公式,实际上只需要多算很少几次的右函数,因为两组
公式里有很多右函数重复。对于其他的一些自适应方法基本原理都差不多。在 MATLAB
中就提供了几种,其中以 ODE45 比较常用,这里予以介绍。
其基本语法是
[t,y] = ODE45(odefun,tspan,y0,options)
其中 t,y 用于输出广义时间与相空间向量,odefun 为要求解的微分方程,tspan 为广
义时间区间,y0 为初值向量,options 为一些可选设置,具体设置可以查看 MATLAB

MATLAB

526

数值分析与应用

帮助文档。

实验目的与要求
l

熟悉变步长方法的基本思想。

会调用系统函数处理常微分方程问题。
有兴趣的读者可以编写出 RKF7-8 方法,并计算常微分方程问题。

实验内容及数据来源

解 Lorenz 方程

 dy1
 dt = − ay1 + y2 y3

 dy2
= −b( y2 − 2 y3 )

 dt
 dy3
 dt = cy2 − y3 − 3 y1 y2

给定 a=4、b=18、c=30 和初值 y1 (0) = 0, y2 (0) = 0, y3 (0) = 10 −10 ,计算区间 t ∈ [0,100] 。

实验操作指导
光盘:\实验视频\chapter11.rar\11-4.exe
光盘:\实验代码\chapter11\
ODE45_fun.m, ODE45_main.m

步骤一:编写 Lorenz 方程。
打开 Editor 编辑器,输入以下语句:
%ODE45 的测试函数
%这个函数为著名的 Loreny 方程,是美国动力气象学家 E.N.Loreny 在研究
%对流实验时提出来的,读者可以在多种学科中看到这个方程,
%尤其是在非线性科学中,可以经常见到这个方程
function dy=ODE45_fun(t,y)
a=4; b=18; c=30;
dy(1)=-a*y(1)+y(2)*y(3);
dy(2)=-b*(y(2)-2*y(3));

MATLAB

527

数值分析与应用

dy(3)=c*y(2)-y(3)-3*y(2)*y(1);
dy=[dy(1);dy(2);dy(3)];
以文件名 ODE45_fun.m 保存。

步骤二:编写主函数对 Lorenz 函数计算。
打开 Editor 编辑器,输入以下语句:
%ODE45 主函数,用以计算 Lorenz 方程
%tspan 为时间区间
tspan=[0,100];
%y0 为初开值
y0=[0; 0;10^(-10)];
%调用函数进行计算
[t,y]=ode45('ODE45_fun',tspan,y0);
%其他设置为缺省默认
data=[t,y];
save ODE45_data.txt data -ascii
%数据太大,以 ASCII 文件保存
plot3(y(:,1), y(:,2), y(:,3))
grid on
%作出相空间图形,相空间的概念在本章第一节有阐述
title('Lorenz 方程')
以文件 ODE45_main.m 保存。
步骤三:调用主函数。
在命令窗口输入
>>ODE45_main
这时候可以看到运行结果,以图象表现出来,如图 10.6。图形是相空间的轨迹。

图 11.6 相空间轨迹

MATLAB

数值分析与应用

528

如果检查你的当前路径,这时会发现有一个文件 ODEdata.txt。可以用任何文本编
辑软件打开,如记事本,UltraEdit 等软件。这里的数据才是我们想要的结果。因为数据
比较多,所以这里只给出一部分,如表 11.5。

t(k)

y1(t)

y2(t)

y3(t)

0.0000000e+000

0.0000000e+000

0.0000000e+000

1.0000000e-010

6.2500000e-002

1.2373248e-016

9.2468160e-008

-6.3850985e-008

1.2500000e-001

1.8215161e-016

9.6100484e-008

-6.6330562e-008

1.8750000e-001

-4.4156868e-017

-7.7038040e-008

5.9035670e-008

2.5000000e-001

-4.4160292e-016

-8.5484793e-008

8.8399565e-008

2.6860043e-001

1.4530190e-015

4.8631948e-008

9.7618248e-009

M

M

M

M

9.9956443e+001

9.8474181e+000

-1.0995575e+001

-6.5572591e+000

9.9968747e+001

1.0252154e+001

-1.1401347e+001

-6.4556463e+000

9.9976560e+001

1.0501501e+001

-1.1580830e+001

-6.3038626e+000

9.9984374e+001

1.0733543e+001

-1.1687908e+001

-6.0865370e+000

9.9992187e+001

1.0939255e+001

-1.1715391e+001

-5.8099429e+000

1.0000000e+002

1.1110895e+001

-1.1659827e+001

-5.4839719e+000

表 11.5 Lorenz 方程计算结果

实验结论
如果以为在数值法计算微分方程时候步长越小越精确,这样的认识是不恰当的。实
际上步长很小的时候,因为每一步都有误差,那么误差累积会比较严重。有经验的程序
员,在某一领域长期从事数值方法计算时,一般会知道对于定步长问题给定多少步左右
效果会不错。而
变步长方法的优点是当某些地方右函数变化比较剧烈时候,计算步长会自动减小,
右函数相对平缓时步长会适当放大。这就其到了自动调节的作用。
变步长方法优于多步法一个明显的地方,是容易设置计算开关。在某些时候,我们
要计算的函数不是连续的,而是间断的,那么单步方法可以快速的重新启动,而多步法
则不太容易实现。不如在计算卫星运动时候,当卫星进入地球地影这时候光压迅速减为
零,对于 RKF 方法很容易实现力学开关,而多步法则比较麻烦。当然这也是单步法共
同的优势。

MATLAB

529

实验 11.5

数值分析与应用

Adams 方法

实验基本原理
对于 Adams 公式,常用的有四阶显格式

yn+1 = yn +

h
(55 f n − 59 f n−1 + 37 f n− 2 − 9 f n −3 )
24

四阶隐格式

yn+1 = yn +

h
(9 f n +1 + 19 f n − 5 f n−1 + f n −2 )
24

对于隐格式,可以用 RK 方法计算 yn +1 。
在 MATLAB 中 ODE113 就是基于 Adams 方法编写的多步法。
其调用格式和 ODE45
非常类似。
基本语法为
[t,y] = ODE113(odefun,tspan,y0,options)
其中 t,y 用于输出广义时间与相空间向量,odefun 为要求解的微分方程,tspan 为广
义时间区间,y0 为初值向量,options 为一些可选设置。

实验目的与要求

l

理解多步法的基本原理。

会调用系统函数中的多步法函数,计算常微分方程。
有兴趣的读着可以自行编写多步方法。

实验内容及数据来源

计算常微分方程初值问题

 dy1
 dt = 3 y1 + 1.5 y2

 dy2 = 1.2 y + 0.8 y
1
2
 dt
积分区间为 t ∈ [0,1] ,初值条件为

MATLAB

530

 y1 (0) = 0

 y2 (0) = 1

实验操作指导
光盘:\实验视频\chapter11.rar\11-5.exe
光盘:\实验代码\chapter11\
ODE113_fun.m, ODE113_main.m

步骤一:编写方程函数文件。
打开 Editot 编辑器,输入以下语句:
% Adams(ODE113)方法的测试函数,
function dy = ODE113_fun(t,y)
dy = zeros(2,1);
% 列向量
dy(1) = 3*y(1)+1.5*y(2);
dy(2) = 1.2*y(1)+0.8*y(2);
以文件名 ODE113_fun.m 保存。

步骤二:编写主文件。
打开 Editor 编辑器,输入以下语句:
%ODE113 主函数,用以计算常微分方程
%tspan 为时间区间
tspan=[0,1];
%y0 为初开值
y0=[0; 1];
%调用函数进行计算
%下面用 RK 方法计算,试验计算时间
tic
[trk,yrk]=ode45('ODE113_fun',tspan,y0);
%其他设置为缺省默认
rk_time=toc
%下面用多步法计算,试验计算时间
tic
[tad,yad]=ode113('ODE113_fun',tspan,y0);
ad_time=toc
data=[tad,yad];
save ODE113_data.txt data -ascii

数值分析与应用

0000000e+000 1.7557911e+000 9.0231422e-001 1.6。 t(k) y(1) y(2) 0.6 ODE113 计算效果 .5231422e-001 1.2731422e-001 1.0159999999999982 因 为 数 据 比 较大 , 所 以以 文 件 保存 数 据 。检 查当 前 工 作 空 间, 会 发 现文 件 ODE113_data.3491819e-005 1.m 保存。 步骤三:调用主函数进行计算。在命令窗口输入: >>ODE113_main 回车得到计算结果, rk_time = 0.0310000000000059 ad_time = 0.0001206e+000 M M M 8.7731422e-001 1.0000402e+000 6.3983422e+001 7.'y(2)') grid on %作出相空间图形 以文件名 ODE113_main. tad.7699044e+001 9.7615711e-001 1.9730501e+000 9.MATLAB 数值分析与应用 531 %数据太大,以 ASCII 文件保存 plot(tad.txt。用记事本打开,发现数据如表 11.5150385e+001 8.6745910e-005 5.5071319e-004 4.8807856e-001 1.7662403e+000 1.0048051e-004 1.0000536e+000 1.7042103e+001 9.0800721e+000 9.0000000e+000 1.0000000e+000 0.0097111e-004 1.2900770e+001 6.5224179e-004 1.5209790e+000 9.0000000e+000 1.2)) legend('y(1)'.yad(:.0237729e-005 1.5072454e-004 1.8379905e+001 9.4167364e+000 9.0129057e+001 表 11.6423567e-001 1.yad(:.1140353e+000 9.6983638e-005 2.0000268e+000 5.6408241e+001 8.0238991e-005 1.1).9085558e+001 1.0000134e+000 3.

7 给出了 y1 .y] = ODE15s(odefun.7 多步法计算结果 实验 11. y2 随时间的变化曲线。 图 11.6 刚性方程组 实验基本原理 在计算微分方程组时候,经常出现解的分量数量级差别很大的情形,这给数值计算 带来很大麻烦,这种问题称为刚性问题。MATLAB 中 ODE15s 可以处理刚性微分方程。 ODE15s 方法是变阶数的微分方程数值方法。采用向后微分公式,往往效率不是太高, 但是对于一些 ODE45 会失效或者计算效果很差的情况下,往往可以采用 ODE15s,因 为这很可能是方程刚性引起的。 ODE15s 基本语法为 [t.y0.options) 其中 t.y 用于输出广义时间与相空间向量,odefun 为要求解的微分方程,tspan 为广 义时间区间,y0 为初值向量,options 为一些可选设置。 实验目的与要求 .MATLAB 532 数值分析与应用 实验结论 可以看出,多步法计算时间相对要短一些,但这不是绝对的。这个时间与计算机 CPU 有关系。而且比较好的软件在设计时候往往为了考虑稳定性或者方程某些特殊性 质如右函数变化剧烈等因素,会把程序设计的复杂一些,这样可能耗费的时间会更长一 些。图 10.tspan.

1000] ,初值为  y1 ( 0 ) = 0   y2 ( 0 ) = 1 实验操作指导 光盘:\实验视频\chapter11. dy(2) = 400*(1 .m.rar\11-6. ODE15s_main.MATLAB l 533 理解 ODE15s 方法在哪些情况下适用。 比较 ODE15s 与一般方法分别处理刚性与非刚性方程的计算效果。 能通过参数设置,获得需要的计算信息。 把计算结果用图象表达出来。 实验内容及数据来源 计算常微分方程组  dy1  dt = y2   dy2 = 400(1 − y 2 ) y − y 1 2 1  dt 积分区间为 [ 0.y(1)^2)*y(2) .y(1).m 保存。 步骤二:编写主调用函数。 打开 Editor 编辑器,输入以下语句 数值分析与应用 .exe 光盘:\实验代码\chapter11\ ODE15s_fun.1). 以文件名 ODE15s_fun. % 列向量 dy(1) = y(2).y) dy = zeros(2.m 步骤一:编写方程函数。 打开 Editor 编辑器,输入以下语句: % NDFs 方法的 ODE15s 测试函数, function dy = ODE15s_fun(t.

[0 1000].6906234e-003 .9999993e+000 -1.2772005e-004 1.9150377e+003 -1.y(:.9857859e-004 9.m 保存。 步骤三:调用主函数进行计算。在命令窗口输入: >>ODE15s_main 回车既可完成计算,因为数据太大,所以我们保存在文件里,这时候打开当前工作空间,会 发现多了一个文件 ODE15s_data.5132437e-005 4.9999997e+000 -8.0000000e+000 2.9999998e+000 -7.[0 1]).MATLAB 数值分析与应用 534 %ODE15s 方法 计算常微分方程组 tic [t.9830232e+000 1.[0 1000].y] = ode15s(@ODE15s_fun.[0 1]).3182655e-004 2.9548907e-004 1.3102711e-004 2.3093959e-005 2.9281876e-005 2.0000000e+000 0.0292962e-004 3.6325809e-004 1.5995103e-004 1.7 所示。 t(k) y(1) y(1) 0. ODE15_time=toc %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 方框内程序采用 RK 方法,注意:因为方程是刚性的,所以这会 % %很消耗计算机资源。 % % tic % % [t.0000000e+000 -8.0000000e+000 -4.txt data -ascii %以文件保存计算结果 plot(t.0000000e+000 -1.9999996e+000 -9.'^') 以文件名 ODE15s_main. save ODE15s_data.6111135e-004 1.0000000e+000 -4.6187917e-005 2.yrk]=ode45(@ODE15s_fun.4779776e-004 6. % % RK_time=toc % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% data=[t.y].8316528e-004 7.1).9072500e-005 6.1419575e-003 M M M 2.9999999e+000 -5.txt。以记事本打开发现数据如表 11.8903099e-004 4.0000000e+000 2.

188 秒。 而且 ODE45 方法计算结果并不可靠。 实验 11.MATLAB 数值分析与应用 535 2.7076801e-003 2.7 高阶方程及微分方程组的数值方法 实验基本原理 .9219597e+003 -1.7253074e-003 2.9812798e+003 -1.9593794e+000 1.9492540e-003 表 11.9712613e+000 1.9358037e+003 -1.8 刚性方程计算结果 目前笔者计算机上 ODE15s 耗时 1 秒, 而 ODE45 耗费时间 429.8 给出了 y1 随时间演化结果,可以看出在很多地方方程右函数变化非常剧烈, 这如果使用 RK 方法的话,结果可能会很糟糕,甚至是死机。在程序里给了注释,这说 明了 ODE15s 方法在这类问题中的有效性。如前面所叙,当采用 ODE45 计算效果不理 想或者失效时可以考虑 ODE15s。 图 11.9288817e+003 -1.8292002e+000 1.7435389e-003 2.9473733e+000 1.8812815e-003 3.8650452e+000 1.0000000e+003 -1.7 ODE15s 方法计算结果 这就是我们需要的计算结果,为了节省篇幅,这里只给出了其中很小的一部分以说明。 实验结论 图 11.

. b ] 上的初值问题为  y (a) = η1  y '(a ) = η  2  L  y ( n −1) (a ) = η  n 做变量替换  y1 = y y = y '  2  L  yn = y ( n−1) 这时候高阶微分方程变为标准的微分方程组的初值问题  y1 ' = y2   y2 ' = y3 L y ' = y n  n−1  yn ' = f (t . y2 . ) dt n dt dt n−1 在 t ∈ [ a . yn ) 注意这时初值条件为  y1 (a ) = η1  y (a ) = η  2 2  L  yn (a ) = η n 这样就对于高阶微分方程与微分方程组最后都统一到微分方程组的形式,这样既便 于数值计算也便于理论分析。 实验目的与要求 l 熟悉高阶微分方程与微分方程组的基本知识。 能熟练的把高阶微分方程化为微分方程组。 能使用 MATLAB 系统函数或自行编写函数计算微分方程组问题。 把计算结果在相空间上用表达出来。 实验内容及数据来源 . y1 .MATLAB 536 数值分析与应用 设置 n 阶微分方程 dny dy d n−1 y = L f ( t .L . . y .

m 步骤一:把二阶常微分方程化为一阶微分方程组  y1 ' = y2  2t  y2 ' = e sin t − 2 y1 + 2 y2 初值条件为 t ∈ [0. % 列向量 dy(1) = y(2).4.m.MATLAB 537 数值分析与应用 计算二阶常微分方程初值问题 d 2 y dy 2t  2 − 2 + 2 y = e sin t .1]   y1 (0) = −0. 以文件名 Gaojie_fun.6  2 这时候已经可以用前面介绍的任何一种方法进行计算了,这里给出 ODE45 方法。 步骤二:编写微分方程函数。 打开 Editor 编辑器,输入以下语句: % 高阶方程组测试函数, function dy = Gaojie_fun(t.y) dy = zeros(2.m 保存。 步骤三:编写主函数。 打开 Editor 编辑器,输入以下语句: %高阶方程的计算 %tspan 为时间区间 . Gaojie_main.6  实验操作指导 光盘:\实验视频\chapter11.4  y (0) = −0.rar\11-7.exe 光盘:\实验代码\chapter11\ Gaojie_fun. y '(0) = −0. dy(2) = exp(2*t)*sin(t)-2*y(1)+2*y(2). t ∈ [0.1).1] dt  dt  y (0) = −0.

tspan.5000000e-002 -4.y]=ode45('Gaojie_fun'.5339441e-001 2.7500000e-001 -4.txt data -ascii %数据太大,以 ASCII 文件保存 plot(t.6173297e-001 -6.1808541e-001 7. %y0 为初开值 y0=[-0. save Gaojie_data. %调用函数进行计算 [t.t.0000000e-001 -6.0000000e-001 -4.5787465e+000 上述数据以文件形式保存在当前工作空间。其中第一列为时间,第二列为所要求的 y,而第三列为 y 的一次导数。 实验结论 在图 11.6794658e-001 2.0000000e+000 -4.0000000e+000 -3.2).0172849e+000 9. %其他设置为缺省默认 data=[t.9 中给也直观的给出了 y 与其一次导数随时间的变化情况。同时获得原函 数与函数的导数变化情况,这就让我们获得了更多的系统信息。 .'*'.7667315e+000 9.y].2549619e-001 1.1].1417846e-001 2.0000000e-002 -4.4.3163105e-001 M M M 9.m 保存。 步骤四:调用主函数进行计算。 在命令窗口输入: >>Gaojie_main 回车得到运算结果。 0.2875611e+000 1.2500000e-001 -5.MATLAB 数值分析与应用 538 tspan=[0.y(:.5000000e-001 -4.4601607e-001 -6.0954227e-001 5.5000000e-002 -4.0000000e-001 2.1520684e-001 1.6].1512120e-001 -6.'^') grid on 以文件名 Gaojie_main.y0).y(:.3046877e-001 -6.-0.1).

9 数值分析与应用 二阶常微分方程计算结果 通过这个例子也读者也很容易理解如何把一般的高阶方程化为一阶方程组的方法。 对于高阶方程组,可以先分别化为一阶方程组,然后这些方程组组就组成更大的一阶方 程组,这样就可以用通用的方法进行数值计算。 实验 11.2 = −n ± n2 − ω 2 根据特征根的值可以把运动形式分为三类,小阻尼运动、临界阻尼运动和大阻尼运动。结合 由 Euler 公式 .8 阻尼振动问题 实验基本原理 振动是工程技术中常见的一种运动形式。振动理论也是处理很多应用问题的基础, 如机床主轴振动、电磁振荡等。由大学物理知识或常微分方程理论知道无阻尼振动是简 谐振动,而阻尼振动相对复杂一些,是这一将实验主要介绍的内容。 有阻尼振动方程为 d 2 x µ dx g + + x=0 dt 2 m dt l µ g = 2n.MATLAB 539 图 11. = ω 2 l 记m ,则方程可以改写为 d 2x dx + 2n + ω 2 x = 0 2 dt dt 特征方程为 λ 2 + 2nλ + ω 2 = 0 特征根为 λ1.

spring_mass.m.m 步骤一:编写脚本程序。 打开 Editor 编辑器,输入以下语句。 % 二阶系统的振动 % 时间从 0 到 5 % 初值 z = 0. . wn = 10. wd = wn * sqrt(1-z^2).1.exe 光盘:\chapter11\sp_mass.rar\11-8.MATLAB 540 数值分析与应用 eix = cos x + i sin x 可以把方程的解统一写为  ς  x ( t ) = x0 e −ςωn t  sin ωd t + cos ωd t   1− ς 2    无阻尼运动为简谐振动是周期运动,而有阻尼运动振幅会不断减小,这也与日常生 活经验符合。 实验目的与要求 l 熟悉二阶阻尼振动的基本原理。 能用微分方程知识处理不同类型的线性振动问题。 熟练使用 MATLAB 辅助分析振动理论。 能把实验结果发布为 HTML 或者其他形式的报告如 word、Latex、XML 等。 实验内容及数据来源 通过选择不同的参数,分析小阻尼运动、临界阻尼运动与大阻尼运动的振幅衰减情 况,并把分析结果通过 MATLAB 发布为 HTML 文件报告。 实验操作指导 光盘:\实验视频\chapter11. x0 = 10.

'SouthEast') %初值 x0 = 10.'r:') grid hold off box on % 标题 title('Underdamped Second Order System') xlabel('Time [s]') %x 轴 ylabel('Amplitude [cm]') %y 轴 legend('System Response'.^2).* (A(k)*sin(wd(k)*t) + cos(wd(k)*t)). wd = wn * sqrt(1-z.:) = x0 * exp(-z(k)*wn*t) . t = 0:0. z = [0.'Location'. % 计算出振幅位移及其衰减 x = x0 * exp(-z*wn*t) . A = z.1.'Amplitude Decay'. %计算出各衰减系数模型对应下的振幅位移 for k = 1:length(z) x(k. end %新图 figure plot(t.^2).x) grid % 标题 title('Comparing Second Order Systems with Various Damping Coefficients') xlabel('Time [s]') ylabel('Amplitude [cm]') 数值分析与应用 .MATLAB 541 t = 0:0. ampDecay = x0 * exp(-z*wn*t).x) plot(t.3].01:5.99.ampDecay.* (z/sqrt(1-z^2)*sin(wd*t) + cos(wd*t)). hold on plot(t. wn = 10.01:5.0./sqrt(1-z.

'SouthEast') 以文件名 sp_mass.10 二阶系统的小阻尼运动 图 11.'zeta = 0.99'.m 文件,如图 11.11。 图 11.1'.'zeta = 3'.12 所示。 数值分析与应用 .10 和图 11.'Location'.MATLAB 542 legend('zeta = 0.11 不同阻尼系数的运动情况比较 步骤三:发布实验报告 使用 Editor 编辑器,打开 sp_mass.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc 回车得到两幅阻尼振动图象,图 11.

12 原脚本文件 步骤四:激活文件为 Cell 状态。方法鼠标点击 Editor 菜单栏的 Cell,弹出子菜单如图 11.13 Cell 菜单栏 这时候原来的 Editor 编辑器,已经多了一行 Cell 工具栏,如图 11.14 Cell 工具栏 步骤五:通过图 4 中的%%图形把原程序分为多段内容,并注意把程序中所有中文注释修改 为英文注释,否则 MATLAB 在编译过程中可能会出现乱码。修改后的程序如下: .14。 图 11.MATLAB 543 数值分析与应用 图 11.13。 图 11.

% Compute Equation for Displacement and Amplitude Decay Envelope x = x0 * exp(-z*wn*t) . Using the plot % and annotation commands.x) plot(t.'r:') grid hold off box on % Label Figure title('Underdamped Second Order System') 数值分析与应用 .1. x0 = 10. t = 0:0.01:5. ampDecay = x0 * exp(-z*wn*t). wn = 10. t = 0 to 5s % Initialize Variables z = 0.ampDecay. wd = wn * sqrt(1-z^2).MATLAB 544 %% Second Order Dynamic Systems and Damping % % This example shows how various second order % dynamic systems can be visualized. %% Underdamped second order system % The following equation describes an underdamped second order system: % % $$ x(t) = x_0 e^{-\zeta\omega_n t} \left({\zeta \over % \sqrt{1-\zeta^2}}\sin\omega_dt + \cos\omega_dt \right) $$ % % Given: % % $$ \begin{array}{l} % \zeta = 0. % Create Plots figure hold on plot(t.* (z/sqrt(1-z^2)*sin(wd*t) + cos(wd*t)).1 \\ \omega_n = 10 \\ \omega_d = \omega_n \sqrt{1-\zeta^2} % \\ x_0 = 10 \end{array} $$ % % Plot the displacement for.

0.'Amplitude Decay'. wn = 10. end % Create Plot figure plot(t.15 所示。 . z = [0. % Compute Displacements for Each Damping Coefficient for k = 1:length(z) x(k. with damping % coefficients 0.99./sqrt(1-z.^2).99'.99. critically damped.x) grid % Label Figure title('Comparing Second Order Systems with Various Damping Coefficients') xlabel('Time [s]') ylabel('Amplitude [cm]') legend('zeta = 0. and 3 are plot to compare their displacements. 0.3].'Location'. or over damped. A = z.MATLAB 545 数值分析与应用 xlabel('Time [s]') ylabel('Amplitude [cm]') legend('System Response'.'SouthEast') %% Comparing effects of different damping coefficients % The damping coefficient of a system determines if the system is under % damped.'SouthEast') 以文件名 spring_mass. % Initialize Variables x0 = 10.'zeta = 0.1'.* (A(k)*sin(wd(k)*t) + cos(wd(k)*t)). wd = wn * sqrt(1-z.01:5.^2). t = 0:0.'Location'.:) = x0 * exp(-z(k)*wn*t) .1.'zeta = 3'. The systems.m 另存在 MATLAB 工作路径上。 步骤六:发布 MATLAB 实验报告为 HTML 文件。鼠标左键单击 Editor 主菜单的 File,弹出 菜单如图 11.

MATLAB 546 图 11.15 发布菜单 选择发布为 HTML 文件。这时得到 HTML 文件,如图 11.16 所示。 数值分析与应用 .

16 发布成功的 HTML 文件 实验结论 从图 11.11 中,刻画了小阻尼、临界阻尼和大阻尼运动情况。其中临界阻尼即处于 振动与不振动状态的阻尼分界情况。此时运动已经不具有振动性。 线性振动理论是常微分方程比较成功的理论之一,可以直接给出分析解。对于一般 的非线性振动问题,则比较复杂,对于一些特殊的非线性振动除了数值方法以外还可以 采用特殊的近似方法,如小参数振动的摄动方法。处理非线性振动问题,已经发展了许 多定性分析方法,而且定性方法在数学和力学领域一直是非常活跃的。 .10 可以知道,振幅不断减小,习惯上仍然称从最大偏离到下一个最大偏离 的时间为一个周期。当时间趋向无穷时,振动停止。这是一种理想状况。实际上,经过 有限时间,振幅减小到小于某个正数,可以认为振动已经停止。 在图 11.MATLAB 547 数值分析与应用 图 11.

x& ( a ) = m 至此,边值问题已经可以利用初值问题得到解决,可以看出,边值问题要比初值问 题麻烦的多。计算量也比较大,其中要求多次计算初值问题。 实验目的与要求 l 熟悉微分方程初值问题的处理方法。 .9 线性方程边值问题的打靶法 实验基本原理 本实验介绍线性常微分方程边值问题的打靶法。对于边值问题  && x ( t ) + p ( t ) x& ( t ) + q ( t ) x ( t ) = f ( t )   x ( a ) = α . x ( b ) = β 线性方程编制问题的打靶方法可以分为以下几个步骤: (1) 计算齐次方程初值问题 x1 ( b ) x1 ( t ) + p ( t ) x&1 ( t ) + q ( t ) x1 ( t ) = 0  &&   x1 ( a ) = 1.MATLAB 548 数值分析与应用 实验 11. x&2 ( a ) = 1 (3) 计算非奇次方程的初值问题 x3 ( b )  && x3 ( t ) + p ( t ) x&3 ( t ) + q ( t ) x3 ( t ) = f ( t )   x3 ( a ) = 0. x&1 ( a ) = 0 (2) 计算齐次方程的初值问题 x2 ( b )  && x2 ( t ) + p ( t ) x&2 ( t ) + q ( t ) x2 ( t ) = 0   x2 ( a ) = 0. x&3 ( a ) = 1 (4) 计算标量 m m= β − α x1 ( b ) − x3 ( b ) x2 ( b ) (5) 原问题的边值问题化为初值问题  && x ( t ) + p ( t ) x& ( t ) + q ( t ) x ( t ) = f ( t )   x ( a ) = α .

25.95 步骤二:编写打靶方法函数。 打开 Editor 编辑器,输入以下语句: function [t.MATLAB 549 知道如何把边值问题转化为初值问题。 能够使用打靶法变成实现实验原理部分的方法。 对计算结果做可视化分析。 实验内容及数据来源 采用打靶法求解区间 [ 0.rar\11-9.m 步骤一:分析问题。 把原来边值问题的二阶微分方程化为微分方程组  dx1  dt = x2   dx2 = 2t x − 2 x + 1  dt 1 + t 2 2 1 + t 2 1 边值条件 x ( 0 ) = 1.95 实验操作指导 光盘:\实验视频\chapter11. x ( 4 ) = −0.t0_tt.m. x ( 4 ) = −0.m.daba_fun1.m.daba_fun2.x0_xt) %线性打靶法 08 年 9 月 %fun1 表示函数 1 %fun2 表示函数 2 由微分方程决定 由微分方程决定 %t0_tt(1) 表示初始时刻 数值分析与应用 . daba_main.fun2. 4] 上的边值问题 d 2x 2t dx 2 = − x +1 2 2 dt 1 + t dt 1 + t 2 其中边值条件为 x ( 0 ) = 1.25.x]=daba(fun1.exe 光盘:\实验代码\chapter11\ daba.

1.0]). [t.[1.[0.^2). [t.4]. dx=[dx1.dx2]'.^2).dx2]'.0]).t0_tt.1) plot(t.t0_tt.-0.x) %打靶法 第一个函数 dx1=x(2).x2]=ode45(fun1.2)) grid 数值分析与应用 .1]).MATLAB 550 %t0_tt(2) 表示结束时刻 %x0_xt(1) 表示初开时刻状态量 %x0_xt(2) 表示结束时刻状态两 x0_xt 为具体的边值 [t.[0.1). subplot(2. dx=[dx1.x3]=ode45(fun2.m 保存。 步骤五:编写主函数。 打开 Editor 编辑器 ,输入以下语句: function daba_main %打靶法主函数 [t.m 保存。 步骤三:编写方程函数文件(一) 。 打开 Edior 编辑器,输入以下语句: function dx=daba_fun1(t.1).1)-x3(end.2) plot(x(:.1))/x2(end.x]=daba('daba_fun1'.*x(2)-2/(1+t.[0. %表为列向量 以文件名 daba_fun2.x(:. %表为列向量 以文件名 daba_fun1.[x0_xt(1). m=(x0_xt(2)-x0_xt(1)*x1(end.'daba_fun2'.x) grid title('函数及一次导数') subplot(2. [t.m 保存。 步骤四:编写方程函数文件(二) 。 打开 Editor 编辑器,输入以下语句: function dx=daba_fun2(t.[1.x]=ode45(fun2.95]).m]).t0_tt.^2)*x(1).25.x) %打靶法第二个函数 dx1=x(2).t0_tt. dx2=2*t/(1+t.x1]=ode45(fun1.*x(2)-2/(1+t. dx2=2*t/(1+t. 以文件名 daba.1.^2)*x(1)+1.

MATLAB 数值分析与应用 551 title('相图') z=[t.17 边值问题的离散结果及相图 实验结论 图 11.032561921 1.257715664 3 0.322067694 .278478503 6 0.065123842 1.048842882 1.8。 序列 t x 1 0 1.227933449 1.305169238 7 0.x(:. 以文件名 daba_main.17 中的数据都是依据微分方程边值问题的计算结果。其中第一幅图形直接给 出了原函数及原函数的一次导数的函数图象,第二幅子图则给出了要求的原函数图象, 二第三幅子图中则给出了相空间的图象。实际上在构造上述方法中,利用了方程的线性 结构,对于一般的非线性方程的初值问题,则需要用到非线性方程的计算方法。 在实验的输出部分,给出了要求的离散结果,如表格 11.25 2 0.271954635 5 0.265033806 4 0.146528646 1.1)].016280961 1.m 保存。 步骤六:运行程序。 在命令窗口输入: >>clear >>clc >> daba_main 回车得到 图 11.

329361087 9 0.327322968 10 0.007621196 40 3.MATLAB 数值分析与应用 552 8 0.490743055 -1.590743055 -1.290743055 -0.693057291 -1.309338252 1.991264092 45 4 -0.795371527 -1.036438456 42 3.090743055 -0.033947923 43 3.312562574 M M M 36 3.950014847 表 11.390743055 1.888900607 37 3.190743055 -0.019067863 44 3.8 方程的离散结果 在计算过程中,需要把二阶方程转化为一阶方程组,所以由计算可以直接给出状态 量的一阶导数的离散结果。 本章小结 本章介绍常微分方程的数值方法,包括单步法和多步法。高阶微分方程与微分方程组都 可以化一阶微分方程组,所以我们变可以用“一般”的方法进行处理。实际上 MATLAB 内 置函数就是面向微分方程组的。 当然本章介绍的是一般通用的算法,对于某些具体领域,数学家与应用学家 一直在开发新的数值方法。有时候计算机给出的结果并不一定可靠,比如对于长 期演化的微分动力系统,往往计算机歪曲了事实的真相,这使人们有时候不得不 转向分析方法与定性理论。同时也有许多非常优秀的算法出现,比如我国数学家 冯康先生提出的辛算法,能保持辛结构。在动力天文中,特别是演化问题很受重 视。 一个好的程序员,不只是自己会很熟悉编写代码,而且要熟悉调用已有的可 靠的方法。美国高等学校很重视 MATLAB 的教学与应用,但他们的思想倾向于让 学生应用 MATLAB 快速处理问题,而不是把学生陷于编写代码中。 .027424754 41 3.977563983 39 3.490743055 1.937802676 38 3.897685764 -0.390743055 -1.

. x& ( 0 ) = 0 。 提示:先化为一阶方程组  dy1 = y2  y1 ( 0 ) = 1  dt .计算区间为 t = [ 0.MATLAB 数值分析与应用 553 上机操作题 1. 用改进的 Euler 方法计算一阶常微分方程 dy y y = + tan dt t t 初始条件为 y ( 0 ) = 2 . 20] 。 参考答案:方程的通解为 sin y = cx t 积分常数 c 由初始条件决定。 2.用经典的 RK 方法计算常微分方程 y ' = e −2 t − 2 y 初值条件为 y ( 0) = 1 10 参考答案:方程通解为 y (t ) = 1 −2t e + te −2t 10 3.求二阶微分方程 d 2x dx − (1 − x 2 ) + x = 0 2 dt dt 初值条件为 x ( 0 ) = 1.   dy2 = (1 − y )2 y − y  y2 ( 0 ) = 0 1 2 1  dt 参考答案:方程解图像如图 11.18.

000703328 0.544776312 29.373087341 29.00045214 0.40780525 -1.000100475 0.000954517 0.578725063 29.6581173 -1.958455698 0.999999544 -0.000150713 0.841720064 0.626977031 0.30101612 -1.93093911 -1.999999898 -0.52683897 -1.908263144 0.612147997 29.59247814 -1.876290087 0.977037304 0.99999998 -0.72030925 0.261162415 29.46591279 29.001205705 0.000954517 0.000703328 0.99999697 -0.67473049 0.02E-05 0.999999273 -0.02E-05 0.9 习题 3 数值结果 .000150713 0.000200951 0.992623572 0.79281734 -1.18 方程解的图像 解的结果见表 11.418011868 29.46119981 -1.86187823 -1.644185013 29.00045214 0.002461646 29.999999989 -0.72375646 -1.000200951 0.001205705 0.763694911 0.999999995 -0.MATLAB 数值分析与应用 554 图 11.507619257 29.9。 1 y(1) y(2) 0 1 0 5.002461649 0.000100475 0.32134294 29.999999753 -0.35441068 -1.804823467 0.707290074 表 11.675662908 30 -1.937299751 0.999999999 -5.

345992 3133.986005 × 10 m s 。 14 提示:在万有引力作用下,物体的运动方程可以写为 &r& = − GE rˆ r2 可以参考实验 12.214 1083.924442 5831.000000  z   -0.773186 13 4138.868265 1213.715843 1488.295375 2374.47801 2357.554939 3085.686414 km/sec  z           3 −2 其中地球质量乘以引力常数为 GE = 3.391038 3023.631807 873.4。 参考答案:空间位置随时间变化,见表 11.685922 10 5132.055548 407.888644 812.000000 km  =  vx   -0.044772 221.370428 4847.137000 km y   km    -0.766357 14 3765.929214 5258.137 0 0 1 6662.482472 1863.855769 6 6107.879503 5683.715464 15 3373.698028 3094.04986 1679.383737 2038.000000 km/sec  v y   6.20333 2203.216904 2740.84896 3432.302203 658.MATLAB 数值分析与应用 555 4. 某宇航员在执行航天任务时,向空间抛出一物体,该物体受地球引力绕地球做高速 运动。现在仅考虑该物体受地球中心引力,已知道初始时刻物体的运动状态,要求 计算该物体在未来 1 小时内相对惯性坐标系的空间位置以及物体的速度变化。初始 时刻的位置速度为  x   6678.774121 5064.016922 2631.960201 1996.379802 1608.799949 5426.182129 1289.16004 .408935 2946.341383 3166.911539 3754.9。 time(min) x(km) y(km) z(km) 0 6678.832151 4605.789530 km/sec     v  3.918548 20 1212.087288 8 5674.292437 2855.989837 16 2965.075719 7 5905.464049 11 4824.007279 2 6613.389652 19 1664.769347 4 6422.29966 18 2109.932007 9 5416.950153 3 6533.36064 4342.851219 2749.838669 2500.129155 440.415808 5 6279.253251 4058.321332 5771.585201 21 753.419365 5568.424628 12 4492.019849 17 2543.

400143 -163.03824 3835.578181 -2318.009315 -1236.428261 -1993.965595 2396.19587 4133.148564 916.537182 5866.984213 5709.646925 47 -6629.883639 43 -6596.29905 4905.772978 55 -5209.78841 44 -6652.487422 38 -5848.462791 46 -6669.264101 -3003.83025 54 -5486.315186 52 -5960.048763 28 -2432.495202 -2646.507212 26 -1547.018134 2833.972765 33 -4402.1545 -5010.968493 48 -6557.685912 -1437.8122 497.590106 -818.56098 -2720.038286 5465.534791 3517.741707 -3981.40148 -3346.887967 60 -3477.47781 1728.181992 -383.512643 表 11.619827 512.286451 3183.555497 57 -4580.854448 1538.494285 2778.657424 39 -6057.044822 34 -4740.642892 51 -6155.019669 -2277.702343 -1109.57269 31 -3665.295757 45 -6677.344035 -1506.58282 1341.033201 53 -5737.341148 3172.486181 23 -171.896538 5863.440633 2880.417023 40 -6237.150355 928.716158 41 -6388.57717 35 -5055.900644 -1896.144754 5842.440811 49 -6454.557947 -602.992766 37 -5610.535882 42 -6507.901322 2663.840004 2967.366302 -1029.051081 105.915075 3041.69819 5789.217247 -4786.556194 -2598.833295 57.089983 -2161.326907 1710.015303 3099.480177 24 -634.10。 time(min) dx/dt(km/s) dy/dt(km/s) dz/dt(km/s) .965856 56 -4906.9 物体空间位置的变化 物体在空间的速度变化见表 11.118227 2082.769068 1909.557023 278.412497 1137.477779 -707.115532 -3672.648938 4670.324661 -301.548601 5304.669348 -4539.076275 30 -3269.MATLAB 数值分析与应用 556 22 291.909266 1316.814912 5600.011685 50 -6319.746659 59 -3864.742398 27 -1994.924648 3185.252164 3183.996883 2244.584889 2470.52401 4412.620063 3143.680806 2535.615675 -1630.977413 2095.708984 29 -2857.651873 714.687085 32 -4043.296535 5117.079577 -1816.498639 -2464.132426 25 -1093.736282 -4270.734764 58 -4232.2993 36 -5345.

342515 29 -6.251239 -6.686414 1 -0.252272 -6.723211 -0.494886 -3.919034 20 -7.621447 -1.809222 -4.573805 -0.148477 -4.72421 3.990168 10 -4.015402 1.627813 6.21853 2.730482 -5.158627 -3.209167 3.945565 -3.667363 3.518515 5.790444 36 -4.597189 6.094691 24 -7.736662 -3.819264 -2.101162 28 -7.063119 4.111941 -0.7665 0.78953 3.416176 22 -7.606776 4 -2.16113 23 -7.63723 17 -7.479839 13 -6.443441 41 -2.644722 -0.905213 -1.769354 3.577402 30 -6.650948 3 -1.603735 26 -7.073003 5.069086 6.515339 -1.342213 4.703868 -3.726437 -2.228178 39 -3.630786 -5.676369 0.MATLAB 数值分析与应用 557 0 0 6.174398 -0.854506 27 -7.143317 2.466616 6 -3.718377 0.804692 31 -6.342029 -3.716432 4.144605 1.232144 33 -5.507204 2.441988 -4.567295 2.607874 6.330222 2.343862 40 -2.862365 16 -6.458121 -3.404209 18 -7.117601 6.4347 -2.616647 35 -5.586231 1.003718 3.43005 1.597392 1.096947 38 -3.284687 14 -6.669216 21 -7.164426 19 -7.69265 0.904723 2.139358 -2.380606 3.384712 3.371303 7 -3.430248 34 -5.190726 -5.02329 32 -6.950801 37 -4.207869 2.132503 9 -4.833431 11 -5.642855 3.773181 3.942265 5.111098 -2.481824 1.677537 2 -1.758398 -6.690849 -0.296765 0.526435 .545233 5 -2.232543 0.475959 -2.373037 -2.028089 -1.048544 -5.828178 2.472605 -1.535833 6.529507 3.323829 -1.663047 12 -5.195224 -2.922009 3.350056 25 -7.12537 6.982758 -2.259753 8 -4.078531 15 -6.

997452 -6.68155 47 0.621783 -4.919432 表 11.763587 -3.028561 55 4.19 数值结果的可视化 .595895 -3.975789 -4.674729 -6.404774 -5.19。 图 11.562004 -3.46062 -6.706174 -3.930933 -6.496374 -6.988588 -2.832963 -3.488663 51 2.834379 -5.672328 45 -0.303272 -2.641156 44 -0.592446 43 -1.928674 -2.396763 -6.619933 49 1.535154 -1.659554 48 1.983273 -6.336486 59 6.562878 50 2.20689 -6.425318 -3.780571 -3.133096 60 6.257687 -3.733239 -6.059918 -3.708582 57 5.301016 -3.528623 58 5.484094 -6.685815 46 0.290267 53 3.875496 56 5.577916 -3.953955 -5.667087 -3.740059 -3.397647 52 3.788426 -3.296005 -2.616463 -3.240701 -4.MATLAB 数值分析与应用 558 42 -1.657144 -2.10 物体在空间的速度变化情况 由以上结果绘制出物体的空间轨迹如图 11.139319 -6.167041 54 4.

1 太阳系及地月系统的共线平动点 实验基本原理 天体力学是一门基础学科,自 1957 年第一颗人造卫星上天以来,很多经典的力学问题 在空间探测中得到了应用。限制性三体问题就是其中比较重要的一个问题,尤其是上世纪中 后期,各航天大国竞相开展相关领域的深空探测,这也拓展了轨道力学在人造天体领域的应 用。 最简单的天体力学或航天动力学情形是二体问题,二体问题可以找到六个积分,这一问 题得到完全解决。人造卫星的运动理论就是受摄的二体问题,解析方法可以通过小参数幂级 数方法展开。相比而言,三体问题则要困难许多,哪怕是对于做了非常大的简化,即使圆形 限制性三体问题,也没有得到彻底解决。圆形限制性三体问题是两个大天体做圆运动,求第 三个小天体的轨道运动理论,其中大天体的运动不受小天体的影响。 虽然圆形限制性三体问题做了很大简化,但是仍然有很大的实用价值,太阳系内大行星 的偏心率都非常小,这就近似满足这一条件,月球探测问题的地月系统也符合这一情况。 天体力学家与数学家已经证明圆形限制性散体问题的解是存在的,但不表示解能具体给 出。目前已经知道只有一个 Jacobi 积分和 5 个平动解,这一实验就针对不同的系统寻找这 5 个平动解的位置。 在天体力学和航天动力学中,常常采用无量纲单位的分析方法,这有很多优点。计算单 位常常取 [ M ] = m1 + m2 [ L ] = a12 1  2 a 212 T = [ ]    G ( m1 + m2 )  .MATLAB 数值分析与应用 559 第十二章 数值方法的应用范例(一) 在前面的章节中,分别针对不同类型数学问题的数值方法进行了介绍。这一章中,将结 合前面章节中的内容,介绍一些实际应用问题。这一章重在阐述针对具体的实际问题用数学 手段建立模型的方法,而后用数值方法结合分析方法分析处理问题的全过程。 当然,限于篇幅,这里不可能介绍所有的数学建模问题,这也是无法做到的。本章节介 绍的几个问题都是比较典型,涉及到的数学理论也相对适中。通过这几个实验的学习,相信 读者对自己遇到的问题,应该能够建立比较合理的模型,同时利用 MATLAB 这一有力工具 辅助自己分析、解决问题。 实验 12.

E.MATLAB 560 数值分析与应用 两个大天体的质量分别为 1− µ = µ= m1 m1 + m2 m2 m1 + m2 它们到质心的距离为 r '1 = µ .Bristol。 如果定义广义的势 U= 1 2 1− µ µ x + y2 ) + + ( 2 r1 r2 则小天体运动方程可以写为  − y&  ∂U && r + 2  x&  =  0  ∂r   在这一实验中,我们将分别针对太阳系各大行星系统以及地月系统,找到 5 个平动解以 及相应的 Jacobi 积分。 实验目的与要求 l 了解三体问题的一些基本常识。 l 找到 5 个平动点的位置由哪些量决定。 l 对于特定的力学系统会计算平动点位置。 l 会计算 Jacobi 积分。 实验内容及数据来源 . r '2 = 1 − µ 可以推导出,在质心旋转坐标系中,小天体的运动方程为  x−x x − x2 x − 2 y& − x = − (1 − µ ) 3 1 − µ  && r1 r23    1− µ µ   y + 2 x& − y = −  3 + 3  y  && r2   r1   1− µ µ  && z = − 3 + 3  z r2    r1 这里略去推导过程,需要的读者可以参看《航天器轨道理论》刘林著,国防工业出版社或 《Orbitial Motion》 A.Roy Adam Hilger Ltd.

0002855 天王星-太阳 0.exe 光盘:\实验代码\ chapter12\pingdong_1.m.00005177 冥王星-太阳 0.00000032 木星-太阳 0.1。计算太阳-行星系统以及地月系统的共线平动点位置。 水星-太阳 0.01230002 表 12.1 太阳系行星质量常数 实验操作指导 光盘:\实验视频\chapter12.00004373 海王星-太阳 0. pingdong_3.m,moon_pingdong.5 月-地 0.00000245 地球-太阳 0.MATLAB 数值分析与应用 561 已经知道太阳系中各大行星质量与太阳质量的比值 µ ,以及月球与地球的质量之比, 如表 12.00000304 火星-太阳 0.rar\12-1.m.00095388 土星-太阳 0.00000278 地月-太阳 1/328900. pingdong_2.00000017 金星-太阳 0. pingdong_main.m 步骤一:分析问题。 满足平动点条件,既探测器发射到该点以后,如果初始速度和加速度为零,则探测器将 定点在这个地方。事实上,当然如果平动点不稳定,则会很快离开,但如果平动点是稳定的, 则即使初始条件有一些误差,那么探测器仍然能够在附近逗留。 满足平动点即要求 ∂U =0 ∂r 由此得到三个方程  (1 − µ )( x − µ ) µ ( x + 1 − µ ) − =0 x − r13 r2 3    1− µ µ    y 1 − 3 − 3  = 0 r1 r2       z  1 − µ + µ  = 0   r13 r23  由于 .m.

( L3 ) 2  ( x − µ ) ( x + 1 − µ )2   1− µ µ 1 − r 3 − r 3 = 0 1 2  y ≠ 0.   x − (1 − µ )( x − µ ) − µ ( x + 1 − µ ) = 0  r13 r23 后一方程的解为 r1 = r2 = 1 ,既相应的平动点与两个大天体呈等边三角形,称为三角平动解, 而前一方程为非线性方程,可以通过前面相关章节介绍的方法求数值解,其解称为共线平动 点。 步骤二:着手计算准备。 。 由实验基本原理知,两个三角平动点位置已经很明确,但是对不同两个大天体系统,其 共线平动点是不同的,平动点的位置跟行两个大天体的质量之比有关系。实际上三个共线平 动点的位置由非线性方程给出,三个共线平动点的初值可以由以下幂级数提供。级数如下, 对于平动点 L1 有 ξ (1) 1 1 1    µ 3  1  µ 3 1  µ 3 =   1 −   −   − L   3   3 3  9 3    平动点 L2 有 ξ ( 2) 平动点 L3 1 1 2    µ 3  1  µ 3 1  µ  3 =   1 +   −   − L   3   3 3  9 3    .  x + = 0.MATLAB 562 数值分析与应用 1− µ µ + 3 ≠0 r13 r2 则要求 z = z0 = 0 既平动点在 xy 平面上,由此则有  (1 − µ ) µ − = 0. x + ( L1 ) 2 2  ( x − µ ) ( x +1− µ )  (1 − µ ) + µ  y = 0. ( L2 ) 2 2  ( x − µ ) ( x +1− µ )  µ  x − (1 − µ ) − = 0.

以文件名 pingdong_2.m 保存。 步骤四:编写主函数。 打开 Editor 编辑器,输入以下语句: %%%% %共线平动点的计算 %08 年 9 月 22 日 %by song yezhi %各大行星与太阳质量之比 u=[0.m 保存。 步骤三:编写平动点三的方程函数。 打开 Editor 编辑器,输入以下语句: function f=pingdong_1(x.00004373 0. 以文件名 pingdong_3.u) %平动点 1 的方程函数 f=x+(1-u)/(x-u)^2-u/(x+1-u)^2.00000304 0. 以文件 pingdong_1.00000017 0.u) %平动点 3 的方程函数 f=x-(1-u)/(x-u)^2-u/(x+1-u)^2.00005177 数值分析与应用 .00000245 0.MATLAB 563  ( 3) ξ = 1 −ν  ν = 7 µ  12  23 2 23 3 761 4 3163 5 30703 6  8 1 + 84 ν + 84 ν + 2352 ν + 7056 ν + 49392 ν  + O (ν ) 步骤二:编写平动点一的方程函数。 打开 Editor 编辑器,输入以下语句: function f=pingdong_1(x.m 保存。 步骤二:编写平动点二的方程函数。 打开 Editor 编辑器,输入以下语句: function f=pingdong_2(x.u) %平动点 2 的方程函数 %08 年 9 月 f=x+(1-u)/(x-u)^2+u/(x+1-u)^2.00028550 0.00095388 0.00000032 0.

00000278 1/328900.49597870*10^11. n=length(u). x2(i)=fzero(@pingdong_2. %实际采用迭代法,寻找 L1 点位置 x1(i)=fzero(@pingdong_1. end disp('各大行星 L2 平动点的天文单位') x2=x2' disp('L2 实际距离/m') P41 刘林 国防工业出版社 . au=1.[]. %%%%%%%%%%%% %平动点 L1 的计算 for i=1:n %temp3 为平动点 1 的迭代初值,取展开级数的前三项 %编程方法可以参考《月球探测器轨道理论》 %或《轨道力学》 南大研究生讲义 temp1=(u(i)/3)^(1/3). temp3=temp1*temp2.[].temp3.u(i)). end disp('各大行星 L1 平动点的天文单位') x1=x1' disp('L1 实际距离/m') x1_length=x1*au %%%%%%%%%%%%%%%%%%%%%%% %平动点 L2 的计算 for i=1:n %temp3 为迭代初值,取级数展开前三项 temp1=(u(i)/3)^(1/3).u(i)).5 ].temp3.MATLAB 数值分析与应用 564 0. temp2=1-1/3*(u(i)/3)^(1/3)-1/9*(u(i)/3)^(2/3). temp2=1+1/3*(u(i)/3)^(1/3)-1/9*(u(i)/3)^(2/3). temp3=temp1*temp2.

932365477089808 -0.954761095327977 -0.m 保存。 步骤五:运行程序。 在命令窗口输入: >> pingdong_main 回车得到: 各大行星 L1 平动点的天文单位 x1 = -0.975728645856398 -0. temp=1-v-23/84*v^2.989986445920769 -0.995264664262998 -0. x3(i)=fzero(@pingdong_3.MATLAB 565 x2_length=x2*au %%%%%%%%%%%%%% %平动点 L3 的计算 for i=1:n %迭代初值取级数展开前三项目 v=7/12*u(i).990279675377774 -0.u(i)).98998597161676 L1 实际距离/m 数值分析与应用 .temp.996163769352778 -0. end disp('各大行星 L3 平动点的天文单位') x3=x3' disp('L3 实际距离/m') x3_length=x3*au 以文件名 pingdong_main.990679557065541 -0.[].974330849965494 -0.

01007521087362 L2 实际距离/m x2_length = -150173182428.806 -148099792683.347 -148203551589.711 -153489024273.02601075986593 -1.101 -145757819830.00937378898162 -1.429 -150308413514.00474969004607 -1.748 各大行星 L2 平动点的天文单位 x2 = -1.00384572606724 -1.025 -151060657415.01 -139479889434.04605714797714 -1.263 -151000168865.169 -142830226219.022 -156487921235.48 -151105028305.052 -159894785963.01007473104683 -1.MATLAB 566 x1_length = -149023978066.315 -151105100086.494 数值分析与应用 .932 -145966927118.00977812996479 -1.06883063216757 -1.128 -148143730140.617 -148889473860.02458167566631 -1.548 -148099863638.656 -153275236320.

1.00000126684717 L3 实际距离/m x3_length = 149597880596.371 149615665913.635 149597889946.01230002.-1.u_e_m) 数值分析与应用 . %月地质量比 l_e_m=384401.383 149657327666.72 149598043284.638 步骤六:编写地月系统的平动点计算主函数。 打开 Editor 编辑器,输入以下语句: %%%%%%%%%%%% %地月系统平动点的计算 %08/9/22 u_e_m=0.00001822083333 1.157.00000126666667 1.492 149598059490.00002157083333 1.837.u_e_m) x3=fzero(@pingdong_3.005.u_e_m) x2=fzero(@pingdong_2.516 149598022714.096 149600595797.MATLAB 567 各大行星 L3 平动点的天文单位 x3 = 1.00000013333333 1.-0.00000102083333 1.00000007083333 1.199 149598059517. %月球到地球平均距离 x1=fzero(@pingdong_1.[].856 149601096950.00011895833207 1.0003974499528 1.[].[].00000115833333 1.

019169275 数值分析与应用 .MATLAB 568 disp('平动点实际距离/km') l1_m=x1*l_e_m %实际 L1 距离 l2_m=x2*l_e_m %实际 L2 距离 l3_m=x3*l_e_m %实际 L3 距离 以函数名 moon_pingdong.15625411551325 x3 = 1.325752885 l2_m = -444465.m 保存。 步骤七:运行程序,计算月球平动点位置。 在命令窗口输入: >>clear >>clc >> moon_pingdong 回车得到 x1 = -0.238257408 l3_m = 386371.836182334991025 x2 = -1.00512490646298 平动点实际距离/km l1_m = -321429.

003845726 -0.00000304 -1.000018221 海王星-太阳 0.005124906 386371.00000032 -150308413514 -148889473860 149597889946 木星-太阳 0.00005177 -153489024273 -145757819830 149601096951 冥王星-太阳 0.000001267 表 12.00000278 -151060657415 -148143730141 149598043284 地月-太阳 1/328900.000001158 地月-太阳 1/328900.00977813 -0.000000133 木星-太阳 0.954761095 1.024581676 -0.4 地月系统的共线平动点位置 注:天体力学家与航天动力学家有时候称呼平衡点位置可能不同,在引用相关文献时需要注 .3。 µ 平动点 2 平动点 1 平动点 3 水星-太阳 0.975728646 1.00000245 -1.2。 µ 平动点 2 平动点 1 平动点 3 水星-太阳 0.00039745 土星-太阳 0.836182335 -321429.00000032 -1.995264664 1.00474969 -0.932365477 1.3 换算为国际单位的平动点位置(m) 地月系统的平动点位置见表 12.MATLAB 数值分析与应用 569 实验结论 这里把计算得到的平动点的位置列于表 12.00004373 -1.000000071 金星-太阳 0.000118958 天王星-太阳 0.990679557 1.00000245 -151000168865 -148203551590 149598022714 地球-太阳 0.068830632 -0.2383 平动点 3 1.2 公线平动点的位置(无量纲单位) 以上单位为一个天文长度单位,既日地平均距离,如果换算成国际单位距离见表 12.5 -151105100086 -148099792684 149598059518 表 12.009373789 -0.5 -1.00000304 -151105028305 -148099863639 149598059491 火星-太阳 0.000001267 火星-太阳 0.989985972 1.996163769 1.00004373 -153275236321 -145966927118 149600595798 海王星-太阳 0.02601076 -0.3258 平动点 2 -1.0192 表 12.0002855 -1.0002855 -156487921236 -142830226220 149615665913 天王星-太阳 0.000001021 地球-太阳 0.010074731 -0.00000017 -150173182428 -149023978066 149597880597 金星-太阳 0.990279675 1.00005177 -1.046057148 -0.00095388 -1.4。 无量纲单位 国际单位 平动点 1 -0.00000278 -1.010075211 -0.00000017 -1.156254116 -444465.00095388 -159894785963 -139479889434 149657327666 土星-太阳 0.000021571 冥王星-太阳 0.97433085 1.989986446 1.

0 . 0. i = 1.2 共线平动点的 Jacobi 常数 实验基本原理 上一个实验介绍了圆形限制性三体问题的基本运动情况,已经知道在质心旋转坐标系中 小天体或宇宙飞船的运动方程为  − y&  ∂U && r + 2  x&  =  0  ∂r   其中 U= 1 2 1− µ µ + x + y2 ) + ( r1 r2 2 虽然,这个方程不能解出来,但是已经找到一个积分,也是唯一的积分 Jacobi 积分。把运 动方程三式分别乘以 x& .MATLAB 数值分析与应用 570 意。在实验结论中,平动点的顺序我们也是按照天体力学家的习惯排列。另外天文常数来自 国际天文相关机构发布的数据,不同时期可能会有一些小的变化,但这对问题的讨论没有影 响。 实验 12.3 而对于平动点 4、5 则有 . y& . 2. z& ,然后相加立即得到 &&& + yy &&& + zz &&& = xx ∂U ∂U ∂U x& + y& + z& ∂x ∂y ∂x 即 1 d 2 dU x& + y& 2 + z& 2 ) = ( 2 dt dt 可以得到一个积分 2U − ( x& 2 + y& 2 + z& 2 ) = C 如果令 v 2 = x& 2 + y& 2 + z& 2 积分可以简写为 2U − v 2 = C 由上一个实验可以知道,对于平动点 1、2、3 有 ( ) Ci ( µ ) = 2U x ( µ )i .

5 很容易得到对平动点 4、5 容易给出 C4 = C5 = 3 而对平动点 1、2、3 则有  1− µ  µ Ci ( µ ) =  xi 2 ( µ ) + µ (1 − µ ) + 2  +   xi ( µ ) − µ xi ( µ ) + (1 − µ )  实验目的与要求 l 大致了解 Jacobi 积分的推导。 l 对于一般性情况,由某时刻的运动状态要会计算积分常数。 l l 对于平动点情况,能给出 Ci ( µ ) 。 比较对应不同 µ ,平动点的 Ci ( µ ) 变化情况。 实验内容及数据来源 由基本的天文数据,表 12.m.1 中的函数 pingdong_2. yi . i = 4. 0 ) .x2.m.m,保持在 MATLAB 搜索路径上。 (3) 准备好实验 12.m,保持在 MATLAB 搜索路径上。 (2) 准备好实验 12.1 的主函数改写而成。在 Editor 中内容如下: function [u.x1.m 步骤一:由于这个实验要用到上一个实验的一些数据或者程序。所以对于相同程序部分内容 不作叙述,只列出要用到的函数列表。 (1) 准备好实验 12.pingdong_jaco_main.1 中的函数 pingdong_1. pingdong_jaco.x3]=pingdong .MATLAB 571 数值分析与应用 Ci ( µ ) = 2U ( xi .rar\12-2.1。以及上一实验计算得到的平动点的位置,计算出对应不同的力 学系统不同平动点的 Jacobi 积分常数。 实验操作指导 光盘:\实验视频\chapter12.pingdong_2.m,保持在 MATLAB 搜索路径上。 步骤二:编写平动点计算的方法函数,实际上可以由实验 12.m. pingdong_3.m.1 中的函数 pingdong_3.exe 光盘:\实验代码\chapter12\pingdong_1.

00000032 0.00000017 0. temp3=temp1*temp2.00000245 0. %%%%%%%%%%%%%%%%%%%%%%% %平动点 L2 的计算 for i=1:n 数值分析与应用 .00004373 0. temp2=1-1/3*(u(i)/3)^(1/3)-1/9*(u(i)/3)^(2/3).temp3. n=length(u). end %各大行星 L1 平动点的无量纲单位 x1=x1'.00095388 0.5 0. %%%%%%%%%%%% %平动点 L1 的计算 for i=1:n %temp3 为平动点 1 的迭代初值,取展开级数的前三项 temp1=(u(i)/3)^(1/3).00028550 0.00005177 0.u(i)).01230002 ].MATLAB 572 %U 为各大行星质量参数 %x1 为平动点 1 %x2 为平动点 2 %x3 为平动点 3 %08 年 9 月 22 日 %by song yezhi %各大行星与太阳质量之比 u=[0.00000278 1/328900.[].00000304 0. %实际采用迭代法,寻找 L1 点位置 x1(i)=fzero(@pingdong_1.

end %各大行星 L3 平动点的天文单位无量纲单位 x3=x3'. end %各大行星 L2 平动点的无量纲单位 x2=x2'.u(i)). temp3=temp1*temp2.[].u)(x^2+u*(1-u))+2*(1-u)/abs(x-u)+2*u/abs(x+(1-u)).u(i)).x3]=pingdong_jaco.[]. temp2=1+1/3*(u(i)/3)^(1/3)-1/9*(u(i)/3)^(2/3). 以文件名 pingdong_jaco. %先计算 x1 的 jacobi 常数 for i=1:n c1(i)=jaco(x1(i).u(i)).temp3.MATLAB 573 %temp3 为迭代初值,取级数展开前三项 temp1=(u(i)/3)^(1/3). jaco=@(x. %%%%%%%%%%%%%% %平动点 L3 的计算 for i=1:n %迭代初值取级数展开前三项目 v=7/12*u(i).temp. temp=1-v-23/84*v^2.x1. x3(i)=fzero(@pingdong_3. x2(i)=fzero(@pingdong_2. %u 为质量比 %x1 为平动点 1 位置 %x2 为平动点 2 位置 %x3 为平动点 3 位置 n=length(x1).x2. 数值分析与应用 .m 保存。 步骤三:编写主函数文件。 打开 Editor 编辑器,输入以下语句: %平动点 Jacobi 常数 主函数 %9 月 22 [u.

u(i)). end c2=c2' %计算 x3 的 Jacobi 常数 for i=1:n c3(i)=jaco(x3(i).00090098382621 3.00588966478798 3.00077735545817 3.00013238200409 3.03971392746425 3.03844183424838 数值分析与应用 .00090089857876 3.0008968452041 3.u(i)).0002012509973 3.00020167766499 3.0052687679284 3.00078062215388 3.20186401368308 c2 = 3. end c3=c3' 以文件名 pingdong_jaco_main.01809699503865 3.00013215533707 3.00084896576314 3.MATLAB 574 end c1=c1' %计算 x2 的 jacobi 常数 for i=1:n c2(i)=jaco(x2(i).m 保存。 步骤四:运行程序。 在命令窗口输入: >> pingdong_jaco_main 回车得到: c1 = 3.

00000555999 地月-太阳 0.00000278000 3.00010353726 冥王星-太阳 0.01771627648673 3.00000245000 3.00089692987 3.03844183425 3.00077735546 3.00000304043 3.00089684520 3.00005177000 3.00013238200 3.18548480183006 c3 = 3.00008745805 海王星-太阳 0.00000033999997 3.00000555999211 3.5 共线平动点对应的 Jacobi 常数 .00020125100 3.00078062215 3.00521045825 3.00089692987394 3.00013215534 3.00000034000 金星-太阳 0.00000017000 3.00004373000 3.00526876793 3.01809699504 3.00057091679 天王星-太阳 0.00000608086 月-地 0.00000304000 3.000570916787 3.03971392746 3.00028550000 3.00582063419 3.00008745804783 3.00190683098457 3.MATLAB 数值分析与应用 575 3.00588966479 3.18548480183 3.00000489999387 3.00090089858 3.20186401368 3.00582063419199 3.00000607999 火星-太阳 0.00000489999 地球-太阳 0.00020167766 3.00000064000 木星-太阳 0.00090098383 3.00084525906077 3.01771627649 3.5。 µ 平动点 2 平动点 1 平动点 3 水星-太阳 0.00084525906 3.02444522500393 实验结论 各共线平动点的 Jacobi 常数整理后,如表 12.000103537264 3.00084896576 3.02444522500 表 12.00095388000 3.01230002000 3.00000607999057 3.00521045824658 3.00000608085697 3.0000006399999 3.00000032000 3.00190683098 土星-太阳 0.

3 飞船定点三角平动点问题 实验基本原理 前面的实验已经提到平动点 L1 .MATLAB 576 数值分析与应用 实验 12. L3 是不稳定的,但是 L4 .η . ζ ,则原方程的线性化方程为   ∂ 2U   ∂ 2U  && ξ − 2η& = ξ  2  + η    ∂x 0  ∂x∂y  0    ∂ 2U   ∂ 2U   && & η + 2ξ = ξ   +η  2   ∂yx  0  ∂y 0   2 ζ&& = ζ  ∂ U  2   ∂z 0 线性方程的特征方程为 λ 4 + ( 4 − U xx − U yy ) λ 2 + U xxU yy − U xy 2 = 0 对于三角平动点,有 3  U xx ( L4,5 ) = 4  U ( L ) = 9  yy 4,5 4  3 3 1 U xy ( L4 ) = µ−   2  2   U ( L ) = − 3 3  µ − 1     xy 5 2  2 如此特征方程即为 . z0 = 0 设初始扰动为 ξ . L5 却是稳定的,这就引起了 航天领域科研人员的兴趣。如果把探测器发射到稳定的平动点上,探测器就可以保持在平动 点进行空间探测。实际上,太阳与木星系统的三角平动点附近就存在一群小行星-Trojan 群, 这也证明了理论分析是正确的。 在这一实验中,将讨论三角平动点的稳定性问题,然后用数值方法验证,查看积分效果。 对于方程  − y&  ∂U && r + 2  x&  =  0  ∂r   记平动解为 x0 = a. L2 . y0 = b.

4 = ± S 2  S1.2 = ± S1  λ3.rar\12-3.01 ,进行线性化运动仿真。 实验操作指导 光盘:\实验视频\chapter12.MATLAB 577 λ4 + λ2 + 数值分析与应用 27 µ (1 − µ ) = 0 4 则特征根为  λ1.385 2 9  时三角平动点线性稳定,地月系统自然满足这一条件。 为了验证上面的分析,我们把探测器放在三角平动点 L4 或 L5 处,然后对初始状态一个 小的扰动,经历一定时间以后观测探测器的运动情况。 实验目的与要求 l 会把非线性方程线形化。 l 了解线性微分方程的几何理论的基本知识。 l 了解按线性近似判断微分方程的稳定性方法。 l 画探测器出空间轨迹。 实验内容及数据来源 把探测器或飞船定点在空间两个大天体的三角平动点 L4 处,通过线性化运动方程查看飞船 或探测器运动情况。不失一般性取 µ = 0.2 = 1  −1 + 1 − 27 µ (1 − µ )    2 如此,当 0 < 1 − 27 µ (1 − µ ) < 1 时,特征根为二对纯虚根,此时三角平动点线性稳定。 那么,当 1 69  µ < 1 −  ≈ 0.exe .

vy1) title('速度几何相图') grid subplot(2.268*t)-2.t. y=5.5:200.963*t). vy1=subs(vy.t1). -1.m 步骤一 :编写主函数。 打开 Editor 编辑器,输入以下语句: %线性化的平动点 L4 的运动图象主函数 %演化时间 t1=0:0. vx1=subs(vx.55e-5*sin(0.t.45e-5*cos(0.. +3.t1).t. %定义符号变量 syms t x=3..20e-5*cos(0.963*t). %求导数 vx=diff(x..t).1) plot(x1.vx1) 数值分析与应用 .t1). y1=subs(y.3) plot(x1.07e-4*sin(0.20e-5*cos(0.MATLAB 578 光盘:\实验代码\chapter12\sanjiao.268*t)-4.963*t)..2) plot(vx1.t1).2.y1) title('运动曲线') grid subplot(2.t).76e-4*sin(0.268*t)+4.t.2.963*t).45e-5*cos(0. %变量代换 x1=subs(x. subplot(2.9e-5*sin(0. vy=diff(y.2.268*t)-8.

x1.4) plot(y1.m 保存。 步骤二:运行程序。 在命令窗口输入: >>clear >>clc >> sanjiao 运行得到图象 12.2.vy1) title('y 方向几何相图') grid %位置数据 key=[t.1。 图 12.y1] 以文件名 sanjiao.6 中,给出了 .1 线性化的运动图象 实验结论 从输出结果来看,扰动后的运动一直在平动点附近运动。实际上,虽然三角平动点是稳 定的,但是对于一个具体的系统,比如地-月系统,还受到其他作用力如太阳的扰动,那么 运动的性态要发生一些变化,这时候往往需要对运动进行轨道控制。在表 12.MATLAB 579 数值分析与应用 title('x 方向几何相图') grid subplot(2.

00002304689546 199.00016935085916 -0.00017585652027 M M M 194.00024737411759 -0.500 0.500 0.000 0.00022887975434 196.500 0.00007311526294 198.00003352125284 表 12.500 0.MATLAB 数值分析与应用 580 运动的轨道量一些信息。 时间 x Y 0.00030286277764 -0.00019714538255 196.00015592113521 197.00023777266742 -0.00022636825828 194.000 0.000 0.00038549679358 -0.00002747669204 199.00017859667023 -0.000 0.00031122309931 -0.000 0.00001348805335 1.00010733528715 -0.00001537207327 2.00038760477405 -0.00006396134252 0.00002700311661 200.00008138376969 4.00001207607239 -0.500 0.00002858304517 -0.6 线性模型下的运动结果 实验 12.500 0.00012979574720 4.00035473120036 -0.00024457744344 195.00003775180421 3.00005920181455 -0.00011224353040 197.000 0.500 0.00003038442874 0.00000854688114 -0.500 0.00000878082979 -0.000 0.000 0.00001000000000 0.00036043009251 -0.00001457339128 -0.00001311060929 -0.4 人造地球卫星轨道外推 实验基本原理 轨道外推是人造卫星精密定轨的基础,而且也是计算量非常大的一部分。人造卫星轨道 计算可以采用分析方法和数值方法进行外推。其中分析方法比较烦琐,其基本方法是先根据 摄动方程采用平均根数法或者正则变换的方法得到卫星的摄动级数解,然后根据级数解进行 编程,这样的方法比较烦琐,而且精度有限,现在只有少数单位和个人在使用。当然,分析 方法的许多优点是数值方法是无法取代的,而且分析方法是卫星轨道总体设计的基础,没有 .00001389550743 0.000 0.000 -0.00001977833508 1.000 0.00002231224219 2.00001000000000 0.000 0.00011480480908 0.500 0.00004396533229 198.00000452659785 3.00024561208151 195.500 0.500 0.

MATLAB 581 数值分析与应用 分析方法的理论,轨道总体设计就无从谈起。不过要编写分析方法,往往时间比较长,一般 而言可能需要长期的程序积累。相比而言,数值方法,编程起来简单快速,而且随着计算机 技术的发展,其计算效率也非常高,使这一方法得到更广泛的使用。在这个实验中,我们简 单介绍数值外推基本方法。 如果采用位置和速度作为轨道量,则轨道外推是为常微分方程的初值问题 v uv uv uv uv uv uv uv uv d 2 r uv = F TB + F NB + F NS + F TD + F RL + F SR + F AL + F DG + F TH dt 2 其中各右函数分别为 uv F :二体问题的中心引力; uv TB F :第三体引力; uv NB F :地球非球型引力; uv NS F :地球潮汐引起的效应; uvTD F :相对论效应引起的卫星角速度变化; uv RL F :太阳光照辐射压力; uv SR F :大气阻力; uv DG F TH :其他力引起卫星加速度变化的力。 这些摄动里都非常复杂,其中以地球非球型 J 2 项影响最大,所以这里主要考虑这一项 引起的卫星运动轨迹的变化。积分方程可以选择位置速度作为状态量,也可以选择轨道根数 作为状态量。 如果采用 Kepler 轨道根数,状态方程为 da 2 = [e( S sin f + T cos f ) + T ] dt n 1 − e 2 de 1 − e2 = ( S sin f + T cos f ) + T cos E  dt na  di r cos u = W dt na 2 1 − e2 dΩ r sin u 1 = W dt na 2 1 − e 2 sin i dω dΩ 1  = − cos i + 1 − e2 (− S cos f + T sin f ) + T sin E    dt dt nae dM 2 r 1 − e2  = n − ( )S − 1 − e 2 (− S cos f + T sin f ) + T sin E    dt na a nae 当然,在实际应用中可能选择第一类或第二类型无奇点根数。考虑 J 2 项用位置速度作 为状态量的卫星运动方程为 .

5 − 1.MATLAB 582  dx  1  dt  dx  2  dt  dx3   dt  dx4   dt   dx5  dt   dx6   dt  r = 数值分析与应用 = x4 = x5 = x6   z2  Re   1 − 7.000 UTCG 时刻的轨道根数为 .5 2 − 1.8116341s   在计算中为了保持精度,可以直接应用计算得到变量作为计算参数,而不必使用上面给出的 具体数值。 实验目的与要求 l 理解轨道外推实际为常微分方程的初值问题。 l 理解微分方程初值问题数值方法的基本原理。 l 能够编程实现轨道外推。 l 针对不同的力学模型,分析这些摄动力的影响大小。 l 把空间运行轨迹用 MATLAB 图象表现出来。 实验内容及数据来源 已经知道卫星在历元 1 Jul 2007 12:00:00.5   J  2  2 r  r    2  x  z  R  = − µ 13 1 − J 2  e   7.5 2 − 4.140km, 时间单位取为 1  ae3  2 T = [ ]  GE  ≈ 806.5   r  r  r   2  x  z  R  = − µ 13 1 − J 2  e   7.5   r  r  r   = −µ x1 r3 x12 + x2 2 + x32 需要注意的是,在程序设计中,我们选择的是人卫工作中习惯采用的人卫工作单位,在 数据进入微分方程之前,先要把国际单位或一般计量单位化为人卫工作单位,计算出结果后 返回国际单位或一般计量单位。在人卫工作单位中,长度单位选为地球半径即 67378.

m.000000    r =  0. weixing_waitui.41km  a      0   e   28. %存为列向量 dx=[dx1 dx2 dx3 dx4 dx5 dx6]'. dx5=-x(2)/r^3.137000   0.x) %无摄动卫星运动方程 r=sqrt(x(1)^2+x(2)^2+x(3)^2).weixing_waitui_j2.686414       km / s   要求分别采用二体模型和考虑地球扁率 J 2 模型对轨道进行数值外推 4 小时,画出两种计算 结果的卫星空间运动轨迹,并比较两者计算的在各分量方向上的差别。 实验操作指导 光盘:\实验视频\chapter12.MATLAB 数值分析与应用 583  6678.exe 光 盘 : \ 实 验 代 码 \chapter12\erti.m.m. dx6=-x(3)/r^3.rar\12-4.789530  0. dx4=-x(1)/r^3.000000  km.m.m 保存。 . v =  6.00000   3.weixing_main. dx3=x(6). dx1=x(4). 以文件名 erti.m 步骤一:编写二体问题的方程右函数。 打开 Editor 编辑器,输入以下语句: function dx=weixing(t. dx2=x(5). erti_j2.5o  i      = 0  ω   0  Ω       0   M  0    即卫星的位置速度向量为  6678.

dx4=-x(1)/r^3*(1-J2/r*(7.v0 为初始位置 速度 %tspan 为积分时间段 a=6378. dx3=x(6).x) %考虑 J2 项的卫星运动方程 J2=0. dx5=-x(2)/r^3*(1-J2/r*(7. %无量纲时间 ts=tspan*60/806. 以文件名 erti_j2. v0=v0/a*T.5)).5*x(3)^2/r^2-1.m 保存。 步骤三:编写二体的外推函数。 打开 Editor 编辑器,输入以下语句: %二体模型下的卫星轨道外推 function [t.5*x(3)^2/r^2-1.5)). dx=[dx1 dx2 dx3 dx4 dx5 dx6]'. 单位为 km、km/s 单位为分钟 数值分析与应用 . r=sqrt(x(1)^2+x(2)^2+x(3)^2).811665. %化为无量纲单位 x0=x0/a. dx2=x(5).140. dx1=x(4).v0.tspan) %x0.5*x(3)^2/r^2-4.00108263.r. dx6=-x(3)/r^3*(1-J2/r*(7.5)).v]=weixing_waitui(x0.MATLAB 584 步骤二:编写扁率摄动的方程右函数。 打开 Editor 编辑器,输入以下语句: function dx=weixing(t.811665. r0=[x0 v0]'. T=806.

v0 为初始位置 速度 %tspan 为积分时间段 单位为 km、km/s 单位为分钟 a=6378. 数值分析与应用 . %积分得到无量纲位置速度向量 %还原为 km, km/s 单位 r=yy(:.m 保存。 步骤四:编写考虑地球扁率摄动的外推函数。 打开 Editor 编辑器,输入以下语句: function [t.yy]=ode45(@erti_j2.yy]=ode45(@erti.r. %-----------考虑 J2 摄动 [tt.v0.ts. %积分得到无量纲位置速度向量 %还原为 km, km/s 单位 r=yy(:. %人卫工作中的单位时间 %化为无量纲单位 x0=x0/a.4:6)*a/T.1:3)*a.r0).140.1:3)*a.r0).811665. v0=v0/a*T.811665. t=tspan(1)+tt*806/60. %人卫工作中的单位长度 T=806.v]=weixing_waitui_j2(x0. %无量纲时间 ts=tspan*60/806.ts.MATLAB 585 %------------不考虑摄动,在二体模型下 [tt. r0=[x0 v0]'. 以文件名 weixing_waitui. v=yy(:.tspan) %考虑 J2 项的卫星轨道外推程序 %x0.

x2=[t2.686414].00000]. %画出考虑 J2 摄动模型的卫星空间运行轨迹 subplot(2.v0.1) plot3(r(:.000000 %外推区间 km,km/2 0.r2(:.137000 0.2) plot3(r2(:. t=tspan(1)+tt*806/60.000000 v0=[ 0. 单位为分钟 %区间在[0,240]表示 积分时间段为 4 小时 tspan=[0.v].tspan).r2.r2(:.1). 6.1.MATLAB 586 v=yy(:. 以文件名 weixing_waitui_j2.r(:.1.r.v2].1).v]=weixing_waitui(x0.r.4:6)*a/T.3)) title('二体模型下的卫星空间运行轨迹') grid %考虑地球扁率摄动的轨道外推 [t2.789530 3. %此时刻 t 单位为分钟 ,r 为 km,v 为 km/s %化出二体模型的卫星运行空间轨迹 subplot(2.v0.m 保存。 步骤五:编写主函数。 打开 Editor 编辑器,输入以下语句: %卫星轨道外推主程序 %08 年 9 月 25 %%初始时刻位置速度 单位为 x0=[6678.240].2).tspan).r(:.v2]=weixing_waitui_j2(x0. x=[t.2). %在二体问题下轨道外推 [t.r2.3)) title('考虑地球扁率摄动的卫星空间运行轨迹') grid 数值分析与应用 .

2)) title('y 方向误差') grid %z 方向误差 subplot(2.2) plot(t.2 和图 12.r(:.m 回车得到图 12.1)) title('x 方向误差') grid %y 方向误差 subplot(2.m 保存。 步骤六:运行程序。 在命令窗口输入: >>clear >>clc >>weixing_main.2)-r2(:.3:4) plot(t.3)-r2(:.r(:.2.1) plot(t.r(:.2.MATLAB figure %两种模型下的 x 方向误差 subplot(2.2.3。 587 数值分析与应用 .1)-r2(:.3)) title('z 方向误差') grid 以文件名 weixing_main.

3 二体模型相对于扁率摄动模型的误差 实验结论 从图 12.MATLAB 588 数值分析与应用 图 12.2 卫星运行的空间轨迹 图 12.2 中可以看出,卫星在三维空间近似以椭圆绕地球运动。在图 12.3 中,可以看 到如果只考虑二体运动,在积分 240 分钟即 4 小时以后 y 和 z 方向的误差已经在几十公里量 .

137 0.00148 6678.686414 0.78953 3.4 中,其实分别包含了上面计算中的二体数据和考虑地球扁率摄动的数据,但 是因为它们的差别百公里左右的量级在二维地面图形如此大的尺度上反应不出来,所以视觉 上近乎重叠。 图 12.006659 6678.137 0.686414 0.002959 6678.78953 3.137 0.000 UTCG 这时候在图 12.137 1.78953 3.327611 -0.MATLAB 数值分析与应用 589 级,而 x 方向已经到了百公里量级。在实际的工作中,要考虑摄动因数还有很多,但是这个 实验反映了卫星轨道外推的 基本原理,更复杂的摄动因素可以逐项加到方程右函数中。 实验中卫星的星下点轨迹如图 12.00079 6.00357 6.655223 -0.5 中可以看出两者计算的差别。其中红线为二体模型积分结果,而绿线为考 虑地球扁率摄动的积分结果。 下面给出轨道外推的数值结果,见表 12.78953 3.136 2.686414 0.686414 .5 外推 24 小时卫星星下点轨迹 如果我们把积分区间扩大为积分 24 小时,即积分到 1 Jul 2007 12:00:00.789529 3.603385 0.78953 3.686414 0.4 星下点轨迹 在图 12.474251 -0.00222 6678.4。 图 12.491417 -0.00074 6678.20677 0.301692 0.00119 6.137 0 0 0 6.7。为了方便读者比对程序,这里给出了全部时 间段上的外推结果,但是出于篇幅考虑这里省略了小数点后面的一些有效数字。 时间/分 x(km) y(km) z(km) vx(km/s) vy(km/s) vz(km/s) 0 6678.0004 6.163806 -0.00159 6.715232 1.686414 0.905077 0.

246166 0.685733 0.83197 -6.917974 2.21155 -0.5934 -2697.223694 2.68425 63.176 1645.30402 -3.29 -2915.26875 54.969 1027.5551 204.22171 5.52 3.16 7.45607 -4157.528 81.702 188.233 -7.4957 6.732155 3.077 0.95945 -5798.61581 3.716244 1.23 6.452953 1.63 6.474305 3.99169 -3.32519 12.716767 13.106 -5662.136 3129.112306 -0.14184 34.11486 25.669322 1.06 5.789442 3.MATLAB 数值分析与应用 590 0.268 -4880.134 5.29 -6.826 61.789508 3.049136 10.908 -7.240617 3.109 751.58934 1.132 7.739345 -6.00953 6.19566 -4804.63 3965.71641 -0.255 -2.7431 6.99115 -179.293279 -0.325723 2.31176 -0.41274 -1674.86742 16.75 -1693.79228 -1466.563 -5.34154 5.82807 28.86166 57.31742 -2.686387 0.686411 0.43 -2649.4414 509.59 75.83449 2604.84913 -3.466 2596.21114 -6301.28192 -0.686366 0.11691 2.09889 6.789392 3.91282 1240.1972 -0.11937 40.673 -3.15307 69.276699 6676.736 -7.78291 8.58 4030.00755 6.638981 4.5321 -1.073244 6678.46284 -6566.234 -4.32925 -6261.53132 -1.27051 -2.79452 -3.036252 6678.12 -919.17582 40.75616 3851.686112 0.678818 1.684518 0.28 7.68912 49.22 5713.971741 .932 1767.676613 22.377 376.52511 -0.311252 6592.79064 -3.494543 6009.789481 3.03 5348.109661 3.001 37.794 -3.34417 60.04 -3074.43441 -2983.706 -7.25953 -0.089 22.94 150.36942 1104.47221 -3.12159 -0.77554 3.08 -1991.788974 3.026467 -0.331845 74.53333 -3.73005 -0.31 -1483.285 3297.19815 6.924057 6664.7426 -2.459 1389.03522 2312.68702 46.3514 361.789525 3.124 -6.691 5763.831 2188.8575 408.245 4792.21669 -0.86 6.010358 6678.23536 6.317275 8.87 7.24 7.39604 -6568.788275 3.94478 -2.31439 3.135 4.003663 2.40961 20.54731 51.2238 102.005 3101.288 2.39 -5560.41 -3117.26 666.45 -4461.39108 -291.67783 4922.51412 43.127286 16.827328 -0.01946 6.626 959.733584 3.369179 6675.81 -3667.668 5401.051 29.03932 6.017756 6678.099 -5369.647808 1.47876 -6.36973 6.75805 3.69107 37.102 -1.9433 66.584554 -1.786037 3.308 5860.685201 0.789528 3.78545 -1.931 2904.372 2932.509 -320.6 -3019.402897 6367.00556 6.386455 6647.98974 6.339258 -6.70776 -5074.03 -5126.664006 3.014057 6678.09174 6678.848854 6623.858498 -6.4977 306.3095 -4.822 2602.515261 6.402 2559.686339 0.24778 6.127 -7.686412 0.05596 -2.082152 -4.02939 6.4527 -0.702169 3.39453 -3824.53 1891.0203 -3.78649 -0.99 -589.394 2153.033 -5.73735 -0.631495 1.8 -2783.029 3181.99255 -5.437642 19.656038 2.116 14.04 3031.789527 3.2253 -0.18422 6677.04925 6.586188 5524.00413 -5.686413 0.31 4781.95633 -2.461659 6674.201 1790.686402 0.51238 31.70103 3435.7993 -0.054748 6678.209 938.32698 6.644546 72.931334 -0.903 112.187107 0.17 -2732.787296 3.173 564.4972 -0.19 -2422.307 -5742.14852 6.26245 -5664.

30492 5.388095 -6.1889 -5207.1435 5065.081 -372.5725 -2.36684 4432.21 -1841.08 -2728.928 -7.712 -6.596 3063.26962 152.015719 82.716067 -3.26 3183.13063 121.01041 6.36 -5417.3685 -3411.012 5745.468297 2.739 0.910891 3.3681 -5411.867 4712.424 -7.933 1149.110413 99.73654 -3.16 7.67859 2.212 4013.24 4719.1305 -3704.66483 1.27 -1821.8987 5508.527583 0.6469 4256.590812 2.433 -6.540267 80.198 2.66941 124.133052 105.44756 4.01547 143.82 4.08 3.66264 6.382 -3392.95274 5956.965 -7.12884 -2.964 1187.0488 1241.74 -3057.57954 0.25 -4213.718076 162.76 5.732218 91.438581 -2.382 2295.554264 3.728669 3.03264 5266.099 -6479.46 -2941.9708 -120.241 3172.097 -4.69358 133.33597 6030.79815 -0.61901 138.85961 -6.31117 -5.928593 2.039558 3.5991 -5841.914544 2.157352 3.266 -4460.57273 -0.158 -2888.54089 146.52 -2255.440817 96.11 2593.735 -5595.13959 -0.48125 130.83894 5.98 -1431.41061 -3.3671 4799.5 -242.0705 -882.048 -5.535 -3739.85392 116.68 -7.06 -1568.393 3470.661939 6.929 2562.61632 6.2 261.39722 3.492607 .752804 4.51817 119.6654 -3.652848 88.362 4228.76 4.105 1728.9821 -1.04 482.55381 -3.73918 136.235 3037.23 -2030.1267 2549.720171 3.641 -8.824 -5.698708 -5.648755 94.67974 -2.969043 186.6 6.034611 -6.95 7.744 1408.024523 6.41 -2607.280308 3.84 -3355.256751 2.88671 -3.3272 6395.23914 170.265 3119.251833 4.668379 102.44 7.117 2873.92 -4802.97401 149.304 2910.011 2184.602969 181.705963 110.570551 6.7724 1795.286454 157.97775 6.05 -5315.845 -2350 -1275.25 5595.438 2.418 1629.7747 520.87284 6385.123 -1826 -991.94 7.91643 -2.2784 -6039.2195 -2195.1887 -6401.579298 1.424556 -6.07579 113.63567 -1.201852 2.28 5642.9215 467.2712 -6.343169 184.41166 -3.834046 -0.7493 -4640.585 1722.642 -7.MATLAB 数值分析与应用 591 77.1367 6147.824375 167.93081 -0.049833 5.288 -3.8133 -0.633 -131.2708 6.41 4023.82 -1323.42 957.59139 -1.511 0.45872 -4.571033 3.07 -654.59 -3038.95888 5452.72771 3.42 -777.879053 0.92412 -2.50539 154.23 5.18 5.965753 3.94 3.26 -2885.809837 -4.066157 160.45247 108.79295 6534.18 884.79611 -1.735 -1205.43446 -4.11469 127.0292 -1.909 644.300222 0.311227 165.229 2850.5116 -2636.885 -686.37857 141.579 5293.8356 3923.59 -4153.164302 1.307 2179.45 5250.71 -2436.337196 3.8971 4.539 1205.461 2219.752308 179.49 6.2047 3746.302 1.241628 5.54 -2287.24 7.87389 3.09 4.71305 6395.60962 6.049 -5026.6401 5703.401 -2.74 2116.963617 1.7787 -4388.80273 -3.317 -5.33834 -1.56778 173.18971 2.04 -2421.8928 -1475.0177 -5630.5177 6367.111 -3.675117 1.0093 -6267.632204 5.409929 85.635844 3.22255 -3.047 2558.7082 6068.285 -4.5818 4682.219657 6.573 -4.075 1884.891626 3.741848 176.

2794 -6045.87741 233.35168 20.31527 200.24036 213.09889 6.20615 -4.002 37.869 4842.686112 0.134 5.903676 0.58066 -0.96799 -3.49755 -0.26852 -2.501 -6.01 -1642.20681 -2.4638 -5490.372 2935.57993 -3.107487 -0.789525 3.78953 3.227655 194.137 0.75792 221.00119 6.01683 -5.74868 218.428631 -2.10282 -0.66 4451.9042 -3.654208 -0.7854 800.002955 6678.5688 -0.72332 -0.925246 -0.42 -2292.327104 -0.091598 6678.898 2.76002 8.729 -6.789528 3.43 -4222.94948 229.788975 3.27 -4.261059 1.002216 6678.718 5625.88 -2618.014038 -0.789481 3.617 3054.00159 6.468127 197.53 -5183.35 5407.661 369.61 6.010342 6678.204901 0.57261 216.9176 -6.29061 12.862182 0.64 7.8479 -2.18 7.686414 0.25 -492.686387 0.242 -7.2155 -4142.607882 0.3 -2946.34 1824.82706 210.7 二体模型下的轨道外推数据 在表 12.92 -2814.6211 -5534.73005 205.7262 -6088.124 -5544.490656 -0.49 -4822.001477 6678.7353 -1380.217153 2.03 680.2447 239.915 990.07313 6678.02939 6.184 -267.089 22.08476 202.84249 -0.301225 0.3354 226.4026 5601.132 7.00556 6.137 0.095 -6337.686366 0.036196 6678.686413 0.381 5336.78953 3.33 -2603.963 -7.63593 -3.912 -6.686414 0.330053 表 12.897 -5.28031 -0.000739 6678.03932 6.789392 3.235 1569.137 0.379475 -6.603 -528.93242 191.99159 -3.183934 6677.31762 207.289727 -0.229404 3.8 给出了考虑地球扁率摄动的轨道外推数据,出于同样的原因,方便读者比对 程序,在表 12.163552 -0.78953 3.3 7.686339 0.789442 3.471968 -0.78953 3.56 -7.78953 3.745218 -6.136 2.7469 -428.00357 6.2227 -5627.135 4.905 112.52707 -6.723279 3.73 -1886.56 -1413.9106 -6352.45707 231.00079 6.591 75.26 3734.19157 -0.00755 6.276271 6676.939 2629.711027 1.14852 6.271 3041.8131 237.50768 -1.712 -3168.137 0 0 0 6.52536 -2.85 -3005.049169 -4.950747 -0.00304 40.922 2027.4205 -1834.98 2722.16466 -0.01946 6.56 2890.137 1.461 -7.685732 .051 29.08 4.017729 6678.006648 6678.60301 224.45068 -0.75458 3.06 2416.60245 0.7236 -2300.940268 0.9679 2096.8 也给出了全部时间段上的外推数据。 时间/分 x(km) y(km) z(km) vx(km/s) vy(km/s) vz(km/s) 0 6678.909261 -3.778839 -1.00953 6.4422 -3930.67 -891.82117 16.1503 3302.234 0.686411 0.054663 6678.014035 6678.559075 1.62 3.742253 -6.686412 0.686414 0.7191 -4971.14304 -3.81543 0.789508 3.980445 -5.789529 3.92123 -3.0004 6.9313 -2932.04 -5426.04925 6.53408 -1.MATLAB 数值分析与应用 592 189.789527 3.686402 0.686414 0.686414 0.59 6.24 7.686414 0.20178 -5.788277 3.29 -3473.6513 61.44632 2.36156 235.99787 -1.7586 533.116 14.83 5014.642 2897.28 -3010.18635 -1.43226 -2.45777 -1.953 -4793.

0389 -0.7873 3.69653 49.17 3.476 5853.58521 6379.03817 -3.28426 -4147.674119 22.1295 5.660114 5.9951 -2.221 563.132 -3.78406 -1.8 -3109.317 -7.01 2925.22125 5.252 1786.179 5755.4983 6533.15433 34.83 -5113.418 3132.51891 -0.719173 3.17 -1264.307673 6592.982156 77.104966 99.33718 -2.801 1386.316945 8.569511 5526.021 2174.749 -5373.651567 2.8681 1253.47983 -6.656365 71.79766 2614.60347 -0.997 -3.1905 40.241 1726.022716 82.34074 5.31709 -4.14043 69.02 -3655.349112 -6.436005 19.255 4709.9324 102.2 -2423.060668 6.924112 2.08 4778.966 -2.394953 6368.865 2554.775562 3.67211 5945.43 -3013.31523 -3.8 -2723.898 2180.93104 66.86194 -3.6248 306.75901 5251.655991 2.731186 3.987 3173.255918 0.733671 3.305 1.602228 1.727604 1.678806 1.845991 6623.73721 -1452 5708.94 7.73 -2637.77571 4.881 -7.19815 6.33456 -3812.460944 6674.519 3121.444 2148.13323 -4793.35497 -6549.943 150.81962 -5781.168478 0.72723 3857.9856 -0.47494 3.4114 6401.5732 6.21 -643.530993 3.19 7.398 375.12344 -1.29954 -6551.6964 407.809 1147.12 4027.101 0.8 7.403 -2380.087 -6.86741 -6.99966 -3.06844 -2.65679 4926.55194 -5061.10275 4416.9724 204.55083 51.9741 6.21 2178.559 -6.64047 5472.732786 91.43699 96.423 1012.83476 28.98975 6.682298 3.422751 1.85 7.943 -2.2949 81.36895 6.8 -5549.862 3291.27049 5.41 1891.70573 37.MATLAB 数值分析与应用 593 0.836 -0.342 5393.364 653.79023 2297.95 -3064.2441 -6246.593 -5.122 -334.3172 346.090906 -4.791 -47.11869 25.029 -5659.47 -4448.76 4.81212 -3.67369 63.53588 -2683.111118 3.08729 -6284.18867 -5650.76132 -0.656109 1.384308 6647.685199 0.794 -7.978 3975.24669 -2977.59463 1.23538 6.707 187.5914 -0.669295 1.376 -3416.786043 3.48776 -3.74311 6.592214 -1.08 -2903.668 -4.156 2584.276 -2.52776 43.72532 -0.20169 -0.44649 3419.263685 3.35 -587.54285 -1.759487 3.076 -5.57 3029.515081 6.696357 6.17154 -297.3265 6.672 2596.187 1210.69821 46.0219 -0.922626 6664.626 -5.482232 6010.646876 94.13397 1092.76 667.2 -930.62 6.92 3.749472 -6.26 -1491.758099 3.357944 3.31468 3.638907 4.672 -5734.456 3092.715953 13.37 5.52207 31.20912 -1674.618347 3.347 2893.421 -7.26826 54.011 1631.41697 4.945 4784.013814 -5.251215 6.493 957.340146 2.156877 0.7396 -1.955316 2.545 3958.702303 3.661669 .048601 10.192 -4230.85732 57.0563 -1.11916 2.057 -1240.1 -1687.78 6.6558 88.93853 -164.677 -7.99757 -5.505 -4890.368607 6675.77 5345.24778 6.724 2.1359 -0.28902 -2.73 -2275.02594 6043.55098 -3.80787 -3.33654 60.549136 79.343306 74.341 936.82816 -6.12617 16.91 -2781.38 -1829.11 5.874734 3.9943 508.415073 85.71 6.194 750.94889 -2.02 -4.57 -1996.4957 6.007433 2.30902 -0.684515 0.564 1764.

33 6.28478 5.9131 -3428.844982 167.1175 202.5347 3364.684843 -5.803 904.MATLAB 数值分析与应用 594 101.54 5.81 -2006.37177 140.125378 104.27104 .16066 -2.891 3058.3687 5485.201812 3.7688 -5208.335169 164.384 2921.595564 181.05 -4116.39 5046.977 2544.47 -2926.783 -2.967 -7.533 5628.01919 -6.13 4.89396 -2.503 -158.2488 -1.41 3045.746315 175.87416 116.13872 126.69488 -1.06306 -5.954163 186.53 7.25744 -3.264 2391.47787 154.61 -207.2083 6.409586 -6.18 -2710.1209 -5628 -3046.90552 -3.7722 5586.75 7.88292 -6.02 4736.162 3404.89 -2885.9912 -461.485 -7.75623 -1.88 1532.255493 170.27 5.296 2702.74637 135.08629 -0.40256 -1.69247 -3.537 -7.72824 -3.488 -3.896 5304.46 3205.5 5600.368914 -6.57 7.625741 6.15502 121.8971 -2.3182 3891.0344 -5389.595 1558.288394 4.113 -6.6547 284.12 5261.44 -5047.48469 -4.6245 -6257.18 3783.41213 -3.66215 1.24949 -5.04 -5290.90618 -1.663083 3.54086 118.45812 0.99857 -0.928146 3.85462 -0.81008 0.80595 -0.331547 183.362559 1.15 4492.3544 -4753.93981 -3.34552 199.851 412.08 -801.048 3026.37252 3.56175 -1.1271 492.59676 -3.2066 5741.7955 -3674.43652 -3.769 6397.429 434.63 -1837.79 -2400.7517 -2218.919742 3.754 2870.5904 -911.25124 -4.3248 -2876.533 -7.1723 868.771 2524.286 1996.7929 2875.735 3036.1761 -2602.653308 1.894665 1.324 -6.8435 4771.377 -7.458 -7.95309 148.3 -1542.534 2557.1966 -5836.093353 159.69436 124.10735 -1.098709 5.978539 2.5691 6161.417 2303.625 -5427.35281 207.00292 143.73 4.71 7.03 -965.02985 -3.60819 -1.7913 2588.153456 2.931 -4.204837 194.750684 178.068953 3.73088 -2.879 2836.55437 6.8294 -6383.5566 -1437.669639 2.7647 204.8692 -5458.1688 6052.5468 3.8 7.626 1.9689 6360.5519 5103.33407 -5.179 5269.149 3111.29315 -6.8396 -3882.4149 -4614.475495 188.61858 138.09302 113.744262 162.72 -2265.291 -3780.341 -4397.989 2632.778 -6.355786 0.42 -1343.71287 3.22 2145.078 1121.81 -1771.02 -6.9319 -6019.136 -2938.559 2897.065 -4.986 -7.797895 -4.037636 6.99 -7.328 -5.891766 0.474 -751.42268 2.441296 196.436021 -2.74 2942.024 -4.799 2161.965755 0.84535 4.78047 5.838586 -0.03 -2398.707138 -3.691999 110.989 4679.100152 1.6349 -80.371 -5.15157 -2.578351 172.005 -1885.152 -4491.729479 1.2677 1759.397 4793.3535 2162.727 -6464.53 4043.52499 -0.35 3.72 -3316.796 -7.0605 5728.20504 -2.50083 129.601155 1.86103 209.209 1896.441739 107.48048 -0.744 2.81249 -3.425 5628.29 4169.19944 2.708 -347.28 -3032.7131 1281.71 -2612.0433 4306.52355 145.109 1424.811 -0.749 2.15 5426.314667 157.70755 132.27 990.883021 3.17594 2.943 -5.22 6.7179 -2.871 1701.234 -5581.516 0.8695 3781.04 -1395.04 -7.65 -4769.60016 6.530198 2.24458 151.914006 191.

67715 -3.34 -5173.57698 -6.97 -2626.66753 237.59533 215.82 -2307.6716 -6019.2774 -5504.84 6.59 -2832.83 -1908.453321 -2.Tapley 等 ELSEVIER ACADEMIC PRESS。 实验 12.4173 -0.2764 -6341.90998 -3.882224 -3.71 -4771.MATLAB 数值分析与应用 595 212.474 -6317.86 6.Mandelbrot 在 20 世纪 60 年代对一个复杂的几何性质但局部看起来仍然一样的几何对 象提出了分形的概念。今天,在非线性动力学动力系统等许多领域都会看到分形的例子。随 着电子计算机的发展许多美丽的分形图案被构造出来,这个实验中我们将介绍两个分形图 案。 下面给出分形图案中的数据计算方法,对于第一个范例中的蕨类植物生长模型是采用 仿射变换的循环迭代方法。设 x 是一个 n 维向量,A 是(n,n)维矩阵,b 是与 A 同维的向 量,则 x → Ax + b 在数学上称为仿射变换,取不同的 A,b 就会得到不同的变换结果。范 例 2 中的图像同样是采用循环的仿射变换绘制而出,只是参数选择不同而已。 分形问题是很有趣的,同时又联系着现代数学中的若干前沿分支,所以也是很活跃的 一个领域,有兴趣的读者可以阅读一些专业著作。 实验目的与要求 l 了解分形问题的一些基本概念及常识。 l 知道分形问题数学上是如何产生的。 l 对于给出算法的分形问题,能够用计算机实现分形图形的绘制。 .76229 218.0788 -6086.50564 -2.9875 -3212.52517 -1.5 美丽的分形图案 实验基本原理 B.59594 223.8 关于更复杂的摄动因素需要参看专著,如刘林教授的《航天器轨道理论》国防工业出版 社或《Sattistical Orbit Determination》Byron D.49 -422.63 -1442.20036 -3.854 0.373 -1258.334405 -6.4202 -0.245 -304.29 4.89 747.83 -926.83 7.93984 -5.7586 832.05 1885.8496 -2.12 -2971.59 7.27462 235.56114 -1.5658 -215.63 7.76144 221.974109 -0.96844 -6.31 3.56802 -3.0332 -4991.49 -4161.4288 230.954 951.94503 -3.04062 239.96 -2533.3 -3406.61432 -2.69 -2960.556 -5635.5925 330.44 -1572.92689 228.014111 -4.888 -5545.84518 233.5104 -4174.1803 -2266.01 -3007.696089 -6.17 -5433.889686 0.821107 -1.31999 226.908705 0.7 7.26788 -0.587851 表 12.306 2.698379 -6.

A3 = [-. -.MATLAB l 596 自己能够构造一些简单的分形计算格式,然后尝试在计算机上实现。 实验内容及数据来源 a) 采用仿射变换通过反复循环分别绘制出蕨类植物的生长模拟图。 2. 绘制著名的 Sierpinski 三角形分形图案。 实验操作指导 光盘:\实验视频\chapter12.85 . . %------仿射变换矩阵 A1 = [ .85 . 1.fengxing2.m 步骤一:编写蕨类植物生长模拟图。 打开 Editor 编辑器,输入以下语句: %蕨类植物模拟 x = [. .exe 光盘:\实验代码\chapter12\fengxing1.6]. . %初值 h = plot(x(1).23 .6].28. 1.22]. .m.16].'. 0 .rar\12-5.04.99 1.92 .04 . if r < p(1) %产生随机数 数值分析与应用 .').15 . A2 = [ .5.5].24].26 . %绘制初值点 %设置用于后面随机数的判别向量 p = [ . A4 = [ 0 0.20 -. b3 = [0. for i=1:20000 r = rand.x(2).44]. b2 = [0.85]. b1 = [0.00].26.

hold on %采用绿色绘制 end axis off %取消坐标轴 以文件名 fenxing1. elseif r < p(2) x = A2*x + b2.6。 图 12. elseif r < p(3) x = A3*x + b3.6 蕨类植物的生长模拟图形 步骤三:编写 Sierpinski 三角形分形图案函数。 打开 Editor 编辑器输入以下语句: %Sierpinski 三角形分形图案 %初值 数值分析与应用 . end plot(x(1).m 保存。 步骤二:运行 fengxing1. else x = A4*x.MATLAB 597 x = A1*x + b1.x(2).'g').m。 在命令窗口输入: >>clear >>clc >>clf >>fenxing1 回车后得到图像 12.

else x = A*x+b3. b2=[1/2 0]'. %仿射变换矩阵 b1=[0 0]'.333333333333 x=A*x+b2. %绘制初值 A=[1/2 0.0 1/2]. h = plot(x(1). %产生随机数 if r >0.m。 在命令窗口输入: >>clear >>clf >>clc >>fengxing2 回车得到图 12. elseif r >0. end plot(x(1).MATLAB 598 x = [0.hold on end axis off %取消坐标轴 以文件名 fengxing2.m 保存。 步骤四:运行 fenxing2.'-').7。 %保持图形 数值分析与应用 .').'. b3=[1/4 sqrt(3)/4]'.x(2).66666666667 x = A*x + b1.x(2). 0]. for i=1:10000 r = rand.

7 Sierpinski 三角形 实验结论 这个实验重点在于介绍如何绘制分形图案方法,对于分形中的复杂数学问题没有进行深 入的讨论,这些内容当然也不是仅仅一个实验可以解决的问题。但通过这两个分形图像的绘 制,给出了典型的分形图案绘制方法,想必对分形问题已经有了一些基本认识。事实上读者 也可以自己构造一些分形问题,然后尝试进行编程实现。 本 章 小 结 这一章节,主要介绍了天体力学与宇航动力学的一些交叉内容部分实验和卫星运动理 论、分形的一些实验。 这些实验具有一定的理论意义与应用价值,既可以作为数值分析学习后的练习,也可以 作为一种专业理论的初步学习。如引言所述,在一章里,不可能罗列所有的数学建模问题, 也没有必要。这里旨在通过实验模型的建立、处理,反过来复习、促进数值分析的学习与理 解。 在这一章的实验中,包含了前面许多章节的类容,有非线形方程的数值方法、常微分方 程初值理论以及最优估计等。 事实上,一个大的实验模型就可能包含多种方法,这也说明了数值分析是一门非常重要 而基础的学科,是现代科学技术发展的一个强劲动力。 .MATLAB 599 数值分析与应用 图 12.

MATLAB 600 数值分析与应用 第十三章 数值方法的应用范例(二) 在上一章中,我们分别介绍了一些不同类型的数值方法应用问题,这些问题都有一定的 典型性,但是不够深入。为了让读者加强实际工程中的数值分析能力,在这一章中,我们以 小专题的形式介绍了导航系统的定位方法。其中前两个实验类似于 GPS 中的定位方式,而 后几个实验则类似于伽利略系统中若干子系统的定位方式。不过需要说明的是这里讨论的数 学原理,以及如何用数值计算方法解决问题,而不是针对某一具体的导航系统。有了这些基 本理论及方法以后,就很容处理一般性的问题,哪怕是其他类型的导航系统,只要通过自己 合理的分析就可以处理问题。 实验 13.1 卫星伪距定位原理 实验基本原理 卫星导航定位是 20 实际一项重大的科技成就。现代卫星导航系统具有全球性、全天候、 连续性,已经深刻的影响到社会生活、国防安全、军事领域、科技领域,其中以美国的 GPS、 俄罗斯的 GLONASS 和欧盟建设中的 GALILEO 系统为典型,中国也在积极发展自己的空间 导航系统。 实际的导航系统是比较复杂的,为了阐述清楚导航定位的基本原理,不可能抓住所有细 节,而且这也不是学术专著。在这个实验中,我们忽略系统误差,而且没有冗余数据,在下 一个实验中,我们将介绍更接近真实情况的实验,既考虑系统误差,而且有多余的观测数据。 根据测量方式的不同,可以有伪距定位、多普勒定位等,以及多种测量数据的融合定位。 只要明白其中一种定位方式,其他的原理也不难理解,这一实验介绍伪距定位。 实验中,假设测量没有误差,用户接收机的时间与卫星的系统时间是同步的。那么,一 般而言,如果测量没有误差三颗卫星的伪距就可以精确的定位。但实际的情况是接收机是有 钟差的,而且测量信号也是有误差的,如果这时用三颗星定位的话,不难想象定出的结果可 能是有效的,但一般而言应该是有误差的。这时候,我们可以采用多数据运用统计学或最优 估计理论,有效的利用数据,得到最后的定位结果。这个实验中暂不考虑,留在下一个实验 解决。 .

MATLAB 数值分析与应用 601 图 13.1 导航定位示意图 在图 13.1 中,给出了定位的基本原理示意图,从几何上也容易看出,如果测量没有误 差而且系统也没有误差的话,那么三颗星就可以实现定位。 观测量与用户的位置是由非线性方程联系的 ρ =  1   ρ2 =   ρ3 =  ( x1 − xu ) + ( y1 − xu ) + ( z1 − xu ) 2 2 2 ( x2 − xu ) + ( y2 − xu ) + ( z2 − xu ) 2 2 ( x3 − xu ) + ( y3 − xu ) + ( z3 − xu ) 2 2 2 2 所以定位问题转化为非线性方程组问题,这在本书的第六章已经做了详细的介绍。如果是使 用 MATLAB 作为工作语言时,可以直接调用系统函数,方便快速度的求得问题的解。 实验目的与要求 l 明白定位的直观几何意义。 l 体会定位的数学含义,对于其它类型定位问题能转化为数学模型。 l 复习非线性方程组的数值方法,能编程实现。 l 会调用 MATLAB 系统函数处理这类问题。 实验内容及数据来源 用户在一时刻测量某导航卫星星座,选择其中三颗卫星,卫星 13、卫星 22 和卫星 23。 这一时刻这三颗卫星在地固坐标系中的位置为 .

%%%------------------%伪距模拟数据 % sat13=[-7134. r23 =  28971.901317 16113.245613   2079. f1=norm(sat13-u)-23403.205570   5307.f3]. 5307.648836 18533. 2079.622323   23709.f2.622323 23709.233168 28971.796362].529244   -22383.exe 光 盘 : \ 实 验 代 码 \chapter13\dingwei_fun.648836 18533. f=[f1.233168  .205570].7950572489.rar\13-1.901317 16113.8440221881.901317      r13 =  16113.529244 % sat22=[-22383. dingwei_main.8328162636.001156]. % % beijing=[-2177.700040 sat23=[-5384.205570].796362].7950572489 和 24870.648836  . 5307. f3=norm(sat23-u)-24870.700040   -5384. r22 =  18533.901474 4070.8328162636。现在的任务是通过定位原理,采用数值方法把用户在地球固联坐标系 中的位置找出来。为了简要说清楚定位原理,这里不考虑测量误差以及系统误差。 实验操作指导 光盘:\实验视频\chapter13. f2=norm(sat22-u)-24695.m. 2079.529244 sat22=[-22383.m 步骤一:编写方程函数。 打开 Editor 编辑器,输入以下语句: %三颗星 不含钟差 系统差的定位函数 %by song ye zhi function f=dingwei_f(u) %卫星伪距离方程 sat13=[-7134.MATLAB 数值分析与应用 602  -7134.700040 % sat23=[-5384.245613]. .622323 23709.527701 % 4388.245613].796362        同时由测码得到对应这三个卫星的伪距分别为 23403.233168 28971.8440221881,24695.

0736983 1.MATLAB 数值分析与应用 603 % ro13=norm(sat13-beijing) % ro22=norm(sat22-beijing) % ro23=norm(sat23-beijing) 以文件名 dingwei_fun.625 718 5 24 279146 39.141 48.9605 0.0625 649 6 28 149856 97.7 244 610 610 x= -2177.27615e-014 0.5 757 3 16 369186 6.29 244.x0.6 39. %调用系统函数 x=fsolve(@dingwei_fun.90147390314 4070.6 8 36 0. options=optimset('Display'.00715892 53.25 15.TolFun.25 746 4 20 342165 15. Trust-region radius 1 1 2.6563 477 7 32 2166.'iter').00115601053 .5277010092 实验结论 4388.5 6.m 保存。 步骤二:编写主函数。 打开 Editor 编辑器,输入以下语句: %三星伪距定位 %初值 x0=[-2000 4000 4000].m 保存。 步骤三:运行程序。 在命令窗口输入: >>clear >>clc >> dingwei_main 回车得到: Norm of step First-order Iteration Func-count f(x) optimality 0 4 386572 763 1 8 384770 1 762 2 12 380285 2.0818 9 40 1.4e-007 Optimization terminated: first-order optimality is less than options.1 97.options) 以文件名 dingwei_main.

2 卫星导航系统的多资料定位 实验基本原理 上一个实验,我们介绍了过于理想的定位类型,目的是说明定位基本原理而为本实验服 务。这个实验将介绍比较接近真实情况的定位问题。本实验与上一个实验有几个地方区别, 第一,认为用户接收机有钟差,与导航卫星系统时间不同步,这个量是需要改正的。第二, 认为观测数据是有误差的。 实际上,这一个实验的步骤,是先建立仿真数据。在得到仿真数据时候,需要对数据故 意的加噪声污染,认为测量到的数据是有误差的。实验的目的是在有噪声污染后数据的基础 上,我们进行定位解算,并把用户的钟差给定出来。 由此,定位的算法用数学语言描述就是计算超定的非线性方程组的问题 .2。 图 13.2 导航卫星星座 实验中,我们对问题做了很大的简化,在实际应用中这些误差是不能忽略的,这里旨在 说明定位的基本原理。在处理非线性方程组时,我们调用了 MATLAB 的系统函数,也可以 按照我们在前面相关章节中非线性方程组的数值方法进行计算。 实验 13.MATLAB 604 数值分析与应用 可以看到初值误差在几百公里范围内,通过几次迭代很快就收敛到需要的结果,定位结 果为用户在北京。在数据模拟中,我们的卫星星座采用欧洲 GALILEO 全球卫星导航系统的 轨道数据,如图 13.

233168 5307.700040 18533.3020893263    24249.1495649421     26973.312423 .796362 卫星 14 637.511543 26977.297933 卫星 12 -11568.4887347568   26366.622323 2079.1269736412   ρ=  26517. n>3 M ( xn − xu ) + ( yn − yu ) + ( zn − zu ) 2 2 2 + ctu 这需要使用前面相关章节中的非线性方程组以及估计理论知识,具体的方法在实验中介绍。 实验目的与要求 l 回顾非线性方程组的数值方法。 l 回顾最小二乘法理论。 l 对于不同类型的定位问题,能自己建立正确的模型,并把模型转化为数学问题。 l 能用数值方法进行定位结算。 l 对定位结果做出合理的分析,结合仿真数据,查看定位效果。 实验内容及数据来源 一个用户在一个时刻,通过测量全球卫星导航系统来确定自己位置,他同时测量到 8 颗卫星的伪距数据,伪距为  23744.1679765305     24423.245613 卫星 23 -5384.648836 23709.3296362982    27190.3701483261   24192.901317 28971.529244 16113.2240745564   导航卫星的轨道数据可以从广播星历或相关地面监控站得到,是已知的。在地固坐标系中, 卫星位置见表 12.8。 x(km) y(km) z(km) 卫星 13 -7134.199533 -3328.205570 卫星 22 -22383.053841 9347.466571 28016.MATLAB 数值分析与应用 605 ρ =  1  ρ =  2    ρ n = ( x1 − xu ) + ( y1 − yu ) + ( z1 − zu ) 2 2 ( x2 − xu ) + ( y2 − yu ) + ( z1 − zu ) 2 + ctu 2 2 2 + ctu .

978513]. sat21=[-28908. sat14.1 导航卫星星历 用户接收机与系统时间是不同步的,既接收机有误差,这个量在微秒量级不能忽略,因 为这将引起千米量级的误差,所以必须考虑。同时观测数据是有误差的,观测的数据是多组 资料。 实验要求通过卫星定位方法,计算出用户位置和用户持的接收机的误差值。 实验操作指导 光盘:\实验视频\chapter13. . %合成卫星总数据 矩阵 sat=[sat13.282494 21199.511543 26977. daohang_fun. sat14=[637.233168 28971.m.297933].m.205570].466571 28016.901317 16113. sat12.297217 3364. daohang_main. nanjing=[-2604.sat23. sat5=[-1205.sat22.700040 sat23=[-5384.025036 卫星 4 16456.199533 -3328.651181 28296.m 第一部分:产生模拟数据。 步骤一:编写模拟数据产生程序。 假设用户在南京,并且他接收机的误差为 7 微秒,但是计算的目的是我们事先并不知道 这一结果。实验先通过实际情况产生模拟数据,然后通过模拟数据计算出用户的位置和接收 机误差。 打开 Editor 编辑器,输入以下语句: %卫星定位的模拟数据产生 c=299792. sat5.527324 12347. sat4=[16456.375658 卫星 5 -1205.061760 6051.648836 18533.916747 -577. sat12=[-11568.061760 6051.796362].529244 sat22=[-22383.053841 9347.daohang_dfun.890128 -8397.298533 4743.025036].173063].375658]. sat21.527324 12347.312423].245613].622323 23709. 5307.458.651181 28296.890128 -8397. 2079.MATLAB 数值分析与应用 606 卫星 21 -28908.282494 21199. sat4].173063 表 13.exe 光 盘 : \ 实 验 代 码 \chapter13\daohang_moni.916747 -577.m. %光速 %导航卫星星历 sat13=[-7134.rar\13-2.

42491269736412 2.41921679765305 2.:)-nanjing).0e+004 * 2.65171495649421 2. x2 .69734887347568 2. %实际距离 %产生伪距数据 ro=length+c*7e-6 %用户时间比系统时间慢 10 的-6 次方秒 以文件名 daohang_moni.63663296362982 2.71902240745564 这就是我们需要的理想中的伪距数据,但是这是不含有误差的数据。但是真实情况是, 我们测量得到的数据都是有误差的。为了接近真实情况,我们需要把这些数据人为的加噪声 污染,这一步将放在主函数里操作。 第二部分:实际的卫星定位解算。 步骤一:分析问题。 回顾一下非线性方程组的计算流程,对于非线性方程组 f ( x ) = 0 ,采用牛顿迭代法的计算 步骤为: 输入迭代的初值 x = [ x1 .m 保存。 步骤二:运行模拟程序。 在命令窗口输入: >> daohang_moni 回车得到 ro = 1.L .37443701483261 2.44233020893263 2. m 做 Step2-5 Step2 计算 f ( x ) 和 f ' ( x ) 。 . xn ] ,最大迭代次数,和误差容限 TOL。 T Step1 对 k = 1. end length=length'.MATLAB 607 数值分析与应用 %计算用户到导航星的实际距离 for i=1:8 length(i)=norm(sat(i.L .

2 2 ( xu − x1 ) + ( yu − y1 ) + ( zu − z1 ) 2 . zu − zn ( xu − xn ) + ( yu − yn ) + ( zu − zn ) 2 因为观测数据多于 4 颗卫星,所以线性方程实际为超定方程,这时候可以计算最小二乘意义 下的解。 步骤二:编写方程函数。 打开 Editor 编辑器,输入以下语句: %多卫星导航方程函数 function f=daohang_fun(x.t.c zu − z2 2 M 2 2 共三列每一列分别为卫星的 x,y,z 2 2 .c  .458. ( xu − xn ) + ( yu − yn ) + ( zu − zn ) 2 2 . %光速 2 .c M yu − yn 2 2    .ro) %x 为用户位置 %t 为用户钟差 %ro 为测量得到的伪距 % sat 为卫星数据 m 颗卫星共 m 行 c=299792. 2 2 yu − y2 ( xu − x2 ) + ( yu − y2 ) + ( zu − z2 ) 2 M 2 zu − z1 . 2 ( xu − x1 ) + ( yu − y1 ) + ( zu − z1 ) 2 .MATLAB 数值分析与应用 608 Step3 计算超定方程 f' ( x ) y = -f ( x ) 的最小二乘意义下的解。 Step4 x ← x + y Step5 如 y < TOL 跳出循环。 Step6 输出计算结果。 其中  xu    yu x=   zu     tu  而方程函数为    f ( x) =      + ctu − ρ1   2 2 2 ( x2 − xu ) + ( y2 − yu ) + ( z1 − zu ) + ctu − ρ2   M  2 2 2 ( xn − xu ) + ( yn − yu ) + ( zn − zu ) + ctu − ρn  ( x1 − xu ) + ( y1 − yu ) + ( z1 − zu ) 2 2 2 其中方程函数一个方程分量包含一个卫星的数据及其对应的伪距。偏导数矩阵可以通过方程 函数很容易算出来      f' ( x ) =        xu − x1 ( xu − x1 ) + ( yu − y1 ) + ( zu − z1 ) 2 2 xu − x2 ( xu − x2 ) + ( yu − y2 ) + ( zu − z2 ) 2 2 yu − y1 . 2 ( xu − x2 ) + ( yu − y2 ) + ( zu − z2 ) xu − xn ( xu − xn ) + ( yu − yn ) + ( zu − zn ) 2 2 .sat.

466571 16113. end end df(:.j))/norm(sat(i. %光速 sat13=[-7134.j)=(x(j)-sat(i.648836 18533.:)-x(j)). 以文件名 daohang_dfun. 2079.205570].:)-x)+c*t-ro(i).n]=size(sat).458.053841 23709. 9347. for i=1:m f(i)=norm(sat(i.n]=size(sat).MATLAB 数值分析与应用 609 [m. 以文件名 daohang_fun.796362].233168 28971.458.m 保存。 步骤三:编写偏导数矩阵函数。 打开 Editor 编辑器,输入以下语句: %多颗卫星导航的偏导数矩阵 function df=daohang_dfun(x.245613].901317 sat14=[637.sat) %x 为用户位置 %t 为用户钟差 % sat 为卫星数据 m 颗卫星共 m 行 共三列每一列分别为卫星的 x,y,z c=299792.700040 sat23=[-5384.529244 sat22=[-22383.622323 28016. %光速 [m.t.4)=c. 5307. end f=f'. . for i=1:m for j=1:3 df(i.m 保存。 步骤四:编写主程序。 打开 Editor 编辑器,输入以下语句: %多星定位的主函数 %08 年 9 月 24 c=299792.297933].

ro).061760 26977.298533 4743. %%%%最大允许迭代 50 次 for i=1:50 f=daohang_fun(x. 6051.sat.375658]. sat4].297217 3364.978513]. sat5.4887347568 26366. t=t0.511543 sat21=[-28908.199533 -3328. sat14.025036].3296362982 27190. sat=[sat13.1495649421 26973.651181 28296. sat5=[-1205. sat21. sat4=[16456.t.890128 -8397. %-------------------------------%加上正态分布的随机误差 %此时可以认为 ro 是实际测量的 含有误差的伪距 %即零均值 方差为 80(米平方) 的标准差的正态分布 ro=ro+sqrt(80)*randn(size(ro))*1e-3. x=nj.916747 -577.1679765305 24423. %理想中测量得到的伪距 ro=[ 23744.t.sat23.282494 21199.1269736412 26517.312423].3701483261 24192.sat).3020893263 24249.2240745564]. %----------------------------------%用户位置迭代初值 nj=[-3000 5000 3000].MATLAB 数值分析与应用 610 sat12=[-11568. nanjing=[-2604.173063]. %钟差迭代初值 t0=4e-7. .527324 12347. df=daohang_dfun(x.sat22. sat12.

4)=t.2)=x(2). t=t+gaiz(4). if tol<1e-10 break end %-------------end disp('迭代次数为') i disp('用户位置为') x disp('用户的钟差为') t 以文件名 daohang_main. x(2)=x(2)+gaiz(2). %%———————————————————————————— %%----------%如果精确到 10 的-10 次方,则停止迭代 tol=norm(gaiz). %%——————存储中间数据———————— % temp(i. % temp(i. %在 MATLAB 中此已经为最小二乘意义下的解 x(1)=x(1)+gaiz(1).1)=x(1).MATLAB 611 数值分析与应用 gaiz=-df\f.m 保存。 步骤五:运行程序。 在命令窗口输入: >>clear >>clc >> daohang_main 回车得到 迭代次数为 i= . % temp(i.3)=x(3). % temp(i. x(3)=x(3)+gaiz(3).

82387 3364.83E-06 8 -2604.69E-05 2 -2623.08172 3362.35E-06 7 -2604.633356 3.29E-06 4 -2606.45928 3370.051103 7.060334 4695.23854 3364.600447 4742.685323 5.80E-06 6 -2604.367341 4744.291059   3364.962457400059610e-006 因为加了随机噪声,所以每次运行结果可能不尽相同,但是都是精度比较高的结果。 实验结论 从输出结果可以看到,迭代进行到 28 次时候,已经停止迭代,跳出条件已经为满足我 们要求的精度。这时候在第固坐标系中的位置为  -2604.9695 7.528155 4743.28515 3364.60429207496172 4.44767 3365.770957 1.28641 4743.04E-05 5 -2603.348295 4756.955684 6.618076 -3.172544 -5.079637 4739.78E-05 3 -2598.928308 6.95E-06 .01E-06 9 -2604.0e+003 * -2.MATLAB 数值分析与应用 612 28 用户位置为 x= 1.959154    定位结果为用户在南京地区。一开始我们有意的选择了估计非常粗糙的距离,三维方向 误差均取了 1000km,而是定位结果很快收敛。为了方便读者对比程序,这里给出了迭代中 的数据变化,如表 13.36497599139875 用户的钟差为 t= 6.295199  ru =  4743.68709 3365.74328541696088 3.321405 4743.2。 迭代序列 x y z t 1 -2534.217064 4743.92068 3372.30868 3364.

295199 4743.958763 6.2 定位解算的迭代序列 在实际定位中,可能还结合其他类型的观测资料,如频率资料等加伪距资料联合定位, 这样定位精度将会更高。 实验 13.298147 4743.96E-06 23 -2604.29108 3364.29039 3364.295198 4743.959154 6.959153 6.295088 4743.959155 6.959154 6.29106 3364.29106 3364.959154 6.295199 4743.959285 6.29106 3364.96E-06 17 -2604.959154 6.29106 3364.29106 3364.29105 3364.295199 4743.295199 4743.29106 3364.96E-06 26 -2604.959154 6.959154 6.2952 4743.295187 4743.29106 3364.29106 3364.294211 4743.29106 3364.96E-06 20 -2604.295203 4743.295199 4743.959168 6.96E-06 12 -2604.959149 6.295199 4743.295199 4743.97E-06 11 -2604.960317 6.96E-06 28 -2604.295199 4743.29098 3364.959154 6.295199 4743.959154 6.96E-06 表 13.29106 3364.29106 3364.29106 3364.959154 6.96E-06 22 -2604.96E-06 18 -2604.3 所示,图中显示北京站可以 接受到数颗卫星信号,而目前太平洋上的某船只发出的信号被两颗卫星转发到北京站。 .96E-06 25 -2604.95911 6.96E-06 16 -2604.96E-06 19 -2604.29106 3364.29128 3364.96E-06 15 -2604.959154 6.MATLAB 数值分析与应用 613 10 -2604.295237 4743.96E-06 13 -2604.3 全球搜救系统的伪距定位方法 实验基本原理 前两个实验中的定位原理是采取被动式定位,这与 GPS 系统中的定位方式比较接近。 用户直接接受卫星广播星历进行定位。而接下来几个实验采取主动式定位,伽利略系统中的 搜救系统就是采用这一方式。 假设用户在地球上某一处遇险(如海事活动) ,如果用户配备专门的信标机,用户可以 向卫星发射信号,这一信号经过卫星转发到相关地面站,通常信号分为频率信号和时间信号, 地面站通过到达的信号进行解算出用户在地球上的位置,然后通知相关救援组织进行救援。 如果采用伪距定位方式,地面站只根据信号到达的各个时刻这一点信息就可以确定用户位 置。如果是频率信号,则仅凭借频率信息同样可以定出用户位置。 以上就是定位的基本概述,其定位原理可以参考图形 13.959154 6.96E-06 21 -2604.29304 3364.96E-06 27 -2604.96E-06 14 -2604.295199 4743.295531 4743.96E-06 24 -2604.

exe .3 全球搜救系统的示意图 以上就是搜救系统定位的基本原理,具体的数学原理, 我们直接结合实验操作部分介绍, 便于理解每一步的操作的意义。 实验目的与要求 l 理解伪距定位的基本原理。 l 比较实验中的定位方式与 GPS 中伪距定位方式的异同。 l 能把定位的基本方程表达为计算非线性方程组的标准形式。 l 能够把非线性方程线性化。 l 能够编程实现定位。 实验内容及数据来源 地面处理站在不同时刻各接受到一个时间信号,根据时间信号计算出求救者在地球上的 位置。地面处理站的位置是明确的,这里假设在北京站。在各接受时刻的卫星星历是已经知 道的,这可以通过导航系统本身获得。 就具体实验而言,先要假设用户求救地址已知,然后根据已有的信息模拟信号到达北京 站的时间。在模拟数据的基础上进行定位解算。 实验操作指导 光盘:\实验视频\chapter13.rar\13-3.MATLAB 614 数值分析与应用 图 13.

527701 4388.t.901474 4070. zu .458.m 保存。 . end f=f'.:)). end c=299792.:))+c*t-c*tt(i)+norm(rm-sat(i. [m.MATLAB 数值分析与应用 615 光盘:\实验代码\chapter13\ f_jia.n]=size(sat).rs ( ) + cτ − ct ( ) + rs ( ) − rm j j j X = ( xu .001156].rm) %ru 为用户位置 %t 为用户求救时刻 % tt 为信号到达 MELOUT 站的时间 是列向量 %sat 为卫星在地固坐标系中的位置 %sat 为矩阵 每一行表示一个卫星的三维坐标 共三列 %光速 单位 km/s %rm 为 MELOUT 站位置 .df_jia.m 步骤一:编写方程函数。 首先确定定位方法的伪距方程为 ( ) c t ( j ) − τ = ru . %输出 f 为列向量 以文件名 f_weiju.tt.τ ) T 有了上面的分析,就可以编写方程函数,打开 Editor 编辑器,输入以下语句。 function f=f_jia(ru.m.weiju_main. %t 为用户求救时刻,tt 为 MELOUT 站接收到信号时刻 for i=1:m f(i)=norm(ru-sat(i.m.如果该参数缺省 则为北京站 if nargin==4 rm=[-2177. yu .rs ( j ) + rs ( j ) − rm + δ1 + δ 2 + δ 3 其中下标 s 表示卫星,上标 j 表示第 j 颗卫星,下标 u 表示用户,下标 m 表示 MELOUT 站。上述方程的后几项表示信号经过电离层、对流程、相对论效应等影响。 为了方便利用非线性方程组的解法可以把方程写成标准形式 F ( X ) = ru .sat.

t.m 保存。 步骤三:编写仿真程序及实算程序。 上面两步为准备工作,下面先通过建立仿真程序得到仿真数据,然后完全在仿真数据上 进行定位解算。 仿真中假设用户在地球固联坐标系中的位置为  -4147.n]=size(sat).MATLAB 数值分析与应用 616 步骤二:编写偏导数矩阵函数。 对于上面的方程求偏导数得到      f' ( x ) =        xu − x1 ( xu − x1 ) + ( yu − y1 ) + ( zu − z1 ) 2 2 xu − x2 ( xu − x2 ) + ( yu − y2 ) + ( zu − z2 ) 2 2 yu − y1 .409214  R =  3480.:)-ru(j)).431434    在 t=0 时刻发出求救信号,信号经过卫星中转到地面处理站,然后有地面处理站给出求救者 2    .089542   3360.4)=c. 以文件名 df_weiju. 2 ( xu − xn ) + ( yu − yn ) + ( zu − zn ) 打开 Editor 编辑器,输入以下语句: %伪距定位多颗卫星导航的偏导数矩阵 function df=df_jia(ru. yu − yn ( xu − xn ) + ( yu − yn ) + ( zu − zn ) 2 2 2 . for i=1:m for j=1:3 df(i.458.j))/norm(sat(i. end end df(:. %光速 [m. 2 ( xu − x2 ) + ( yu − y2 ) + ( zu − z2 ) xu − xn ( xu − xn ) + ( yu − yn ) + ( zu − zn ) 2 2 .sat) %ru 为用户位置 %t 为用户求救时刻 % sat 为卫星数据 m 颗卫星共 m 行 2 M zu − zn 2 共三列每一列分别为卫星的 x,y,z c=299792.c .c  . 2 2 yu − y2 ( xu − x2 ) + ( yu − y2 ) + ( zu − z2 ) 2 M 2 zu − z1 .j)=(ru(j)-sat(i.c zu − z2 2 M 2 2 2 . 2 2 ( xu − x1 ) + ( yu − y1 ) + ( zu − z1 ) 2 . 2 ( xu − x1 ) + ( yu − y1 ) + ( zu − z1 ) 2 .

890128 -8397. %卫星 13 r5=[-22383. %卫星 23 28016. %卫星 5 r4=[-7134.089542 3360.651181 28296. %卫星 4 ru=[-4147. %---------------------------------以上为仿真平台 %以下为实际解算过程,计算中只知道信号到达地面处理站的时间 tt %卫星星历是已知的 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% .173063].796362].r4. %卫星 14 r3=[-1205.r3.431434].245613]. [m.901317 r2=[637.527324 12347. %求救位置 rm=[-2177.:)-ru)+norm(sat(i.MATLAB 数值分析与应用 617 在地球上的位置。但上面的数据仅限于做仿真数据,在实际解算中并不知道用户的位置以及 发射信号时间,这也正是待求的量。 打开 Editor 编辑器输入以下语句: %光速 单位 km/s c=299792.529244 16113. end tt=tt'.409214 3480.622323 2079.527701 4388.233168 5307. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 卫 星 数 据 %%%%%%%%%%%%%% %地固坐标系中的位置 r1=[-5384.r2.025036]. %卫星 22 r6=[ 16456.700040 18533.053841 9347.:)-rm))/c.205570].901474 4070.458.466571 28971.648836 23709.r6].001156].r5. %北京 %卫星的总数据 是一矩阵 每一行表示一个卫星 %总共 三列 sat=[r1.297933 ]. %求救信号 经 "卫星(i) " 转发到 MELOUT(北京)的时间 for i=1:m tt(i)=(norm(sat(i.n]=size(sat).282494 21199.

00000001. %精确的结果为 0 这里是迭代初值 ru=nj. df=df_jia(ru.t. t=t+dx(4).rm). %其实已经进行了最小二乘 ru(1)=ru(1)+dx(1). t=t0.t. for i=1:200 f=f_jia(ru.tt.sat). dx=-df\f. if tol<10-9 break end end disp('用户求救位置') ru disp('求救时刻') t disp('迭代次数') i 以文件名 weiju_main.MATLAB 数值分析与应用 618 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %%%%% 开始构造迭代 %迭代初值 x0 为求救者在地固坐标系中的位置 最后一项为初始 时间 % nj=[-2000 5000 t0= 0.m 保存。 在 MATLAB 中 .sat. ru(3)=ru(3)+dx(3). ru(2)=ru(2)+dx(2). tol=norm(dx(1:3)). 4000].

3604 求救时刻 t= 3.431434    越接近越好。 在命令窗口输入: >> weiju_main 回车得到: 用户求救位置 ru = 1.0793e-008 迭代次数 i= 6 实验结论 从运算结果来看,计算结果已经收敛。初值选取问题是收敛效果好坏的一个因素。实验 中,我们把仿真平台和解算平台放在同一个程序中,希望读者不要混淆两者的关系。关于计 算中的时间问题,实际上是对于任意一个时刻而言的相对时间。如果一开始记时时刻为 0, 则最后解算到用户求救时刻为 3.0e+003 * -4.089542   3360.4801 3.1473 3.409214  R =  3480.0793e-008,则表示计算的结果是用户在经过 3.MATLAB 619 数值分析与应用 步骤四:运行程序。 在运行程序之前,我们希望实际计算的结果跟仿真中的用户位置  -4147.0793e-008 秒 之后发出的信号。当然理想的计算结果是用户就在 0 时刻发出求救信号。 .

4 全球搜救系统的多普勒定位 实验基本原理 上一个实验介绍了伪距定位法的基本数学原理,与实现方法。这一实验介绍另外一种测 量手段——多普勒定位方法,多普勒定位方法其数学上相对而言复杂一些,但是多普勒定位 方法测量精度较高,所以也是定位中不可或缺的一种定位方法。 在图形 13.4 实验目的与要求 l 理解多普勒定位的基本原理及数学方法。 l 能够推导出多普勒频率定位的偏导数矩阵。 .4 中给出了多普勒定位的基本示意图。图中显示了某地面站可以接受到数颗 卫星发来的频率信号,而用户在海域遇险,通过导航卫星系统把信号转发到地面站。地面站 将通过发来不同频率的信号估计出用户在地球上的位置。 出于和上一个实验一样的考虑,为了更清楚的说明每一步操作的意义,我们将把数学原 理直接放到实验操作中介绍。 图 13.MATLAB 620 数值分析与应用 通过换算可以得到用户在太平洋北纬 32°,东经 140°遇险情。这时,地面处理站可以 通知全球搜救相关组织进行海上救援。 实验 13.

f ) 步骤二:推导出偏导数矩阵公式。 对于变形的多普勒频率方程求其 Jacobi 矩阵为 .m 步骤一:分析多普勒频率方程及其变形形式。 定位的多普勒频率方程为  f    v s ( rs .m.df.ru )  1 − g  + ∆F  1 − g  = FOA c rs .rm     其中下标 s、u、m 分别代表卫星用户与 MELOUT 站。 为了方便编程可以令 y= FOA − ∆F v s ( rs . yu . zu .rm 则方程函数变为  v (r .r )  F ( X ) = f 1 − s g s u  − y c rs .rar\13-4.dop.rm )   v s ( rs . f ) = ( xu .ru  c rs .m.MATLAB 621 l 能够编程实现函数矩阵及偏导数矩阵。 l 能够利用观测资料进行定位解算。 数值分析与应用 实验内容及数据来源 地面站在不同时刻接受到卫星导航系统的频率信号,这些信号来自于持有信标机的用户 发射的求救信号经卫星转发而至的。已知地面站在地固坐标系中的位置以及各转发卫星的星 历。根据这些信息计算出用户在地球上的位置。 实验操作指导 光盘:\实验视频\chapter13.ru   其中 X = ( ru .rm ) 1− g c rs .exe 光盘:\实验代码\chapter13\ dop_fun.duopule.

rs ) c ru . temp2(i)=1-1/c*(rs(i.rs 为使下标清晰,这里没有对卫星的当前下标标示。实际第 i 行对应第 i 颗卫星,第一行对应 第一颗卫星的相关数据,其他各行类同。 步骤三:编写多普勒频率方程函数。 打开 Editor 编辑器输入以下语句: %%%多普勒方法的方程函数 function F=dop_fun(f.FOA 输入时为(m,1)向量 %de_F 为卫星转发时候加的频率 %F 输出为(m,1)向量 c=299792.:)'/norm(rs(i.ru.rs ) ( zu − zs ) ru .:)-ru)*vs(i.rs 数值分析与应用 f g c ( xu − xs ) 2 + ( yu − ys ) 2 + ( zu − z s ) 2 f g c ( xu − xs )2 + ( yu − ys ) 2 + ( zu − z s ) 2 f g c ( xu − xs )2 + ( yu − ys )2 + ( zu − z s )2 a14 = 1 + vs g( ru . . for i=1:m temp(i)=1-1/c*(rs(i.de_F) %f 为用户发射频率,为标量 %ru 为用户位置, 输入时为(1,3)向量 %rs 为卫星位置, 输入时为(m.rs.rs vsy ru . y(i)=FOA(i)/temp(i)-de_F.:)'/norm(rs(i.3)矩阵,m 表示共有 m 颗卫星 %vs 为卫星速度, 输入时为(m.458.:)-rm)*vs(i.:)-ru).rs ) ( yu − ys ) ru .vs.rs − v s g( ru . %光速 [m.rs ) ( xu − xs ) ru .FOA.:)-rm).rs vsz ru .3)矩阵 %rm 为 MELOUT 站位置 ,输入时候为(1,3)向量 %FOA 为 MELOUT 站接收到的频率.rs − v s g( ru .rm.n]=size(rs).MATLAB 622 a11 = a12 = a13 = vsx ru .rs − v s g( ru .

rs.:)*(ru-rs(i.2)*norm(ru-rs(i)).:))'*(ru(1)-rs(i. %输出为列向量 以文件名 dop_fun.:)))^2.3)*norm(ru-rs(i)).m 保存。 步骤四:编写偏导数矩阵函数。 %多普勒方法的 Jacobi 矩阵 function df=dop_df(f.1)*norm(ru-rs(i)). 数值分析与应用 .3)矩阵 %vs 为卫星在地固坐标系中的速度 输入时为(m.:))'*(ru(2)-rs(i.:)). end F=F'.:)).2)=(temp1-temp2)/temp3/c.1)=(temp1-temp2)/temp3*f/c.MATLAB 623 F(i)=temp2(i)*f-y(i).:)). %第二列数据 temp1=f*vs(i. df(i.1))/norm(ru-rs(i.2))/norm(ru-rs(i.n]=size(rs). %光速 [m.2)*(ru(2)-rs(i.1))^2/norm(ru-rs(i. %temp2=vs(i.3))/norm(ru-rs(i.vs. for i=1:m temp1=vs(i.rm) %多普勒定位的偏导数矩阵 %f 为用户求救发出的信号频率 %ru 为用户在地固坐标系中的位置 %rs 为卫星在地固坐标系中的位置 输入时为(m. %temp2=f*vs(i.ru.1)*(ru(1)-rs(i.:)).2))^2/norm(ru-rs(i.:))'*(ru(3)-rs(i.458. temp2=vs(i.:)). temp3=(norm(ru-rs(i.:)*(ru-rs(i.:)))^2. %第一列数据 temp1=f*vs(i.:)*(ru-rs(i. temp3=(norm(ru-rs(i.3)矩阵 %rm 为 MELOUT 站在地固坐标系中的位置 c=299792. temp2=vs(i. temp2=vs(i. df(i.

719185].782445 2079.233168 4..3)=(temp1-temp2)/temp3/c. %第三列数据 df(i..:)). 0.m 保存。 步骤五:编写主函数。 主函数前部分为模拟,用于产生接受频率。假设用户在地固坐标系中  4051.527324 0.356781 sat5=[-22383..375658. 23709.519054 sat3=[-1205. %satellite21 .042952 sat4=[-7134..130057]..088201 velocity of satellite 28971. -1...529244 2..589323].204502].384526].648836 3.101457 -0..025036.423937  R =  -2890.457554 -577.:)'/c/norm(ru-rs(i...297933.989081 -3..796362. df(i.MATLAB 数值分析与应用 624 %temp2=f*vs(i.851609 %satellite14 -8397.:)).4)=1+(ru-rs(i..706937].700040 3.916747 -0..053841 9347.. -2..629060 sat6=[16456.555039 18533. 0..493148 12347.3)*(ru(1)-rs(i.526563].643501    发射求救信号,发射频率是 406MHZ。在实际解算过程中,这两个值是不知道的,也是待求 的问题。假设 MELOUT 站在北京,这个是知道的。 打开 Editor 编辑器,输入以下语句: %velocity of light c=299792.511543 4.863646]. %satellite4 26977.386823 sat7=[-11568.312423. %satellite13 5307.245613..282494 2.199533 0.061760 5.. %fixed positon and sat1=[-5384..:)))^2. %satellite12 6051.:))*vs(i.386079   3975. %satellite5 16113. 28296.648243 sat2=[637.890128 -0..651181 -0...458. -1. %satellite23 28016.205570.105412 -3328. %satellite22 21199.3))^2/norm(ru-rs(i.622323 1..173063.901317 5. -0. %第四列数据 end 以文件名 dop_df. 0.466571 3.091745 sat8=[-28908. temp3=(norm(ru-rs(i.

:)-ru)/c.423937 -2890. %转发增加频率 [m.:)'/norm(rs(i. for i=1:m temp1=(rs(i.包括位置和速度 ru=[4051.386079 3975.:)-rm)/c. %用户仿真数据 rm=[-513. temp1=f*(1-temp1)+de_F. %卫星速度数据,共 3 列,每一行表示一个卫星的速度 %%%%以下制造仿真数据 %假设用户求救频率 f 为 406MHZ.sat7.n]=size(rs).732137]. end %%%%%此时得到 MELOUT 站接受频率,以列向量输出 FOA=FOA'.MATLAB 625 数值分析与应用 sat=[sat1.956687 3515.:)'/norm(rs(i. FOA(i)=temp1*temp2. %%%%%%%%%%%%%%%% %%%%%%%%%%以上为仿真程序 %%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%一下为实际计算程序 %%%%%%%%%%%%%%%%%% .sat6. %所有卫星数据.sat8].sat4.643501].sat3.sat2. temp2=(rs(i. %巴黎地面站 %提取卫星数据 rs=sat(:. %用户发射频率 de_F=1140. temp2=1-temp2.4:6).:)-ru)*vs(i.:)-rm)*vs(i.sat5.转发时增加的频率 de_F 为 1140MHZ %以下通过仿真,计算出 MELOUT 站接受到各卫星转发的频率 FOA f=406. %卫星位置数据,共 3 列,每一行表示一个卫星的位置 vs=sat(:.1:3).705755 -5288.

MATLAB 626 nj=[4000 -3000 f0=400.rs.643501    而用户发射频率最好接近 406MHZ,如果偏差太大,表明计算不理想甚至是计算失败。下运 行之。在命令窗口输入: >>clear . dx=-dfun\fun. for i=1:500 fun=dop_fun(f.vs.m 保存。 步骤六:运行程序。 在程序运行之前,我们希望运行的结果是用户位置最好接近  4051.ru. f=f0.423937  R =  -2890. %设置初值,用户位置 %设置初值,用户发射频率 ru=nj.ru. ru(3)=ru(3)+dx(3). f=f+dx(4).de_F). dfun=dop_df(f.vs.FOA. tol=norm(dx(1:3)).386079   3975. 数值分析与应用 4000]. if tol<10-8 break end end disp('用户位置为') ru disp('用户发射频率为') f disp('实际迭代次数为') i 以文件名 duopule. ru(2)=ru(2)+dx(2). %在 MATLAB 中实际已经进行了最小二乘 ru(1)=ru(1)+dx(1).rm).rs.rm.

505deg      在解算出遇险目标在地球上的位置后,巴黎地面站可以通知国际相关救援组织对大西洋上的 遇险船只进行救援。 实验 13.5 多普勒与伪距的联合定位方法 实验基本原理 前两个实验分别介绍了多普勒与伪距定位的方法,事实上如果用户发射信号到卫星上之 .8911 3.0516 -2.MATLAB 627 数值分析与应用 >>clc >> duopule 用户位置为 ru = 1.0000 实际迭代次数为 i= 7 实验结论 计算结果已经给出了用户在地球固联坐标系中的位置,如果换算为经纬度则为  Latitude   3.0e+003 * 4.807deg   Longitude  =  -35.9760 用户发射频率为 f= 406.

lianhe_df.m.MATLAB 628 数值分析与应用 后卫星能把信号传到地面站,则两种信号都是有效的。这个实验中将介绍如何充分利用资料 信息进行定位解算。 从数学上而言,前面两个实验的重点就是计算超定非线性方程组,而不同资料之间各自 满足的数学关系式,其实可以形成一种更大规模的超定非线性方程组,这个实验将实现这一 方法。 在仿真的过程中,我们人为的制造观测随机误差去干扰测量值,然后通过计算给出用户 的实际位置。 实验目的与要求 l 能够理解联合定位的基本原理及数学方法的思想。 l 能够把不同观测资料组成的非线性方程组表达非线性方程组的标准形式。 l 能够对不同观测资料组成的定位方程进行线性化。 l 能够实现具体的定位解算。 实验内容及数据来源 已知观测站在地固坐标系中的位置,地面站连续的接受到各时刻的时间信号及频率信 号,这两个信号都来自持有信标机的用户发射的求救信号经卫星转发而至。其中频率信号到 达卫星时,卫星会在接受到信号的基础上增加一个固定的频率再往地面站转发频率信号。现 在要求根据时间信号和频率信号进行联合求解,给出求救者在地球上的位置。 实验操作指导 光盘:\实验视频\chapter13. lianhe_fun.m.m 实验为两部分,第一部分是仿真平台,用于产生仿真数据。第二部分为在仿真数据的基 础上进行实际解算。 【第一部分】 步骤一:准备实验的基本数据。 仿真时已经知道卫星的星历及卫星的速度。并假设用户在发生险情时发射信号通过卫星 中转到北京处理中心,信号分为时间信号和频率信号。北京处理中心在时间信号和频率信号 的基础上进行解算,给出用户的实际位置,在解算时并不知道用户的实际位置,如果解算结 .exe 光盘:\chapter13\lianhe_fangzhen.rar\13-5. lianhe_jiesuan.m.

362923 .454710 0.662085 16657.037353 -1.195954 20429.027234 27011.481080 27187.863646 -1208.449240 0.488968 -11506.049060 -1.077868 -0.313378 -3061.446254 -1723.450441 2.016868 13456.465156 1.063758 -0.740264 12970.782074 -1189.920656 0.902980 27856.335110 -0.395539 12723.395175 2.413411 -11435.473448 27106.104844 0.250674 -9755.309787 -0.229889 4.413875 4.651181 28296.463807 -11485.918259 -2.359783 20225.934682 -2.822713 -1228.433313 27211.253906 20823.025505 -1.329215 12847.589323 -11561.787136 -1253.514101 -11524.777853 表 13.094437 -1.583511 27234.049743 -0.459207 -0.851609 -2.761152 -0.992226 -1456.419559 2.3 卫星 4 的数据 -1205.328936 -10090.138189 20628.181654 -0.077759 -2258.101274 -0.445659 0.457554 0.427457 2.676501 0.990113 0.411545 2.707993 13576.289062 -8568.025036 -0.681083 16685.199533 -3328.458495 0.623220 28192.442899 2.042952 -0.001388 -1.183845 4.388177 -11406.806980 -0.060704 27914.277064 28084.278708 21106.085849 -0.109127 0.768683 -9923.562060 0.814053 -1234.505660 4.604538 16578.282494 21199.093492 -0.868411 -2.546187 16503.035044 27135.386823 2.457860 2.767217 13336.611936 21013.459790 4.756102 28028.024634 20529.373219 0.456598 0.015275 -2.545093 20726.076390 -8910.699988 16712.565725 16528.632307 0.557459 0.403416 2.072041 -1.692952 27162.983350 -2.438621 -11461.946142 12598.083313 -1.173063 0.890128 -8397.526563 16479.621689 13093.109192 -0.585176 16553.934299 0.796265 -1246.060623 -1.818343 -922.951006 -2.091745 4.847748 -1215.117246 -1.515165 0.458869 0.716859 0.252136 -2525.137794 4.831216 -1223.235612 28139.013516 -1.312423 0.431295 28245.681185 27972.539205 -11539.989123 -1.503483 27045.078344 -0.275921 4.300237 0.887313 -9250.974240 27076.025353 0.367920 4.999366 -2.3-13.070981 -0.982060 0.715047 -0.805237 -1239.216264 27796.901738 -2.608514 -0.458678 0.10 提供,表的前 3 列表示卫星在地固坐标系中的位置,后 3 列表 示卫星在地固坐标系中的速度,各行表示每经过一分钟卫星的数据更新。位置单位为 km, 速度单位为 km/s。 16456.457921 0.768576 -9587.527324 12347.142015 -1991.452258 0.564280 -11551.623811 16604.885121 -2.105412 -1.511543 26977.664194 -2793.718799 表 13.987831 12473.273275 20919.476022 -9080.643768 20327.642994 16630.404641 0.260250 -0.056679 -0.839561 -1219.316162 -9419.435238 2.112415 0.682628 -8739.008734 27736.321934 4.MATLAB 数值分析与应用 629 果显示用户与仿真时的数据非常接近,则说明解算基本成功,否则计算失败。这一部分就是 产生频率与时间信号,其中频率信号经过卫星时卫星在接收到信号的基础上增加 1140MHZ。 其中卫星数据由表 13.855777 -1211.966400 13215.412986 0.624673 0.4 卫星 5 的数据 -11568.967230 -2.

845086 -3.785559 4.081168 -0.553524 0.737861 28360.629060 4.429841 -1.937280 4.045408 7400.962291 9154.466571 28016.757322 18151.418452 -20542.253304 2125.213085 1060.165255 5113.185388 20102.270251 -0.394330 -21716.044553 2.524389 -1.260806 2339.807251 17560.555039 -1.297933 3.373143 17956.461464 20354.413673 -20783.053841 9347.545797 3.700040 18533.084029 4.191550 20850.392055 3.461195 7793.204502 848.548527 22960.292311 2.698601 3.547731 0.692836 3.979904 4.893182 -3.976775 5138.661130 23071.574188 0.887249 4.513360 3.102737 3.211794 5236.275266 2768.131809 4.772490 -6552.221645 23396.748720 2.713499 21093.769427 3.5 卫星 12 的数据 -7134.356781 3.534491 0.482474 5087.432647 表 13.408871 -21021.837154 -6093.130432 2.397474 -1.038453 2.980344 28181.7 卫星 14 的数据 -22383.815700 -6248.603406 -3.581952 3.644419 19590.894055 5061.196599 5260.068559 28320.221488 1272.384526 -22164.373326 18801.921935 表 13.169472 3.731346 3.571164 0.532365 0.965502 27255.524693 5284.426972 3.233168 5307.797591 4.405453 3.402257 8574.337648 表 13.103972 数值分析与应用 630 -655.125552 5188.355041 17156.529244 16113.026548 3.431666 22848.567586 0.209941 7597.660958 3.263868 -1.8 卫星 22 的数据 .364689 -1.6 卫星 13 的数据 637.493148 -0.316048 -0.314086 19330.794165 23180.951814 5163.551477 4.796901 -3.129310 -0.741330 2.200413 28465.563452 0.697099 28276.423207 -20299.361243 -0.033876 23606.144013 2.229712 1485.648836 23709.282223 表 13.332081 4.331489 -1.489759 16536.723954 2.062368 16326.566819 23501.MATLAB -11375.562962 3.833016 16745.628683 3.274375 3.858506 -5937.205570 2.802314 7989.900897 -5617.728885 -6847.558765 0.993723 8961.750736 -6700.441514 0.032457 -0.527047 0.989081 -3.852332 28073.900937 19067.768707 8379.785596 20604.044076 2.681745 4.924017 19848.297881 -1.700292 -3.986758 4.837069 28433.706937 -6992.223858 -0.493303 -1.879754 -5778.237757 1698.162605 2.748634 -3.941183 -3.972593 23289.707357 3.114042 16951.286138 22734.651880 -3.836673 4.519054 0.529526 3.427939 -20052.404047 -21255.533559 5212.176876 -0.461786 -1.554877 -3.035677 4.405828 -0.194437 3.245613 3.142219 8768.377155 3.064338 17759.087809 22620.245621 1912.389439 -21941.222226 3.578513 17359.449799 -0.733914 4.506298 -3.596016 3.541387 0.794145 -6401.671785 28398.229455 -1.268127 2553.461525 3.399199 -21487.667251 3.609865 3.236838 8184.656654 28230.495712 3.701236 28128.

213452 -0.464056 25510.txt、sat14.422800 1818.527701 rm =  4388.txt、sat5.628830 -0.732177 0.717330 14434.956839 -2.843864 -2249.726582 -3681.719131 0.181112 24196.486383 4.899428 5.117918 -2292.101457 -0.698020 17041.885831 23995.901317 28971.381655 -0.901474  km  4070.076283 24780.002048 4.737493 0.850061 -3.034323 -0.023325 29370.911950 4.088691 5.796362 5.892521 5.709142 15615.867409 -2120.711248 15323.622323 2079.001156    以下通过这些数据进行仿真得到信号到达地面处理站的时间与频率。假设用户发射频率是 406MHZ,但这数据仅在仿真中使用,在实际解算时并不知道用户的发射频率,发射频率也 是待求量之一。 .326050 -0.724793 -4023.696685 -0.967045 -0.099056 -0.736462 表 13.702586 16478.832836 5.517834 -2544.865124 -0.734917 -1965.899633 -0.188706 1775.9 卫星 23 的数据 14133.978513    地面处理站在地固坐标系中的位置为  -2177.672486 0.660762 1.041203 -0.298533  ru =  4743.024551 -2.648243 1.700323 16761.711404 0.793093 4.704811 16192.txt、sat22.178192 29430.830799 25332.775460 -3.737150 -3.634565 -2461.024006 25683.587748 5.653028 4.728330 -3339.695678 表 13.10 卫星 24 的数据 以上数据以 txt 文件形式放在 MATLAB 搜索路径中,在程序执行的时可以直接读入数 据,以上文件分别命名为 sat4.735416 29251.560888 -0.552579 25853.991046 -2.944715 29151.627175 29035.156475 -0.625728 29095.813098 -3.MATLAB 数值分析与应用 631 -5384.812721 5.082595 25152.265769 5.txt、sat12.691691 1906.715343 14732.731705 -2653.706996 15905.713315 15028.239875 -2376.719185 -5045.txt、sat13.907996 -2334.txt、sat23.588436 1862.390139 4.698175 -3.982925 -0.303059 29295.696462 2036.840780 4.921936 -2.040009 5.683414 0.886342 -3.880648 1731.txt。 用户在地固坐标系中的位置为  -2604.631970 29203.060544 -2206.751340 -2503.493693 1687.041013 5.150337 4.118045 24394.178104 24967.924229 -0.023475 1642.722964 -4364.702874 0.424781 -0.832096 -0.100805 4.658539 -3.492868 -0.739210 1949.805618 -0.269980 -0.291367 5.txt、 sat24.382979 29335.743160 -2163.726056 0.736403 24589.733332 -2309.297217  km  3364.693544 0.272308 29402.764444 -0.738207 1993.139817 -2419.721095 -4705.643785 5.730038 -2996.062882 4.

txt sat23 -ascii load sat24.001156].转发时增加的频率 de_F 为 1140MHZ %以下通过仿真,计算出 MELOUT 站接受到各卫星转发的频率 FOA f=406.:). %卫星速度数据,共 3 列,每一行表示一个卫星的速度 %%%%以下制造仿真数据 %假设用户求救频率 f 为 406MHZ. %各卫星数据每行表示 卫星在地固系中的位置和速度向量,每一列表示间隔一分钟后 %的卫星状态 load sat4.txt sat24 -ascii sat=[sat4(1.包括位置和速度 ru=[-2604.:). %有卫星数据.sat14(1.sat5(1.978513].MATLAB 632 数值分析与应用 步骤二:编写仿真函数。 打开 Editor 编辑器,输入以下语句: %%%%%%%%%%%% %%%伪距与多普勒联合定位方法 %velocity of light c=299792. %转发增加频率 %所 . %北京 %提取卫星数据 rs=sat(:.:)].:).:).txt sat5 -ascii load sat12.901474 4070.sat12(1.txt sat12 -ascii load sat13.txt sat14 -ascii load sat22. %用户发射频率 de_F=1140.458.sat24(1.1:3). [m.:).txt sat22 -ascii load sat23.n]=size(rs).527701 4388.4:6).sat13(1.:).sat22(1.:). %南京 rm=[-2177. %卫星位置数据,共 3 列,每一行表示一个卫星的位置 vs=sat(:.txt sat4 -ascii load sat5.297217 3364.298533 4743.sat23(1.txt sat13 -ascii load sat14.

FOA %仿真得到的频率,是为地面 MELOUT 站接受到的频率 %仿真得到的时间,是 MELOUT 站 从任一历元时刻的相对时间, tt %实际测量时可以任意取历元,并记录随后的时刻,也可以直接取第一个 %到达时刻为 0 %那么最后 解算得到用户发射时刻必然为一个负数 以文件名 lianhe_fangzhen. end tt=tt'.:)'/norm(rs(i.:)-rm)/c.:)-rm)*vs(i. temp2=1-temp2. temp2=(rs(i.1:3)-ru)+norm(sat(i.:)-ru)/c. end %%%%%此时得到 MELOUT 站接受频率,以列向量输出 FOA=FOA'. temp1=f*(1-temp1)+de_F.:)'/norm(rs(i.54600061607307 .m 保存。 步骤三:运行仿真程序,产生仿真数据。 在命令窗口输入: >> format long >> lianhe_fangzhen 回车得到: FOA = 1.0e+003 * 1. FOA(i)=temp1*temp2.1:3)-rm))/c. %以下用于产生仿真频率 for i=1:m temp1=(rs(i.:)-ru)*vs(i.MATLAB 633 数值分析与应用 %以下用于产生仿真时间 %求救信号(南京) 经 "卫星(i) " 转发到 MELOUT(北京)的时间 for i=1:m tt(i)=(norm(sat(i.

16217712768240 0.MATLAB 634 数值分析与应用 1.18397588836315 记录下 FOA 与 tt 数据为后面解算使用。 【第二部分】 步骤一:分析方程函数。 方程函数为伪距与频率的联合函数,事实上这是更大的一个非线性方程组。如果在某一 时刻有 n 颗卫星的观测数据,则非线性方程个数为 2n 个。下面给出方程函数 .16306569155443 0.17919264361589 0.54600549668749 1.15726251399996 0.54599370129674 tt = 0.54599718502428 1.54600273251882 1.17494578317460 0.16442053508359 0.17793984796296 0.54599568544321 1.54600106050714 1.54599637910458 1.

FOA.rs (1) f . c − ys( n) ) ( ru . ru .rs (1) ru .rs ( ) − F' ( x ) =  ru .rs (1) ( n) n) ) (z u − zs (n ) 2 表示第      ( v s (1) g ru .rs (1) f .de_F) u − zs (1) ( ru . f ) ,其它量由外部输入。 步骤二:分析偏导数矩阵。 xu − x1  .rs (n ) ( j) ) v s ( ) g ru .rs (1) ru .  2 c ru .rs (1)  M  n n v s ( ) g ru .rs (n ) vsy (1) ru .rs (1) − f . c.  ( n) r  u .MATLAB 数值分析与应用 635  r .0.rs ( ) ) .rs ( n )  .τ .rs ru .τ .rs ( ) − 上标 j 表示第 j 颗卫星的数据,vsx j 颗卫星在 y 方向的速度分量, vsz yu − y1 ru . c.rs  v s (1) g ru . zu .rs.1 + 2 表示第 j 颗卫星在 x 方向的速度分量,vsy 表示第 j 颗卫星在 z 方向的速度分量。 (z v s ( ) g ru .f.ru    (1) FOA  f 1 − −  − ∆ F (1) (1)    c r r   v rs .ru.tt. c ( j) (y (1) u − ys 2 ( ru . 0 zu − zn . f ) = ( xu .rs ( n n n vsz ( ) ru .rs (1) − f c ( v s (1) g ru .rm s u   1 − s  F ( X) =   (1)   r r c  s m    M         ( n) ( n)   ( n)  v r r   s s u FOA    f − − − ∆ F 1   (n) (n)  r r c   v r r s u s m    1 − s   (n)   r r c s m    ( ) ( ) ( ) ( ) j 其中 τ 表示用户求救时刻, t ( ) 表示地面站接受到信号的时刻(对应于第 j 颗卫星) , j FOA( ) 表示接受到第 j 颗卫星的转发回的频率, ∆F 表示信号经卫星转发时的增加频率。 上述函数中 X = ( ru .rs ( n ) ru .rm          v s (1) rs (1) .rs ( n )  ( ) ( ( ) ) ( ) .rs (1) (n ) 2 n) ) (y u ) zu − z1 .r (1) + cτ − ct (1) + rs (1) . ru .rs (1) yu − yn .rs ( ) − f .rm. c ) v s (1) g ru .rm  u s M   ru .rs (1) ru .rs f  2 c ru .rs ( n) + cτ − ct ( n) + rs ( n) .rs (n c ru .rs ( n n n vsy ( ) ru .0.  (1) r u .rs   M   xu − xn .rs (1) 步骤三:编写方程函数。 打开 Editor 编辑器,输入以下语句: %%%伪距与多普勒联合定位的方程函数 function F=lianhe_fun(t.rs ( )  n (n ) (n ) xu − xs ( )  vsx ru .rs (1)  1 1 xu − xs (1)  vsx ( ) ru .1 + ) 1 ( v s ( n ) g ru .rs ru . 0 vsz (1) ru . yu .rs ( n ) ( j) ) .rs − (n ) ru .vs.rs (1) c ru .

for i=1:m f1(i)=norm(ru-rs(i. end f2=f2'.m 保存。 步骤四:编写偏导数矩阵函数。 打开 Editor 编辑器,输入以下语句: %伪距联合多普勒方法的 Jacobi 矩阵函数 数值分析与应用 .:)'/norm(rs(i. temp2(i)=1-1/c*(rs(i.:)-ru). 以文件名 lianhe_fun. f2(i)=temp2(i)*f-y(i). for i=1:m temp(i)=1-1/c*(rs(i. %输出为列向量 F=[f1. end f1=f1'.:)-rm)*vs(i.:)'/norm(rs(i.FOA 输入时为(m,1)向量 %de_F 为卫星转发时候加的频率 %F 输出为(m,1)向量 c=299792.n]=size(rs).f2].:)-rm).:))+c*t-c*tt(i)+norm(rm-rs(i.MATLAB 636 %t 为用户求救时刻 %tt 为时间到达 MELOUT 站的时刻 %f 为用户发射频率,为标量 %ru 为用户位置, 输入时为(1,3)向量 %rs 为卫星位置, 输入时为(m.3)矩阵,m 表示共有 m 颗卫星 %vs 为卫星速度, 输入时为(m.458.3)矩阵 %rm 为 MELOUT 站位置 ,输入时候为(1,3)向量 %FOA 为 MELOUT 站接收到的频率. y(i)=FOA(i)/temp(i)-de_F. %光速 [m.:)).:)-ru)*vs(i.

:)*(ru-rs(i.vs.j))/norm(rs(i.458. %光速 [m.5).1))^2/norm(ru-rs(i.4)=c.j)=(ru(j)-rs(i.n]=size(rs). %%------------------------------------------------------------%多普勒部分 dpl=zeros(m. %temp2=vs(i.3)矩阵 %vs 为卫星在地固坐标系中的速度 输入时为(m. weiju=zeros(m.ru.:))'*(ru(1)-rs(i.1)=(temp1-temp2)/temp3*f/c. temp3=(norm(ru-rs(i.rs.5).rm) %w 伪距联合多普勒定位的偏导数矩阵 %t 为用户求救时刻 %f 为用户求救发出的信号频率 %ru 为用户在地固坐标系中的位置 %rs 为卫星在地固坐标系中的位置 输入时为(m.MATLAB 637 %多普勒方法的 Jacobi 矩阵 function df=lianhe_df(t.1)*norm(ru-rs(i)).1)*(ru(1)-rs(i. end end weiju(:.:)-ru(j)).:)). weiju(:.:)).5)=0.1))/norm(ru-rs(i.3)矩阵 %rm 为 MELOUT 站在地固坐标系中的位置 c=299792. for i=1:m temp1=vs(i. dpl(i.f. temp2=vs(i.:)))^2. %%%%%%%%%%%%%%伪距部分 for i=1:m for j=1:3 weiju(i. %第一列数据 数值分析与应用 .

m 保存。 步骤五:编写主函数进行解算。 打开 Editor 编辑器输入以下语句: %加噪声 %%%%%%%%%%%% %%%伪距与多普勒联合定位方法 %velocity of light c=299792.3))^2/norm(ru-rs(i.2)=(temp1-temp2)/temp3/c. %第三列数据 dpl(i. 以文件名 lianhe_df. temp2=vs(i.2))^2/norm(ru-rs(i. %temp2=f*vs(i.:)*(ru-rs(i.:))*vs(i.5)=1+(ru-rs(i. temp3=(norm(ru-rs(i.3)*norm(ru-rs(i)).MATLAB 638 数值分析与应用 temp1=f*vs(i. 4388.这是明确知道的 .:)).3))/norm(ru-rs(i.:)).:)))^2. dpl(i.458.:)). %第四列数据 end dpl(:.:)). rm=[-2177. temp3=(norm(ru-rs(i. %temp2=f*vs(i.2)*(ru(2)-rs(i.dpl]. %北京 .901474 %增发频率 4070.:)).:)'/c/norm(ru-rs(i.:)))^2.2))/norm(ru-rs(i.3)=(temp1-temp2)/temp3/c.:))'*(ru(2)-rs(i.527701 de_F=1140.:))'*(ru(3)-rs(i.2)*norm(ru-rs(i)). dpl(i. %第二列数据 temp1=f*vs(i. temp2=vs(i.3)*(ru(1)-rs(i.:)*(ru-rs(i.001156]. df=[weiju.4)=0.

txt sat14 -ascii load sat22.txt sat13 -ascii load sat14. %观测到的频率 FOA=FOA+(0.177939847962956 0.txt sat24 -ascii tt=[0.:). %有卫星数据.:).99370129674].00106050714 1545.:).162177127682404 0.157262513999962 0.包括位置和速度 %提取卫星数据 rs=sat(:.99718502428 1545.:).MATLAB 数值分析与应用 639 %以下为加载卫星数据 load sat4.163065691554433 0.99568544321 1546.1:3).sat22(1.:). %观测得到的时刻,是相对任一历元而言的时间差 tt=tt+(7e-6)*randn(size(tt)).164420535083587 0.174945783174601 0.179192643615886 0.183975888363151].:).txt sat23 -ascii load sat24.:)]. %加观测噪声 % sat=[sat4(1.txt sat12 -ascii load sat13.sat12(1.sat24(1. %加观测噪声 FOA=[1546.sat23(1.4:6).sat13(1. %卫星位置数据,共 3 列,每一行表示一个卫星的位置 vs=sat(:.:).txt sat4 -ascii load sat5. %卫星速度数据,共 3 列,每一行表示一个卫星的速度 %所 .txt sat22 -ascii load sat23.99637910458 1546.sat5(1.00061607307 1545.1e-3)*randn(size(FOA)).sat14(1.txt sat5 -ascii load sat12.00273251882 1545.00549668749 1546.

ru(2)=ru(2)+dx(2). if tol<10-8 break end end disp('用户位置为') ru disp('用户发射频率为') f disp('实际迭代次数为') i 以文件名 lianhe_jiesuan.ru. ru(3)=ru(3)+dx(3). for i=1:500 fun=lianhe_fun(t. tol=norm(dx(1:3)). f=f0. %设置初值,用户发射频率 t0=1e-5.m 保存。 .rm.f. %设置用户发射时间初值 数值分析与应用 3000].vs.rs.ru. dx=-dfun\fun. t=t+dx(4). %设置初值,用户位置 ru=nj. %在 MATLAB 中实际已经进行了最小二乘 ru(1)=ru(1)+dx(1).rs.de_F).f. dfun=lianhe_df(t.FOA. t=t0. f=f+dx(5).MATLAB 640 nj=[-3000 5000 f0=400.tt.rm).vs.

0e+003 * -2.7429 3.0000 实际迭代次数为 i= 6 实验结论 程序运行后,命令窗口的输出部分已经给出了计算结果,从结果可以看出这正是我们期 望的结果。解算过程是可靠的。 虽然我们在仿真时,人为的加噪声取污染测量数据,但是如果观测数据比较多,也就是 信息的冗余度比较大,则计算结果一般而言还是不错的,一般而言观测噪声可以根据实际情 况来加。 在实际的应用中,我们还要根据观测量的测量精度对不同的方程进行加权,这样的估计 才是一定意义下的最优估计,这里我们就不再继续深入的介绍下去。 .MATLAB 641 数值分析与应用 步骤六:运行主程序进行解算。 在命令窗口输入: >> lianhe_jiesuan 回车得到 用户位置为 ru = 1.3641 用户发射频率为 f= 406.6023 4.

MATLAB 642 数值分析与应用 本章小结 在这一章节中,主要介绍了几种类型的卫星导航方式。为了方便读者理解,我们从最基 本的最简单的三星定位逐步深入介绍到搜救系统的多种类型资料多颗卫星的联合定位方法。 在实际工程中,情况比上面的介绍的内容还要复杂,还要对各种系统误差进行修正,如电离 层、对流层、相对论效应等等。 相信读者通过本章的阅读,不仅掌握了导航定位的基本原理,更重要的是掌握了遇到问 题后的分析方法。当然,要实现这些方法,很多时候就需要依赖数值计算。 .

b ∈ P 。 习惯上第一种法则称为加法,后一种法则称为数乘。S、P、+与 g 一起,称为 S 在 P 上 的线性空间或向量空间,S 重点元素可以称为向量。 鉴于线性空间理论在线性代数或高等代数中已经做了详细的介绍,这里不过多阐述,简 单介绍两个线性空间的例子。 例 1.元素属于数域 C 上的 m × n 的矩阵全体对应法则按照矩阵加法以及数与矩阵的乘 法,构成 C 上的一个线性空间。读者可以逐条验证定义一中的条件,尽皆满足。 . a. ∀x ∈ S ; f) ( ab ) x = a ( bx ) . b ∈ P ; g) a ( x + y ) = ax + ay. a. y ∈ S 有 S 的唯一元素——记为 x + y 与之对应,而且满足下面四个条件: a) x + y = y + x. y. y ∈ S ; b) ( x + y ) + z = x + ( y + z ) , ∀x. y ∈ S . ∀x.MATLAB 643 数值分析与应用 附录一 数值分析中的泛函理论介绍 泛函分析理论源于经典数学理论的发展,其理论有高度的抽象性和普遍性,已经广泛渗 透到现代数学、物理、工程技术中。因此,泛函分析理论不仅是数学工作者,也是工程技术 人员必须要掌握的数学工具。泛函理论本身是非常优美的,但是学习起来比较抽象。这里只 打算用通俗的方式介绍与本教材有关的数值分析中常用的一些泛函基本理论。主要内容包括 度量空间,赋范线性空间,Bananch 空间以及 Hilbert 空间等。 1 线性空间与度量空间 泛函理论中有很多不同定义的数学上的空间。这些空间具有高度的概括性。附录里采用 这样的叙述方式,既先介绍定义,然后给出合适的例子加深理解。 首先回顾线性代数学中的线性空间的基础知识。 一 线性空间 定义 1 设 S 是一非空集合,P 是一数域,如果规定两种对应法则,使对任意的 x. a ∈ P ; h) ( a + b ) x = ax + bx. ∀x ∈ S . ∀x. ∀x. z ∈ S ; c) S 中存在唯一的一个元素记为 0,使得 x + 0 = x , ∀x ∈ S ; d) 每个 x ∈ S 于 S 中存在唯一的一个元素记为 − x ,使得 x + ( − x ) = 0 。 另一种法则使任意的 a ∈ P 与任意的 x ∈ S 有唯一的元素——记为 ag x 或简记为 ax 与 之对应,且满足以下四个条件: e) 1x = x.

y ) = 0 ⇔ x = y ; b) d ( x. d ) ,S 中的元素称为点。 下面给出度量空间的几个例子。 例 3 实数集 R 成为度量空间,如果对于任意的实数 x. y ) = x − y 。 ( 例 4 R 中,点 x = x . y ) = d ( y . b] 是定义在区间 [ a. z 成立。称函数 d 为 S 中的度量。因此,度量空间是 由集合 S 以及集合 S 上给定度量组成的序对 ( S . d ) 的点列 { xn : n ∈ N } 叫基本列或者叫柯西列,如果对任意小的 ε > 0 ,存在 N ,使用对任意的大于 N 的 m. n ∈ N ,满足 d ( xm . y . y ) 定义距离 d ( x.L . y ) 定义距离 1 2 n 1 p p  n d ( x. xn ) < ε 。 .MATLAB 数值分析与应用 644 例 2. C n [ a. z ) ≤ d ( x. y. y ) + d ( y. x n 1 2 n ) .L . x n 1 2 n ) . y ) =  ∑ x i − y i   i =1  可以验证这时也满足度量空间的条件,这里需要用到一个不等,称为 Minkowski 不等式 1 1 1 p  ∞ i  ∞ i p p  ∞ i p p i p ∑ x + y  ≤ ∑ x  + ∑ y   i =1   i =1   i =1  还可以构造出更复杂的度量空间的例子,这里不再举出。 三 完备的度量空间 定义 3 度量空间 ( S . y . b ] 上的具有 n 阶导数的实函数全体,对应法则取函数 的加法以及函数与数的乘法,构成实数域上的线性空间。 二 度量空间 定义 2 称集合 S 上装备了度量或者度量空间的结构,或称 S 是度量空间,如果指定了 函数 d :S×S → R 而且满足条件: a) d ( x. y = ( y .L. x . z ) 上述条件要求对 S 中任意的 x. x ) ; c) d ( x. y = ( y . y 规定 d ( x.L. y ) = 1 2 ∑( x i n i =1 n − yi ) 2 这时候,也满足度量空间的条件,是为度量空间。 ( 例 5 R 中,点 x = x . x .

xn ) ≤ qn d ( x1 . y ) 定理 1(Picard-Banach 不动点原理) 从完备度量空间 ( S . x1 = f ( x0 ) . L . y ) = ∑( x n i =1 i − yi ) 2 四 压缩映射原理 定义 6 称 a ∈ S 为映射 f : S → S 的不动点,如果 f (a) = a 定义 7 称从度量空间 ( S . d ) 到自身的映射 f : S → S 是压缩映射,如果存在数 q, 0<q<1,使得对于 S 中的任意两点 x.MATLAB 数值分析与应用 645 定义 4 称度量空间 ( S . f ( y ) ) ≤ qd ( x. x0 ) 1− q 给出。 2 赋范线性空间与 Banach 空间 在泛函分析中,特别重要而且有用的一类度量空间是赋范线性空间,在赋范线性空间中 的元素可以相加或者数乘,元素之间有距离,而且每个元素有类似普通响亮长度的所谓范数。 一 赋范线性空间 定义 8 设 X 是实域或复数域上的线性空间。把每个向量 x ∈ X 对应一个实数 x 的函 . d ) 的点列 { xn : n ∈ N } 收敛于 a ∈ S ,如果 lim d ( a. xn +1 = f ( xn ) . d ) 到自身中的压缩映射 f : S → S 有唯一的不动点。 不动点定理在很多存在唯一性定理的证明中是一个非常有力的工具,如微分方程、代数 方程、积分方程等。 压缩映射定理不仅证明了存在唯一性,而且还给出了求解的方法-逐次逼近方法。对于 任意的 x0 ∈ S ,迭代序列 x0 . d ) 是完备的,如果它的每个基本列都是收敛列。 n 例 6 空间 R 是完备的,其中的度量按照定义 d ( x. xn ) = 0 。 n →∞ 定义 5 称度量空间 ( S . y ,成立不等式 d ( f ( x ) .L 收敛到 a。收敛速度由估计式 d ( a.

b ] 是按给定的范数成为 Banach 空间。 例 8 空间 l ∞ ,对于每个 x = (ξ1 . y ) 是 X 上的距离,且 { xn } 依范数收敛于 a 等价于 { xn } 按距离 d ( x. y ∈ X ) 容易验证 d ( x. y ) 为由范数 x 导出的距离。所以赋范线性空间实际上是一种特殊的度量空间。 二 Banach 空间 定义 9 称完备的赋范线性空间称为 Banach 空间。 例 7 空间 C [ a. y ) 收敛 与 a。 称 d ( x. b ] ,定义范数 x = max x ( t ) a ≤t ≤b 容易验证 C [ a. ( x. ξ 2 .MATLAB 数值分析与应用 646 数 : X → R 称为线性空间 X 中的范数,如果它满足以下三个条件: a) x = 0 ⇔ x = 0; b) λ x = λ x , λ 为任意实数或复数; c) x+ y ≤ x + y 称在其上定义了范数的线性空间为赋范线性空间,称向量的范数值为这个向量的范数。设 { xn } 是赋范线性空间 X 中的点列,如果存在 a ∈ X ,使得 xn − a → 0 ( n → ∞ ) ,则称 { xn } 依范数收敛与 a,或强收敛与 a,记为 lim xn = a 。 n →∞ 如果令 d ( x.L) ∈ l ∞ ,定义范数 x = sup ξ j j 可以验证 l ∞ 按给出的范数成为 Banach 空间。 三 数值代数中的常用的向量范数 设 V 是复向量空间。函数 x :V a R 称为向量 x 的范数,若对所有的 x. y ∈ V ,下面 的范数公理成立: (1) x ≥ 0 ; . y ) = x − y . b ] ,对每个 x ∈ C [ a.

l∞ 范数分别是 l p 范数在 p = 1. C2 ∈ R ,使得 C1 x 四 β ≤ x α ≤ C2 x β 数值代数中常用的矩阵范数 作为一个算子,实矩阵 A ∈ R n× m 的范数记做 A ,它是矩阵 A 的实值函数,必须具有 以下性质: (1) A > 0 ,如果 A ≠ 0 ,并且 0 = 0 ; (2)对任意实数 c 有 cA = c A ; . l2 . l2 .5)T 的 l1 . 4. 2. ∞ 时的特殊情形。容易验证 l p 范数满足范 数的三个基本条件。 譬如向量 x = (3. l∞ 范数分别为 x 1 = 12 , x 2 =5 2, x 需要注意的是,向量空间的一切范数都是等价的,既对任意的两种范数 x α ∞ = 5。 和 x β 总存在 两个与该向量无关的常数 C1 .MATLAB 数值分析与应用 647 (1a) x = 0 ,当且仅当 x = 0 ; (2) cx = c x ,对所有的复常数 c 成立; (3) x + y ≤ x + y 。 根据需要,我们可以定义出各种范数,只要它满足上面的条件。下面给出一些常用的 范数: (1) l1 范数 n x = ∑ xi i =1 (2) l2 范数 x = 5. ∞ (3) l∞ 范数 x ∞ = max xi 1≤i ≤ n (4) l p 范数 n p x = (∑ xi )1/ p i =1 可以看出 l1 .

z = a x.且 x. ( x. z ∈ X ) . y. b ) ∈ C c) x. z + b y. y = y. y ,有一复数 x. x = 0 ⇔ x = 0. y ∈ X ) 则称 x. x ∈ X b) ax + by . x > 0 .MATLAB 数值分析与应用 648 (3) A + B ≤ A + B ; (4) AB ≤ A B 。 下面给出几种常用的矩阵范数: (1)Frobenius 范数 m A F 2 n = (∑∑ aij )1/ 2 i =1 j =1 (2) l p 范数 A p = max x ≠0 Ax x p p (3)行和范数与列和范数,分别为 n A row = max{∑ aij } 1≤i ≤ m j =1 m A col = max{∑ aij } spec = σ max = λmax 1≤ j ≤ n i =1 (4)谱范数 A 其中, σ max 是矩阵 A 的最大奇异值,即 A A 最大特征值 λmax 的平方根。 H 3 内积空间与 Hilbert 空间 n n Hilbert 空间是赋范线性空间的特例,一种最接近 R 的无限维空间。类似与 R 中有 n 个坐标,向量 n 个基向量一样,Hilbert 空间有可数个基向量。 一 内积空间 定义 10 设 X 是复线性空间,如果对于 X 中的任何两个向量 x. ( a. ( x. x . z . y 与之 对应,并且满足以下条件: a) x. y 为 x 与 y 的内积,X 称为内积空间。 .

y ∈ X ,有 x + y = x + y . x 完备,则称此内积空间为 Hilbert 空间。 例 9 l 2 空间。设 x = (ξ1 .L) ,定义内积 ∞ x. y 2 = x + x. x + y 2 2 y + y =( x + y ≤ x +2 x 2 2 ) 2 即 x + y ≤ x + y 。因此内积空间是一种特殊的赋范空间。如果按范数 x = x. y 成立 x. x + y. x + x. y + y. y = (η1 . ξ 3 . x 则 x 是 X 上由内积定义的范数。 二 Hilbert 空间 定理 2 (Schwarz 不等式)对于内积空间 X 中的任意元素 x. x + y = x.η3 . y ≤ x y 当且仅当 x,y 线性相关时取等号。 由 Schwarz 不等式,可以验证三角不等式。 ∀x.η 2 .L) . y = ∑ ξ iηi i =1 2 则 l 按此内成为 Hilbert 空间。 . ξ 2 . y + y.MATLAB 数值分析与应用 649 设 X 为内积空间,对于 x ∈ X 定义 x = x.

MATLAB 650 数值分析与应用 附录二 代码编辑器 UltraEdit 的使用 一般的软件开发系统都自行配置了代码编辑器,一个好的代码编辑器虽然不影响程序的 运行,但是对于程序的编写有很大帮助,能有效的提高工作效率。当然,使用 Windows 自 带的记事本也可以,不过无疑是很不方便的。 MATLAB 自行配备的代码编辑器 Editor,功能比较多,使用也比较方便,但是有时候 程序代码非常多的时候,我们需要一些中间代码编辑器,这里推荐 UltraEdit,这也是许多编 程朋友喜欢的工具。对于从事程序设计的人员来说,UltraEdit 的确是一款比较优秀的代码编 辑软件。尤其是支持多种语言的语法高亮,可以用来编写 c/c++/、c#、Delphi、Fortran、 MATLAB、Maple、HTML、Java 等几百种编程语言,而且是可以方便实现自行定义。用户 完全可以快速的自行定义自己的语言语法高亮。编辑器的界面如图 1。 图 1 UltraEdit 编辑器界面 如果你已经安装了该软件,可能界面的颜色和这里不一定相同,这完全是可以根据个人 习惯调整的。具体方法选择主菜单的“查看|设置颜色” ,如图 2 所示。 .

MATLAB 651 图2 弹出颜色设置对话框,如图 3 所示。 查看菜单 图 3 颜色设置对话框 数值分析与应用 .

MATLAB 652 数值分析与应用 这时可以根据需要调整对话框中的颜色,读者请自行查看调整一种颜色后,编辑器界面 的颜色变化。 下面介绍对 UltraEdit 配置 MATLAB 语法高亮的方法。 步骤一:选择主菜单的“高级”|“配置”命令,如图 4 所示。 图 4 高级菜单 这时弹出配置对话框,如图 5。 图 5 配置对话框 步骤二:选择语法着色对话框,用鼠标左键单击图 5 中作者圈住的部分,这时候对话框变为 图 6。 .

MATLAB 653 数值分析与应用 图 6 语法配置对话框 如果用鼠标左击图 6 中圆角矩形圈住部分,则下拉菜单中会显示当前你的版本已经有了 编程语法着色。 下一步要做的是修改一个名叫 wordfile.txt 的文件,这个文件在你安装 UltraEdit 的目录 下。可以通过图 6 中大椭圆圈住部分的路径找到,也可以直接用鼠标左键盘单击小椭圆圈住 部分打开,这时弹出一个文件,注意这个文件就是用 UltraEdit 打开的,如图 7。 .

"'<> .txt 文件 步骤三:初次打开 wordfile.txt 文件可能和图 7 中不同,不过这没有关系。找到文件的末尾 出,添加以下内容。 /L20"MATLAB 2008 " Nocase Line Comment = % String Chars = ' File Extensions = m M /Function String = "%[ ^t]++function*=[ ^t]++^([a-z0-9_]+^)" /Function String 1 = "%[ ^t]++function[ ^t]+^([a-z0-9_]+^)[ ^t]++[~=]" /Delimiters = ~!@$^&*()-+=|\/{}[]:.? /C1 break case catch else elseif end for function global if otherwise persistent return switch try while /C2 abs acos acosh add_annotation add_block add_line add_param all and any asin asinh assignin atan atan2 atanh .MATLAB 654 图7 数值分析与应用 UltraEdit 软件中的 wordfile. .

MATLAB 655 数值分析与应用 balance beep bitand bitcmp bitget bitor bitset bitshift bitxor builtin callstats cat cd ceil cell cell2struct cellhorzcat cells char chdir check_system chol cholinc cholupdate class clc clear clock close_system colon compare_system computer conj contourc conv2 copyobj cos cosh cputime ctranspose cumprod cumsum dbclear dbcont dbdown dbquit dbstack dbstatus dbstep dbstop dbtype dbup delete delete_annotation delete_block delete_line delete_param det diag diary diff disp display dongarra dos double dragrect drawnow echo eig eps eq error errortrap eval evalc evalin exist exit exp expm eye fclose feature feof ferror feval fft fftn fftw fgets fieldnames fields filesep fill fill3 filter find find_system findpackage findstr findtype finite fix floor fopen format fprintf frame2im fread fscanf fschange fseek ftell full func2str functions functionscalled fwrite ge getenv getframe gs_get_buttonmotion gt handle handle2struct hardcopy hcreate help hess hittest home horzcat hregister i ieee ifft ifftn im2frame imag import inf Inf inferiorto inmem input inputname int16 int32 int8 inv isa iscell ischar isempty isequal isfinite isglobal ishandle isieee isinf isjava isletter islogical isnan isreal isruntime isspace issparse isstr isstudent j java javaArray javaMethod javaObject java_array java_method java_object keyboard lasterr lastwarn ldivide le length license load log log2 logical loglog lookfor lower lt ltitr lu luinc magic matlabpath matlabroot max methods mexext mfilename mimofr min minus mislocked mldivide mlock mod more movie mpower mrdivide mtimes munlock nan NaN nargin nargout ndims ne new_system norm not numel ones open_system or pack pause permute pfile pi plot plot3 plus pow2 power prod qr qrupdate quit qz rand randn rbbox rcond rdivide real rehash rem reset reshape rmappdata round rtwgen runtime save save_system schur selectmoveresize semilogx semilogy setappdata setstr sign sim simulink simver sin single sinh size sldebug sort sparse sparsfun sprintf sqrt sscanf str2func strcmp strcmpi strfind string strncmp strncmpi strrep struct struct2cell struct2handle subsasgn subsindex subsref sum superiorto svd system system_dependent tan tanh tic times toc transpose tril triu trmginput type .

MATLAB 656 数值分析与应用 u_convert_to_gobject uigetfile uimenufcn uint16 uint32 uint8 uipushtool uiputfile uisetcolor uisetfont uitoggletool uitoolbar uminus unix uplus upper version vertcat vms waitfor waitforbuttonpress warning what which who whos xlate zeros /C3 axes dir figure findobj gcbf gcbo gcf gco get get_param gcbh image light line patch pwd rectangle set set_param sf surface text uicontrol uimenu uicontextmenu /C4 + = // / \ % & > < ^ ! { } | 这里对首行内容做一介绍,L20 表示 MATLAB 语言在你的编辑器中,认为是第 20 个可 以高亮的语法,排在之前的可能是 c、java 或者是空白的。可以修改数字 20,当然这要保证 没有其他语言的序号是 20。查看的方法是图 6 中圆角矩形的下拉菜单。或者选择主菜单的 “查看”|“语法着色类型”命令,如图 8 所示。 .

MATLAB 657 数值分析与应用 图 8 编辑器中的 MATLAB 语法着色 紧接着 L20 之后的是"MATLAB 2008 ",这表明本次添加语法高亮的语言名称,这完全 可以修改。 步骤四:这时用 UltraEdit 打开 MATLAB 的 m 文件,已经可以显示语法高亮了。随意打开 一个 m 文件,如图 9 所示。 .

MATLAB 658 数值分析与应用 图 9 MATLAB 的语法高亮效果 如果系统默认的 m 文件是使用 MATLAB 自带的 Editor 打开的话,可以用如下方法使默 认 UltraEdit 打开。找到任何一个 m 文件,鼠标右键击文件,弹出对话框如图 10。 .

MATLAB 659 图 10 右击文件弹出的对话框 选择属性后,弹出对话框如图 11。 数值分析与应用 .

Inc 公司所作,而是编程开发用户 第三方所编写,有时候可能会遗漏一些关键字等现象,这时候用户可以根据需要自行修改 wordfile.txt 文件。 添加完高亮文件以后,还可以根据个人需要自行修改高亮显示方式,如不同关键字、数 字、注释、普通文本等的属性。方法是鼠标左键单击图 6 中圆角矩形劝中的“语言”下拉菜 单,选择 MATLAB 语言,后选择图 6 中的颜色组(既包括关键字、数字、注释等)进行修 改。例如想把注释修改为绿色,且不需要背景色,则如图 13 所示。 .MATLAB 660 数值分析与应用 图 11 文件的属性对话框 这时候用鼠标左键单击图 11 中圈住的更改,弹出选择程序的对话框,如图 12。选择图 12 中圈住的 UltraEdit 后,m 文件默认的打开方式就变为 UltraEdit。 图 12 打开方式对话框 步骤五:上面的操作已经完成 MATLAB 语法高亮的添加工作了。一般而言,一种语法的高 亮文件往往并非 UltraEdit 开发商 IDM Computer Solutions.

MATLAB 661 数值分析与应用 图 13 MATLAB 的语法着色修改 至此,已经完成了 UltraEdit 语法高亮的设置,当然 UltraEdit 还有许多其他的优点,这 里就不多介绍。 注:步骤三中的添加部分的文件内容,读者不必自行逐词输入,在随书配置的光盘中,会给 出一些语言如 MATLAB、Maple、Fortran、Java、Delphi、HTML、Phyton、Basic、C/C++、 C#等常用语言的语法高亮文件。 .

MATLAB 662 数值分析与应用 附录三 程序调试方法 程序调试方法是编程工作中最重要且基础的一项技能之一。一个好的程序员不是希望在 程序编写过程中一次性的完全没有错误,而是在有错误的代码上能够通过程序调试快速找到 并改正错误。事实上,试图一次性完全没有错误的想法是很不切实际的,而且完全没有必要 的,尤其是面对大型的程序,有成千上万条语句。当然,养成良好的编程习惯,尽量在代码 编写中减少错误,这无疑是很重要的。 程序调试是一项实践性比较强的工作,可惜目前很多编程教材(无论是 MATLAB 或者 其他语言)中没有讲解,或者只是针对语言提供的帮助系统“理论性”的介绍,这样对很多 初学者还是难以掌握程序调试方法。而如前所言,程序调试是相当重要的。可以说没有掌握 程序调试方法,就并没有真正具备使用该语言处理复杂问题的能力。 不同的程序员有不同的调试习惯,程序调试方法也有许多。在学习程序调试时,不一定 要求全,但要有效,能解决问题。 粗略的说,程序错误可以分为两类,一类是语法错误,另一类是逻辑错误。语法错误是 比较容易找到的,才运行程序时,如果语法有错误则系统会自动给出错误信息。而逻辑错误, 则比较麻烦,计算机并不能检查出逻辑错误。因为计算机是按照人的意图来进行运算,而计 算机并不清楚人的意图。 为了解释逻辑错误,这里打个比方,在计算机工作空间中有 4 个变量 a=1、b=2、c=3、 d=4。现在程序员希望计算的是 a+d,而在代码中程序员错误的把 a+b 写成了 a+d,如果原 程序代码很多,而这一句只是在中间看上去很不起眼的一句。运行这段程序,结果当然是错 的。如果在检查代码后程序员发现了这个错误,当然会改正过来。但是计算机是永远不会发 现这个错误的,因为计算机并不知道程序员的意图,它以为也许程序员要计算的就是 a+b。 这就是所谓的逻辑错误的一种情况。当然在实际问题中,情况可能远要比这样复杂。解决逻 辑错误的,就需要有效的程序调试方法。 相比较而言,语法错误则简单的许多,比如在调用函数时候,不小心把函数名称写错了; 或者使用一个变量时,这个变量事先并没有任何的赋值或者声明;或者调用函数时候,参数 设置不符合原函数给定的输入类型或格式,这些问题计算机会自动给出错误信息,程序员也 很容易定位到错误的位置,从而改正错误。 如前面所述,程序调试是一项实践性比较强的工作,泛泛的给出一些调试图标或者给出 一些调试命令,对于许多初学者根本不容易掌握调试方法,所以这里将结合几个范例介绍程 序调试的一般步骤以及具体方法。在范例选择上基于以下考虑,如果范例过于简单,则显得 不能说明问题,而过于复杂则更是不可取,这往往让初学者搞不清重点而陷于问题本身。 一.计算机检查错误 【例 1】编写一个函数计算 sum = 1 + 2 + 3 +L n ,取 n=5 时的 sum。 为了说明调试过程,在程序编写中,我们故意写错一些内容,并假设在程序调试之前我 们并没有检查出来错误。 步骤一:编写函数文件。 打开 Editor 编辑器,输入以下语句: function s=fulu_ex1(n) for i=1:n s=s+i. .

m 保存。 步骤二:在命令窗口输入: >> x=0:0.m 保存。 步骤二:在命令窗口输入: >> fulu_ex1(5) 回车后,MALTAB 给出如下报错信息: ??? Undefined function or variable "s". end 修改后保存程序。 步骤三:重新运行程序。 在命令窗口输入: >> fulu_ex1(5) 回车得到: ans = 15 这时已经是我们需要的计算结果。 2 【例 2】编写一个函数 f ( x ) = x + x cos x ,然后对 x 从 0 到 6 之间间隔 0. >> y=fulu_ex2(x).MATLAB 663 数值分析与应用 end 以文件名 fulu_ex1. 回车后,MATLAB 给出如下报错信息: .1:6. Error in ==> fulu_ex1 at 4 s=s+i. 以文件名 fulu_ex2. for i=1:n s=s+i. 信息指出,程序中的“s”既没有指定为函数也没有指定为变量,程序的错误出现在函数 fulu_ex1 中的第 4 行。 略微一分析既可以知道在程序中我们希望 s 存储每次的连加计算结果, 但是没有对 s 赋初值。修改函数如下: function s=lianjia(n) s=0.1 取离散点列, 绘制出函数图象。 步骤一:编写函数文件。 打开 Editor 编辑器,输入以下语句: function f=fulu_ex2(x) f=x^2+x*cos(x).

%调用函数,计算函数值 >> plot(x.y.1:6. 信息指出出错的详细位置,同时指出了错误的原因。分析可以知道,我们希望是对离散点列 的每个值分别计算函数值,所以应该用数组乘法。修改原函数程序如下: function f=fulu_ex1(x) f=x.'*') >> grid 回车后得到函数图象,如图 1。 图 1 例 2 的运行结果 二.程序的手工调试 【例 3】编写一个函数可以计算 s ( x. >> y=fulu_ex2(x).MATLAB 664 数值分析与应用 ??? Error using ==> mpower Matrix must be square.*cos(x).n) %附录 2 范例 3 mi=1. 修改后保存文件。 步骤三:重新运行程序。 在命令窗口输入: >> clear >>clc >> x=0:0. Error in ==> fulu_ex2 at 2 f=x^2+x*cos(x).^2+x. . s=0. n ) = x + x 2 + x 3 +L x n 其中 x 和 n 由外部读入。 这个范例的正确程序如下: function s=fulu_ex3(x.

end 在命令窗口输入: >>fulu_ex3(2.3) = 2 + 2 2 + 23 = 14 我们期望的结果是 14 而不是 3。 下面我们开始着手调试这个程序。 步骤一:打开 Editor 编辑器,输入以下语句: n=4. s=0. for i=1:n mi=mi*mi.n) %附录 2 范例 3 mi=1.n) 以文件名 ex3_main. s=s+mi. f=fulu_ex3(x. x=2.3) 回车后得到 ans = 3 显然,这个答案是有问题的,事实上 s ( 2. end 假设我们开始没有正确编写出程序,而是把程序编写成了如下代码: function s=fulu_ex3(x.m 保存。我们已经估计错误出在函数 fulu_ex3()中,所以我们在数据 进入这个函数时设置一个断点。方法是鼠标点亮程序需要设断点所在的行,然后左键单击 。设置断点后,程序效果如图 2。 . s=s+mi.MATLAB 665 数值分析与应用 for i=1:n mi=mi*x.

MATLAB 666 数值分析与应用 图 2 设置断点的效果图 这时候就可以执行程序,当程序运行到断点时,会自动暂停。 步骤二:鼠标左键单击图 2 中的 按钮,执行程序如图 3。 图 3 程序执行到断点处的情况 可以看到图 3 中,比图 2 多了一个绿色箭头,表明程序已经执行到该断点处。同时发现 程序调试按钮全部被激活。 这时查看工作空间中的变量,会发现已经执行过的程序中变量的值,如图 4 所示。 .

MATLAB 667 数值分析与应用 图 4 执行过程中的工作空间变量 还有一个简洁的查看变量方法是鼠标放到断点之前的变量上,都会显示程序已经执行的 结果,如图 4 显示了 x 的值。 图 4 已经执行部分程序中变量 步骤三:程序调试需要使用到以下图标,其各自的功能如下: :添加断点,这功能在刚才已经用到,还可以在其他多处添加需要的断点。 :取消所有断点。 :程序向下执行一步。 :追踪到函数内部。 :将函数执行完,然后暂停。 :继续执行代码到下一断点处,如果后面没有断点则直接执行完程序。 :退出程序调试模式。 在这里,我们首先希望追踪到函数内部进行查找错误,于是可以单击 进入 fulu_ex3()函数内部,如图 5 所示。 。这时候程序 .

MATLAB 668 数值分析与应用 图 5 追踪到函数内部 我们判定出错部分肯定在循环中的内容,这时候可以在第 5 行加断点,然后直接点 图标,而不需要一行一行的单步执行,如图 6。当然这里只有两行程序,可以直接点 两 次执行到断点处,而一般的程序可能中间相隔很多行,这些中间行通过判断是没有错误的, 一步一步执行效率就太低了,可以直接设置断点,然后一次执行到可疑错误处。 图 6 程序执行进入循环部分 步骤四:单步执行程序。在程序执行到图形 6 后,采用单步执行程序,鼠标左键单击 次,向下执行两步后,可以查看 mi 变量的值,如图 7。 两 .

如果继续单步执行,则随着循环的增加 n 逐步增加,直 n 大于输入的 4 后跳出循环。其 实经过修改后程序已经正确。 步骤五:重新运行程序。这时鼠标左键单击图标 准 ,去掉所有断点。接着鼠标左键单击图 ,退出程序调试模式。在命令窗口输入: >> ex3_main 回车得到 f= 30 已经是正确答案。 在程序调试中,还可以用键盘输入的方法配合调试,如此达到人为修改变量的目的。 如程序在执行到第四步之前,查看 MATLAB 的命令窗口,如图 8。 图 8 调试中的命令窗口 .MATLAB 数值分析与应用 669 图 7 单步执行 可以看到这时 mi 的值为 1,这并不是我们想要的,我们希望 mi 是用来存储幂的,输入 的 x 为 2,n 等于 1 时候 mi 应该为 2 才对。于是我们把第 6 行的程序修改为 mi=mi*x.

MATLAB 670 数值分析与应用 在图形 8 中可以看到命令窗口显示 K>> 这是在等待用户输入,如输入 n K>> n 回车后得到: n = 4 K>> 可以看到,会显示当前变量的值,然后等待用户的下一个输入。事实上,还可以认为的 修改变量值,并在之后的程序执行中起作用。如现在用户希望这时候的乘幂之和已经达到 100,想看下一步的执行结果。在命令窗口输入: K>> s=100. K>> 然后鼠标左键单击图标 ,单步执行程序两次,这时 s 变为 102,如图 9 所示。 图 9 人为修改变量后的单步执行 需要说明的是,只是修改变量发生了变化,其他的量目前都没有变化。 三.条件断点方法 MATLAB 程序调试不仅允许逐步的单步执行,但往往在调试复杂程序时候,往往希望 程序在满足一定条件时到断点停止。 比如在编写一个迭代代码中,程序员希望迭代进行到 50 次以后程序暂停,让程序员查 看变量的值,并在此基础上继续进行单步执行调试,或者希望迭代的某控制小量达到一定指 标后,程序暂停,并继续后面的程序调试。虽然,这也可以用单步法一步一步执行,但效率 肯定是非常低的,而且容易出错。比如想在循环 1000 次以后暂停,采用单步执行就非常麻 烦。这时可以考虑使用条件断点方法。 【例 4】调用例 3 中的函数,计算 .

m 文件。修改程序如下: n=20.m 中的循环体在执行到第 10 次时暂停,等待下一步的调试工作。 步骤一:打开 ex3_main.MATLAB 671 数值分析与应用 s ( 2. x=2. f=fulu_ex3(x. 20 ) = 2 + 22 + 23 + L + 220 要求在函数 fulu_ex3.n) 修改后保存文件。 步骤二:在第三行加断点,并追踪到函数内部,如图 10。 图 10 设置一般断点 鼠标左键单击图标 ,显示结果如图 11。 图 11 循环体内的断点 步骤三:下面修改断点的属性,把鼠标方到图 11 中的第 6 行断点上,单击鼠标右键弹出菜 单如图 12。 .

MATLAB 672 数值分析与应用 图 12 修改断点属性的菜单 或者直接选择 Editor 主菜单的“Debug”|“Set/Modify Conditional Breakpoit” 。这时弹出条 件对话框,如图 13。 图 13 条件断点的设置对话框 步骤四:修改断点条件。默认的情况下断点是无条件的,既只要程序执行到该命令语句, MATLAB 就会停下来,等待用户下一步操作。在图 13 椭圆圈住的对话框里中输入 i>10 然后鼠标左键单击 按钮确认。 这时断点的颜色已经变为黄色,如图 14 所示。 .

MATLAB 673 数值分析与应用 图 14 条件断点 步骤五:向下执行程序。鼠标左简单击程序执行图标 ,程序在运行完 11 次以后暂停了, 因为 11 已经大于 10,符合了条件断点中设置的条件。这时查看工作空间中的变量,如图 15。 图 15 工作空间中的变量 可以看到 i 已经确实为 11,而其他量都是执行到当前步骤后这些变量的值。 上面介绍了 MATLAB 的程序调试方法,一般来说程序调试可以按照图 16 中的流程进 行,当然在实际操作时可以灵活处理。 .

MATLAB 数值分析与应用 674 有意识排除错误 计算机检查错误 手工调试 单步执行 条件断点设置 图 16 程序调试的一般步骤 到此,已经介绍了程序调试方法,当然这些问题需要在经常的进行调试中逐渐熟练。一 旦掌握了一种语言的调试方法,则其他语言(如 pascal、fortran 等)也都非常类似,很容易 自行掌握,基本不需要重复学习。 .

ustc.cn/ B. 综合程序库 1. CMLIB 程序库 美国国家科技研究所(NITS)的核心数学程序库,有大量不受版权限制的 Fortran 子程序的 集成。可以访问 .edu.cn/webpagenew/homepage.amss.cn/sjxy/index.sysu.cn/cps/site/mathematics/main/main.edu.nju.tsinghua.aspx 9. 中国科学技术大学数学系 http://math.htm 2. 计算数学与科学计算工程研究所 http://lsec.cn/ 6. 浙江大学数学系 http://www.cn/chinese/icmsec/indexcn.ecnu.asp 7. 清华大学数学系 http://math.edu.cn/ 4. 南京大学数学系 http://www.cn/Ch/ 10. 北京师范大学数学科学学院 http://math.edu.html 3. 北京大学数学科学学院 http://www.ac.zju.cn/ 8. 中山大学数学与计算科学学院 http://math.fudan.bnu.edu.cn/ 11. 华东师范大学数学系 http://math.htm 5. 复旦大学数学科学学院 http://math.cn/amss/index.math.ac.cc.edu.edu.MATLAB 675 数值分析与应用 附录四 常用数值分析理论及应用资源 A. 国内一些大学数学系及研究院所 1. 中国科学院数学与系统科学研究院 http://www.pku.edu.math.edu.

MATLAB 676 数值分析与应用 http://gams.mathworks.com 4. Scilab Scilab 是由法国国家计算机科学与控制研究院 INRIA 等人开发的一个集成系统。该软件类似 于 MATLAB,但目前与 MATLAB 还有一定差距。Scilad 是完全免费、开放源代码的,所以 这得到许多人的青睐。可以访问 http://www.org/ .gov/ 2. IMSL 程序库 由于 Visual Numerics 公司开发的 C#、C 和 Fortran 的数值程序库。在 Visual Fotran 专业版里 就包含 IMSL,不需要另外购买。可以访问 http://www.com/ 3. NAG 程序库 这是科学家、工程师等研究开发人员的 Fortran77/90 代码或 C 代码数值几统计程序库,涉到 数学、统计和最优化程序。程序的最大版本有 1000 个以上的程序。可以访问 http://www.com 3. Mathmatica 美国 Wolfram 公司研究开发的一套集成数学软件,尤其擅长符号计算,在图象处理方面也很 方便,但在数值分析方面要弱于 MATLAB。比较适合从事数学理论、物理理论的工作者。 因为创始人即原作者是一个物理学家所以整个软件风格也比较符合物理工作者的习惯。可以 访问 http://www.mathematica.com 2. Maple 由加拿大滑铁卢大学研究开发的包含符号、数值、图象处理的程序交互系统。MATLAB 的 符号工具箱内核就是基于该系统。可以访问 http://www.vni.com/ 4. SLATEC 美国能源部和能源科技中心的一个大型 Fortran 数学子程序集。具有可移植性、稳定性等特 点,而且稳当做的也非常出色。可以访问 http://www.nist.maplesoft.nag.energy.scilab.gov/ C. 交互系统 1. MATLAB 学习 MATLAB 的读者应该经常访问这个网站,在第一章里也做了介绍。读者可以访问 http://www.

Kurtis D.Fink 著,周潞等译.数值方法(第四版)北京: 电子工业出版社,2007. 27. 田根宝.考研数学一本通.北京:学苑出版社,2007. 28. 华东师范大学数学系编.数学分析(上、下册) (第三版) .北京:高等教育出版社, 2001. 29. 同济大学应用数学系.高等数学(上、下册) (第五版) .北京:高等教育出版社, 2002. 30. 史荣昌、魏丰编著.矩阵分析(第二版) .北京:北京理工大学出版社,2005. 31. 张贤达.矩阵分析与应用.北京:清华大学出版社,2004. 32. 张善杰等编著.实用计算方法.南京:南京大学出版社,2000. 33. 丁军、杨丽丽.科学与工程数值算法(Java 版) .北京:清华大学出版社,2003. .MATLAB 677 数值分析与应用 主要参考文献 1. 林成森.数值计算方法(上、下)(第二版) .北京:科学出版社,2005. 2. 冯康等编.数值计算方法.北京:国防工业出版社,1978. 3. 《现代应用数学手册》编委会编.现代应用数学手册,计算与数值分析卷.北京:清华 大学出版社,2005. 4. [俄] B.A.卓里奇著,蒋铎等译.数学分析(第一、二卷) .北京:高等教育出版社, 2006. 5. [美] David Kincaid、Ward Cheney 著,王国荣等译.数值分析.北京:机械工业出版社, 2005. 6. 张志涌、杨祖樱等编.MATLAB 教程.北京:北京航空航天大学出版社,2006. 7. 薛定宇、陈阳泉.高等应用数学问题的 MATLAB 求解.北京:清华大学出版社,2004. 8. 王正林等编.精通 MATLAB 科学计算.北京:电子工业出版社,2007. 9. 徐士良.常用算法程序集(C 语言描述) .北京:清华大学出版社,2004. 10. 刘林.人造地球卫星轨道力学.北京:高等教育出版社,1992. 11. 刘林.轨道力学.南京大学研究生讲义. 12. 刘林.人造地球卫星精密定轨.南大研究生讲义. 13. Byron D . Tapley 、 Bob E . Schutz 、 George H . Born . Statistical Orbit Determination.ELSEVIER ACADEMIC PRESS,2004. 14. A E Roy.Orbital Motion.Second Edition.Bristol:Adam Hilger Ltd. 15. CARL D.MURRAY、STANLEY F.DERMOTT.CAMBRIDGE UNIVERSITY PRESS,1999。 16. 刘利生等编著.卫星导航测量差分自校准融合技术.北京:国防工业出版社,2007. 17. 王高雄等.常微分方程(第二版) .北京:高等教育出版社,1983. 18. [俄] V.I.Anorld 著,沈家骐等译.常微分方程.北京:科学出版社,2006. 19. 吴晓燕等.MATLAB 在自动控制中的应用.西安:西安电子科技大学出版社,2006. 20. 阵仲、栗熙.大学数学.南京:南京大学出版社,1998. 21. 程其襄等.实变函数与泛函分析基础(第二版) .北京:高等教育出版社,2003. 22. 梁昆淼.数学物理方法.北京:高等教育出版社,1998. 23. 邵惠民.数学物理方法.北京:科学出版社,2004. 24. 何书元.应用时间序列分析.北京:北京大学出版社,2003. 25. 关治、陈景良.数值计算方法.北京:清华大学出版社,1990. 26. [美] John H.Mathews.

MATLAB 678 数值分析与应用 34. 邓建中、刘之行.计算方法(第二版) .西安:西安交通大学出版社,2001. 35. 周衍柏.理论力学教程(第二版) .北京:高等教育出版社,1985. 36. Cleve B.Moler.Numerical Computing with MATLAB.Society for Industrial and Applied Mathmatics.INC. 43. [美]G.H.戈卢布、C.F,范洛恩著,袁亚湘等译.矩阵计算.北京:科学出版 社,2001. 44. Willian H . Press 、 Saul A . Teukolsky 、 William T . Vetterling 、 Brian P.Flannery.NUMERICAL RECIPES(Third Editon) .Cambrige University Press.2004. 37. 北京大学数学系几何与代数教研室代数小组编.高等代数(第二版) .北京:高等 教育出版社,1988. 38. 李庆扬、王能超、易大义编.数值分析(第四版) .清华大学出版社、施普林格出 版社,2001. 39. [美] Pratap Misra、Per Enge 著,罗鸣等译.全球定位系统—信号、测量与性能.北 京:电子工业出版社,2008. 40. 张嗣瀛、高立群编著.现代控制理论.北京:清华大学出版社,2006. 41. 秦永元、张洪钺、汪叔华编著.卡尔曼滤波与组合导航原理.西安:西北工业大学 出版社,1998. 42. P.Venkataraman.APPLIED OPTIMIZATION WITH MATLAB PROGRAMMING.A WILEY-INTERSCIENCE PUBLICATION JOHN WILEY&SONS.2007. .

MATLAB 679 数值分析与应用 .

Sign up to vote on this title
UsefulNot useful