内容简介

MATLAB语言是进行科学计算的利器。《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》系统地论述了MATLAB的功能及使用MATLAB语言编程的方法。《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》内容包括MATLAB语言的常用数据结构和语句结构、矩阵的代数运算、c越函数的计算方法与数据处理的方法、MATLAB语言的流程控制结构与应用、MATLAB函数编写与调试,以及MATLAB的科学可视化方法。此外,《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》还介绍了MATLAB语言的接口设计、面向对象的程序设计方法与图形用户界面设计方法等。

薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》可作为一般读者学习和掌握MATLAB语言的工具书,也可作为高等学校理工科各类专业本科生与研究生学习计算机数学语言(MATLAB)的教材。

作者简介

薛定宇教授:分别在沈阳工业大学、东北大学和英国Sussex大学获得学士(1985年)、硕士(1988年)和博士学位(1992年),1997年任东北大学信息学院教授。深耕于计算机在数学与自动控制学科的应用,主持了国家精品课程建设,并于1996年在清华大学出版社出版《控制系统计算机辅助设计——MATLAB与应用》,该教材被认为是国内MATLAB应用领域具有深远影响的一部图书,为MATLAB在国内高校教学与科研中的普及起到了巨大的作用。薛定宇教授先后被评为辽宁省教学名师、辽宁省优秀教师,获得g家级教学成果二等奖。其主讲的“控制系统仿真与CAD”课程被评为g家级精品课程、g家级精品资源共享课程;主讲的“现代科学运算——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.1MATLAB命令窗口与基本命令14

2.1.1变量名命名规则14

2.1.2保留的常数·15

2.1.3显示格式的设置16

2.1.4底层操作系统命令16

2.1.5MATLAB的工作环境设置17

2.1.6MATLAB的工作空间与管理18

2.1.7MATLAB的其他辅助工具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.5MuPAD接口函数的编写·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.5MATLAB的基本语句结构·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.3Excel文件的读取与存储·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矩阵的比较运算483.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.1for循环结构·64

4.1.2while循环结构·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.1MATLAB的脚本程序·80

5.2MATLAB语言函数的基本结构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.4MATLAB程序的调试·93

5.4.1MATLAB程序的跟踪调试93

5.4.2伪代码与代码保密处理96

5.5MATLAB实时编辑器·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.2LATEX支持的修饰命令·115

6.2.3数学公式叠印与宏包设计1166.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.7MATLAB图形的输出方法·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.7Voronoi图与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.1C语言环境下提供的MATLAB变量格式及函数概述·174

8.1.1编译程序的环境设置174

8.1.2Mex下的数据结构175

8.1.3Mex文件的结构176

8.1.4Mex文件的编写方法与步骤·179

8.2不同数据结构的Mex处理180

8.2.1不同类型输入输出变元的处理·181

8.2.2字符串变量的读写181

8.2.3多维数组的处理183

8.2.4单元数组的处理184

8.2.5MAT文件的读写方法·1858.3C程序中直接调用MATLAB函数187

8.4MATLAB函数的独立程序转换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.2ftf对象的连接重载函数205

9.4.3分数阶传递函数的频域分析·207本章习题208

第10章MATLAB的图形用户界面设计技术209

10.1MATLAB语言图形界面编程基础·209

10.1.1MATLAB图形界面中各对象的关系·209

10.1.2窗口对象及属性设置210

10.1.3窗口的常用属性211

10.1.4对象属性的读取与修改·213

10.1.5简易对话框215

10.1.6标准对话框及其调用216

10.2MATLAB图形界面设计基本控件·219

10.2.1MATLAB支持的基本控件219

10.2.2控件的常用属性221

10.2.3控件句柄的获取221

·x·薛定宇教授大讲堂(卷I):MATLAB程序设计

10.3图形用户界面设计工具Guide222

10.4图形用户界面的高级技术·231

10.4.1菜单系统的设计231

10.4.2工具栏设计232

10.4.3ActiveX控件的嵌入与编程234

