教学PPTMATLAB程序设计.ppt

上传人:文库蛋蛋多 文档编号:2204291 上传时间:2023-01-30 格式:PPT 页数:82 大小:4.43MB
返回 下载 相关 举报
教学PPTMATLAB程序设计.ppt_第1页
第1页 / 共82页
教学PPTMATLAB程序设计.ppt_第2页
第2页 / 共82页
教学PPTMATLAB程序设计.ppt_第3页
第3页 / 共82页
教学PPTMATLAB程序设计.ppt_第4页
第4页 / 共82页
教学PPTMATLAB程序设计.ppt_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《教学PPTMATLAB程序设计.ppt》由会员分享,可在线阅读,更多相关《教学PPTMATLAB程序设计.ppt(82页珍藏版)》请在三一办公上搜索。

1、第5章 MATLAB程序设计,5.1 程序流程控制,5.2 M文件,5.3 函数调用和参数传递,5.4 利用函数句柄执行函数,5.5 利用泛函命令进行数值分析,5.6 内联函数,5.7 M文件性能的优化和加速,5.1 程序流程控制,5.1.1 forend循环结构MATLAB的循环结构有2种:forend结构和whileend结构。语法:for循环变量=array 循环体end【例5.1】使用forend循环编程求出1+3+5+99的值。sum=0;for n=1:2:100 sum=sum+nend,5.1.1 forend循环结构,【例5.2】使用forend循环将单位阵转换为列向量。su

2、m=zeros(6,1);for n=eye(6,6)sum=sum+nend计算结果如下。sum=111111,5.1.2 whileend循环结构,forend循环的循环次数确定,而whileend循环的循环次数不确定。语法:while表达式循环体end,5.1.2 whileend循环结构,【例5.3】根据,求y3时的最大n值和y值。y=0;n=1;while y3 y=y+1/(2*n-1);n=n+1;z(n)=y;endmn=n-2%y3之前的nmy=z(n-1)计算结果如下。mn=56my=2.9944,5.1.3 ifelseend条件转移结构,ifelseend结构是最常见的

