描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302447337丛书名: 高等院校信息技术规划教材
MATLAB程序设计与*化计算一书内容循序渐进、由浅入深,并结合大量实例帮助读者理解和掌握*化问题的建模方法与求解技巧。MATLAB程序设计与*化计算一书适合计算应用、*化领域和科学计算的研究人员使用,也可作为高等院校计算机专业、通信专业等相关专业的教材。
目录Contents第1篇MATLAB编程篇
第1章导论3
1.1概论3
1.2算法的开发与应用3
1.3数据获取与分析6
1.4数据可视化7
1.5数值计算9
第2章MATLAB基础10
2.1启动MATLAB10
2.2命令行窗口13
2.3输出命令15
2.3.1disp命令15
2.3.2fprintf命令16
2.4保存与加载命令22
2.4.1save命令23
2.4.2load命令23
2.5导入与输出数据25
2.5.1数据导入或输出命令25
2.5.2使用导入向导27
2.6工作空间28
2.7显示格式30
2.8定义标量变量30
2.8.1赋值运算符31
2.8.2变量的命名规则32
2.8.3预定义变量和关键字32◆MATLAB程序设计与化计算目录第3章MATLAB编程34
3.1带标量的算术运算34
3.1.1优先级34
3.1.2用MATLAB作计算器35
3.2基本内置函数35
3.3关系和逻辑运算符37
3.3.1关系运算符37
3.3.2逻辑运算符39
3.3.3优先级40
3.3.4内置逻辑函数42
3.4条件语句43
3.4.1ifend结构43
3.4.2ifelseend结构43
3.4.3ifelseifelseend结构44
3.5switchcase语句45
3.6循环46
3.6.1forend循环46
3.6.2whileend循环47
3.7嵌套循环和嵌套条件语句48
3.8break和continue语句49
第4章脚本与函数文件50
4.1脚本文件50
4.1.1使用脚本文件的注意事项50
4.1.2脚本文件的创建与保存51
4.1.3脚本文件的运行52
4.1.4当前路径52
4.2函数文件的创建53
4.3函数文件的结构53
4.3.1函数定义行54
4.3.2输入和输出参数54
4.3.3H1行和帮助文本行55
4.3.4函数体56
4.4局部变量和全局变量56
4.5函数文件的保存57
4.6用户自定义函数的使用57
4.7脚本文件与函数文件的比较58
4.8子函数58
第5章矩阵计算60
5.1矩阵的创建60
5.1.1创建一个一维数组(向量)60
5.1.2根据一串已知的数字来创建向量60
5.1.3创建一个二维数组(矩阵)63
5.1.4MATLAB中变量的注意事项65
5.1.5转置运算符65
5.1.6数组寻址66
5.1.7在数组寻址中使用冒号67
5.1.8向已有变量中添加元素69
5.1.9删除元素72
5.1.10处理数组的内置函数73
5.2矩阵运算74
5.2.1加法与减法74
5.2.2数组相乘75
5.2.3数组相除78
5.2.4逐元素运算80
5.2.5在MATLAB内置数学函数中使用数组82
5.2.6分析数组的内置函数83
5.2.7随机数的生成84
第6章数值计算87
6.1多项式87
6.1.1多项式的值87
6.1.2多项式的根89
6.1.3多项式的加法、乘法和除法运算90
6.1.4多项式求导91
6.2曲线拟合92
6.2.1用多项式来实现曲线拟合polyfit函数92
6.2.2使用函数而不是多项式来实现曲线拟合95
6.2.3插值计算98
6.2.4基本拟合接口101
6.3求解单变量方程104
6.4寻找函数值或小值106
6.5数值积分107
6.6常微分方程110
第7章符号计算114
7.1符号对象和符号表达式115
7.1.1创建符号对象115
7.1.2创建符号表达式116
7.1.3findsym命令和默认符号变量118
7.2化简符号表达式119
7.2.1collect、expand和factor命令119
7.2.2simplify和simple命令121
7.2.3pretty命令122
7.3求解代数方程122
7.4微分125
7.5积分126
7.6求解常微分方程127
7.7符号表达式的数值计算130
第8章二维绘图133
8.1plot命令134
8.1.1绘制给定数据137
8.1.2绘制函数137
8.2fplot命令139
8.3在同一个plot中绘制多个图像139
8.3.1使用plot命令139
8.3.2使用hold on 和 hold off 命令141
8.3.3使用line命令141
8.4定义绘图显示格式142
8.4.1使用命令定义绘图显示格式142
8.4.2使用plot编辑器绘图145
8.4.3使用误差线绘图146
8.5绘制特殊图形147
8.6直方图149
8.7polar绘图152
8.8在同一页面上绘制多图153
8.9多图窗口153
8.10工具栏绘图154
第9章三维绘图156
9.1三维曲线156
9.2三维网格和三维曲面图157
9.3特殊图形绘图163
9.4view命令166
第2篇化计算基础篇
第10章优化计算基础171
10.1优化问题实例171
10.2优化问题标准形式172
10.3无约束优化问题173
第11章线性与非线性优化174
11.1线性优化174
11.2非线性优化174
11.3方程和方程组的解175
11.4多项式180
第12章数值方法优化185
12.1非线性方程185
12.2不动点法求解x=g(x)185
12.2.1牛顿法求解方程f(x)=0187
12.2.2Schrder方法求解方程 f(x)=0188
12.3非线性方程组188
12.3.1Seidel法188
12.3.2牛顿迭代法189
第13章优化工具箱194
13.1优化工具箱194
13.1.1标准算法194
13.1.2大规模的算法194
13.2小化算法195
13.2.1多目标问题195
13.2.2具有边界约束的非线性标量小化197
13.2.3带约束的非线性小化198
13.2.4极小极大优化199
13.2.5小值优化200
13.2.6半无限约束小值201
13.2.7线性规划201
13.2.8二次规划203
13.3求解方程的算法204
第3篇化计算高级篇
第14章遗传算法209
14.1概述209
14.1.1问题解的表示209
14.1.2适应度函数210
14.1.3种群规模初始化211
14.1.4选择机制211
14.1.5交叉操作212
14.1.6变异操作212
14.1.7繁殖算子212
14.2编码和优化问题212
14.3遗传算法的参数213
14.3.1Dejong设置213
14.3.2设置214
14.3.3MicroGA设置214
14.4遗传算法的MATLAB程序214
14.4.1问题1: 化给定区间内的给定一维函数214
14.4.2问题2: 旅行商问题216
第15章微粒群优化224
15.1简介224
15.2PSO算法224
15.3PSO的数学模型225
15.4PSO中的参数及参数调优225
15.5MATLAB群体智能的例子226
15.5.1问题1: 模拟集群运动使目标函数小化226
15.5.2问题2: 粒子群优化行为228
编者2016年10月◆MATLAB程序设计与化计算
MATLAB编程3.1带标量的算术运算在本节中,只讨论带数字标量的算术运算。数字可以直接用在算术计算中,或者可以通过赋值给变量,然后用在计算中。常用算术运算符列表如表31所示。表31常用算术运算符列表运算符 号 标 志示例加法 5 3减法-5-3乘法*5*3右除/5/3左除\5\3=3/5幂运算^5^3(等价于125)可以看出,除左除号外的所有符号在多数运算中都是一样的,对于标量来说,左除号是右除的逆反,但是左除通常用于数组的运算。3.1.1优先级MATLAB根据表32所示的优先级执行运算,这个顺序在大多数运算器中是一样的。表32算术运算符的优先级优先级数 学 运 算1()括号。当出现括号嵌套时,内层的括号先执行2幂运算3乘、除(优先级相同)4()加、减在一个有多个运算的表达式中,先执行高优先级的运算,如果两个或多个运算符有相同的优先级,则从左至右依次执行表达式,3.1.2节将会讲到,括号可以用来改变优先级。3.1.2用MATLAB作计算器使用MATLAB的简单的方法是把它当作一个计算器,这个可以通过在命令行窗口输入数学表达式并按回车键来实现,MATLAB会计算这个表达式,并在下一行显示“ans=”返回运算结果,如例31所示。◆MATLAB程序设计与化计算第◆3章MATLAB编程例31用MATLAB作计算器。1. >> 7 8/2%输入并按回车键,先计算8/22. ans=3. 114. >>(7 8)/2%输入并按回车键,先计算7 85. ans=6. 7.50007. >>4 5/3 2%先计算5/38. ans=9. 7.666710. >> 5^3/2%先计算5^3,然后计算/211. ans=12. 62.500013. >> 27^(1/3) 32^0.2%先计算1/3,然后计算27^(1/3)和32^0.2,后计算加法14. ans=15. 516. >>27^1/3 32^0.2%先计算27^1和32^0.2,然后计算/3,后计算加法17. ans=18. 1119. %输入3个点(并按回车键)可以在下一行继续输入表达式20. >> 0.7854-(0.7854)^3/(123) 0.7854^5/(12345)…21. -(0.785)^7/(1234567)22. %后这个表达式是泰勒公式的前四项23. ans=24. 0.70713.2基本内置函数除了基本的算术运算之外,MATLAB中的表达式还可以包含函数,MATLAB中有一个很大的内置函数库,一个函数由一个函数名和一个用括号括起来的参数组成,例如,计算平方根的函数为sqrt(x),它的名字是sqrt,参数是x。当使用函数时,参数可以是数字,也可以是赋了数值的变量,或者是一个由数字或变量组成的计算表达式,参数或表达式中也可以包含某个函数,例32中显示了当用MATLAB作计算器处理标量时,使用sqrt(x)函数的示例。例32内置函数sqrt的使用。1. >> sqrt(64)%参数为一个数字2. ans=3. 84. >> sqrt(50 143)%参数为一个表达式5. ans=6. 9.59177. >> sqrt(54 9sqrt(100))%参数中包含一个函数8. ans=9. 1210. >>(15 600/4)/sqrt(121)%函数包含在表达式中11. ans=12. 15表33~表35列出了一些常用的基本MATLAB的数学内置函数,完整的按目录编排的函数列表可以在帮助窗口中找到。表33基本数学函数函数描述举例sqrt(x)求平方根>> sqrt(81)ans=9nthroot(x,n)实数x的第n个实根(若x为负数,n必须为奇数且为整数)>> nthroot(80,5)ans=2.4022exp(x)指数函数>> exp(5)ans=148.4132abs(x)求值>> abs(-24)ans=24log(x)求以e为底的对数>> log(1000)ans=6.9078log10(x)求以10为底的对数>> log10(1000)ans=3factorial(x)求x的阶乘,x必须为正数>> factorial(5)ans=120表34三角数学函数函数描述举例sin(x)sind(x)求用弧度表示的角的正弦值求用度数表示的角的正弦值>> sin(pi/6)ans=0.5000cos(x)cosd(x)求用弧度表示的角的余弦值求用度数表示的角的余弦值>> cosd(30)ans=0.8660tan(x)tand(x)求用弧度表示的角的正切值求用度数表示的角的正切值>> tan(pi/6)ans=0.5774cot(x)cotd(x)求用弧度表示的角的余切值求用度数表示的角的余切值>> cotd(30)ans=1.7321表35取整函数函数描述举例round(x)求近似于x的整数>> round(17/5)ans=3fix(x)取整函数>> fix(13/5)ans=2ceil(x)求不小于x的小整数> ceil(11/5)ans=3floor(x)求小于等于数值x的整数>> floor(-9/4)ans=-3rem(x,y)求x/y的余数>> rem(13,5)ans=3sign(x)符号函数,若x>0,函数返回1;若x<0,函数返回-1;若x=0,返回0>> sign(5)ans=1对以弧度表示的角适用的反三角函数有asind(x)、acos(x)、atan(x)、acot(x);对以度表示的角适用的反三角函数有asind(x)、acosd(x)、atand(x)、acotd(x);双曲三角函数有sinh(x)、cosh(x)、tanh(x)和coth(x)。表34使用了pi,等于π。3.3关系和逻辑运算符一个关系运算符通过判断一个比较表达式(如5<8)是真还是假来比较两个数字,如果表达式为真,表达式被赋值1;如果表达式为假,则赋值为0。一个逻辑运算符根据特定的运算符检验表达式的真假从而产生结果为真(1)或假(0),例如,逻辑运算符AND只有在两个表达式都为真时,结果才为1,关系和逻辑运算符可以用在数学表达式中,本章中还会介绍怎样将关系和逻辑运算符和其他命令结合用于控制计算机程序的流程。 3.3.1关系运算符MATLAB中的关系运算符如表36所示。表36关系运算符列表关系运算符描述关系运算符描述=大于等于>大于==等于<=小于等于~=不等于注意: “==”这个关系运算符包括两个等于号(两个等于号之间没有空格),因为一个等于号是赋值运算符,在其他的包含两个字符的关系运算符中,两个字符中间也没有空格(<=、>=、~=)。(1) 关系运算符通常作为算术运算符用在数学表达式中,其结果可以用在其他数学运算中,也可以用在数组表示中,还可以和其他命令结合(如if语句)来控制程序的流程。(2) 当比较两个数字时,如果根据关系运算符比较的结果是真,则结果为1(逻辑上为真);如果比较的结果为假,则结果为0(逻辑上为假)。(3) 当比较两个标量时,结果也为标量1或0,如果比较的是数组(只有当数组的大小一样时才能相互比较),比较是通过逐个取出元素来进行比较的,结果为一个和原来数组大小一样的逻辑数组,其元素为0或1,每个地址中根据比较的结果来确定是1或0。(4) 如果将标量和数组进行比较,则实际上是将该标量和数组中的每个元素进行比较,并且结果也是一个由0或1构成的逻辑数组,根据每一次比较的结果来确定是0还是1。下面是一些例子: 1. >> 5>8%判断5是否大于8,因为5不大于8,所以结果为02. ans=3. 04. >> a=5<10%判断5是否小于10,并把结果赋值给变量a5. a=%因为表达式为真(5确实小于10),所以a的值为16. 17. >> y=(6<10) (7>8) (53==60/4)%在数学表达式中用关系运算符8. %(6<10)=1,因为6小于10;(7>8)=0,因为7小于8 9. %(53==60/4)=1,因为表达式左右的值相等10. y=11. 212. >> b=[15 6 9 4 11 7 14];c=[8 20 9 2 19 7 10];%定义向量b和c13. >> d=c>=b%判断c中的元素是否大于等于b中的元素14. d=15. %当c中元素的值大于等于b中的元素时,结果为116. 0 1 1 0 1 1 017. >> b==c%判断b中的元素是否等于c中的元素18. ans=19. 0 0 1 0 0 1 020. >> b~=c%判断b中的元素是否不等于c中的元素21. ans=22. 1 1 0 1 1 0 123. >> f=b-c>0%用b中的元素减去c中的元素并判断结果是否大于024. f=25. 1 0 0 1 0 0 126. >> A=[2 9 4;-3 5 2;6 7 -1]%定义了一个3×3的矩阵27. A=28. 2 9429. -3 5230. 6 7-131. >> B=A<=2%判断A中的哪些元素小于等于2,并赋值给B32. B=33. 1 0 034. 1 0 135. 0 0 1(5) 向量的关系运算的结果也是一个由0或1构成的向量,称为逻辑向量,可以用于向量寻址,当用一个逻辑向量来表示其他向量时,它就是将原向量中与逻辑向量中1所对应的位置的元素提取出来,例如: 1. >> r=[8 12 9 4 23 19 10]%定义一个向量r2. r=3. 812 9 42319104. >> s=r<=10%判断r中的元素是否小于等于105. s=%逻辑向量s中元素为1的位置即元素小于等于10的位置6. 1 0 1 1 0 0 17. >> t=r(s)%用逻辑向量s在向量r中进行寻址,并创建向量t8. t=%向量t由r中与s中元素为1的位置向对应的位置的元素组成9. 8 9 41010. >> w=r(r<=10)%这一步同上11. w=12. 8 9 410(6) 由0和1构成的数值向量和数组与由0和1构成的逻辑向量和数组不同,数值向量和数组不能用来寻址,而逻辑向量和数组可以用在算术运算中。首次在算术运算中使用逻辑向量或数组,则向量和数组就变成了数值型。(7) 优先级: 在数学表达式中,包括关系和算术运算,算术运算符( 、-、*、/、\)的优先级比关系运算符高,关系运算符之间的优先级是一样的,执行时需从左至右执行,括号可以用来改变优先级,示例如下: 1. >> 3 4<16/2%先执行 和/2. ans=%答案为1,因为7小于83. 14. >> 3 (4<16)/2%先执行4<16,得到结果为1,因为表达式为真5. ans=6. 3.5000%结果为3.5,因为3 1/2为3.53.3.2逻辑运算符MATLAB中的逻辑运算符如表37所示。表37逻辑运算符列表逻辑运算符名字描述&,如A&B与双目运算符(运算对象为A、B),如果都为真,表达式为真(1),否则为假(0)|,如A|B或双目运算符,A和B中至少有一个为真,则结果为真(1),否则,结果为假(0)~,如~A非单目运算符,为表达式A的反,如果A为假,则结果为真(1);如果A为真,则结果为假(0)(1) 逻辑运算符用数字作操作数,一个非零的数代表真值,零值代表假。(2) 逻辑运算符(和关系运算符一样)在数学表达式中通常用作算术运算符,运算的结果可以用在其他数学运算中,在处理数组时,结合其他MATLAB命令(如if)一起使用可以控制程序的流程。(3) 逻辑运算符(和关系运算符一样)可以用在标量和数组中。(4) 逻辑运算符与和或的两个操作数可以都是标量或数组,还可以一个是标量,另一个为数组。如果两个都是标量,则结果也为标量为0或1;如果两个都是数组,则两个数组的大小要一样,并且逻辑运算是通过逐个比较数组元素实现的,运算的结果仍然为数组,且数组大小不变,数组元素由0和1组成,0和1是由每一位的运算结果决定的;如果一个是标量,另一个为数组,则逻辑运算是通过标量和数组的每一个元素进行比较完成的,且运算结果为由0和1构成的大小不变的数组。(5) 逻辑运算符非只有一个操作数。当操作数是标量时,结果也为标量0或1;当操作数是数组时,结果也为数组,并且数组大小不变,数组的非零位对应为0,零位对应为1。下面是一些示例: 1. >> 3&7%3和7均为真,所以结果为12. ans=3. 14. >> a=5|0%把5|0的结果赋值给a5. a=%a为1,因为至少有一个为真6. 17. >> ~25%非258. ans=%结果为0,因为25为真,取相反,结果为假9. 010. >> t=25((12&0) (~0) (0|5))%把逻辑运算符用在数学表达式中11. t=12. 5013. >> x=[9 3 0 11 0 15];y=[2 0 13 -11 0 4];%定义了两个向量x和y14. >> x&y%结果为一个向量,为1的位置是两个数都为真的位置,否则为015. ans=16. 1 0 0 1 0 117. >> z=x|y%结果为一个向量,为1的位置是两个数中至少有一个为真,否则为018. z=19. 1 1 1 1 0 120. >> ~(x y)%结果为一个向量,为1的位置是当x y为假时,否则为021. ans=22. 0 0 0 1 1 03.3.3优先级算术运算符、关系运算符和逻辑运算符可以在数学表达式中结合在一起使用。当一个表达式包含上述组合时,运算结果取决于运算执行的顺序。MATLAB中运算符的优先级如表38所示。表38运算符的优先级列表优先级运算符1()括号(如果括号出现嵌套,则内层的括号优先级)2幂运算3逻辑非(~)4乘和除5加和减6关系运算符(>、=、<=、==、~=)7逻辑与(&)8()逻辑或(|)如果有两个或多个运算符有相同的优先级,则表达式按照自左至右的顺序依次执行。应该指出,上面所示的优先级顺序是从MATLAB 6开始使用的,MATLAB 6之前的版本所采用的优先级顺序跟这个稍有不同(&不比|的优先级高),所以读者需注意,MATLAB的版本兼容性问题可以通过括号解决,即使有时不需要添加括号。下面是一些包含算术运算符、关系运算符和逻辑运算符的表达式的示例: 1. >> x=-2;y=5;%定义变量x、y2. %这个不等式在数学上是正确的,但是在MATLAB中是错误的 3. %因为MATLAB是自左至右执行的,-5> -5> -5> ~(y<7)%先执行y<7,结果为1,~1结果为012. ans=13. 014. >> ~y<7%先执行~y,结果为0,0<7的结果为115. ans=16. 117. %先执行y>=8(结果为0)、x> ~((y>=8)|(x=8(结果为0)、x=8),结果为122. %再执行”|”,结果为123. >> ~(y>=8)|(x> xor(7,0)ans=1>> xor(7,-5)ans=0all(A)若向量A中的元素均为真,则返回1,如果一个或多个元素为假,则返回0;若A是矩阵,则将A的列看作向量,返回的是由0和1构成的向量>> A=[6 2 15 9 7 11];>> all(A)ans=1>> B=[6 2 15 9 0 11];>> all(B)ans=0any(A)若向量A中的任意一个元素为真,则返回1;若A中的所有元素都为0,则返回0;若A为矩阵,则将A看作是列向量,返回的是由0和1构成的矩阵>> A=[6 0 15 0 0 11];>> any(A)ans=1>> B=[0 0 0 0 0 0];>> any(B)ans=0find(A)find(A>d)若A为向量,则返回的是非零元素的位置若A为向量,则返回的是比d大的元素的地址>> A=[0 9 4 3 7 0 0 1 8];>> find(A)ans=2 3 4 5 8 9>> find(A>4)ans=2 5 94种逻辑运算符的逻辑运算可以用表311表示。表311逻辑运算规则INPUTOUTPUTABANDA&BORA|BXOR(A,B)NOT~ANOT~Bfalsefalsefalsefalsefalsetruetruefalsetruefalsetruetruetruefalse续表INPUTOUTPUTABANDA&BORA|BXOR(A,B)NOT~ANOT~Btruefalsefalsetruetruefalsetruetruetruetruetruefalsefalsefalse3.4条 件 语 句一个条件语句是一个命令,它允许MATLAB根据条件语句来决定是否执行一组命令或跳过这些命令。在条件语句中会有一个条件表达式,如果表达式为真,则执行条件语句后面的一组命令;如果表达式为假,则跳过这组命令。条件语句的基本格式如下: if 由关系运算符或逻辑运算符构成的条件表达式示例: if a7)if(x≠13)|(y<0)所有变量必须已经赋值(1) 条件语句可以是脚本文件中程序的一部分,也可以是用户自定义的函数。(2) 如下面所示,每个if语句都对应着一个end语句。if语句通常用在3个结构中,即ifend、ifelseend和ifelseifelseend,下面会详细讲到。 3.4.1ifend结构ifend条件语句的结构大致如图31所示,图31显示了怎样在程序中输入命令,左边的流程图大致显示了流程或命令执行的顺序,当程序执行到if语句时,如果if语句中的条件表达式的结果为真,则程序继续执行if语句后面的语句直到end语句;如果条件表达式为假,则程序跳过if与end之间的语句,继续执行end后面的语句。图31ifend条件语句的结构if和end在屏幕上显示为蓝色字体,if语句和end语句之间的命令自动缩进(即使不需要),这增加了程序的可读性。3.4.2ifelseend结构ifelseend结构提供了在两组命令中选择执行的一种方式,图32所示为ifelseend的结构,显示了如何在程序中输入ifelseend语句。左边的流程图展示了命令执行的流程或顺序,行是一个包含了条件表达式的if语句,若条件表达式为真,则程序执行if和else之间的组指令,然后跳到end;若条件表达式为假,则程序跳到else,然后执行else和end之间的第二组命令。图32ifelseend条件语句的结构3.4.3ifelseifelseend结构ifelseifelseend结构如图33所示,图33显示了程序编写的流程,左边的流程图显示了程序执行的流程和顺序,这个结构包含两个条件语句(if和elseif),所以才能实现在三组命令中选择一组执行。行是一个包含条件表达式的if语句,如果表达式结果为真,则执行if和elseif之间的组命令,并直接跳到end;如果if语句中的条件表达式为假,则程序跳至elseif语句;如果elseif语句中的条件表达式为真,则程序执行elseif和else之间的第二组命令,然后跳至end;如果elseif语句中的条件表达式为假,则程序直接跳至else并执行else与end之间的第三组命令。图33ifelseifelseend条件语句的结构注意: 可以添加多个elseif语句及相应的命令组,所以可以有很多条件,并且else语句是可选的,也就是说当有多个elseif语句而没有else语句时,如果所有的条件语句都为真,则执行相应的命令组,否则的话,什么也不执行。3.5switchcase语句switchcase语句是可以引导程序流程的另外一种方法,它提供一种可以从几组命令中选择一组执行的方法,语句图34switchcase语句的结构的结构如图34所示。(1) 行就是switch语句,格式如下: switch switch expressionswitch表达式可以是一个标量,也可以是字符串,通常为一个赋了标量或字符串的变量,然而,也可以是一个包含预赋值变量的数学表达式,可以计算结果。(2) switch语句下面就是一个或多个case语句,每个case语句都对应一个值(可以是一个标量,也可以是字符串value1、value2等),case语句下面对应的是一组命令。(3) 在后一个case语句之后,是一个otherwise命令。(4) 后一行必须是end语句。将switch表达式的值与case语句后面对应的值进行比较,如果值一样,则执行对应的case语句后面的命令(只执行一组命令,即相对应的case和下一个case之间的命令或otherwise与end之间的命令)。(5) 如果有多个case语句的值与switch表达式的值相匹配,则执行个相匹配的case语句。(6) 如果case语句中没有与switch表达式相匹配的值,且有otherwise语句,则程序执行otherwise与end之间的命令。(7) 如果没有case语句与switch表达式的值相对应,并且语句中没有otherwise语句,则程序什么也不执行。(8) 一个case语句可以有多个值,格式可以为{value1,value2,value3,…}(本书中没有介绍这种格式,这个称为单元数组),当至少有一个值与switch表达式的值相匹配时,这个case语句才执行。注意: 在MATLAB中,只有个与switch表达式相匹配的case语句才会执行,执行完相对应的case语句后面的命令之后,程序直接跳至end语句,这与C语言不同,在C语言中,有break语句时,才会直接跳至end。3.6循环循环是改变计算机程序流程的另外一种方法,在循环中,一个命令或一组命令不断地重复多次执行,每执行一次称为一个循环,每次循环之后,循环结构中定义的变量至少有一个,通常是多个,甚至是所有变量都被重新赋予新值。MATLAB中有两种基本的循环结构: 在for循环中,在循环开始之前就知道了代码重复的次数;在while循环中,代码重复的次数在循环开始之前是未知的,只要满足用户定义的条件,循环会一直继续下去,这两种循环均可以使用break语句随时实现终止。3.6.1forend循环在forend循环中,一个命令或一组命令重复执行的次数是预先订好的。(1) 循环指示变量可以有多个变量名(通常为i、j、k、m、n,但如果MATLAB处理的数字比较复杂,则不能用i和j作为循环指示变量)fork=f : s : tend① k: 循环指示变量。② f: k的初始值。③ s: k在每次循环后的增量。④ t: k的终值。(2) 在次循环中,k=f,计算机将会执行for和end之间的命令,然后程序回到for语句,开始第二次循环,k得到一个新值,即k=f s,则for与end之间的命令以新值k第二次执行,循环一直继续,直到k=t。这时,程序不会回到for语句,而是会继续执行end后面的部分,例如,如果k=1:2:9,则一共会执行5次循环,相应的k值为1、3、5、7、9。(3) 增量可以为负值(如k=25:-5:10,则循环一共执行4次,对应的k值为25, 20, 15, 10)。(4) 如果省略增量s,则增量值默认为1(如k=3:7,则循环一共执行5次,对应的k值为3、4、5、6、7)。(5) 如果f=t,则循环只执行一次。(6) 如果f>t并且s>0,或者f0,则后一次循环时k的值为小于t的值(如k=8:10:50,一共循环5次, k=8, 18, 28, 38, 48);如果s<0,则后一次循环时k的值为大于t的小值。(8) 在for循环中,k也可以被赋予一个特定的值(向量),如for k=[7 9 -1 3 3 5]。(9) 在循环中,k的值不能被重新定义。(10) 每一个for循环都必须对应一个end语句。(11) 循环指示变量(k)的值不会自动显示出来,可以在循环语句中输入k来显示每次循环中k的值(通常可以用来调试程序)。(12) 循环结束时,循环指示变量(k)的值为后一次循环所赋的值。for循环的简单示例如下: for k=1:3:10x=k^2end执行上述代码,循环一共执行4次,k的值分别为1、4、7、10,也就是说4次循环中,x的值分别为1、16、49、100,因为第二行末尾没有分号,所以x的值在每次循环执行后会显示在屏幕中,执行上述程序,命令行窗口显示如下: >> x=1x=16x=49x=1003.6.2whileend循环当需要使用循环并且循环的次数事先未知时通常使用whileend循环,当循环开始时,循环的次数是不能事先确定的。而且,只要满足用户定义的条件,循环就会一直进行下去。whileend循环的结构如下:while conditional expressionsend行是一个包含条件表达式的while语句,如果表达式的结果为假(0),MATLAB就跳到end语句,并继续执行下面的代码;如果条件表达式的结果为真(1),MATLAB就执行while和end之间的命令,然后再次跳到while语句,检查是否满足条件表达式,直到不再满足条件表达式,循环结束。whileend循环的正确执行需要满足: (1) while语句中的条件表达式必须至少包含一个变量。(2) 在MATLAB执行while语句之前,条件表达式中的变量必须是已经赋过值的。(3) 条件表达式中的变量至少得有一个变量的值在循环中是不断更新的,否则的话一旦循环开始就不会结束,因为条件表达式一直为真。一个简单的whileend循环示例如下。在下面的代码中,x的初始值为1,并且当x<=15时,每循环一次,x的值变为原来的两倍。x=1%x的初始值为1while x<=15%只有当x<=15时才会执行下面的命令x=2x%在每轮循环后x的值变为原来的两倍end执行上述程序,命令窗口的显示如下:x=%x的初始值1x=2%在每一次循环之后x的值变为原来的两倍x=4x=8x=%当x=16时,while命令的条件表达式为假,所以结束循环16注意: 在编写whileend循环时,程序员必须确保条件表达式中的变量在每次循环赋予的新值中后能让表达式的值取假。否则的话,循环将会无限次地执行下去(无限循环),在上面的例子中,如果将条件表达式换成x>=0.5,则循环将会无限次地进行,可以通过限定循环的次数来避免发生无限循环,当循环的次数超过某个值时,即停止循环。可以在条件表达式中设置循环次数,也可以使用break语句实现终止循环。即使再仔细的编程也有可能出错,一旦出现无限循环,用户可以通过Ctrl C或Ctrl Break键来停止循环。3.7嵌套循环和嵌套条件语句循环和条件语句可以和其他循环或条件语句进行嵌套,也就是说,一个循环或条件语句可以在其他循环或条件语句中开始和结束。对于嵌套的循环和条件语句的个数没有具体限制,但是,每一个if、case、for和while语句必须有一个end语句与其对应,图35所示的是一个for循环嵌套在了另一个for循环中,在如图所示的嵌套结构中,如果n=3,m=4,那么k的初始值为1,嵌套循环执行4次,h的值分别为1、2、3、4,后k=3,嵌套循环又执行4次,每当输入嵌套的循环语句时,MATLAB会自动缩进新循环,嵌套循环和条件表达式的显示如图35所示。图35嵌套循环的结构3.8break和continue语句〖*2〗1. break语句 (1) 当break语句写在循环语句(for循环或while循环)的内部时,通常用来终止循环(指的是整个循环,不只是后一次循环);当循环语句中出现break语句时,MATLAB会直接跳到end语句,并继续执行下面的代码(不会再跳回到for循环语句)。(2) 如果break语句写在嵌套循环的内部,则只终止嵌套循环。(3) 当break语句写在循环的外部,则会终止整个程序的执行。(4) break语句通常用在条件语句中,在循环内部,如果满足条件,则终止循环,例如,循环的次数超过了某个预定义的值,或误差小于阈值。break语句写在循环的外部时,则会终止整个程序的执行,比如当数据传递到一个函数时,与期望不符,可以用break语句来终止执行。2. continue语句(1) continue语句可以用在循环内部(for循环或while循环)来跳出本次循环,或者开始下次循环。(2) continue语句也通常写在条件语句中,当执行到continue语句时,MATLAB不会执行continue后面的语句,而是直接跳到end语句,并开始下次循环。····························································第4章chapter4
脚本与函数文件到目前为止,所有的命令都是在命令行窗口中输入的,当按回车键之后,命令执行。虽然每一个MATLAB命令都可以用这种方式执行,但是用命令窗口来执行命令有时不是很方便,或许很困难,甚至是不可能的,尤其当所要执行的程序与其他程序有关系时,命令行窗口的命令不能保存并再次执行。另外,命令行窗口不是交互的,也就是说当按回车键时,只有后一个命令会执行,前面已执行的命令结果不会改变,如果需要修改之前已经执行过的命令,并且把命令的结果用在后面的程序中,那么就需要重新输入所有的命令并再次执行。用户自定义的函数是一个由用户创建的MATLAB程序,并作为函数文件保存,相当于一个内置函数。函数可以是一个简单的单个数学表达式,或者是包含多个计算公式的复杂表达式,通常情况下为一个计算机程序的子程序,函数文件的主特征是有一个输入和一个输出,也就是说函数中的计算通过使用输入的数据来完成,计算的结果通过输出语句显示出来,输入和输出语句中可以有一个或多个变量,可以是标量、向量或任意大小的数组。 用户自定义函数除了可以用作数学函数之外还可以用作大程序中的子程序,这样大程序就可以由多个程序块构成,以方便独立调试,函数文件类似于Basic语言和FORTRAN语言中的子路,Pascal中的程序和C语言中的函数。4.1脚 本 文 件用MATLAB执行程序的另外一种方式是首先创建一个程序文件,并保存,然后执行。当运行程序时,文件中的命令会按照列出的顺序依次执行,如果需要更改命令,可以打开文件进行更改,并保存,然后再次执行,这样的文件就称为脚本文件。4.1.1使用脚本文件的注意事项(1) 脚本文件是一系列MATLAB命令,也称为程序。(2) 当执行脚本文件时,MATLAB会按照程序编写的顺序依次执行,就像在命令行窗口中一样。(3) 如果脚本文件有输出(如给一个变量赋值,并且语句末尾没有分号),那么输出结果会显示在命令窗口中。(4) 因为脚本文件的可编辑性并可多次执行,所以说使用脚本文件是很方便的。(5) 脚本文件可以在任意一个文本编辑器中进行编辑,并粘贴到MATLAB中。(6) 脚本文件也称M文件,因为其扩展名是m。◆MATLAB程序设计与化计算第◆4章脚本与函数文件4.1.2脚本文件的创建与保存在MATLAB中,可以在编辑/调试窗口创建和编辑脚本文件,这个窗口可以通过在命令行窗口的工具条中选择New Script图标来打开,或者直接在工具条中单击New,然后在打开的菜单中选择Script,打开的编辑/调试窗口如图41所示。图41编辑/调试窗口编辑窗口的上部有一个工具条,工具条的上方有3个标签: Editor、Publish、View,选择不同的标签会打开不同的图标。选中Home标签就会打开MATLAB的主页,下面的章节会详细介绍执行不同命令所对应的不同图标。一旦打开窗口,脚本文件中的命令是逐行输入的,按回车键,MATLAB会自动编号一个新行,MATLAB的命令可以在任意一个文本编辑器或文本处理程序中进行编辑,然后复制、粘贴到编辑/调试窗口,编辑/调试窗口中的小程序如图42所示。脚本文件的前几行是注释(不会被执行,因为行首是%)对脚本文件中的命令进行了简单描述。图42编辑/调试窗口中的程序执行脚本文件之前必须先保存,可以通过单击工具条中的Save,然后在打开的菜单中选择Save As命令,当保存脚本文件时,MATLAB会在文件名的后面加上后缀.m。命名脚本文件的规则和命名变量的规则是一样的(必须以字母开头,可以包含数字、下划线,不能使用空格,多包含63个字符), 用户自定义的变量、预定义的变量、MATLAB的命令或者函数名不能用作脚本文件的名字。4.1.3脚本文件的运行可以通过直接在编辑窗口中选择Run图标来运行脚本文件,或者在命令行窗口中输入文件名,并按回车键。对于待运行的文件,MATLAB需要知道文件保存的路径,如果文件保存的路径是MATLAB的当前路径,则可以运行该文件,或者该路径在搜索路径中,这个会在下面详细解释。4.1.4当前路径命令窗口的工具条中的当前路径域中的当前路径显示如图43所示。如果想要通过单击编辑窗口的Run图标来运行脚本文件,但其保存路径不是当前路径,将会出现如图44所示的提示框,用户可以通过更改脚本文件所在的保存路径,或者将其添加到搜索路径中。一旦在一个会话中使用两个或多个当前文件夹,则可以在命令行窗口的Current Folder 域中进行文件夹的切换,也可以在当前文件夹窗口更改当前文件路径,如图45所示。当前文件夹窗口可以通过Desktop菜单打开。通过选择文件保存的磁盘和文件夹来更改当前路径。图43命令窗口的当前路径域 图44更改当前路径图45当前文件夹窗口还可以在命令行窗口中使用cd命令来更改当前文件夹,通过输入cd加空格,然后输入磁盘名,并以分号结束,按回车键,即可更改磁盘。例如,为了将当前文件夹保存至E盘,可以输入cd E;如果脚本文件保存在一个磁盘内的文件夹中,可以通过在cd命令中将路径作为一个字符串进行输入,当然这个路径必须得是明确的。例如,cd(’E:\Chapter 1’)即可将路径设置到E盘的Chapter 1文件夹下,接下来的例子显示了怎样把当前路径改为E盘,然后图42中的保存在E盘中脚本文件就可以通过在命令行窗口中输入文件名并按回车键来运行了。1. >>cd(‘E:Chapter 1’)%把当前路径改为E盘2. >>Chap1_Exampl%通过输入脚本文件名并按回车键来执行文件3. x1=%脚本文件的执行结果显示在命令行窗口4. 3.50005. x2=6. -1.250004.2函数文件的创建函数文件和脚本文件类似,都是在编辑/调试窗口中创建的。该窗口可以从命令行窗口中打开,首先在工具条中选择New,然后选择Function,如图46所示为打开的编辑/调试窗口。编辑器中包含了几行预输入的代码,概括了函数文件的结构,行是函数定义行,后面是注释,接着是程序代码(即图46中4~11行),后一行是end语句,这是可选的,4.3节中将会详细介绍函数文件的结构。图46编辑/调试窗口注意: 编辑/调试窗口还可以通过选择工具条中的New Script 来打开,或者在工具条中单击New, 然后在打开的菜单中选择Script,用这种方式打开的窗口是空的,没有预输入的代码行,通常情况下,编辑/调试窗口可以用来编写脚本文件或函数文件。4.3函数文件的结构一个典型的完整的函数文件结构如图47所示,这个函数文件计算了月支出和贷款的总费用,这个函数文件的输入是贷款的数目、年利率、贷款的时间,函数文件的输出是
评论
还没有评论。