1、Matlab程序设计第8讲 2022-4-25Application of Matlab Language3 Matlab命令的执行方式n交互式命令执行方式(命令窗口) 逐条输入,逐条执行,操作简单、直观,但速度慢,执行过程不能保留。nM文件的程序执行方式 将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,可以重复进行。nMatlab程序设计有传统高级语言的特征,又有自己独特的特点,可以利用数据结构的特点,使程序结构简单,编程效率高。 2022-4-25Application of Matlab Language4 5.1 M文件的分类n 用Matlab语言编写的程序,称为M文件
2、。 是由若干Matlab命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。n M文件根据调用方式的不同分为两类: 命令文件(Script File) 函数文件(Function File)n 它们的扩展名都是.m 2022-4-25Application of Matlab Language5 命令文件和函数文件的区别n命令文件没有输入参数,也不返回输出参数;函数文件可以带输入参数,也可以返回输出参数。n命令文件对工作空间中的变量进行操作,文件中所有命令的执行结果也返回工作空间中;函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量也被清除。n命令文件可以直接运行;函数文
3、件不能直接运行,要以函数调用的方式来调用它。 2022-4-25Application of Matlab Language6 例5.1 建立文件将变量a、b的值互换。命令文件:clear;a = 1:10;b = 11,12,13,14;15,16,17,18;c = a; a = b; b = c;ab将文件保存为exch,并在命令窗口执行。执行结果:a = 11 12 13 14 15 16 17 18b = 1 2 3 4 5 6 7 8 9 10 2022-4-25Application of Matlab Language7 函数文件fexch.mfunction a,b = ex
4、ch(a,b)c = a; a = b; b = c;然后在命令窗口调用该函数文件:clear;x = 1:10;y = 11,12,13,14;15,16,17,18;x,y = fexch(x,y)输出结果为:a = 11 12 13 14 15 16 17 18b = 1 2 3 4 5 6 7 8 9 10函数参数a,b,c未保留在工作空间中,x,y保留在工作空间中。 2022-4-25Application of Matlab Language8 M文件的建立与打开 M文件是一个文本文件,可以用任何编辑程序来建立和编辑,一般最常用的是使用Matlab提供的文本编辑器。 该编辑器是一个
5、集编辑和调试于一体的工作环境。 2022-4-25Application of Matlab Language9 5.2 程序控制结构n 顺序结构n 选择结构n 循环结构 任何复杂的程序都可以由这3种基本结构构成。 2022-4-25Application of Matlab Language10 5.2.1 顺序结构n顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句。(最简单的一种程序)1、数据的输入 从键盘输入数据,则可以使用input函数来进行, 调用格式为: A = input(提示信息,选项); 其中提示信息为一个字符串,用于提示用户输入数据。 例如:从键盘输入A
6、矩阵,可以采用下面的命令来完成 A = input(输入A矩阵); 如果在input函数调用时采用s选项,则允许用户输入一个字符串。 例:xm = input(Whats your name?,s); 2022-4-25Application of Matlab Language11 5.2.1 顺序结构2、数据的输出 命令窗口输出函数主要有disp函数,其调用格式为: disp(输出项) 其中输出项既可以为字符串,也可以为矩阵。例如: A = Hello, Tom; disp(A) 输出为:Hello, Tom 又如:A = 1,2,3;4,5,6;7,8,9; disp(A) 输出为: 1
7、 2 3 4 5 6 7 8 9 %disp函数输出格式更紧凑 2022-4-25Application of Matlab Language12 5.2.1 顺序结构例5.2 求一元二次方程 的根。由于Matlab能进行复数运算,所以不需要判断方程的判别式,可直接根据求根公式求根。程序如下:a = input(a=?);b = input(b=?);c = input(c=?);d = b*b-4*a*c;x = (-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a);disp(x1=,num2str(x(1),x2=,num2str(x(2);程序输出为:a=?4b=?78
8、c=?54x1=-0.7188,x2=-18.781220axbxc 2022-4-25Application of Matlab Language13 5.2.1 顺序结构3、程序的暂停 程序执行过程中暂停,可用pause函数,其调用格式为: pause(延迟描述) 如果省略延迟时间,直接使用pause,则将暂停程序,直到 用户按任一键后程序继续执行。 若要强行中止程序的运行可按Ctrl+C键。 2022-4-25Application of Matlab Language14 5.2.2 选择结构选择结构是根据给定的条件成立或不成立,分别执行不同的语句。Matlab用于实现选择结构的语句有
9、if语句,switch语句和try语句。1. if语句在Matlab中,if语句有3种格式。(1)单分支if语句语句格式:if 条件 语句组end例如:当x是整数矩阵时,输出x的值if fix(x)=x disp(x);end 2022-4-25Application of Matlab Language15 5.2.2 选择结构(2)双分支if语句语句格式:if 条件 语句组 1else 语句组 2end当条件成立时,执行语句组1,否则执行语句组2,然后再执行if语句的后续语句。 2022-4-25Application of Matlab Language16 5.2.2 选择结构例例5.
10、3 计算分段函数:计算分段函数:2cos(1)1,10,10 xxxyxxx x 程序如下:程序如下:x = input(请输入请输入x x的值的值:);if x = 10 y = cos(x+1)+sqrt(x*x+1);else y = x*sqrt(x+sqrt(x);endy也可以用单分支if语句来实现:x = input(请输入x的值: );y = cos(x+1)+sqrt(x*x+1);if x=10 y = x*sqrt(x+sqrt(x);endy 2022-4-25Application of Matlab Language17 5.2.2 选择结构(3)多分支if语句语句
11、格式:if 条件1 语句组 1elseif 条件2 语句组 2elseif 条件m 语句组 melse 语句组nend 2022-4-25Application of Matlab Language18 例5.4 大小写字母的置换输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。程序如下:c = input(请输入一个字符,s);if c =A & c=a & c=0 & c=9 disp(abs(c)-abs(0);else disp(c);endsetstr函数可以得到函数可以得到ASC码码 2
12、022-4-25Application of Matlab Language19 5.2.2 选择结构2、switch语句switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式:switch 表达式case 表达式1 语句组1case 表达式2 语句组2case 表达式m 语句组motherwise 语句组 nendswitch子句后面的表达式应为一个标量或一个字符串;子句后面的表达式应为一个标量或一个字符串;case子句后面的表达式不仅可以为一个标量或一个字符子句后面的表达式不仅可以为一个标量或一个字符串,还可以为一个元胞矩阵。串,还可以为一个元胞矩阵。 2022-4-25Ap
13、plication of Matlab Language20 例5.5 某商场对顾客所购买的商品实行打折销售,标准如下:price200 没有折扣200=price500 3%折扣500=price1000 5%折扣1000=price2500 8%折扣2500=price5000 10%折扣5000 mtimesInner matrix dimensions must agree. 2022-4-25Application of Matlab Language24 5.2.3 循环结构循环是指按照给定的条件,重复执行指定的语句,Matlab提供了两种实现循环结构的语句:for语句和while
14、语句。1、for语句for语句的格式为:for 循环变量 =表达式1:表达式2:表达式3 循环体语句end其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。 2022-4-25Application of Matlab Language25 例5.7 已知 ,当n=100时,求y的值。程序如下:y = 0;n = 100;for i=1:n y = y+1/i/i;endy输出结果为:y = 1.635022221111123yn利用Matlab的特点,常用向量运算来代替循环操作,程序可以如下:n = 100;i = 1:n;f
15、= 1./i.2;y = sum(f) 2022-4-25Application of Matlab Language26 5.2.3 循环结构2、while语句while语句的一般格式为:while条件 循环体语句end其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。 2022-4-25Application of Matlab Language27 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和。sum = 0;n = 0;x = input(Enter a number(end in 0):);while(x=0) sum
16、= sum+x; n = n+1; x = input(Enter a number(end in 0):);endif(n0) sum mean = sum/nend例5.8 输出结果为:输出结果为:Enter a number(end in 0):67Enter a number(end in 0):89Enter a number(end in 0):93Enter a number(end in 0):70Enter a number(end in 0):0sum = 319mean = 79.7500 2022-4-25Application of Matlab Language28
17、 5.2.3 循环结构3、break语句和continur语句它们一般与if语句配合使用。break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。 2022-4-25Application of Matlab Language29 例5.9 求100,200之间第一个能被21整除的整数。程序如下:for n = 100:200 if rem(n,21)=0; continue end breakendn程序输出结果为:n
18、 = 105Matlab程序设计第9讲 2022-4-25Application of Matlab Language31 5.3 函数文件 函数文件是另一种形式的M文件,每一个函数文件都定义一个函数。Matlab提供的标准函数大部分是由函数文件定义的。5.3.1 函数文件的基本结构 函数文件由function语句引导,其基本结构为: function 输出形参表 = 函数名(输入形参表) 注释说明部分 函数体语句 其中,以function开头的一行为引导行,表示该M文件是一个函数文件。 当输出形参多于一个时,应该用方括号括起来。 2022-4-25Application of Matlab
19、Language32 说明:1. 关于函数文件名 函数文件名通常由函数名再加上扩展名.m组成。 当函数文件名与函数名不同时,Matlab将忽略函数名而确认文件名 因此调用时使用函数文件名。2. 关于注释说明部分 注释说明包括3部分: 紧随引导行之后以%开头的第一注释行。 这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor 关键词查询和help在线帮助时使用。 第一注释行及之后连续的注释行。 通常包括函数输入/输出参数的含义及调用格式说明等信息,构成全 部在线帮助文本。 2022-4-25Application of Matlab Language33 说明: 与在线帮助文本相隔
20、一空行的注释行。 包括函数文件编写和修改的信息,如作者和版本等。3、关于return语句 如果在函数文件中插入了return语句,则执行到该语句就结束函数 的执行,流程转至调用该函数的位置。通常也不使用return语句。 例5.10 编写函数文件,求半径为r的圆的面积和周长。 函数文件如下: function s,p = fcircle(r) % FCIRCLE calculate the area and perimeter of a circle of radii r % r 圆半径 % s 圆面积 % p 圆周长 %2006年2月30日编 s = pi*r*r; p = 2*pi*r;
21、2022-4-25Application of Matlab Language34 说明:将以上函数文件以文件名fcircle.m保存,然后在命令窗口调用。s,p = fcircle(10)输出结果是: s = 314.1593 p = 62.8319采用help命令或lookfor命令可以显示出注释说明部分的内容。 help fcircle屏幕显示 FCIRCLE calculate the area and perimeter of a circle of radii r r 圆半径 s 圆面积 p 圆周长 2022-4-25Application of Matlab Language35
22、 5.3.2 函数调用 函数调用的一般格式是: 输出实参表 = 函数名(输入实参表) 注意:函数调用时,各实参出现的顺序、个数,应与函数定义时相同。例5.11 利用函数文件,实现直角坐标(x,y)与极坐标(,)之间的转换。 函数文件:tran.m: function rho,theta = tran(x,y) rho = sqrt(x*x+y*y); theta = atan(y/x); 调用调用tran.m的命令文件的命令文件main1.m: x = input(please input x=:); y = input(please input y=:); rho,the = tran(x,
23、y); rho the 2022-4-25Application of Matlab Language36 函数的嵌套调用 在Matlab中,函数可以嵌套调用,即一个函数可以调用别的函数。 一个函数调用自身称为函数的递归调用。 例5.12 利用函数的递归调用,求n!。 n!本身就是以递归的形式定义的:,!()!,nnn nn 1111 显然,求显然,求n!需要求!需要求(n-1)!,这时可采用递归调用。,这时可采用递归调用。 函数如下:函数如下: function f = factor(n) if n后输入变量名,检查变量的值。可以分析判断程序 的正确性。 选择Debug菜单中的Continu
24、e命令,程序继续运行,在断点处又暂停,再检查 变量的值,一直到发现问题为止。 切换工作空间,结束对程序的调试。打开编辑窗口中的Stack下拉列表框,从 中选择Base,即将工作空间切换到主工作空间。然后选择Debug菜单中的Set Clear Breakpoint 命令清楚已设置的断点,在选择Continue命令,去除白色 箭头,完成调试。 2022-4-25Application of Matlab Language44 5.5 Matlab矩阵分析与处理5.5.1 特殊矩阵常见的特殊矩阵有零矩阵、幺矩阵、单位矩阵等,这类特殊矩阵在应用中具有通用性。1、通用的特殊矩阵常用的产生通用特殊矩阵的
25、函数有: zeros:产生全0矩阵(零矩阵)。 ones: 产生全1矩阵(幺矩阵)。 eye: 产生单位矩阵。 rand:产生01间均匀分布的随机矩阵。 randn:产生均值为0,方差为1的标准正态分布随机矩阵。 产生(0,1)区间均匀分布随机矩阵使用rand函数 产生均值为0,方差为1的标准正态分布随机矩阵使用randn函数 2022-4-25Application of Matlab Language45 例5.16 建立随机矩阵: 在区间20,50内均匀分布的5阶随机矩阵。 均值为0.6,方差为0.1的5阶正态分布随机矩阵。命令如下: x = 20+(50-20)*rand(5) x =
26、 48.5039 42.8629 38.4630 32.1712 21.7367 26.9342 33.6940 43.7581 48.0641 30.5860 38.2053 20.5551 47.6544 47.5071 44.3950 34.5795 44.6422 42.1462 32.3081 20.2958 46.7390 33.3411 25.2880 46.8095 24.1667 y = 0.6 + sqrt(0.1)*randn(5) 2022-4-25Application of Matlab Language46 5.5 矩阵结构变换1、对角阵与三角阵 只有对角线上有非
27、零元素的矩阵称为对角矩阵,在研究矩阵时, 有时候需要将矩阵的对角线上的元素提取出来形成一个列向量,有 时也需要用一个向量构造一个对角阵。 (1)提取矩阵的对角线元素函数:diag 例如: A = 1,2,3;4,5,6; D = diag(A) D = 1 5 diag函数还有一种形式:diag(A,k)提取第k条对角线的元素。 例如: D1 = diag(A,1) D = 2 6 2022-4-25Application of Matlab Language47 5.5 矩阵结构变换(2)构造对角矩阵 如果V是一个m个元素的向量,diag(V)将产生一个mm对角矩阵,其主对角线元素即为向量V
28、的元素。 例如: diag(1,2,-1,4) ans = 1 0 0 0 0 2 0 0 0 0 -1 0 0 0 0 4 例如: diag(1:3,-1) ans = 0 0 0 0 1 0 0 0 0 2 0 0 0 0 3 0 2022-4-25Application of Matlab Language48 例5.17 建立一个55矩阵A,然后将A的第一行元素乘以1,第二行乘以2,第五行乘以5。解: 用一个对角矩阵左乘一个矩阵时,相当于用对角阵的第一个元素乘以该矩阵的第一行,依次类推。命令如下: A = ones(5); D = diag(1:5); D * Aans = 1 1 1
29、 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 2022-4-25Application of Matlab Language49 5.6 矩阵求逆与线性方程组求解5.6.1 矩阵的逆 对于一个方阵A,如果存在一个与其同阶的方阵B,使得: (I为单位矩阵)则称B为A的逆矩阵,当然,A也是B的逆矩阵。求方阵A的逆矩阵可调用函数inv(A)。例5.18 求方阵A的逆矩阵,且验证。 A = 1,-1,1;5,-4,3;2,1,1; B = inv(A); A*B ans = 1.0000 0 0 -0.0000 1.0000 0 -0.0000 0 1.00
30、00A BB AI 2022-4-25Application of Matlab Language50 5.6.2 用矩阵求逆方法求解线性方程组 将包含n个未知数,由n个方程构成的线性方程组表示为:其矩阵表示形式为:其中:因此:11112211211222221122nnnnnnnnnna xa xa xba xa xaxba xaxa xb Axb 1111121212222212,nnnnnnnnxbaaaaaaxbAxbaaaxb1xA b 2022-4-25Application of Matlab Language51 例5.19 用求逆矩阵A的方法解线性方程组命令如下: A = 1
31、,2,3;1,4,9;1,8,27; b = 5,-2,6; x = inv(A)*b %x = Ab x = 23.0000 -14.5000 3.6667也可以运用左除运算符求解。2354928276xyzxyzxyz 2022-4-25Application of Matlab Language52 5.7 矩阵行列式值 把一个方程看做一个行列式,并按行列式的规则求值,称为行列式的值。在Matlab中,使用函数det(A)得到。例如: A = rand(5) A = 0.9501 0.7621 0.6154 0.4057 0.0579 0.2311 0.4565 0.7919 0.9355 0.3529 0.6068 0.0185 0.9218 0.9169 0.8132 0.4860 0.8214 0.7382 0.4103 0.0099 0.8913 0.4447 0.1763 0.8936 0.1389 B = det(A) B = -0.0071