教学PPTMATLAB程序设计

上传人:新** 文档编号:584561570 上传时间:2024-08-31 格式:PPT 页数:82 大小:4.43MB
返回 下载 相关 举报
教学PPTMATLAB程序设计_第1页
第1页 / 共82页
教学PPTMATLAB程序设计_第2页
第2页 / 共82页
教学PPTMATLAB程序设计_第3页
第3页 / 共82页
教学PPTMATLAB程序设计_第4页
第4页 / 共82页
教学PPTMATLAB程序设计_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《教学PPTMATLAB程序设计》由会员分享,可在线阅读,更多相关《教学PPTMATLAB程序设计(82页珍藏版)》请在金锄头文库上搜索。

1、 第第第第5 5章章章章 MATLABMATLAB程序程序程序程序设计设计5 . 1 程序流程控制程序流程控制5 . 2M文件文件5 . 3 函数调用和参数传递函数调用和参数传递5 . 4 利用函数句柄执行函数利用函数句柄执行函数5 . 5 利用泛函命令进行数值分析利用泛函命令进行数值分析5 . 6 内联函数内联函数5 . 7 M文件性能的优化和加速文件性能的优化和加速5.15.1程序流程控制程序流程控制程序流程控制程序流程控制5.1.1 forend循环结构循环结构MATLAB的循环结构有2种:forend结构和whileend结构。语法:for循环变量=array循环体end【例5.1】使

2、用forend循环编程求出1+3+5+99的值。sum=0;forn=1:2:100sum=sum+nend5.1.1FOR5.1.1FORENDEND循循循循环结环结构构构构【例5.2】使用forend循环将单位阵转换为列向量。sum=zeros(6,1);forn=eye(6,6)sum=sum+nend计算结果如下。sum=1111115.1.2WHILE5.1.2WHILEENDEND循循循循环结环结构构构构forend循环的循环次数确定,而whileend循环的循环次数不确定。语法:while表达式循环体end5.1.2WHILE5.1.2WHILEENDEND循循循循环结环结构构构

