描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302518686
视频公开课: 爱课程或中国大学MOOC(慕课) “现代科学运算——MATLAB语言与应用”“控制系统仿真与CAD”(非严格配套本书视频,仅供读者参考)。
配书源代码: 配书源代码可以到清华大学出版社网站本书页面下载。
薛定宇大讲堂系列图书将陆续出版:
薛定宇教授大讲堂(卷Ⅰ):MATLAB程序设计
薛定宇教授大讲堂(卷Ⅱ):MATLAB微积分运算
薛定宇教授大讲堂(卷Ⅲ):MATLAB线性代数运算
薛定宇教授大讲堂(卷Ⅳ):MATLAB*化计算
薛定宇教授大讲堂(卷Ⅴ):MATLAB微分方程求解
薛定宇教授大讲堂(卷Ⅵ):MATLAB/Simulink仿真
本书可作为一般读者学习和掌握 MATLAB语言的工具书,也可作为高等学校理工科各类专业本科生与研究生学习计算机数学语言(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
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程序设计
机工具的科学运算问题求解方法与技巧,也可作为相应数学课程同步学习的伴侣,在学习相应课程理论知识的同时,侧重学习基于计算机的数学问题求解方法,从另一个角度观察、审视数学课程所学的内容,扩大知识面,更好地学习、理解并实践相应的数学课程。
本书是系列著作的卷 I。本书系统介绍 MATLAB语言编程方法,首先介绍 MATLAB语言的常用数据结构和语句结构,然后介绍矩阵的代数运算、超越函数的计算方法与数据处理的方法,并介绍 MATLAB的流程控制结构与应用、MAT-LAB函数编写与调试等编程技巧、MATLAB的科学可视化方法。本书还介绍 MAT-LAB语言的接口设计、面向对象的程序设计方法与图形用户界面设计方法等,旨在为读者继续学习科学运算或其他领域的知识奠定较好的基础。
值此系列著作付梓之际,衷心感谢相濡以沫的妻子杨军教授,她数十年如一日的无私关怀是我坚持研究、教学与写作工作的巨大动力。
薛定宇 2019年 5月
人们有时习惯用其他计算机语言(如 C和 Fortran)解决科学计算问题。毋庸置疑,这些计算机语言在数学与工程问题的求解中起过很大的作用,而且它们曾经是实现 MATLAB这类高级语言的底层计算机语言。然而,对于一般科学研究者来说,利用 C这类语言去求解数学问题是远远不够的。首先,一般程序设计者无法编写出符号运算和公式推导类程序,只能编写数值计算程序;其次,数值分析类教科书中介绍的数值算法往往不是求解实际数学问题的最好方法;除了上述局限性外,若采用底层计算机语言编程,由于程序冗长难以验证,即使得出结果也不敢相信该结果。所以应该采用更可靠、更简洁的专门计算机数学语言来进行科学研究,因为这样可以将研究者从烦琐的底层编程中解放出来,更好地把握求解的问题,避免“只见树木、不见森林”的认识偏差,这无疑是受到更多研究者认可的解决问题方式。
例 1-8已知 Fibonacci序列的前两个元素为 a1 = a2 =1,随后的元素可以由 ak = ak.1 ak.2,k =3, 4, ···递推地计算出来。试用计算机列出该序列的前 100项。 解 C语言在编写程序之前需要首先给变量选择数据类型,因为此问题需要的是整数,所以很自然地会选择 int或 long表示序列的元素,若选择数据类型为 int,则可以编写出如下 C程序:
#include
main()
{ int a1, a2, a3, i;
a1=1; a2=1; printf(“%d %d “,a1,a2);
for (i=3; i<=100; i )
{ a3=a1 a2; printf(“%d “,a3); a1=a2; a2=a3;
}}
只用了上面几条语句,问题就看似轻易地被解决了。然而该程序是错误的!运行该程序会发现,该序列显示到第 24项突然会出现负数,而再显示下几项会发现时正时负。显然,上面的程序出了问题。问题出在 int整型变量的选择上,因为该数据类型能表示数值的范围为 (.32767, 32767),超出此范围则会导致错误的结果。即使采用 long整型数据定义,也只能保留 31位二进制数值,即保留 9位十进制有效数字,超过这个数仍然
·8·薛定宇教授大讲堂(卷 I):MATLAB程序设计
返回负值。可见,采用 C语言,如果某些细节考虑不周,则可能得出完全错误的结论。所以说 C这类语言得出的结果有时不大令人信服。用 MATLAB语言则不必考虑这些烦琐的问题,可以直接编写下面的底层程序:
>> a=[1 1]; for i=3:100, a(i)=a(i-1) a(i-2); end; a(end) %循环计算
另外,由于 long整型数据只能保持 9位有效数字,而 double型只能保留 15位有效数字,如果得出的结果超出此范围,则精度将存在局限性。采用 MATLAB的符号运算则可以避免这类问题,只需将第 1个语句修改成 a=sym([1,1])就可以得出 a100的值为 354224848179261915075,甚至用类似的语句都能在 24s内得出 a5000的全部 1045位有效数字,该结果是采用任何数值计算语言都无法得出的。
例 1-9试编写出两个矩阵 A和 B相乘的 C语言通用程序。 解如果 A为 n × p矩阵, B为 p × m矩阵,则由线性代数理论,可以得出 C矩阵,其矩阵元素为 p
∑
cij = aikbkj ,i =1, 2, ··· ,n, j =1, 2, ··· ,m
k=1
分析上面的算法,容易编写出 C语言程序,其核心部分为三重循环结构:
for (i=0; ic[i][j]=0; for (k=0; k
看起来这样一个通用程序通过这几条语句就解决了。事实不然,这个程序有个致命的漏洞,就是没考虑两个矩阵是不是可乘。如果 A矩阵的列数等于 B矩阵的行数,则两个矩阵可乘,所以很自然地想到应该加一个判定语句:
if A的列数不等于 B的行数,给出错误信息
其实这样的判定可能引入新的漏洞,因为若 A或 B为标量,则 A和 B无条件可乘,而增加上面的 if语句反而会给出错误信息。这样在原来的基础上还应该增加判定 A或 B是否为标量的语句。
其实即使考虑了上面所有的内容,程序还不是通用的程序,因为并未考虑矩阵为复数矩阵的情况。这也需要特殊的语句处理。
从这个例子可见,用 C这类语言处理某类标准问题时需要特别细心,否则难免会有漏洞,致使程序出现错误,或其通用性受到限制,甚至可能得出有误导性的结果。在 MATLAB语言中则没有必要考虑这样的琐碎问题,因为 A和 B矩阵的积由 C=A*B直接求取,若可乘则得出正确结果,如不可乘则给出出现问题的原因。
1.2计算机数学语言简介
1.2.1计算机数学语言的出现
MATLAB语言为数学问题的计算机求解,特别是控制系统的仿真领域起到了巨大的推动作用。 1978年美国 New Mexico大学计算机科学系的主任 Cleve Moler 教授认为用当时最先进的 EISPACK和 LINPACK软件包求解线性代数问题过程过于烦琐,所以构思一个名为 MATLAB(Matrix Laboratory,矩阵实验室)的交互式计算机语言。该语言一开始为免费版本, 1984年 The MathWorks公司(现名 MathWorks公司)成立,并推出了 1.0版。该语言的出现正赶上控制界基于状态空间的控制理论蓬勃发展的阶段,所以很快就引起了控制界学者的关注,出现了用 MATLAB语言编写的控制系统工具箱,在控制界产生了巨大的影响,成为控制界的标准计算机语言。后来由于控制界及相关领域提出的各种各样要求, MATLAB语言得到了持续发展,使得其功能越来越强大。可以说, MATLAB语言是由计算数学专家首创的,但是由控制界学者“捧红”的新型计算机语言。目前大部分工具箱都是面向自动控制和相关学科的,但随着 MATLAB语言的不断发展,目前也在其他领域广泛使用。稍后出现的 Mathematica及 Maple等语言也是当前应用广泛的计算机数学语言。
此外,法国计算机科学与控制研究院 INRIA开发的自由软件 Scilab也可以解决部分常用的数学问题,其最显著的特色是完全免费且源代码全部公开,但在求解数学问题的功能上尚无法和 MATLAB等计算机数学语言媲美。
1.2.2有代表性的计算机数学语言
目前在国际上有三种计算机数学语言最有影响力: MathWorks公司的 MAT-LAB语言、 Wolfram Research公司的 Mathematica语言和 Waterloo Maplesoft公司的 Maple语言。这三种语言各有特色,其中 MATLAB长于数值运算,其程序结构类似于其他计算机语言,因而编程很方便。 Mathematica和 Maple有强大的解析运算和数学公式推导、定理证明的功能,相应的数值计算能力比 MATLAB要弱,这两种语言更适合于纯数学领域的计算机求解。此外,德国的 MuPAD[10]也是较好的计算机数学语言。
与 Mathematica及 Maple相比, MATLAB语言的数值运算功能是很出色的。除此之外,更有一个另两种语言不可替代的优势,就是 MATLAB语言在各种各样的领域均有领域专家编写的工具箱,可以高效、可靠地解决各种各样的问题。 MATLAB符号运算工具箱采用 MuPAD为其符号运算引擎,有些符号运算的能力较以前版本有所改善,也有很多功能不如早期版本。从整体水平来看, MATLAB的符号运算能力在纯数学问题求解中不如 Mathematica与 Maple,从一般应用数学运算领域看,差距则不是太大,可以利用 MATLAB的符号运算功能很好地解决一般的科学运算问题。
本丛书采用 MATLAB语言为主要计算机数学语言,系统地介绍其在数学及一
·10·薛定宇教授大讲堂(卷 I):MATLAB程序设计
般科学运算问题求解中的应用。掌握了该语言将提高读者求解数学问题的能力,提高数学水平,拓广知识面,使得原来看似高深的应用数学问题的实际求解变得轻而易举。
本书是丛书的第一卷,将系统地介绍 MATLAB语言的编程方法与技巧。丛书的其他卷次将利用 MATLAB语言为主要工具,深入、系统地介绍每个数学分支的相关内容,可以从不同的角度重新学习与实践各个数学分支问题的直接求解,还可以利用 MATLAB这样的工具对相应的数学分支开展创造性的研究,得出别人没有观测到的结果。
1.3科学运算问题的三步求解方法
本书倡导一种科学运算问题的三步求解方法 [11],这三个步骤分别是“是什么”“如何描述”和“求解”。在“是什么”步骤中,侧重于数学问题的物理解释和含义。即使学生没有学习过相关的数学分支,也可能通过简单的语言叙述大致理解问题的物理含义。在“如何描述”步骤中,用户应该知道如何将数学问题用 MATLAB描述出来。在“求解”步骤中,用户应该知道调用哪个 MATLAB函数将原始数学问题直接求解出来。如果有现成的 MATLAB函数,则应该调用相应函数直接求解出问题;如果没有现成函数,则编写出通用程序得出问题的解。
例 1-10用例 1-5中的线性规划问题的求解演示三步求解方法。
min .2×1 . x2 . 4×3 . 3×4 . x5.2×2 x3 4×4 2×5.54
I
x s.t. 3×1 4×2 5×3.x4.x5.62
.
x1,x2.0,x3.3.32,x4.0.678,x5.2.57
解有的读者很可能没有系统地学习过最优化等相关的课程。不过不要紧,即使没有学习过相关的理论知识,也可以通过下面的三步求解方法得出问题的解。
(1)“是什么 ”。本步先理解每个数学问题的物理含义。在这个具体问题中,读者可以将原始问题从字面上理解为:在满足下面联立不等式约束
.
. 2×2 x3 4×4 2×5 . 54
3×1 4×2 5×3 . x4 . x5 . 62
. x1,x2 . 0,x3 . 3.32,x4 . 0.678,x5 . 2.57
的前提下,怎么发现一组决策变量 xi的值,能使得目标函数 f(x)= .2×1 . x2 . 4×3 . 3×4 . x5的值为最小。所以,即使没有学习过最优化课程的读者也不难从字面上理解该问题的数学公式。
(2)“如何描述 ”。读者将学会如何将数学问题用 MATLAB函数描述出来,在例
1-5的代码中,用下面的方法建立一个变量 P描述整个数学问题: >> clear; P.f=[-2 -1 -4 -3 -1]; %目标函数P.Aineq=[0 2 1 4 2; 3 4 5 -1 -1]; P.Bineq=[54 62]; %约束条件 P.solver=’linprog’; P.lb=[0;0;3.32;0.678;2.57]; %下边界 P.options=optimset; %将整个线性规划问题用结构体变量 P描述出来
(3)“求解”。调用线性规划求解函数 linprog()直接求解问题,得出问题的解。 >> x=linprog(P) %调用 linprog()函数求解数学问题
例 1-11人工神经网络是近年来应用较广泛的智能类数学工具,擅长于数据拟合与分类等运算。假设由下面的语句生成样本点数据:
>> x=0:0.1:pi; y=exp(-x).*sin(2*x 2);
试利用样本点建立人工神经网络模型,并绘制函数曲线。 解如果不想花时间或没有时间去学习人工神经网络的系统理论,只想使用神经网络解决本例的数据拟合问题,则可以考虑利用前面介绍的三步求解方法,花几分钟了解神经网络基本概念与使用方法,就能利用人工神经网络求解数据拟合问题。回到前面提及的三步求解方法:
(1)什么是人工神经网络。没有必要去了解人工神经网络的技术细节,只须将人工神经网络看作一个信息处理单元,它接受若干路信号进行处理,得出输出信号。
(2)将神经网络的数学模型建立起来,选择 fitnet()函数建立空白神经网络模型,
用 train()训练神经网络,得出可用的人工神经网络模型,如图 1-1所示。 >> net=fitnet(5); net=train(net,x,y), view(net)
图 1-1人工神经网络的结构
(3)使用神经网络绘制曲线,并与理论值比较,如图 1-2所示。可见,即使不系统学习人工神经网络,也可以直接利用人工神经网络解决实际问题。用户还可以调整神经网络的结构参数,如修改节点个数等,通过实践观察和比较不同参数下曲线拟合的效果。
>> t0=0:0.01:pi; y1=net(t0); y0=exp(-t0).*sin(2*t0 2);
plot(t0,y0,t0,y1)
从表面上看,本套系列著作涉及大量的数学公式,有些看起来很深奥。但是,即使读者的数学基础不是很好,也不要害怕,因为本套系列著作的目标不是讲解数学问题的底层细节,而是帮助读者在大概理解该问题物理含义的前提下,绕开底层烦
·12·薛定宇教授大讲堂(卷 I):MATLAB程序设计
图 1-2人工神经网络的数据拟合效果琐的数学求解方法,将问题用计算机能理解的格式推给计算机,直接得出问题可靠的解。借助计算机能提供的强大求解工具,读者求解实际应用数学问题的能力完全可以远超过不会或不擅用计算机工具的一流数学家。通过学习本书的内容,读者能显著地提高应用数学问题的实际求解水平。
本章习题
1.1在机器上安装
MATLAB语言环境,并输入 demo命令,由给出的菜单系统和对话框运行演示程序,领略 MATLAB语言在求解数学问题方面的能力与方法。
1.2考虑
“20172017”的例题。用 C语言常用的数据结构有可能表示该数据吗?如果不能,试利用 MATLAB计算该结果(提示:应该用 sym(2017)表示 2017)。
1.
3人们到底能记住圆周率 π的前多少位?试试 vpa(pi,50)命令,让计算机帮助“记忆”,将 50再换成更大的数试试。
3
1.
4科学运算问题靠记忆是不靠谱的,即使记得住 π,还能记得住三 π、 三 π吗?可以再试试 vpa(sym(pi)^(1/15),500),读者能猜出来该命令计算的是什么吗?
1.5假设已知广义
Lyapunov方程如下:
试利用 lookfor lyapunov命令查询与关键词 lyapunov有关的函数名,并用 doc或 help命令获得相关函数的进一步调用信息,观察是否能得出该方程的解,并检验得出解的精度。
1.
6利用联机帮助命令 help sym/diff查询符号运算工具箱中的求导函数 diff(),在了解所提供的帮助信息的基础上试着求解例 1-2中给出的问题,并比较两个结果。另外,试通过积分运算还原回原函数。
8 1 6 16 4 1 1 2 3
3 5 7 .X X 9 3 1 . = 4 5 6 .
4 9 2 4 2 1 7 8 0
评论
还没有评论。