3、条件转移结构。语法:if条件式1语句段1elseif条件式2语句段2else语句段n+1end,5.1.3 ifelseend条件转移结构,【例5.4】根据不同的分段表达式,绘制分段函数曲线,曲线如图5.1所示。,5.1.3 ifelseend条件转移结构,x=0:0.5:10;y=zeros(1,length(x);%产生0行向量,y的初始值为0for n=1:length(x)if x(n)=8 y(n)=1;elseif x(n)=6 y(n)=5-x(n)/2;elseif x(n)=4 y(n)=2;else y(n)=sqrt(x(n);endendplot(x,y)axis(0

4、10 0 2.5);,5.1.4 switchcase开关结构,switchcase结构是有多个分支结构的条件转移结构。语法:switch开关表达式case表达式1语句段1case表达式2语句段2otherwise语句段nend,5.1.4 switchcase开关结构,【例5.5】用switchcase开关结构得出各月份的季节。for month=1:12;switch monthcase3,4,5season=springcase6,7,8season=summercase9,10,11season=autumnotherwiseseason=winterendend,5.1.5 tryc

5、atchend试探结构,MATLAB提供一种试探结构trycatchend,这种语句结构是其他很多语言所没有的。语法:try语句段1catch语句段2end,5.1.5 trycatchend试探结构,【例5.6】用trycatchend结构进行矩阵相乘运算。n=4;a=magic(n);m=3;b=eye(3);tryc=a*bcatchc=a(1:m,1:m)*bendlasterr计算结果如下。c=162351110976,5.1.5 trycatchend试探结构,用lasterr函数查看出错原因显示如下。ans=Errorusing=*Inner matrix dimensions

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

7、的nmy=z(n-1),5.1.6 流程控制语句,计算结果如下。mn=56my=2.9944,5.1.6 流程控制语句,2continue命令continue命令用于结束本次for或while循环,与break命令不同的是continue只结束本次循环而继续进行下次循环。【例5.8】将if命令与continue命令结合,计算的1100中除了5的倍数之外的所有整数和。sum=0;for n=1:100if mod(n,5)=0continue;%能被整除就跳出本次外循环elsesum=sum+n;endendsum计算结果如下。sum=4000,5.1.6 流程控制语句,3return命令ret

8、urn命令用于终止当前命令的执行,并且立即返回到上一级调用函数或等待键盘输入命令,可以用来提前结束程序的运行。return命令也可以用来终止键盘方式。4pause命令pause命令用来使程序运行暂停,等待用户按任意键继续;用于程序调试或查看中间结果,也可以用来控制动画执行的速度。语法:pause%暂停pause(n)%暂停n秒5keyboard命令keyboard命令用来使程序暂停运行,等待键盘命令,执行完自己的工作后,输入return语句,程序就继续运行。keyboard命令可以用来在程序调试或程序执行时修改变量。,5.1.6 流程控制语句,6input命令input命令用来提示用户应从键盘

9、输入数值、字符串和表达式,并接受该输入。Input命令常用的几种格式如下。a=input(input a number:)%输入数值给ainput a number:45a=45b=input(input a number:,s)%输入字符串给binput a number:45b=45input(input a number:)%将输入值进行运算input a number:2+3ans=5,5.1.7 循环结构与动画,1以电影方式产生动画以电影方式产生动画,有2个步骤。(1)使用getframe命令抓取图形作为画面,每个画面都是以1个列向量的方式,置于存放整个电影的矩阵M中。(2)使用mo

10、vie(M,k)命令播放电影,并可指定矩阵M播放的重复次数k。【例5.9】使用电影方式制作动画并显示,最后一幅画面如图5.2所示。,t=-pi:0.1:pi;n=length(t)for ii=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.7 循环结构与动画,5.1.7 循环结构与动画,2以对象方式产生动画(1)擦除属性EraseMode。以对象方式产

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

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

13、.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);%定义红色的小球for i=1:length(x)set(h,xdata,x(i),ydata,y(i);%设置小球的新位置pause(0.005)%暂停0.005 sdrawnow%刷新屏幕end,5.1.7 循环结构与动画,运行界面,5.2 M文件,

14、5.2.1 M文件编辑器单击MATLAB桌面上的 图标,或者选择菜单“File”“New”“Script”命令,或选择“Function”可以分别打开空白的M脚本文件编辑器和M函数文件编辑器。如 图5.4(a)所示为空白的M脚本文件编辑器,如图5.4(b)所示为M函数文件编辑器。,5.2.2 M脚本文件,脚本文件具有如下特点。(1)脚本文件中的命令格式和前后位置,与在命令窗口中输入时没有任何区别。(2)MATLAB在运行脚本文件时,只是简单地按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行。(3)与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空

15、间(workspace)中,可以很方便地查看变量,除非用clear命令清除;脚本文件的命令也可以访问工作空间的所有数据,为此要注意避免变量的覆盖而造成程序出错。,5.2.2 M脚本文件,【例5.11】在M文件编辑/调试器窗口中编写M脚本文件绘制二阶系统的多条时域曲线。欠阻尼系统的时域输出y与x的关系为。(1)单击MATLAB桌面上的 图标打开M文件编辑器。(2)将命令全部写入M文件编辑器中,为了能够标志该文件的名称,在第1行写入包含文件名的注释。保存文件为Ex0501.m。%EX0511 绘制二阶系统的时域曲线x=0:0.1:20;y1=11/sqrt(10.32)*exp(0.3*x).*s

16、in(sqrt(10.32)*x+acos(0.3)plot(x,y1,r)%画阻尼系数为0.3的曲线hold ony2=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.2 M脚本文件,(3)选择M文件编辑器菜单“Debug”“Run”命令,运行界面如图5.5所示。,5.2.2 M脚本文件,查看工作空间的变量如下:whosNameSizeByteClassx1x2011608d

17、oublearrayy11x2011608doublearrayy21x2011608doublearrayy31x2011608doublearrayGrand total is 804 elements using 6432 Byte,5.2.3 M函数文件,M函数文件的基本格式如下:函数声明行H1行(用%开头的注释行)在线帮助文本(用%开头)编写和修改记录(用%开头)函数体说明:(1)函数声明行以“function”引导,是M函数文件必须有的,M脚本文件没有;函数名和文件名一致,当不一致时,MATLAB以文件名为准,Ex0502函数保存在Ex0502.m文件中。函数声明行的格式:func

18、tion 输出变量列表=函数名(输入变量列表)(2)H1行通常包含大写的函数文件名,可以提供help和look for关键词用于查询。(3)在线帮助文本通常包含函数输入、输出变量的含义和格式说明。(4)编写和修改记录一般在空1行后,记录作者、日期和版本记录,用于软件档案管理。(5)函数体由MATLAB的命令或者通过流程控制结构组织的命令组成。通过函数体实现函数的功能。,5.2.3 M函数文件,在MATLAB界面中选择菜单“File”“New”“Function”命令,则会创建一个新的函数文件并自动生成函数语句,函数文件内容如下:function output_args=Untitled1(in

19、put_args)%UNTITLED1 Summary of this function goes here%Detailed explanation goes here end,5.2.3 M函数文件,【例5.12】在M文件编辑/调试器窗口编写计算二阶系统时域响应的M函数文件,并在MATLAB命令窗口中调用该文件。创建M函数文件并调用的步骤如下。(1)修改上面的程序内容,修改output_args,Untitled1和input_args的名称。function y=Ex0512(zeta)%EX0512Step response of quadratic system.%Second or

20、der output curve%copyright 20110501x=0:0.1:20;y=11/sqrt(1zeta2)*exp(zeta*x).*sin(sqrt(1zeta2)*x+acos(zeta)plot(x,y),5.2.3 M函数文件,(2)将函数文件保存为“Ex0512.m”。在命令窗口输入help和lookfor命令查看帮助信息:help Ex0512EX0512Step response of quadratic system.Second order output curvelookforSecond order output curveEx0512.m:%二阶系统

21、时域响应,5.2.3 M函数文件,(3)在MATLAB命令窗口输入以下命令,则会出现f的计算值和绘制的曲线:f=Ex0512(0.3)第1行指定该文件是函数文件,文件名为“Ex0512”,输入参数为阻尼系数zeta,输出参数为时域响应y。当函数文件调用结束,查看x、y。x?Undefined function or variablex.y?Undefined function or variabley.,5.3 函数调用和参数传递,5.3.1 子函数和私有函数1子函数在1个M函数文件中,可以包含1个以上的函数,其中只有一个是主函数,其他均为子函数。(1)在1个M文件中,主函数必须出现在最上方,

22、其后是子函数,子函数的次序无任何限制。(2)子函数不能被其他文件的函数调用,只能被同一文件中的函数(可以是主函数或子函数)调用。(3)同一文件的主函数和子函数变量的工作空间相互独立。(4)用help和lookfor命令不能提供子函数的帮助信息。,5.3.1 子函数和私有函数,【例5.13】将画二阶系统时域曲线的函数作为子函数,编写画多条曲线的程序。function Ex0513()%EX0513使用函数调用绘制二阶系统时域响应z1=0.3;Ex0512(z1);%调用Ex0502hold onz1=0.5Ex0512(z1)%调用Ex0502z1=0.707;Ex0512(z1)%调用Ex05

23、02functiony=Ex0512(zeta)%子函数,画二阶系统时域曲线x=0:0.1:20;y=11/sqrt(1zeta2)*exp(zeta*x).*sin(sqrt(1zeta2)*x+acos(zeta)plot(x,y),5.3.1 子函数和私有函数,2私有函数私有函数是指存放在private子目录中的M函数文件,具有以下性质。(1)在private目录下的私有函数,只能被其父目录的M函数文件所调用,而不能被其他目录的函数调用。私有函数对其他目录的文件是不可见的,私有函数可以和其他目录下的函数重名。(2)私有函数父目录的M脚本文件也不可调用私有函数。(3)在函数调用搜索时,私有

24、函数优先于其他MATLAB路径上的函数。3调用函数的搜索顺序在MATLAB中调用1个函数,搜索的顺序如下。(1)查找是否为子函数。(2)查找是否为私有函数。(3)从当前路径中搜索此函数。(4)从搜索路径中搜索此函数。,5.3.2 局部变量和全局变量,1局部变量局部变量(Local Variables)是在函数体内部使用的变量,其影响范围只能在本函数内;每个函数在运行时,都占用独立的函数工作空间,此工作空间和MATLAB的工作空间是相互独立的。局部变量仅存在于函数的工作空间内,只在函数执行期间存在,当函数执行完变量就消失。2全局变量全局变量(Global Variables)是可以在不同的函数工

25、作空间和MATLAB工作空间中共享使用的变量。,5.3.2 局部变量和全局变量,【例5.14】修改【例5.13】在主函数和子函数中使用全局变量。function Ex0514()%EX0514使用全局变量绘制二阶系统时域响应global XX=0:0.1:20;z1=0.3;Ex0512(z1);hold onz1=0.5;Ex0512(z1);z1=0.707;Ex0512(z1);function Ex0512(zeta)%子函数,画二阶系统时域曲线global Xy=11/sqrt(1zeta2)*exp(zeta*X).*sin(sqrt(1zeta2)*X+acos(zeta);pl

26、ot(X,y);,5.3.2 局部变量和全局变量,程序分析:X变量为全局变量,在需要使用的主函数和子函数中都需要用global定义;同样,如果在工作空间中定义X为全局变量后也可以使用。global XwhoYour variables are:X,5.3.3 函数的参数,函数调用的格式如下:输出参数1,输出参数2,=函数名(输入参数1,输入参数2,)1参数传递规则在MATLAB中,函数具有自己的工作空间,函数内变量与外界(包括其他函数和工作空间)的唯一联系就是通过函数的输入/输出参数。输入参数在函数中的任何变化,都仅在函数内进行,不会传递回去。,5.3.3 函数的参数,【例5.15】将画二阶系

27、统时域的函数修改,使用输入/输出参数来实现参数传递,如图5.6所示。,5.3.3 函数的参数,2函数参数的个数MATLAB函数的调用有一个与其他语言不同的特点是:函数的输入/输出参数的数目都可以变化,用户可以根据参数的个数编程。(1)nargin变量和nargout变量。在MATLAB中有2个特殊变量:nargin和nargout。函数的输入/输出参数的个数可以通过变量nargin和nargout获得,nargin用于获得输入参数的个数,nargout用于获得输出参数的个数。语法:nargin%在函数体内获取实际输入变量的个数nargout%在函数体内获取实际输出变量的个数nargin(fun

28、)%在函数体外获取定义的输入参数个数nargout(fun)%在函数体外获取定义的输出参数个数,5.3.3 函数的参数,【例5.16】计算2个数的和,根据输入参数个数的不同使用不同的运算表达式。functionsum,n=Ex0516(x,y)%EX0516 参数个数可变,计算x和y的和if nargin=1sum=x+0;%若输入1个参数就计算与0的和else if nargin=0sum=0;%若无输入参数就输出0elsesum=x+y;%若输入的是2个数则计算和end,5.3.3 函数的参数,在命令窗口调用Ex0516函数,分别使用2个、1个和无输入参数,结果如下所示。y,n=Ex051

29、6(2,3)y=5n=2y,n=Ex0516(2)y=2n=1y,n=Ex0516y=0n=0,5.3.3 函数的参数,如果输入的参数多于输入参数个数,则会出错。y,n=Ex0516(1,2,3)?Errorusing=ex0516Toomanyinputarguments.也可以在工作空间查看函数体定义的输入参数个数。nargin(Ex0516)ans=2,5.3.3 函数的参数,【例5.16续】添加以下程序,查看用nargout变量获取输出参数个数。if nargout=0%当输出参数个数为0时,运算结果为0sum=0;end在命令窗口调用Ex0516函数,当输出参数格式不同时,结果如下。

30、Ex0516(2,3)%当输出参数个数为0时ans=0y=Ex0516(2,3)%当输出参数个数为1时y=5y,n,x=Ex0516%当输出参数个数太多时?Errorusing=ex0516Too many out put arguments,5.3.3 函数的参数,(2)varargin变量和varargout变量。MATLAB还有2个特殊变量:varargin和varargout,可以获得输入/输出变量的各元素内容,varargin和varargout都是元胞数组。【例5.16续】计算所有输入变量的和。functiony,n=Ex0516(varargin)%EX0516使用可变参数var

31、arginif nargin=0%当没有输入变量时输出0disp(NoInputvariables.)y=0;elseif nargin=1%当一个输入变量时,输出该数y=varargin1;elsen=nargin;y=0;for m=1:ny=vararginm+y;%当有多个输入变量时,取输入变量循环相加endendn=nargin;,5.3.3 函数的参数,在MATLAB的命令窗口中输入不同个数的变量调用函数Ex0516,结果如下。y,n=Ex0516(1,2,3,4)%输入4个参数y=10n=4y,n=Ex0516(1)%输入1个参数y=1n=1y,n=Ex0516%无输入参数NoI

32、nputvariables.y=0n=0,5.3.4 程序举例,【例5.17】根据输入的参数绘制不同的曲线,每个子函数绘制一种曲线。M文件的程序代码。程序分析:主函数名为Ex0517,4个子函数名分别为po1、po2、po3和po4,文件保存为Ex0517.m。若在命令窗口中输入以下命令:y=Ex0517(1);则产生如图5.7所示的调用第一个子函数的极坐标曲线。,5.3.4 程序举例,【例5.18】编写M函数文件,通过流程控制语句,建立如下的矩阵。,functiony=Ex0518(m)%EX0518用循环流程控制语句创建矩阵y=0;m=m1;for n=1:my=0,y;%创建全0行end

33、for n=1:ma=1:1:n;b=a;for k=m:1:nb=0,b;endy=b;y;n=n+1;end,5.3.4 程序举例,5.3.4 程序举例,在命令窗口中调用Ex0518函数。y=Ex0518(5)y=0123400123000120000100000,5.3.4 程序举例,【例5.19】在本书第4章例4.30中,在界面中绘制正弦波形,在单选按钮中选择振幅,在列表框中选择频率,然后绘制正弦曲线。1设计界面界面设计如图5.8所示。,5.3.4 程序举例,2回调函数回调函数需要在单击“Draw”按钮(pushbutton1)时绘制正弦曲线,单击“Close”按钮(pushbutto

34、n1)时关闭窗口。编写回调函数的步骤:选择“Draw”按钮(pushbutton1)单击鼠标右键,然后选择菜单“View Callbacks”“Callback”命令,进入pushbutton1_Callback函数,在函数中添加函数内容如下:function pushbutton1_Callback(hObject,eventdata,handles)am_1=get(handles.radiobutton1,value);%获取单选按钮radiobutton1的值am_2=get(handles.radiobutton2,value);if am_1=1%如果单选按钮radiobutton

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

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

37、“”符号或str2func命令实现。语法: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=sin cos tan,5.4.1 函数句柄的创建,2使用函数句柄的优点利用函数句柄执行函数的优点有以下几点。(1)在更大范围内调用函数。函数句柄包含了函数文件的路径和函数类型,即函数是否

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

39、的命令窗口调用该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.5 利用泛函命令进行数值分析,5.5.1 求极小值1fminbnd函数fminbnd函数用来计算单变量非线性函数的极小值。语法:x,y=fminbnd(h_fun,x1,x2,options)x,y=fminbnd(funname,x1,x2,options)【例5.22

40、】用fminbnd求解humps函数的极小值。x,y=fminbnd(humps,0.5,0.8)%求在0.50.8之间的极小值x=0.6370y=11.2528,5.5.1 求极小值,程序分析:humps函数是MATLAB提供的M文件,保存为humps.m文件;humps表示humps函数的句柄,humps的函数最小值曲线如图5.10所示,最小值为图中的圆点(0.6370,11.2528),误差小于104。,5.5.1 求极小值,2fminsearch函数fminsearch函数用于求多变量无束缚非线性最小值,采用Nelder-Mead单纯形算法求解多变量函数的最小值。语法:x=fminse

41、arch(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)%用inline产生内联函数,x和y用二元数组表示fn=Inline function:fn(x)=100*(x(2)x(1)2)2+(1x(1)2y=fminsearch(fn,0.5,1)%从(0.5,1)为初始值开始搜索求最小值y=1.0000 1.0000,5.5.2 求

42、过零点,fzero函数可以寻找一维函数的零点,即求f(x)=0的根。语法:x=fzero(h_fun,x0,tol,trace)x=fzero(funname,x0,tol,trace)【例5.24】求解humps函数的过零点,humps函数的过零点用圆点表示,如图5.11所示。xzero=fzero(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=fzeroThe function

43、 valuesat the interval end points must differin sign.,5.5.2 求过零点,humps函数的过零点,5.5.3 数值积分,语法:s=quad(h_fun,x1,x2,tol,trace,p1,p2,)s=quad(funname,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

44、(x,y)%用梯形计算积分area=29.8571area1=quad(humps,0,1)%用quad计算积分area1=29.8583area2=quad8(humps,0,1)%用quad8计算积分area2=29.8583,5.5.4 微分方程的数值解,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】解经典的范德波尔(

45、Van derPol)微分方程:,5.5.4 微分方程的数值解,(1)必须把高阶微分方程式变换成为一阶微分方程组。令y1=x,y2=dx/dt,则将二阶微分方程变为一阶微分方程组:(2)编写1个函数vdpol.m文件,设定=2,该函数返回上述导数值。输出结果由1个列向量yprime给出。y1和y2合并写成列向量y。函数M文件vdpol.m:%范德波尔方程functiony prime=vdpol(t,y)yprime=y(2);2*(1y(1)2)*y(2)y(1),5.5.4 微分方程的数值解,(3)给定当前时间及y1和y2的初始值,解微分方程。tspan=0,30;%起始值0和终止值30y

46、0=1;0;%初始值t,y=ode45(vdpol,tspan,y0);%解微分方程y1=y(:,1);y2=y(:,2);figure(1)plot(t,y1,:b,t,y2,r)%画微分方程解figure(2)plot(y1,y2)%画相平面图,5.5.4 微分方程的数值解,设y1为横坐标,y2为纵坐标,则画出相平面图如图5.12所示。,5.6 内联函数,1内联函数的创建创建内联函数可以使用inline命令实现。语法:inline(string,arg1,arg2,)%创建内联函数【例5.26】创建内联函数实现。f=inline(sin(x)*exp(z*x),x,z)%创建内联函数f=I

47、nline function:f(x,z)=sin(x)*exp(z*x)y=f(5,0.3)%调用函数fy=0.2140,5.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=xz,5.6 内联函数,3使内联

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

49、x=0:0.1:20;z=0:0.05:10;y=feval(ff,x,z),5.7 M文件性能的优化和加速,5.7.1 M文件性能优化1使用循环时提高速度的措施循环语句及循环体是MATLAB编程的瓶颈问题。MATLAB与其他编程语言不同,它的基本数据是向量和矩阵,编程时应尽量对向量和矩阵编程,而不要对矩阵的元素编程。2大型矩阵的预先定维由于MATLAB变量在使用之前不需要定义和指定维数,当变量新赋值的元素下标超出数组的维数时,MATLAB就为该数组扩维1次,大大地降低了运行的效率。,5.7.1 M文件性能优化,【例5.27】将【例5.18】中的双重循环改为单循环,并用zeros函数定维来提高

50、运行速度,创建矩阵。,functiony=Ex0518(m)%EX0518先定维再创建矩阵m=m1;y=zeros(m);for n=1:m1a=1:mn;y(n,n+1:m)=a;endy,5.7.1 M文件性能优化,3优先考虑内在函数矩阵运算应该尽量采用MATLAB的内在函数。内在函数是由更底层的C语言构造的,其执行速度显然很快。4采用高效的算法在实际应用中,解决同样的数学问题经常有各种各样的算法。例如,求解定积分的数值解法在MATLAB中就提供了2个函数:quad和quad8,其中后者在精度、速度上都明显高于前者。可见,应寻求更高效的算法。5尽量使用M函数文件代替M脚本文件由于M脚本文件

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号