3、构【例5.3】根据,求y3时的最大n值和y值。y=0;n=1;whiley3y=y+1/(2*n-1);n=n+1;z(n)=y;endmn=n-2%y=8y(n)=1;elseifx(n)=6y(n)=5-x(n)/2;elseifx(n)=4y(n)=2;elsey(n)=sqrt(x(n);endendplot(x,y)axis(01002.5);5.1.4SWITCH5.1.4SWITCHCASECASE开关开关开关开关结结构构构构switchcase结构是有多个分支结构的条件转移结构。语法:switch开关表达式case表达式1语句段1case表达式2语句段2otherwise语句段

4、nend5.1.4SWITCH5.1.4SWITCHCASECASE开关开关开关开关结结构构构构【例5.5】用switchcase开关结构得出各月份的季节。formonth=1:12;switchmonthcase3,4,5season=springcase6,7,8season=summercase9,10,11season=autumnotherwiseseason=winterendend5.1.5TRY5.1.5TRYCATCHCATCHENDEND试试探探探探结结构构构构MATLAB提供一种试探结构trycatchend,这种语句结构是其他很多语言所没有的。语法:try语句段1cat

5、ch语句段2end5.1.5TRY5.1.5TRYCATCHCATCHENDEND试试探探探探结结构构构构【例5.6】用trycatchend结构进行矩阵相乘运算。n=4;a=magic(n);m=3;b=eye(3);tryc=a*bcatchc=a(1:m,1:m)*bendlasterr计算结果如下。c=1623511109765.1.5TRY5.1.5TRYCATCHCATCHENDEND试试探探探探结结构构构构用lasterr函数查看出错原因显示如下。ans=Errorusing=*Innermatrixdimensionsmustagree.程序分析:试探出矩阵的大小不匹配时,矩阵

6、无法相乘,则再执行catch后面的语句段,将A的子矩阵取出与B矩阵相乘。5.1.65.1.6流程控制流程控制流程控制流程控制语语句句句句1break命令命令break命令可以使包含break的最内层的for或while语句强制终止,立即跳出该结构,执行end后面的命令,break命令一般和if结构结合使用。【例5.7】将【例5.3】增加条件,用if与break命令结合,停止while循环。计算值,当y=3时终止计算。y=0;n=1;whilen=100ify3y=y+1/(2*n-1);n=n+1;z(n)=y;elsebreakendendmn=n-2%ya=input(inputanumb

7、er:)%输入数值给ainputanumber:45a=45b=input(inputanumber:,s)%输入字符串给binputanumber:45b=45input(inputanumber:)%将输入值进行运算inputanumber:2+3ans=55.1.75.1.7循循循循环结环结构与构与构与构与动动画画画画1以电影方式产生动画以电影方式产生动画以电影方式产生动画,有2个步骤。(1)使用getframe命令抓取图形作为画面,每个画面都是以1个列向量的方式,置于存放整个电影的矩阵M中。(2)使用movie(M,k)命令播放电影,并可指定矩阵M播放的重复次数k。【例5.9】使用电影

8、方式制作动画并显示,最后一幅画面如图5.2所示。t=-pi:0.1:pi;n=length(t)forii=1:n%循环次数由横坐标长度决定x=-pi:0.1:t(ii);y=sin(2*x);z=cos(x);plot3(x,y,z)%绘制曲线axis(-4,4,-1,1,-1,1);%确定坐标轴范围M(ii)=getframe;%抓取画面endmovie(M)%播放数组M的画面5.1.75.1.7循循循循环结环结构与构与构与构与动动画画画画5.1.75.1.7循循循循环结环结构与构与构与构与动动画画画画2以对象方式产生动画以对象方式产生动画(1)擦除属性EraseMode。以对象方式产生动

9、画需要设置EraseMode属性。EraseMode为1个字符串,代表对象的擦除方式,即对于旧对象的处理方式。EraseMode属性有以下几种。normal:计算整个画面的数据,重画整个图形。xor:将旧对象的点以xor的方式还原,即只画与屏幕色不一致的新对象点,擦除不一致的原对象点,这种方式不会擦除被擦对象下面的其他图像。background:将旧对象的点变成背景颜色,实现擦除,这种方式会擦除被擦对象下的其他图像。none:保留旧对象的点,不进行任何擦除。5.1.75.1.7循循循循环结环结构与构与构与构与动动画画画画(2)对象的位置属性。通常在动画过程中,会改变对象的位置、尺寸或颜色等外观

10、属性。位置属性有如下2种。xdata:为1个向量,代表对象的x坐标值。ydata:为1个向量,代表对象的y坐标值。(3)屏幕刷新。当新对象的属性设置后,应刷新屏幕,使新对象显示出来,刷新屏幕用drawnow命令实现。drawnow命令使MATLAB暂停当前的任务序列而去刷新屏幕,如果没有drawnow命令,MATLAB则会等当前的任务序列执行完才去刷新屏幕。(4)产生动画。产生动画的具体步骤是:首先产生1个对象,其EraseMode属性为xor、background或none;然后在循环中产生动画,每次循环改变此对象的xdata或ydata(或两者);最后使用drawnow命令刷新屏幕。5.1

11、.75.1.7循循循循环结环结构与构与构与构与动动画画画画【例5.10】使用对象方式产生1个红色的小球沿着曲线运行的界面,如图5.3所示。x=0:0.1:20;y=11/sqrt(10.32)*exp(0.3*x).*sin(sqrt(10.32)*x+acos(0.3);plot(x,y)h=line(0,0,color,red,marker,.,markersize,40,erasemode,xor);%定义红色的小球fori=1:length(x)set(h,xdata,x(i),ydata,y(i);%设置小球的新位置pause(0.005)%暂停0.005sdrawnow%刷新屏幕e

12、nd5.1.75.1.7循循循循环结环结构与构与构与构与动动画画画画运行界面5.25.2 M M文件文件文件文件5.2.1 M文件编辑器文件编辑器单击MATLAB桌面上的图标,或者选择菜单“File”“New”“Script”命令,或选择“Function”可以分别打开空白的M脚本文件编辑器和M函数文件编辑器。如图5.4(a)所示为空白的M脚本文件编辑器,如图5.4(b)所示为M函数文件编辑器。5.2.2M5.2.2M脚本文件脚本文件脚本文件脚本文件脚本文件具有如下特点。(1)脚本文件中的命令格式和前后位置,与在命令窗口中输入时没有任何区别。(2)MATLAB在运行脚本文件时,只是简单地按顺序

13、从文件中读取一条条命令,送到MATLAB命令窗口中去执行。(3)与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空间(workspace)中,可以很方便地查看变量,除非用clear命令清除;脚本文件的命令也可以访问工作空间的所有数据,为此要注意避免变量的覆盖而造成程序出错。5.2.2M5.2.2M脚本文件脚本文件脚本文件脚本文件【例5.11】在M文件编辑/调试器窗口中编写M脚本文件绘制二阶系统的多条时域曲线。欠阻尼系统的时域输出y与x的关系为。(1)单击MATLAB桌面上的图标打开M文件编辑器。(2)将命令全部写入M文件编辑器中,为了能够标志该文件的名称,在第

14、1行写入包含文件名的注释。保存文件为Ex0501.m。%EX0511绘制二阶系统的时域曲线x=0:0.1:20;y1=11/sqrt(10.32)*exp(0.3*x).*sin(sqrt(10.32)*x+acos(0.3)plot(x,y1,r)%画阻尼系数为0.3的曲线holdony2=11/sqrt(10.7072)*exp(0.707*x).*sin(sqrt(10.7072)*x+acos(0.707)plot(x,y2,g)%画阻尼系数为0.707的曲线y3=1exp(x).*(1+x)plot(x,y3,b)%画阻尼系数为1的曲线5.2.2M5.2.2M脚本文件脚本文件脚本文件

15、脚本文件(3)选择M文件编辑器菜单“Debug”“Run”命令,运行界面如图5.5所示。5.2.2M5.2.2M脚本文件脚本文件脚本文件脚本文件查看工作空间的变量如下:whosNameSizeByteClassx1x2011608doublearrayy11x2011608doublearrayy21x2011608doublearrayy31x2011608doublearrayGrandtotalis804elementsusing6432Byte5.2.3M5.2.3M函数文件函数文件函数文件函数文件M函数文件的基本格式如下:函数声明行H1行(用%开头的注释行)在线帮助文本(用%开头)编

16、写和修改记录(用%开头)函数体说明:(1)函数声明行以“function”引导,是M函数文件必须有的,M脚本文件没有;函数名和文件名一致,当不一致时,MATLAB以文件名为准,Ex0502函数保存在Ex0502.m文件中。函数声明行的格式:function输出变量列表=函数名(输入变量列表)(2)H1行通常包含大写的函数文件名,可以提供help和lookfor关键词用于查询。(3)在线帮助文本通常包含函数输入、输出变量的含义和格式说明。(4)编写和修改记录一般在空1行后,记录作者、日期和版本记录,用于软件档案管理。(5)函数体由MATLAB的命令或者通过流程控制结构组织的命令组成。通过函数体实

17、现函数的功能。5.2.3M5.2.3M函数文件函数文件函数文件函数文件在MATLAB界面中选择菜单“File”“New”“Function”命令,则会创建一个新的函数文件并自动生成函数语句,函数文件内容如下:functionoutput_args=Untitled1(input_args)%UNTITLED1Summaryofthisfunctiongoeshere%Detailedexplanationgoeshereend5.2.3M5.2.3M函数文件函数文件函数文件函数文件【例5.12】在M文件编辑/调试器窗口编写计算二阶系统时域响应的M函数文件,并在MATLAB命令窗口中调用该文件。

18、创建M函数文件并调用的步骤如下。(1)修改上面的程序内容,修改output_args,Untitled1和input_args的名称。functiony=Ex0512(zeta)%EX0512Stepresponseofquadraticsystem.%Secondorderoutputcurve%copyright20110501x=0:0.1:20;y=11/sqrt(1zeta2)*exp(zeta*x).*sin(sqrt(1zeta2)*x+acos(zeta)plot(x,y)5.2.3M5.2.3M函数文件函数文件函数文件函数文件(2)将函数文件保存为“Ex0512.m”。在命令

19、窗口输入help和lookfor命令查看帮助信息:helpEx0512EX0512Stepresponseofquadraticsystem.SecondorderoutputcurvelookforSecondorderoutputcurveEx0512.m:%二阶系统时域响应5.2.3M5.2.3M函数文件函数文件函数文件函数文件(3)在MATLAB命令窗口输入以下命令,则会出现f的计算值和绘制的曲线:f=Ex0512(0.3)第1行指定该文件是函数文件,文件名为“Ex0512”,输入参数为阻尼系数zeta,输出参数为时域响应y。当函数文件调用结束,查看x、y。x?Undefinedfun

20、ctionorvariablex.y?Undefinedfunctionorvariabley.5.35.3函数函数函数函数调调用和参数用和参数用和参数用和参数传递传递5.3.1 子函数和私有函数子函数和私有函数1子函数子函数在1个M函数文件中,可以包含1个以上的函数,其中只有一个是主函数,其他均为子函数。(1)在1个M文件中,主函数必须出现在最上方,其后是子函数,子函数的次序无任何限制。(2)子函数不能被其他文件的函数调用,只能被同一文件中的函数(可以是主函数或子函数)调用。(3)同一文件的主函数和子函数变量的工作空间相互独立。(4)用help和lookfor命令不能提供子函数的帮助信息。5

21、.3.15.3.1子函数和私有函数子函数和私有函数子函数和私有函数子函数和私有函数【例5.13】将画二阶系统时域曲线的函数作为子函数,编写画多条曲线的程序。functionEx0513()%EX0513使用函数调用绘制二阶系统时域响应z1=0.3;Ex0512(z1);%调用Ex0502holdonz1=0.5Ex0512(z1)%调用Ex0502z1=0.707;Ex0512(z1)%调用Ex0502functiony=Ex0512(zeta)%子函数,画二阶系统时域曲线x=0:0.1:20;y=11/sqrt(1zeta2)*exp(zeta*x).*sin(sqrt(1zeta2)*x+

22、acos(zeta)plot(x,y)5.3.15.3.1子函数和私有函数子函数和私有函数子函数和私有函数子函数和私有函数2私有函数私有函数私有函数是指存放在private子目录中的M函数文件,具有以下性质。(1)在private目录下的私有函数,只能被其父目录的M函数文件所调用,而不能被其他目录的函数调用。私有函数对其他目录的文件是不可见的,私有函数可以和其他目录下的函数重名。(2)私有函数父目录的M脚本文件也不可调用私有函数。(3)在函数调用搜索时,私有函数优先于其他MATLAB路径上的函数。3调用函数的搜索顺序调用函数的搜索顺序在MATLAB中调用1个函数,搜索的顺序如下。(1)查找是否

23、为子函数。(2)查找是否为私有函数。(3)从当前路径中搜索此函数。(4)从搜索路径中搜索此函数。5.3.25.3.2局部局部局部局部变变量和全局量和全局量和全局量和全局变变量量量量1局部变量局部变量局部变量(LocalVariables)是在函数体内部使用的变量,其影响范围只能在本函数内;每个函数在运行时,都占用独立的函数工作空间,此工作空间和MATLAB的工作空间是相互独立的。局部变量仅存在于函数的工作空间内,只在函数执行期间存在,当函数执行完变量就消失。2全局变量全局变量全局变量(GlobalVariables)是可以在不同的函数工作空间和MATLAB工作空间中共享使用的变量。5.3.25

24、.3.2局部局部局部局部变变量和全局量和全局量和全局量和全局变变量量量量【例5.14】修改【例5.13】在主函数和子函数中使用全局变量。functionEx0514()%EX0514使用全局变量绘制二阶系统时域响应globalXX=0:0.1:20;z1=0.3;Ex0512(z1);holdonz1=0.5;Ex0512(z1);z1=0.707;Ex0512(z1);functionEx0512(zeta)%子函数,画二阶系统时域曲线globalXy=11/sqrt(1zeta2)*exp(zeta*X).*sin(sqrt(1zeta2)*X+acos(zeta);plot(X,y);5

25、.3.25.3.2局部局部局部局部变变量和全局量和全局量和全局量和全局变变量量量量程序分析:X变量为全局变量,在需要使用的主函数和子函数中都需要用global定义;同样,如果在工作空间中定义X为全局变量后也可以使用。globalXwhoYourvariablesare:X5.3.35.3.3函数的参数函数的参数函数的参数函数的参数函数调用的格式如下:输出参数1,输出参数2,=函数名(输入参数1,输入参数2,)1参数传递规则参数传递规则在MATLAB中,函数具有自己的工作空间,函数内变量与外界(包括其他函数和工作空间)的唯一联系就是通过函数的输入/输出参数。输入参数在函数中的任何变化,都仅在函数

26、内进行,不会传递回去。5.3.35.3.3函数的参数函数的参数函数的参数函数的参数【例5.15】将画二阶系统时域的函数修改,使用输入/输出参数来实现参数传递,如图5.6所示。5.3.35.3.3函数的参数函数的参数函数的参数函数的参数2函数参数的个数函数参数的个数MATLAB函数的调用有一个与其他语言不同的特点是:函数的输入/输出参数的数目都可以变化,用户可以根据参数的个数编程。(1)nargin变量和nargout变量。在MATLAB中有2个特殊变量:nargin和nargout。函数的输入/输出参数的个数可以通过变量nargin和nargout获得,nargin用于获得输入参数的个数,na

27、rgout用于获得输出参数的个数。语法:nargin%在函数体内获取实际输入变量的个数nargout%在函数体内获取实际输出变量的个数nargin(fun)%在函数体外获取定义的输入参数个数nargout(fun)%在函数体外获取定义的输出参数个数5.3.35.3.3函数的参数函数的参数函数的参数函数的参数【例5.16】计算2个数的和,根据输入参数个数的不同使用不同的运算表达式。functionsum,n=Ex0516(x,y)%EX0516参数个数可变,计算x和y的和ifnargin=1sum=x+0;%若输入1个参数就计算与0的和elseifnargin=0sum=0;%若无输入参数就输出

28、0elsesum=x+y;%若输入的是2个数则计算和end5.3.35.3.3函数的参数函数的参数函数的参数函数的参数在命令窗口调用Ex0516函数,分别使用2个、1个和无输入参数,结果如下所示。y,n=Ex0516(2,3)y=5n=2y,n=Ex0516(2)y=2n=1y,n=Ex0516y=0n=05.3.35.3.3函数的参数函数的参数函数的参数函数的参数如果输入的参数多于输入参数个数,则会出错。y,n=Ex0516(1,2,3)?Errorusing=ex0516Toomanyinputarguments.也可以在工作空间查看函数体定义的输入参数个数。nargin(Ex0516)a

29、ns=25.3.35.3.3函数的参数函数的参数函数的参数函数的参数【例5.16续】添加以下程序,查看用nargout变量获取输出参数个数。ifnargout=0%当输出参数个数为0时,运算结果为0sum=0;end在命令窗口调用Ex0516函数,当输出参数格式不同时,结果如下。Ex0516(2,3)%当输出参数个数为0时ans=0y=Ex0516(2,3)%当输出参数个数为1时y=5y,n,x=Ex0516%当输出参数个数太多时?Errorusing=ex0516Toomanyoutputarguments5.3.35.3.3函数的参数函数的参数函数的参数函数的参数(2)varargin变量

30、和varargout变量。MATLAB还有2个特殊变量:varargin和varargout,可以获得输入/输出变量的各元素内容,varargin和varargout都是元胞数组。【例5.16续】计算所有输入变量的和。functiony,n=Ex0516(varargin)%EX0516使用可变参数vararginifnargin=0%当没有输入变量时输出0disp(NoInputvariables.)y=0;elseifnargin=1%当一个输入变量时,输出该数y=varargin1;elsen=nargin;y=0;form=1:ny=vararginm+y;%当有多个输入变量时,取输入

31、变量循环相加endendn=nargin;5.3.35.3.3函数的参数函数的参数函数的参数函数的参数在MATLAB的命令窗口中输入不同个数的变量调用函数Ex0516,结果如下。y,n=Ex0516(1,2,3,4)%输入4个参数y=10n=4y,n=Ex0516(1)%输入1个参数y=1n=1y,n=Ex0516%无输入参数NoInputvariables.y=0n=05.3.45.3.4程序程序程序程序举举例例例例【例5.17】根据输入的参数绘制不同的曲线,每个子函数绘制一种曲线。M文件的程序代码。程序分析:主函数名为Ex0517,4个子函数名分别为po1、po2、po3和po4,文件保存

32、为Ex0517.m。若在命令窗口中输入以下命令:y=Ex0517(1);则产生如图5.7所示的调用第一个子函数的极坐标曲线。5.3.45.3.4程序程序程序程序举举例例例例【例5.18】编写M函数文件,通过流程控制语句,建立如下的矩阵。functiony=Ex0518(m)%EX0518用循环流程控制语句创建矩阵y=0;m=m1;forn=1:my=0,y;%创建全0行endforn=1:ma=1:1:n;b=a;fork=m:1:nb=0,b;endy=b;y;n=n+1;end5.3.45.3.4程序程序程序程序举举例例例例5.3.45.3.4程序程序程序程序举举例例例例在命令窗口中调用E

33、x0518函数。y=Ex0518(5)y=01234001230001200001000005.3.45.3.4程序程序程序程序举举例例例例【例5.19】在本书第4章例4.30中,在界面中绘制正弦波形,在单选按钮中选择振幅,在列表框中选择频率,然后绘制正弦曲线。1设计界面设计界面界面设计如图5.8所示。5.3.45.3.4程序程序程序程序举举例例例例2回调函数回调函数回调函数需要在单击“Draw”按钮(pushbutton1)时绘制正弦曲线,单击“Close”按钮(pushbutton1)时关闭窗口。编写回调函数的步骤:选择“Draw”按钮(pushbutton1)单击鼠标右键,然后选择菜单“

34、ViewCallbacks”“Callback”命令,进入pushbutton1_Callback函数,在函数中添加函数内容如下:functionpushbutton1_Callback(hObject,eventdata,handles)am_1=get(handles.radiobutton1,value);%获取单选按钮radiobutton1的值am_2=get(handles.radiobutton2,value);ifam_1=1%如果单选按钮radiobutton1被选中am=5;elseam=10;endfre1=get(handles.listbox1,string);%获取

35、下拉列表listbox1的string属性n=get(handles.listbox1,value);%获取下拉列表listbox1被选中的列表索引fre=eval(fre1n);%得出下拉列表listbox1被选中项的内容x=0:0.1:10;plot(am*sin(fre*x);%绘制正弦曲线,振幅和频率根据选择得出5.3.45.3.4程序程序程序程序举举例例例例handles变量非常重要,它是1个结构数组,包括以下两部分内容。(1)存储所有在图形界面中的控件、菜单、坐标轴对象的句柄,每个对象的句柄名称与对象的“Tag”名相同,如下拉列表listbox1的句柄是“handles.listb

36、ox1”。(2)通过get函数可以获得不同对象的属性值,例如,get(handles.listbox1,string)得出91的元胞数组,记录了所有下拉项的值,fre1n用来获取对应下拉列表项的值;get(handles.listbox1,value)得出用户所选的下拉项的索引,如果选择第一项则为1。运行界面如图5.9所示。5.45.4利用函数句柄利用函数句柄利用函数句柄利用函数句柄执执行函数行函数行函数行函数5.4.1 函数句柄的创建函数句柄的创建1函数句柄的创建函数句柄的创建与图形对象的句柄不同,函数句柄不是在函数文件创建时自动创建的,而是必须通过专门的定义。创建函数句柄使用“”符号或st

37、r2func命令实现。语法:h_fun=fun%创建函数句柄h_fun=str2func(fun)%创建函数句柄h_array=str2func(fun1,fun2,)%创建函数句柄数组【例5.20】创建MATLAB内部函数的句柄。h_sin=sin;%创建函数句柄h_cos=str2func(cos);%创建函数句柄数组h_array=str2func(sin,cos,tan)h_array=sincostan5.4.15.4.1函数句柄的函数句柄的函数句柄的函数句柄的创创建建建建2使用函数句柄的优点使用函数句柄的优点利用函数句柄执行函数的优点有以下几点。(1)在更大范围内调用函数。函数句柄

38、包含了函数文件的路径和函数类型,即函数是否为内部函数、M或P文件、子函数、私有函数等。(2)提高函数调用的速度。不使用函数句柄时,对函数的每次调用都要为该函数进行全面的路径搜索,直接影响了速度。(3)使函数调用像使用变量一样方便、简单。(4)可迅速获得同名重载函数的位置、类型信息。5.4.25.4.2用用用用FEVALFEVAL命令命令命令命令执执行函数行函数行函数行函数函数也可以使用feval命令直接执行,feval命令可以使用函数句柄或函数名。语法:y1,y2,=feval(h_fun,arg1,arg2)y1,y2,=feval(funname,arg1,arg2)【例例5.21】根据阻

39、尼系数绘制不同二阶系统的时域响应,当时,5.4.25.4.2用用用用FEVALFEVAL命令命令命令命令执执行函数行函数行函数行函数在MATLAB的命令窗口调用该Ex0520函数有3种格式。(1)用feval命令利用函数句柄执行。h_Ex0520=str2func(Ex0520)h_Ex0520=Ex0520y=feval(h_Ex0520,1);(2)用feval命令利用函数名执行。y=feval(Ex0520,1);(3)直接调用函数。y=Ex0520(1);5.55.5利用泛函命令利用泛函命令利用泛函命令利用泛函命令进进行数行数行数行数值值分析分析分析分析5.5.1 求极小值求极小值1f

40、minbnd函数函数fminbnd函数用来计算单变量非线性函数的极小值。语法:x,y=fminbnd(h_fun,x1,x2,options)x,y=fminbnd(funname,x1,x2,options)【例5.22】 用fminbnd求解humps函数的极小值。x,y=fminbnd(humps,0.5,0.8)%求在0.50.8之间的极小值x=0.6370y=11.25285.5.15.5.1求极小求极小求极小求极小值值程序分析:humps函数是MATLAB提供的M文件,保存为humps.m文件;humps表示humps函数的句柄,humps的函数最小值曲线如图5.10所示,最小值为

41、图中的圆点(0.6370,11.2528),误差小于104。5.5.15.5.1求极小求极小求极小求极小值值2fminsearch函数函数fminsearch函数用于求多变量无束缚非线性最小值,采用Nelder-Mead单纯形算法求解多变量函数的最小值。语法:x=fminsearch(h_fun,x0)x=fminsearch(funname,x0)【例5.23】 求著名的Banana测试函数f(x,y)=100(yx2)2+(1x)2的最小值,它的理论最小值是x=1,y=1。该测试函数有一片浅谷,很多算法都难以逾越。fn=inline(100*(x(2)x(1)2)2+(1x(1)2,x)%

42、用inline产生内联函数,x和y用二元数组表示fn=Inlinefunction:fn(x)=100*(x(2)x(1)2)2+(1x(1)2y=fminsearch(fn,0.5,1)%从(0.5,1)为初始值开始搜索求最小值y=1.00001.00005.5.25.5.2求求求求过过零点零点零点零点fzero函数可以寻找一维函数的零点,即求f(x)=0的根。语法:x=fzero(h_fun,x0,tol,trace)x=fzero(funname,x0,tol,trace)【例5.24】 求解humps函数的过零点,humps函数的过零点用圆点表示,如图5.11所示。xzero=fzer

43、o(humps,1)%求在1附近的零点xzero=1.2995xzero=fzero(humps,0.5,1.5)%求在0.51.5范围内的零点xzero=1.2995xzero=fzero(humps,0.5,1)%求在0.51范围内的零点?Errorusing=fzeroThefunctionvaluesattheintervalendpointsmustdifferinsign.5.5.25.5.2求求求求过过零点零点零点零点humps函数的过零点5.5.35.5.3数数数数值积值积分分分分语法:s=quad(h_fun,x1,x2,tol,trace,p1,p2,)s=quad(fun

44、name,x1,x2,tol,trace,p1,p2,)s=quad8(h_fun,x1,x2,tol,trace,p1,p2,)s=quad8(funname,x1,x2,tol,trace,p1,p2,)【例5.25】 计算y=humps(x)曲线下面的面积。x=0:0.01:1;y=humps(x);area=trapz(x,y)%用梯形计算积分area=29.8571area1=quad(humps,0,1)%用quad计算积分area1=29.8583area2=quad8(humps,0,1)%用quad8计算积分area2=29.85835.5.45.5.4微分方程的数微分方程的

45、数微分方程的数微分方程的数值值解解解解MATLAB提供了ode23、ode45和ode113等多个函数求解微分方程的数值解。以下介绍低维方法、高维方法和变维方法解一阶常微方程组。语法:t,y=ode45(h_fun,tspan,y0,options,p1,p2)t,y=ode45(funname,tspan,y0,options,p1,p2)【例5.26】 解经典的范德波尔(VanderPol)微分方程:5.5.45.5.4微分方程的数微分方程的数微分方程的数微分方程的数值值解解解解(1)必须把高阶微分方程式变换成为一阶微分方程组。令y1=x,y2=dx/dt,则将二阶微分方程变为一阶微分方程

46、组:(2)编写1个函数vdpol.m文件,设定=2,该函数返回上述导数值。输出结果由1个列向量yprime给出。y1和y2合并写成列向量y。函数M文件vdpol.m:%范德波尔方程functionyprime=vdpol(t,y)yprime=y(2);2*(1y(1)2)*y(2)y(1)5.5.45.5.4微分方程的数微分方程的数微分方程的数微分方程的数值值解解解解(3)给定当前时间及y1和y2的初始值,解微分方程。tspan=0,30;%起始值0和终止值30y0=1;0;%初始值t,y=ode45(vdpol,tspan,y0);%解微分方程y1=y(:,1);y2=y(:,2);fig

47、ure(1)plot(t,y1,:b,t,y2,r)%画微分方程解figure(2)plot(y1,y2)%画相平面图5.5.45.5.4微分方程的数微分方程的数微分方程的数微分方程的数值值解解解解设y1为横坐标,y2为纵坐标,则画出相平面图如图5.12所示。5.65.6内内内内联联函数函数函数函数1内联函数的创建内联函数的创建创建内联函数可以使用inline命令实现。语法:inline(string,arg1,arg2,)%创建内联函数【例5.26】创建内联函数实现。f=inline(sin(x)*exp(z*x),x,z)%创建内联函数f=Inlinefunction:f(x,z)=sin

48、(x)*exp(z*x)y=f(5,0.3)%调用函数fy=0.21405.65.6内内内内联联函数函数函数函数2查看内联函数查看内联函数MATLAB可以用char、class和argnames命令方便地查看内联函数的信息。语法:char(inline_fun)%查看内联函数的内容class(inline_fun)%查看内联函数的类型argnames(inline_fun)%查看内联函数的变量【例5.26续】查看内联函数的信息。char(f)ans=sin(x)*exp(z*x)class(f)ans=inlineargnames(f)ans=xz5.65.6内内内内联联函数函数函数函数3使内

49、联函数适用于数组运算使内联函数适用于数组运算内联函数的输入变量不能是数组,但可以使用vectorize命令将内联函数适用于数组运算。语法:vectorize(inline_fun)%使内联函数适用于数组运算【例5.26续】使内联函数适用于数组运算。ff=vectorize(f)%使内联函数f转换为适合于数组运算ff=Inlinefunction:ff(x,z)=sin(x).*exp(z.*x)x=0:0.1:20;y=ff(x,0.3);5.65.6内内内内联联函数函数函数函数4执行内联函数执行内联函数内联函数还可以直接使用feval命令执行。语法:y1,y2,=feval(inline_f

50、un,arg1,arg2)【例5.26续】执行内联函数。x=0:0.1:20;z=0:0.05:10;y=feval(ff,x,z)5.7M5.7M文件性能的文件性能的文件性能的文件性能的优优化和加速化和加速化和加速化和加速5.7.1 M文件性能优化文件性能优化1使用循环时提高速度的措施使用循环时提高速度的措施循环语句及循环体是MATLAB编程的瓶颈问题。MATLAB与其他编程语言不同,它的基本数据是向量和矩阵,编程时应尽量对向量和矩阵编程,而不要对矩阵的元素编程。2大型矩阵的预先定维大型矩阵的预先定维由于MATLAB变量在使用之前不需要定义和指定维数,当变量新赋值的元素下标超出数组的维数时,

51、MATLAB就为该数组扩维1次,大大地降低了运行的效率。5.7.1M5.7.1M文件性能文件性能文件性能文件性能优优化化化化【例5.27】将【例5.18】中的双重循环改为单循环,并用zeros函数定维来提高运行速度,创建矩阵。functiony=Ex0518(m)%EX0518先定维再创建矩阵m=m1;y=zeros(m);forn=1:m1a=1:mn;y(n,n+1:m)=a;endy5.7.1M5.7.1M文件性能文件性能文件性能文件性能优优化化化化3优先考虑内在函数优先考虑内在函数矩阵运算应该尽量采用MATLAB的内在函数。内在函数是由更底层的C语言构造的,其执行速度显然很快。4采用高

52、效的算法采用高效的算法在实际应用中,解决同样的数学问题经常有各种各样的算法。例如,求解定积分的数值解法在MATLAB中就提供了2个函数:quad和quad8,其中后者在精度、速度上都明显高于前者。可见,应寻求更高效的算法。5尽量使用尽量使用M函数文件代替函数文件代替M脚本文件脚本文件由于M脚本文件每次运行时,都必须把程序装入内存,然后逐句解释执行,十分费时。因此,要尽量使用M函数文件代替M脚本文件。5.7.2P5.7.2P码码文件文件文件文件1P码文件的生成码文件的生成P码文件使用pcode命令生成,生成的P码文件与原M文件名相同,其扩展名为“.p”。语法:pcodeFilename.m%在当

53、前目录生成Filename.ppcodeFilename.m-inplace%在Filename.m所在目录生成Filename.p例如,将【例5.27】生成P码文件,在命令窗口中输入代码将Ex0527.m文件转换为P码文件。pcodeEx0527.m则在当前目录就生成了P码文件Ex0518.p。5.7.2P5.7.2P码码文件文件文件文件2P码文件的特点码文件的特点(1)P码文件的运行速度比原M文件速度快。(2)若存在同名的M文件和P码文件时则P码文件被调用。为了测试,可以将Ex0527.m文件和Ex0527.p文件放在同一目录,将Ex0527.m文件修改并保存,然后在命令窗口运行该文件,结

54、果仍然与原来一样。y=Ex0527(5)(3)P码文件保密性好。用字处理软件打开Ex0527.p文件,看到的是乱码。5.7.35.7.3程序性能剖析窗口程序性能剖析窗口程序性能剖析窗口程序性能剖析窗口(1)打开程序性能剖析窗口。选择MATLAB菜单“Desktop”“Profiler”命令,或在命令窗口输入“profileviewer”命令都可以打开程序性能剖析窗口,如图5.13所示。或者在M文件编辑器窗口中选择菜单“Tools”“OpenProfiler”命令进行剖析。5.7.35.7.3程序性能剖析窗口程序性能剖析窗口程序性能剖析窗口程序性能剖析窗口将本书的【例5.27】和【例5.18】进

55、行剖析比较,在图5.13中输入“y=Ex0527(100)”,然后单击“StartProfiling”按钮,查看剖析报告。图5.14(a)显示的是单循环【例5.27】的剖析报告,图5.14(b)显示的是双循环【例5.18】的剖析报告。5.7.35.7.3程序性能剖析窗口程序性能剖析窗口程序性能剖析窗口程序性能剖析窗口(3)查看剖析报告。在程序性能分析窗口中以表格显示“剖析分析汇总表”(ProfileSummary),从上到下按占用时间的多少排列。在图5.14中可以看出创建100100的矩阵,单循环只需要0.020s,而双重循环需要0.032s。如果需要得出分析的详细内容,则可以单击表格中的超链接,打开相应的内容页面。在图5.14(a)图中单击Ex0527则打开图5.15,可以看到Ex0527的详细运行细节。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号