10.5工具箱的集成与发布·235本章习题235参考文献·237

MATLAB函数名索引·239术语索引·245

精彩书摘

  计算机数学语言概述
  MATLAB
  程序设计
  1.1数学问题计算机求解概述
  数学问题是科学研究中不可避免的问题。研究者通常将自己研究的问题用数学建模的方法建立数学模型,然后通过求解数学模型的方法获得所研究问题的解。建立数学模型需要所研究领域的专业知识,而有了数学模型则可以采用《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》介绍的通用数值方法或解析方法去直接求解。本章将首先对计算机数学语言进行简单介绍,通过实例介绍为什么需要学习计算机数学语言,然后介绍计算机数学语言和数学工具的发展简况。
  1.1.1为什么要学习计算机数学语言
  求解科学运算问题时手工推导当然是有用的,但并不是所有的问题都是能手工推导的,故需要由计算机完成相应的任务。用计算机求解的方式有两种,其一是用成型的数值分析算法、数值软件包与手工编程相结合的求解方法,其二是采用国际上有影响力的专门的计算机语言求解问题,这类语言包括MATLAB、Mathematica[1]、Maple[2]等,《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》统称之为“计算机数学语言”。顾名思义,用数值方法只能求解数值计算的问题,至于像公式推导等数学问题,例如求解x3+bx+c=0方程的解,在b、c不是给定数值时,数值分析的方式是没有用的,必须使用计算机数学语言求解。
  《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》将涉及问题的求解方法称为“数学运算”,以区别于传统意义下的“数学计算”,因为后者往往对应于数学问题的数值求解方法。《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》介绍的内容还尽可能地包括解析求解方法,如果解析解不存在则将介绍数值解方法。
  在系统介绍《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》的内容之前,先介绍几个例子,读者可以思考其中提出的问题,从中体会学习《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》的必要性。相应的MATLAB语句后面还将详细介绍。
    例1-1考虑一个“奥数”类题目:20172017的最后一位数是什么?  解如果不借助计算机工具,数学家用纸笔能计算出来的只有这个数的个位了。事
  ·2·薛定宇教授大讲堂(卷I):MATLAB程序设计
  实上,这样的解在现实生活中没有任何意义和价值,因为一个很昂贵的物品人们不会纠结其售价的个位数是1还是9,还是其他的什么数,人们更感兴趣的是这个数有多少位,其最高位是几,每位数是什么等。而对这些问题的求解,数学家是无能为力的,只能借助于专用的计算机工具求解。借助计算机数学语言,可以直接得出该数的精确值是390657···8177,共有6666位数,该数可以充满《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》的两页多。
    例1-2大学的高等数学课程介绍了微分与积分的概念和数学推导方法,实际应用中也可能遇到高阶导数的问题。已知f(x)=sinx/(x2+4x+3)这样的简单函数,如何求解出d4f(x)/dx4?  解这样的问题用手工推导是可行的,由高等数学的知识可以先得出函数的一阶导数df(t)/dx,对结果求导得出函数的二阶导数,对结果再求导得出三阶导数,继续进一步求导就能求出所需的d4f(x)/dx4,重复此方法还能求出更高阶的导数。这个过程比较机械,适合用计算机实现,用现有的计算机数学语言可以由一行语句求解问题:
  >>symsx;f=sin(x)/(x^2+4*x+3);y=diff(f,x,4)%描述原函数并直接求导上述语句得出的结果为
  d4f(t)sinx(2x+4)cosx(2x+4)2sinx
  =+4.12
  2
  dx4x2+4x+3(x2+4x+3)(x2+4x+3)3
  3
  sinx(2x+4)cosx(2x+4)cosx
  +12.24+48
  (x2+4x+3)2(x2+4x+3)4(x2+4x+3)3(2x+4)4sinx(2x+4)2sinxsinx
  +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矩阵
  11/21/3···1/n
  H=..1/2...1/3...1/4...···...1/(n+1)...
  1/n1/(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语言,可以用下面的命令直接求解该方程:
  >>symsxy;[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
  xs.t.3x1+4x2+5x3.x4.x5.62
  .
  
  x1,x2.0,x3.3.32,x4.0.678,x5.2.57
    解求解线性规划问题需要最优化类课程的基础知识。因为上述问题是有约束最优化问题,不能用高等数学中令目标函数导数为0、得出若干方程再用求解方程的方式求解最优化问题,而必须用线性规划中介绍的算法求解,例如使用如下代码:
  ·4·薛定宇教授大讲堂(卷I):MATLAB程序设计
  ……

前言/序言

  前 言
  PREFACE
  科学运算问题是每个理工科学生和科技工作者在课程学习、科学研究与工程实践中常常会遇到的问题,不容回避。对于非纯数学专业的学生和研究者而言,从底层全面学习相关数学问题的求解方法并非一件简单的事情,也不易得出复杂问题的解。所以,利用当前最先进的计算机工具,高效、准确、创造性地求解科学运算问题是一种行之有效的方法,尤其能够满足理工科人士的需求。
  作者曾试图在同一部著作中叙述各个数学分支典型问题的直接求解方法,通过清华大学出版社出版了《高等应用数学问题的MATLAB求解》。该书从2004年出版之后多次重印再版,并于2018年出版了第4版,还配套发布了全新的MOOC课程①,一直受到广泛的关注与欢迎。首次MOOC开课的选课人数接近14000人,教材内容也被数万篇期刊文章和学位论文引用。
  从作者首次使用MATLAB语言算起,已经有30年的时间了,通过相关领域的研究、思考与一线教学实践,积累了大量的实践经验资料。这些不可能在一部著作中全部介绍,所以与清华大学出版社策划与编写了这套“薛定宇教授大讲堂”系列著作,系统深入地介绍基于MATLAB语言与工具的科学运算问题的求解方法。
  本系列著作不是原来版本的简单改版,通过十余年的经验和资料积累,全面贯穿“再认识”的思想写作此书,深度融合科学运算数学知识与基于MATLAB的直接求解方法与技巧,力图更好地诠释计算机工具在每个数学分支的作用,帮助读者以不同的思维与视角了解工程数学问题的求解方法,创造性地得出问题的解。
  本系列著作卷I可以作为学习MATLAB入门知识的教材与参考书,也为读者深入学习与熟练掌握MATLAB语言编程技巧,深度理解科学运算领域MATLAB的应用奠定一个坚实的基础。后续每一卷试图对应一个数学专题或一门数学课程进行展开。整套系列著作的写作贯穿“计算思维”的思想,深度探讨该数学专题的问题求解方法。本系列著作既适合于学完相应的数学课程之后,深入学习利用计算
  .MOOC网址:https://www.icourse163.org/learn/NEU-1002660001
  ·ii·薛定宇教授大讲堂(卷I):MATLAB程序设计
  机工具的科学运算问题求解方法与技巧,也可作为相应数学课程同步学习的伴侣,在学习相应课程理论知识的同时,侧重学习基于计算机的数学问题求解方法,从另一个角度观察、审视数学课程所学的内容,扩大知识面,更好地学习、理解并实践相应的数学课程。
  《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》是系列著作的卷I。《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》系统介绍MATLAB语言编程方法,首先介绍MATLAB语言的常用数据结构和语句结构,然后介绍矩阵的代数运算、超越函数的计算方法与数据处理的方法,并介绍MATLAB的流程控制结构与应用、MAT-LAB函数编写与调试等编程技巧、MATLAB的科学可视化方法。《薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计》还介绍MAT-LAB语言的接口设计、面向对象的程序设计方法与图形用户界面设计方法等,旨在为读者继续学习科学运算或其他领域的知识奠定较好的基础。
  值此系列著作付梓之际,衷心感谢相濡以沫的妻子杨军教授,她数十年如一日的无私关怀是我坚持研究、教学与写作工作的巨大动力。
  薛定宇2019年5月

其他推荐