Matlab程序设计第4章_第1页
Matlab程序设计第4章_第2页
Matlab程序设计第4章_第3页
Matlab程序设计第4章_第4页
Matlab程序设计第4章_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 Matlab程序设计 Mtatlab程序设计既有传统高级语言的特征,又有自己独特的优点,在Matlab程序设计时,充分利用Matlab数据结构的特点,可以使程序结构简单、编程效率高。本章介绍有关Matlab程序控制结构以及程序设计的基本方法。Matlab在执行命令时,一种交互的命令执行方式,在命令窗口逐条输入指令,执行时Matlab逐条解释执行。这种方式虽然简单、直观,但速度慢,执行过程不保留,当某些操作需要反复进行时,更使人感到不便。另一种M文件的程序执行方式,是将有关命令变成程序存储在一个文件中(M文件)当需要运行时,直接调用运行,运行时Matlab就自动依次执行该文件中的命令4.

2、1 M文件一、M文件的分类通常,M文件可分为两大类这里通过一个例题加以说明 这两种Matlab程序代码所编写的文件通常都是以“.m”为扩展名,因此都统称为M文件。M函数文件是Matlab的主流。Matalb本身的一系列工具箱的内部函数就是Matlab的开发者设计的一些M函数,提供给我们使用。 我们也可以根据我们的需要,开发设计我们自己需要M函数在区间-6,6中的图形例: 用matlab编写一M文件和M函数绘制以下函数图形x=-6:0.1:6;leng=length(x);for m=1:leng; if x(m)=0 y(m)=sin(x(m); elseif x(m)=3 y(m)=x(m)

3、; else y(m)=-x(m)+6; endendplot(x,y);grid用M文件形式编写程序x=-6:0.1:6;leng=length(x);y=;for m=1:leng; if x(m)=0 y=y,sin(x(m); elseif x(m)=3 y=y,x(m); else y=y,-x(m)+6; endendplot(x,y);grid方法三:x=-6:0.1:6;y=(x=0&x3).*(-x+6);plot(x,y),grid on2、M函数的形式编写程序function y=demofile(x)leng=length(x);for m=1:leng if x(m)

4、=0 y(m)=sin(x(m); elseif x(m)=3 y(m)=x(m); else y(m)=-x(m)+6 endend 编写好该程序,保存时Matlab自动以demofile为函数名存入内存。当需要运行该程序时在Matlab命令窗口键入function y=demofile1(x)y=(x=0&x3).*(-x+6);plot(x,y),grid onx=-6:0.1:6;y=demofile(x); %自动调用demofile.mplot(x,y);grid从例题中我们看到了,M函数和M脚本的不同,这里主要介绍M函数的基本格式M函数文件基本格式: 函数声明行 H1行(用%开头

5、的注释行) 在线帮助文本(用%开头) 编写和修改记录(用%开头) 函数体x=-6:0.1:6;y=demofile1(x); 例:用M脚本文件和M函数文件两方式,编写二阶系统时间响应曲线%M脚本文件程序%Ex0401 二阶系统时域曲线%画阻尼系数为0.3的曲线t=0:0.1:20;y1=1-1/sqrt(1-0.32)*exp(-0.3*t).*sin(sqrt(1-0.32)*t+acos(0.3);plot(t,y1,r)M脚本文件function y=Ex0402(zeta)% 二阶系统时域曲线%Ex0402 %zeta 阻尼系数%y 时域响应%copyright 2009-3-4t=0

6、:0.1:20;y1=1-1/sqrt(1-zeta2)*exp(-zeta*t).*sin(sqrt(1-zeta2)*t+acos(zeta);plot(t,y1,r)M函数文件第一行一定为函数声明行H1行(用%开头的注释行)一般在空一行进行作编写和修改记录(用%开头)可在命令窗口输入help和lookfor命令查看帮助信息 help Ex0402 二阶系统时域曲线 Ex0402 zeta 阻尼系数 y 时域响应 copyright 2009-3-4 lookfor 阶系统时域曲线Ex0402.m: % 二阶系统时域曲线help命令显示M文件的第一个连续注释快lookfor命令显示第一行注

7、释,lookfor命令的查找必须是Matlab搜索路径上的文件 Matlab的脚本文件(script File)比较简单,当需要在命令窗口运行大量的命令时,直接从命令窗口输入比较麻烦,可以打开M文件编辑器,将这组命令存放在脚本文件中,运行时只要输入脚本文件名,Matlab就会自动执行该文件。例:在M文件编辑/调试器窗口中编写M脚本文件绘制二阶系统的多条时域曲线,(1)单击Matlab桌面上的 图标打开M文件编辑器(2)将命令全部写入M编辑器中,在第一行加入注释“%Ex0403 二阶系统时域曲线”,保存文件为Ex0403.m%Ex0403 二阶系统时域曲线t=0:0.1:20;y1=1-1/sq

8、rt(1-0.32)*exp(-0.3*t).*sin(sqrt(1-0.32)*t+acos(0.3);plot(t,y1,r)hold ony2=1-1/sqrt(1-0.72)*exp(-0.7*t).*sin(sqrt(1-0.72)*t+acos(0.7);plot(t,y2,g)y3=1-exp(-t).*(1+t);plot(t,y3,b) 选择M文件编辑器选单“Debug/Save and Run”,就可以观察运行结果3、M文件的建立与打开M文件建立与打开各3种方法4.2 程序控制结构Matlab的程序控制结构有4种:顺序结构;选择结构;循环结构。任何复杂的程序都可以有着3种基

9、本结构构成。一、顺序结构 顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句。这也是最简单的一种程序结构。一般涉及数据的输入、数据的计算或处理、数据的输出等内容。1、数据的输入从键盘输入数据,则可使用input函数来实现,其格式: A=input(提示信息,选项);其中:提示信息-为字符串,用于提示用户 输入什么样的数据A=input(输入A矩阵:) %提示输入A矩阵2、数据的输出 Matlab提供的命令窗口输出函数主要有disp函数,其调用格式为:disp(输出项)其中:输出项-既可以是字符串、也 可以是矩阵例如:A=Helio,Tom; disp(A)输出结果:Hello

10、,Tom例如:A=1 2 3;4 5 6;7 8 9; disp(A)输出结果: 1 2 3 4 5 6 7 8 9例:求解一元二次方程 a=input(a=?);b=input(b=?);c=input(c=?);d=b2-a*4*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a);disp(x1=,num2str(x(1),x2=,num2str(x(2)a=?4b=?78c=?54x1=-0.7188 x2=-18.7812输出结果:a=?23b=?-6c=?51x1=0.13043+1.4834i x2=0.13043-1.4834iMatlab中程序暂停函

11、数的调用格式pause(延时秒数) 若省去延时秒数,直到用户按任意键程序继续执行,按Ctrl+C强行中止程序的执行2、选择结构 选择结构是根据给定条件成立或不成立,分别执行不同的语句。Matlab中用于选择结构的语句有if语句;switch语句;try语句。1)if语句Matlab中,if语句有3种格式格式:if 条件 语句组 end单分支if语句双分支if语句格式:if 条件 语句组1 else 语句组2 end多分支if语句格式:if 条件1 语句组1 elseif 条件2 语句组2 elseif 条件m 语句组m else 语句组n end条件1条件2条件m语句组1语句组2语句组m语句组

12、n成立成立成立不成立不成立不成立多分支if语句的执行过程结构框图例如:计算分段函数运用单分支if语句编程x=input(请输入的值); y=cos(x+1)+sqrt(x*x+1); if x=10 y=x*sqrt(x+sqrt(x);endy运用双分支if语句编程x=input(请输入的值);if x=10 y=cos(x+1)+sqrt(x*x+1); else y=x*sqrt(x+sqrt(x);endyx=input(请输入的值);if x=10 y=x*sqrt(x+sqrt(x);else y=cos(x+1)+sqrt(x*x+1); endy例如:利用if结构计算二阶系统的

13、时域响应,根据阻尼系数0zeta0)&(zeta *Inner matrix dimensions must agree.输出结果2、循环结构 循环是指按照给定的条件,重复执行指定的语句,这是十分重要的一种程序结构。Matlab提供了两种实现循环的结构语句for语句;while语句For语句(步长的默认值为1)格式: for 循环变量=循环初值:步长:终值 循环体语句 end分别求循环的初值、步长、终值将循环的初值赋给循环变量ii在是否在初值和终值之间循环体语句i增加1个步长是否例如:一个3位整数,其各位数字的立方和等于该数本身则称为水仙花数,求出100999之间的全部水仙花数。for m=1

14、00:999; m1=fix(m/100); %求m的百位数字,fix向零方向取整P30 m2=rem(fix(m/10),10); %求m的十位数字 m3=rem(m,10); %求m的个位数字 if m=m1*m1*m1+m2*m2*m2+m3*m3*m3 disp(m) endendMatlab程序 例:求1+3+5+100的值% 数组求和sm=0;for n=1:2:100; sm=sm+n;endsm程序分析:循环变量为n,n对应为向量1:2:100,循环次数为向量1:2:100的列数,每次循环n取一个元素%用Matlab函数求和x=1:2:100s=sum(x)while语句格式:

15、while (条件) 循环体语句 end条件循环体语句不成立成立循环过程图例如:从键盘输入若干个数,当输入0时结束运算,求这些数的平均值和它们的和Matlab程序sm=0;n=0;x=input(Enter a number (end in 0):);while(x=0) sm=sm+x; n=n+1; x=input(Enter a number (end in 0):);endif (n0) sm mean=sm/nend 例:利用while循环,求1+3+5+100的值%Ex0404 利用while循环求1+3+5+100的值sm=0;n=1;while n=100 sm=sm+n n=

16、n+2end Matlab程序程序分析:可见whileend循环的循环次数由表达式来决定,当n=101时停止循环3、流程控制语句在程序执行中,有一些可以控制程序流程的命令,下面主要介绍 break continue return pause keyboard input break语句 break语句用于终止for循环和while循环的执行。当遇到break时,则退出循环体,继续执行循环体外的下一个语句。在嵌套循环中,break往往存在于内层的循环中例:用if与break命令结合,停止while循环,计算1+3+5+100的值,当和大于1000时终止计算%Ex0405 用break终止whil

17、e循环sm=0;n=1;while n=100 if sm1000 sm=sm+n n=n+2else breakendend 程序分析:whileend循环结构嵌套ifelseend分支结构,当sm为1024时跳出while循环,终止运算例:输出100到150之间的第一个能被7整除的整数%E0408for n=100:120 if rem(n,7)=0 continue end break %得到第一个数后就终止循环endn continue语句 continue命令用于结束本次for或while循环,与break命令不同的是continue指结束本次循环而继续进行下次循环例:将if命令与c

18、ontinue命令结合,计算1100种所有素数的和,判断是否为素数是将100以内的每个数都被2 整除,不能被整除的就是素数%Ex0406 用continue终止for循环sm=2;ss=0;y=2;for n=3:100 for m=2:fix(sqrt(n) if mod(n,m)=0 ss=1; %能被整除就用ss=1表示 break; %能被整除就跳出内循环 else ss=0; %不能被整除就用ss=0表示 end end if ss=1 continue; %能被整除就跳出本次循环 end sm=sm+n; %100以内的素数之和 y=y,n; %所有的素数endsm程序分析:fix

19、(sqrt(n)是将 取整;本程序为双重循环,两个for循环嵌套还嵌套一个if结构;当mod(n,m)=0时就用break跳出判断是否是素数的内循环,并继续用continue跳出求素数和的循环而继续下依次外循环例:把100到120之间的能被7整除的整数输出%Ex4047 for n=100:120 if rem(n,7)=0 %rem为求余数函数,判断能否被7整除 continue %把不能被7整除的数去掉,判断下个数 end n %输出能被7整除的数end程序分析:在for循环和while循环中,当出现continue语句时,则跳出循环体所有剩余的语句,继续下一个循环。在嵌套循环中,cont

20、inue控制执行本循环中的下一次循环。例2:已知学生的名字和百分制分数。要求根据学生的分数分别采用“满分”、“优秀”、“良好”、“及格”、“不及格”表示学生的学习成绩。程序分析:本例使用了胞元数组。胞元数组的不同胞元允许放置不同类型的数据对每个胞元赋值时,被赋的值必须放置在“花括号”内clear;%定义分数段:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格( global t whoYour variables are:t whos Name Size Bytes Class t 1x201 1608 double array (global)Grand t

21、otal is 201 elements using 1608 bytes三、函数参数 Matlab的函数调用过程实际上就是参数传递的过程。 1、函数调用格式输出参数1,输出参数2,=函数名(输入参数1,输入参数2,)2、参数传递的规则 在Matlab中,函数具有自己的工作空间,函数内变量与外界(包括其他函数和工作空间)的唯一联系就是通过函数的输入、输出参数,输入参数在函数中的任何变化,都仅在函数内进行,不会传递出去。function Ex0414()%Ex0414 参数传递绘制二阶系统时域响应z1=0.3;t1 y1=Ex0415(z1);plot(t1,y1)hold onz1=0.5;t

22、2 y2=Ex0415(z1);plot(t2,y2)z1=0.707;t3 y3=Ex0415(z1);plot(t3,y3)function t,y=Ex0415(zeta)%子函数,绘制二阶系统时域响应曲线t=0:0.1:20;y=1-1/sqrt(1-zeta2)*exp(-zeta*t).*sin(sqrt(1-zeta2)*t+acos(zeta);例如:使用输入输出参数来实现参数传递,绘制二阶系统时域响应曲线绘制程序分析:主函数Ex0414调用子函数Ex0415,子函数中的zeta为输入函数,函数调用时将z1传递给子函数的zeta,子函数计算后将输出参数t和y回传给主函数t1,y

23、1;主函数调用子函数三次,后面2次参数的传递也是同样的。3、函数参数的个数Matlab函数的调用有一个与其它语言不同特点:函数的输入、输出参数数目都可以变化,用户可以根据参数的个数来编程。(1)nargin和nargout变量 在Matlab中有两个特殊的变量nargin和nargout,函数的输入、输出个数可以通过nargin和nargout获得, nargin用于获得输入参数的个数, nargout用于获得输出参数的个数格式 nargin %在函数体中获取实际输入变量的个数 nargout %在函数体中获取实际输出变量的个数 nargin(fun) %在函数体外获取定义的输入参数个数 na

24、rgout (fun) %在函数体外获取定义的输出参数个数例如:计算两个数的和,根据输入的参数个数使用不同的运算表达式在命令窗口调用Ex0416函数,分别使用2个、1个和无输入参数观察结果。此例计算输入参数不能大于2functionsm,n=Ex0416(x,y)%Ex0416 参数个数可变,计算x和y的和if nargin=1 sm=x; % 输入一个参数就计算与0的和elseif nargin=0 sm=0; %无输入参数就输出0else sm=x+y; %输入的是两参数就计算和endn=nargin;x=8;y=9;sm,n=Ex0416(x,y)functionsm,n=Ex0417(

25、varargin)%Ex0417 使用可变量vararginif nargin=0 %当没有输入变量时的输出0 sm=0; disp(No input )elseif nargin=1 %当输入变量为1个时,输出该数 sm=varargin1 else n=nargin; sm=0; for m=1:n sm=vararginm+sm endendn=nargin;例如:计算所有输入变量的和程序说明:n为输入参数的个数,sm为求和结果x=7;y=9;z=10;sm,n=Ex0417(x,y,z)4.4 程序调试 程序调试是程序设计中的重要环节,也是程序设计人员必须掌握的一种技能。Matlab提

26、供了相应的程序调试功能。一、程序调试概述一般来说程序错误有两类 语法错误:语法错误包括词法和文法 运行错误:是指程序运行结果错误,又称逻辑错误Matlab均能够检查出大部分的语法和文法错误,给出相应的错误信息,并标出错误在程序中的具体所在的行号。A=87;B=9.3;C=A+*B;例如:执行后系统将给出? Error: File: C:MATLAB6p5workd3.m Line: 3 Column: 5Expected a variable, function, or constant, found *. Matlab对逻辑错误是无能为力的,不会给出任何错误信息,此时只能通过一些调试手段来发

27、现问题,最常见的办法是通过获取中间结果的方式来得到错误发生在程序的具体位置的信息二、matlab调试菜单 Matlab的M文件编辑器除了能够编辑和修改文件外,还能对程序进行调试。通过调试菜单(Debug),可以查看和修改函数工作空间的变量,从而准确的找出逻辑错误。通过调试菜单设置断点可以使程序运行到某一行暂停或逐行运行帮助我们查找错误。1、控制单步运行(Debug菜单)书中的Debug菜单图Matlab7.1Matlab6.5Debug菜单中命令有 Step:单步运行。每单击一次,程序运行一次,但不进入函数;Step In:单步运行。遇到函数时进入函数内,仍单步运行Step Out:停止单步运

28、行。如果是在函数中,跳出函数,如果不在函数中,直接运行到下一个断点处。Save and Run:储存文件开始运行。如果文件是已经储存过的,该选项变为Run,Go Until Cursor:直接运行到光标所在的位置。 控制单步运行菜单命令共有5个,在程序运行之前,仅有Save and Run命令是激活的。只有当程序中设置了断点,且程序停止在第一个断点处时其他菜单命令才被激活。2、断点操作(Breakpoints 菜单)断点设置操作命令有5个 Set/Clear Breakpoint:设置或清除断点Set/Modify Conditional Breakpoint:设置或修改条件断点。条件断点可以使程序执行到满足一定条件时停止。Enable/Dsable Breakpoint:使断点有效或无效。 Clear Breakpoint in All Files:清除所有断点Stop If Errors / Warnings:在程序执行出现错误或警告时,停止程序运行,进入调试状态。例如:下图所示的编辑窗口,有一程序时设置断点来控制程序执行Matlab7.1将此项归入Debu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论