MATLAB语言是进行科学计算的利器。本书系统地论述了 MATLAB的功能及使用 MATLAB语言编程的方法。本书内容包括 MATLAB语言的常用数据结构和语句结构、矩阵的代数运算、c越函数的计算方法与数据处理的方法、 MATLAB语言的流程控制结构与应用、 MATLAB函数编写与调试,以及 MATLAB的科学可视化方法。此外,本书还介绍了 MATLAB语言的接口设计、面向对象的程序设计方法与图形用户界面设计方法等。
本书可作为一般读者学习和掌握 MATLAB语言的工具书,也可作为高等学校理工科各类专业本科生与研究生学习计算机数学语言(MATLAB)的教材。
计算机数学语言概述
MATLAB
程序设计
1.1数学问题计算机求解概述
数学问题是科学研究中不可避免的问题。研究者通常将自己研究的问题用数学建模的方法建立数学模型,然后通过求解数学模型的方法获得所研究问题的解。建立数学模型需要所研究领域的专业知识,而有了数学模型则可以采用本书介绍的通用数值方法或解析方法去直接求解。本章将首先对计算机数学语言进行简单介绍,通过实例介绍为什么需要学习计算机数学语言,然后介绍计算机数学语言和数学工具的发展简况。
1.1.1为什么要学习计算机数学语言
求解科学运算问题时手工推导当然是有用的,但并不是所有的问题都是能手工推导的,故需要由计算机完成相应的任务。用计算机求解的方式有两种,其一是用成型的数值分析算法、数值软件包与手工编程相结合的求解方法,其二是采用国际上有影响力的专门的计算机语言求解问题,这类语言包括 MATLAB、 Mathematica[1]、Maple[2]等,本书统称之为“计算机数学语言”。顾名思义,用数值方法只能求解数值计算的问题,至于像公式推导等数学问题,例如求解 x3 +bx+c = 0方程的解,在 b、c不是给定数值时,数值分析的方式是没有用的,必须使用计算机数学语言求解。
本书将涉及问题的求解方法称为“数学运算”,以区别于传统意义下的“数学计算”,因为后者往往对应于数学问题的数值求解方法。本书介绍的内容还尽可能地包括解析求解方法,如果解析解不存在则将介绍数值解方法。
在系统介绍本书的内容之前,先介绍几个例子,读者可以思考其中提出的问题,从中体会学习本书的必要性。相应的 MATLAB语句后面还将详细介绍。
例 1-1考虑一个“奥数”类题目:20172017的最后一位数是什么? 解如果不借助计算机工具,数学家用纸笔能计算出来的只有这个数的个位了。事
·2·薛定宇教授大讲堂(卷 I):MATLAB程序设计
实上,这样的解在现实生活中没有任何意义和价值,因为一个很昂贵的物品人们不会纠结其售价的个位数是 1还是 9,还是其他的什么数,人们更感兴趣的是这个数有多少位,其最高位是几,每位数是什么等。而对这些问题的求解,数学家是无能为力的,只能借助于专用的计算机工具求解。借助计算机数学语言,可以直接得出该数的精确值是 390657··· 8177,共有 6666位数,该数可以充满本书的两页多。
例 1-2大学的高等数学课程介绍了微分与积分的概念和数学推导方法,实际应用中也可能遇到高阶导数的问题。已知 f(x)= sin x/(x2 +4x + 3)这样的简单函数,如何求解出 d4f(x)/dx4? 解这样的问题用手工推导是可行的,由高等数学的知识可以先得出函数的一阶导数 df(t)/dx,对结果求导得出函数的二阶导数,对结果再求导得出三阶导数,继续进一步求导就能求出所需的 d4f(x)/dx4,重复此方法还能求出更高阶的导数。这个过程比较机械,适合用计算机实现,用现有的计算机数学语言可以由一行语句求解问题:
>> syms x; f=sin(x)/(x^2+4*x+3); y=diff(f,x,4) %描述原函数并直接求导上述语句得出的结果为
d4f(t) sin x (2x + 4) cos x (2x + 4)2 sin x
= +4 . 12
2
dx4 x2 +4x +3 (x2 +4x +3)(x2 +4x + 3)3
3
sin x (2x + 4)cos x (2x + 4) cos x
+12 . 24 +48
(x2 +4x + 3)2 (x2 +4x + 3)4 (x2 +4x + 3)3 (2x + 4)4 sin x (2x + 4)2 sin x sin x
+24 . 72 +24
(x2 +4x + 3)5 (x2 +4x + 3)4 (x2 +4x + 3)3
显然,若依赖手工推导,得出这样的结果需要很繁杂、细致的工作,稍有不慎就可能得出错误的结果,所以应该将这样的问题推给计算机去求解。实践表明,利用著名的 MATLAB语言,在 4s内就可以精确地求出 d100f(x)/dx100。
例 1-3还记得线性代数课程中介绍的求高阶矩阵的行列式的方法吗? 解线性代数课程介绍的通用方法是代数余子式的方法,可以将一个 n阶矩阵的行列式问题化简成 n个 n . 1阶行列式问题,而 n . 1阶又可以化简为 n . 2阶的问题,这样用递归的方法可以最终化简成一阶矩阵的行列式求解问题,而该问题是有解析解的,就是该一阶矩阵本身,所以数学家可以得出结论,任意阶矩阵的行列式都可以直接求解出解析解。
事实上,这样的结论忽略了计算复杂度问题,这样的算法计算量很大,高达 (n.
1)(n+1)!+n,例如 n = 25时,运算次数为 9.679×1027,相当于在每秒 12.54亿亿次的神威太湖之光(2017年世界上最快的超级计算机)上计算 204年,虽然用代数余子式的方法可以求解,但求解是不现实的。其实在某些领域中甚至需要求解成百上千阶矩阵的问题,所以用代数余子式的方法是不可行的。
数值分析中提供了求解行列式问题的各种算法,但有时传统的方法对某些矩阵会
得出错误的结果,特别是接近奇异的矩阵。考虑 Hilbert矩阵
1 1/2 1/3 · · · 1/n
H =.. 1/2 . . . 1/3 . . . 1/4 . . . · · · ... 1/(n + 1) . . .
1/n 1/(n + 1) 1/(n + 2) · · · 1/(2n . 1)
...
并假设 n = 80,用数值分析方法或软件很容易得出 det(H)=0的不精确结果,从而导致矩阵奇异这样的错误结论。事实上,用计算机数学语言 MATLAB很容易在 1.79s内得出该行列式的精确解为
1
det(H)=
⊕ 1.00979×10.3790
0
00000
全部 3789位,因排版的限制省略了中间的数字 求解一般高阶矩阵求逆问题需要计算机数学语言,对特殊的矩阵问题更需要这样的语言,以免得出错误的结果。本例采用的 MATLAB语句为
H=sym(hilb(80)); det(H)
例 1-4你会求解下面两个方程吗?
9903010146699347787886767841019251
86
···
. .. ..
x +3y3 +2z2 = 1/2
x + y = 35
{
x2 +3y + z3 =2
2x +4y = 94
x3 +2z +2y2 = 2/4
解第一个方程是鸡兔同笼问题,即使不使用计算机工具人们也可以直接求解。如果使用 MATLAB语言,可以用下面的命令直接求解该方程:
>> syms x y; [x0,y0]=vpasolve(x+y==35,2*x+4*y==94)
有了 MATLAB这样的高水平计算机语言,求解第二个方程与鸡兔同笼问题一样简单,只须将方程用符号表达式表示出来,就可以由 vpasolve()函数直接求解,得出方程的全部 27个根,将根代入方程,则误差范数达到 10.34级。第二个方程的代码如下:
>>symsxyz; %用符号表达式表示方程,更利于检验 f1(x,y,z)=x+3*y^3+2*z^2-1/2; f2(x,y,z)=x^2+3*y+z^3-2; %描述方程 f3(x,y,z)=x^3+2*z+2*y^2-2/4; [x0,y0,z0]=vpasolve(f1,f2,f3) size(x0), norm([f1(x0,y0,z0) f2(x0,y0,z0) f3(x0,y0,z0)])
例 1-5试求解下面的线性规划问题:
min (.2x1 . x2 . 4x3 . 3x4 . x5)
.2x2+x3+4x4+2x5.54
I
x s.t.3x1+4x2+5x3.x4.x5.62
.
x1,x2.0,x3.3.32,x4.0.678,x5.2.57
解求解线性规划问题需要最优化类课程的基础知识。因为上述问题是有约束最优化问题,不能用高等数学中令目标函数导数为 0、得出若干方程再用求解方程的方式求解最优化问题,而必须用线性规划中介绍的算法求解,例如使用如下代码:
·4·薛定宇教授大讲堂(卷 I):MATLAB程序设计
目 录
CONTENTS
第 1章计算机数学语言概述 1
1.1数学问题计算机求解概述 1
1.1.1为什么要学习计算机数学语言· 1
1.1.2数学问题的解析解与数值解· 4
1.1.3数学运算问题软件包发展概述· 5
1.1.4常规计算机语言的局限性 7
1.2计算机数学语言简介 8
1.2.1计算机数学语言的出现 8
1.2.2有代表性的计算机数学语言· 9
1.3科学运算问题的三步求解方法 10本章习题 12第 2章 MATLAB语言程序设计基础 13
2.1 MATLAB命令窗口与基本命令 14
2.1.1变量名命名规则 14
2.1.2保留的常数 · 15
2.1.3显示格式的设置 16
2.1.4底层操作系统命令 16
2.1.5 MATLAB的工作环境设置 17
2.1.6 MATLAB的工作空间与管理 18
2.1.7 MATLAB的其他辅助工具 18
2.2常用数据结构 · 19
2.2.1数值型数据 · 19
2.2.2符号型数据 · 20
2.2.3任意符号型矩阵的生成 22
2.2.4符号型函数 · 22
2.2.5整型变量与逻辑变量 22
2.2.6数据结构类型的识别 23
·iv·薛定宇教授大讲堂(卷 I):MATLAB程序设计
2.2.7矩阵的维数与长度 23
2.3字符串数据结构 · 24
2.3.1一般字符串的表示 24
2.3.2字符串的处理方法 24
2.3.3字符串的转换与读写方法 26
2.3.4字符串命令的执行 27
2.3.5 MuPAD接口函数的编写 · 27
2.4其他常用数据结构 28
2.4.1多维数组 · 28
2.4.2单元数组 · 29
2.4.3表格数据 · 30
2.4.4结构体 · 32
2.4.5其他数据结构 33
2.5 MATLAB的基本语句结构 · 33
2.5.1直接赋值语句 33
2.5.2函数调用语句 34
2.5.3多样的函数调用机制 34
2.5.4冒号表达式 · 34
2.5.5子矩阵的提取 35
2.5.6等间距行向量的生成 36
2.6数据文件的读取与存储 36
2.6.1数据文件的读取与存储命令· 36
2.6.2文件读写的底层方法 37
2.6.3 Excel文件的读取与存储 · 38本章习题 39
第 3章基本数学运算 · 42
3.1矩阵的代数运算 · 42
3.1.1矩阵的转置、翻转与旋转 · 42
3.1.2矩阵的加减乘除运算 44
3.1.3复数矩阵及其变换 45
3.1.4矩阵的乘方与开方 45
3.1.5矩阵的点运算 47
3.2矩阵的逻辑运算与比较运算 47
3.2.1矩阵的逻辑运算 47
3.2.2矩阵的比较运算 48 3.2.3矩阵元素的查询命令 48
3.2.4属性判定语句 49
3.3超越函数的计算 · 49
3.3.1指数与对数函数的计算 50
3.3.2三角函数的计算 50
3.3.3反三角函数的计算 52
3.3.4矩阵的超越函数 52
3.4符号表达式的化简与变换 54
3.4.1多项式的运算 54
3.4.2三角函数的变换与化简 55
3.4.3符号表达式的化简 55
3.4.4符号表达式的变量替换 56
3.4.5符号运算结果的转换 56
3.5基本数据运算 · 57
3.5.1数据的取整与有理化运算 57
3.5.2向量的排序、最大值与最小值 58
3.5.3数据的均值、方差与标准差 · 59
3.5.4质因数与质因式 60
3.5.5排列与组合 · 61本章习题 62
第 4章 MATLAB语言的流程结构 64
4.1循环结构 · 64
4.1.1 for循环结构 · 64
4.1.2 while循环结构 · 66
4.1.3迭代方法的循环实现 67
4.1.4循环结构的辅助语句 69
4.1.5向量化编程实现 69
4.2条件转移结构 · 71
4.2.1简单的条件转移结构 71
4.2.2条件转移结构的一般形式 72
4.2.3分段函数的向量化表示 74
4.3开关结构 · 75
4.4试探结构 · 77本章习题 78
·vi·薛定宇教授大讲堂(卷 I):MATLAB程序设计
第 5章函数编写与调试 80
5.1 MATLAB的脚本程序 · 80
5.2 MATLAB语言函数的基本结构 81
5.2.1函数的基本结构 81
5.2.2函数名的命令规则 83
5.2.3函数编写举例 83
5.3函数编写的技巧 · 86
5.3.1递归调用 · 86
5.3.2可变输入输出个数的处理 87
5.3.3输入变元的容错处理 89
5.3.4全局变量 · 89
5.3.5存取 MATLAB工作空间中的变量 90
5.3.6匿名函数与 inline函数 · 91
5.3.7子函数与私有函数 93
5.4 MATLAB程序的调试 · 93
5.4.1 MATLAB程序的跟踪调试 93
5.4.2伪代码与代码保密处理 96
5.5 MATLAB实时编辑器 · 96
5.5.1实时文档编辑界面 97
5.5.2建立一个简单的文档 97
5.5.3嵌入代码的运行 98
5.5.4在实时编辑器中嵌入其他对象· 99
5.5.5实时编辑文档的输出 101本章习题 101
第 6章二维图形绘制 · 105
6.1二维曲线的绘制 · 105
6.1.1二元数据的曲线绘制 105
6.1.2数学函数的曲线绘制 108
6.1.3分段函数的曲线绘制 108
6.1.4二维图形的标题处理 109
6.1.5多纵轴曲线的绘制 111
6.2图形修饰 · 112
6.2.1利用界面工具的修饰 113
6.2.2 LATEX支持的修饰命令 · 115
6.2.3数学公式叠印与宏包设计 116 6.3其他二维图形绘制语句 117
6.3.1极坐标曲线的绘制 117
6.3.2离散信号的图形表示 118
6.3.3直方图与饼图 120
6.3.4填充图 · 122
6.3.5对数坐标图 · 123
6.3.6误差限图 · 124
6.3.7动态轨迹显示 124
6.3.8二维动画的显示 124
6.4图形窗口的分割 · 125
6.4.1规范分割 · 125
6.4.2任意分割 · 126
6.5隐函数绘制及应用 128
6.6图像的显示与简单处理 130
6.6.1图像的输入 · 130
6.6.2图像的编辑与显示 131
6.6.3颜色空间转换 132
6.6.4边缘检测 · 132
6.6.5直方图均衡化 133
6.7 MATLAB图形的输出方法 · 134
6.7.1图形输出菜单与应用 134
6.7.2图形输出命令 135本章习题 136
第 7章三维图形表示 · 138
7.1三维曲线绘制 · 138
7.1.1三维曲线绘制命令 138
7.1.2已知数学函数的三维曲线绘制· 139
7.1.3三维填充图 · 140
7.1.4三维直方图与饼图 140
7.1.5条带图 · 142
7.2三维曲面绘制 · 144
7.2.1网格图与表面图 144
7.2.2表面图的阴影与光照 147
7.2.3图像文件的三维表面图 149
7.2.4已知函数的表面图 150
·viii·薛定宇教授大讲堂(卷 I):MATLAB程序设计
7.2.5散点数据的表面图绘制 151
7.3三维图形视角设置 152
7.3.1视角的定义 · 152
7.3.2三视图的设置 153
7.3.3任意视角的设置 153
7.4其他三维绘图 · 154
7.4.1等高线 · 154
7.4.2矢量图 · 155
7.4.3三元隐函数的绘图 156
7.4.4参数方程的表面图 158
7.4.5复变函数的三维表面图 158
7.4.6球面与柱面 · 159
7.4.7 Voronoi图与 Delaunay剖分 · 161
7.5三维图形的特殊处理 163
7.5.1三维曲面的旋转 163
7.5.2坐标轴变换的三维曲面 164
7.5.3三维图形的剪切 165
7.5.4三维表面图贴面处理 166
7.6四维图形绘制 · 167
7.6.1切片图 · 167
7.6.2体视化界面 · 168
7.6.3三维动画的制作与播放 169本章习题 171
第 8章 MATLAB语言与其他语言的接口· 173
8.1 C语言环境下提供的 MATLAB变量格式及函数概述 · 174
8.1.1编译程序的环境设置 174
8.1.2 Mex下的数据结构 175
8.1.3 Mex文件的结构 176
8.1.4 Mex文件的编写方法与步骤· 179
8.2不同数据结构的 Mex处理 180
8.2.1不同类型输入输出变元的处理· 181
8.2.2字符串变量的读写 181
8.2.3多维数组的处理 183
8.2.4单元数组的处理 184
8.2.5 MAT文件的读写方法 · 185 8.3 C程序中直接调用 MATLAB函数 187
8.4 MATLAB函数的独立程序转换 191本章习题 192
第 9章面向对象程序设计基础 193
9.1面向对象编程的基本概念 193
9.1.1类与对象 · 193
9.1.2类与对象数据结构 194
9.2类的设计 · 195
9.2.1类的设计方法 195
9.2.2类的定义与输入 196
9.2.3类的显示 · 197
9.3重载函数的编写 · 198
9.3.1加法的重载函数编写 198
9.3.2合并同类项的化简函数 199
9.3.3减法重载函数 200
9.3.4乘法重载函数 200
9.3.5乘方运算重载函数 202
9.3.6域的赋值与提取 203
9.4类的继承与扩展 · 203
9.4.1扩展类的定义与显示 204
9.4.2 ftf对象的连接重载函数 205
9.4.3分数阶传递函数的频域分析· 207本章习题 208
第 10章 MATLAB的图形用户界面设计技术 209
10.1 MATLAB语言图形界面编程基础 · 209
10.1.1 MATLAB图形界面中各对象的关系· 209
10.1.2窗口对象及属性设置 210
10.1.3窗口的常用属性 211
10.1.4对象属性的读取与修改· 213
10.1.5简易对话框 215
10.1.6标准对话框及其调用 216
10.2 MATLAB图形界面设计基本控件 · 219
10.2.1 MATLAB支持的基本控件 219
10.2.2控件的常用属性 221
10.2.3控件句柄的获取 221
·x·薛定宇教授大讲堂(卷 I):MATLAB程序设计
10.3图形用户界面设计工具 Guide 222
10.4图形用户界面的高级技术 · 231
10.4.1菜单系统的设计 231
10.4.2工具栏设计 232
10.4.3 ActiveX控件的嵌入与编程 234
10.5工具箱的集成与发布 · 235本章习题 235参考文献· 237
MATLAB函数名索引 · 239术语索引· 245
温馨提示:请使用泸西县图书馆的读者帐号和密码进行登录