《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt

上传人(卖家):momomo 文档编号:5716777 上传时间:2023-05-05 格式:PPT 页数:52 大小:436.50KB
下载 相关 举报
《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt_第1页
第1页 / 共52页
《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt_第2页
第2页 / 共52页
《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt_第3页
第3页 / 共52页
《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt_第4页
第4页 / 共52页
《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、2023-5-5主要内容主要内容 M文件文件脚本文件和函数文件脚本文件和函数文件 MATLAB程序流程控制与调试程序流程控制与调试 程序流程控制示例程序流程控制示例 匿名函数、子函数与嵌套函数匿名函数、子函数与嵌套函数 匿名函数、子函数与嵌套函数匿名函数、子函数与嵌套函数 应用案例应用案例 编写高效的编写高效的MATLAB程序程序 养成良好的编程风格养成良好的编程风格 2023-5-5第一节第一节 M文件文件脚本文件和函脚本文件和函数文件数文件 2023-5-5一、脚本文件一、脚本文件1.什么时候适合用脚本文件什么时候适合用脚本文件2.什么是脚本文件什么是脚本文件 指令的增加并且需要频繁重复计

2、算时,直接从指令窗指令的增加并且需要频繁重复计算时,直接从指令窗进行计算很麻烦。这时候使用脚本文件最为适宜进行计算很麻烦。这时候使用脚本文件最为适宜。所谓脚本文件,就是一些按用户意图排列的所谓脚本文件,就是一些按用户意图排列的MATLAB指指令(包括流程控制指令在内)组成的令(包括流程控制指令在内)组成的M文件。文件。3.脚本文件和函数文件的区别脚本文件和函数文件的区别 脚本文件运行后,产生的所有变量都驻留在脚本文件运行后,产生的所有变量都驻留在MATLAB基基本工作空间本工作空间(base workspace)中。只要用户不使用中。只要用户不使用clear指令指令加以清除,或加以清除,或MA

3、TLAB不关闭,这些变量将一直保存在基不关闭,这些变量将一直保存在基本工作空间。本工作空间。2023-5-5二、函数文件二、函数文件其中其中out1,out2,为输出参数列表,为输出参数列表,in1,in2,为输入参数为输入参数列表,列表,funname为函数名。输入参数和输出参数个数根据问为函数名。输入参数和输出参数个数根据问题的需要可以为题的需要可以为0个到多个。函数文件也需要保存到个到多个。函数文件也需要保存到MATLAB的搜索路径下才能被调用。的搜索路径下才能被调用。格式:格式:每个函数都由每个函数都由“function”引导,如下:引导,如下:function out1,out2,=

4、funname(in1,in2,)注释说明部分(注释说明部分(%号引导的行)号引导的行)函数体函数体 2023-5-5第二节第二节 MATLAB程序流程控制程序流程控制与调试与调试 2023-5-5一、一、MATLAB程序流程控制程序流程控制 if-else-end 结构 switch-case-otherwise-end结构 for循环 while循环 try-catch结构 其他中断、暂停语句2023-5-5二、二、MATLAB程序调试程序调试 2.设置断点进行调试设置断点进行调试 1.语法错误和运行结果错误语法错误和运行结果错误 语法错误即所书写的代码不符合语法错误即所书写的代码不符合M

5、ATLAB语法规范所语法规范所造成的错误,比如由于粗心造成的拼写错误,不十分了解造成的错误,比如由于粗心造成的拼写错误,不十分了解某个函数的调用方法而造成的调用错误等某个函数的调用方法而造成的调用错误等。运行结果错误是一类非常难以检查的错误,程序能正运行结果错误是一类非常难以检查的错误,程序能正常运行,只是运行结果与期望的不一样,这类错误大多是常运行,只是运行结果与期望的不一样,这类错误大多是由于算法错误引起的。由于算法错误引起的。2023-5-5 在程序编辑窗口中编写的在程序编辑窗口中编写的M代码的每一行的前面都标有行代码的每一行的前面都标有行号,在可执行的命令行的行号后面都有一个小短横号,

6、在可执行的命令行的行号后面都有一个小短横“-”,单击某一行的单击某一行的“-”,就可在该行设置一个断点,此时的,就可在该行设置一个断点,此时的“-”变成了红色的圆点,表示设置断点成功。变成了红色的圆点,表示设置断点成功。将光标放到将光标放到M代码的某一行上,然后按快捷键代码的某一行上,然后按快捷键F12,或者,或者单击程序编辑窗口工具栏上的图标,也可以通过菜单项单击程序编辑窗口工具栏上的图标,也可以通过菜单项“Debug Set/Clear Breakpoint”设置断点。设置断点。用函数用函数dbstop设置断点。设置断点。2023-5-5第三节第三节 程序流程控制示例程序流程控制示例 20

7、23-5-5一、概述一、概述 要通过一个完整的要通过一个完整的MATLAB程序来展示各种流程序来展示各种流程控制的用法,该程序来源于如下一个有趣的问程控制的用法,该程序来源于如下一个有趣的问题。题。一只失明的小猫不幸掉进山洞里,山洞有三个门,一只失明的小猫不幸掉进山洞里,山洞有三个门,其中第一个门进去后走两个小时后可以回到地面,其中第一个门进去后走两个小时后可以回到地面,第二个门进去后走四个小时又回到原始出发点,第二个门进去后走四个小时又回到原始出发点,不幸的是第三个门进去后走六个小时还是回到原不幸的是第三个门进去后走六个小时还是回到原始出发点。小猫由于眼睛失明,每次都是随机的始出发点。小猫由

8、于眼睛失明,每次都是随机的选择其中一个门走。问题是这只可怜的小猫走出选择其中一个门走。问题是这只可怜的小猫走出山洞的期望时间是多少山洞的期望时间是多少?2023-5-5二、问题分析二、问题分析 设小猫走出山洞的期望时间为设小猫走出山洞的期望时间为t,如果小猫不幸进了第二个如果小猫不幸进了第二个或第三个门,那么它过四个小时或是六个小时后又和进门或第三个门,那么它过四个小时或是六个小时后又和进门之前面临状况一样了,只不过这两种不幸的情况发生的概之前面临状况一样了,只不过这两种不幸的情况发生的概率都为率都为1/3,而万幸一次性走出去的概率也是,而万幸一次性走出去的概率也是1/3。于是我。于是我们可以

9、得到下面的方程:们可以得到下面的方程:t=2*1/3+(4+t)*1/3+(6+t)*1/3很简单的一元一次方程,解得很简单的一元一次方程,解得t=12。1.解析分析方法解析分析方法2.计算机模拟的思路计算机模拟的思路2023-5-5 输入正整数输入正整数n作为模拟小猫出洞的次数,生成一个作为模拟小猫出洞的次数,生成一个1*n的数的数组组T用来记录每次小猫出洞时间,初始值为用来记录每次小猫出洞时间,初始值为0。k从从1循环循环到到n,T(k)用来记录每次实际出洞的时间。随机等概率的用来记录每次实际出洞的时间。随机等概率的生成生成1,2,3之间的一个数之间的一个数c,如果,如果c=1,T(k)=

10、T(k)+2,小,小猫走出山洞,开始下一次模拟。否则根据猫走出山洞,开始下一次模拟。否则根据c=2或者或者c=3 决定决定T(k)=T(k)+4或或T(k)=T(k)+6,并继续随机生成,并继续随机生成c,直到直到c=1。模拟完模拟完n次后,计算次后,计算T的均值得到小猫走出山洞的期望时的均值得到小猫走出山洞的期望时间的近似值间的近似值 2023-5-5三、程序代码三、程序代码 function T=cat_in_holl(varargin)%varargin,使函数可以接受参数个数不定的输入使函数可以接受参数个数不定的输入if isempty(varargin)%输入参数非空输入参数非空n=

11、varargin1;%varargin为为cell型数组,取其第一个元素赋给型数组,取其第一个元素赋给nend%try-catch结构用法示例结构用法示例try%如果如果n是正整数下面语句不会发生错误,进而执行是正整数下面语句不会发生错误,进而执行try-catch结构结构之后的语句之后的语句%否则会发生错误否则会发生错误,执行由执行由catch引导的语句。引导的语句。if n0&mod(n,1)=0;%n为正整数的判断条件为正整数的判断条件%空语句,不会报错空语句,不会报错 else%n不是正整数,报错不是正整数,报错 error;end2023-5-5catch ME%ME,用来记录发生错

12、误的一些信息用来记录发生错误的一些信息 disp(函数没有输入参数或者输入参数不是正整数标量函数没有输入参数或者输入参数不是正整数标量);T=;%给给T赋空值赋空值 return;%函数返回,后面语句不再执行,没有函数返回,后面语句不再执行,没有return会接着执行后会接着执行后面的语句面的语句end%switch-case-end结构用法示例结构用法示例switch nargin%nargin,函数输入参数的个数,函数输入参数的个数 case 1%case 1 的情况是我们程序的核心部分,即整个模拟出洞的过程的情况是我们程序的核心部分,即整个模拟出洞的过程 T=zeros(1,n);for

13、 k=1:n%for循环用法示例循环用法示例 c=unidrnd(3,1);%等概率随机生成等概率随机生成1,2,3中某个数字中某个数字 2023-5-5while c=1%while循环用法示例循环用法示例 if c=2 T(k)=T(k)+4;else T(k)=T(k)+6;end c=unidrnd(3,1);end T(k)=T(k)+2;end case 2 T=;disp(函数只能有一个输入参数,且为正整数函数只能有一个输入参数,且为正整数);otherwise T=;disp(函数输入参数个数不能大于函数输入参数个数不能大于1,参数需为正整数,参数需为正整数);end 2023

14、-5-5四、程序验证四、程序验证 在在Editor中新建一个中新建一个m文件,将上述程序复制过去,并以文件,将上述程序复制过去,并以 cat_in_holl.m 文件名保存到文件名保存到MATLAB的搜索路径下,对的搜索路径下,对于于n=104以及以及n=105,我们可以用如下指令得到近似,我们可以用如下指令得到近似期望时间期望时间T:n=1e4;T=cat_in_holl(n);mean(T)ans=11.8888 T=cat_in_holl(n);mean(T)ans=12.0222 2023-5-5 cat_in_holl.m是一个完整的是一个完整的m函数文件,里面用函数文件,里面用到了

15、几乎各种流程控制方法。读者朋友可以试运到了几乎各种流程控制方法。读者朋友可以试运行如下指令,观看程序结果,体会各流程控制的行如下指令,观看程序结果,体会各流程控制的功能:功能:T=cat_in_holl;%没有输入参数没有输入参数T=cat_in_holl(10.1);%输入参数为小数输入参数为小数T=cat_in_holl(-10000);%输入参数为负数输入参数为负数T=cat_in_holl(1000);%输入为元胞数组输入为元胞数组T=cat_in_holl(1000,100);%输入参数为输入参数为2个个T=cat_in_holl(1000,100,100);%输入参数大于输入参数大

16、于2个个2023-5-5第四节第四节 匿名函数、子函数与嵌匿名函数、子函数与嵌套函数套函数 2023-5-5一、匿名函数一、匿名函数1.匿名函数定义匿名函数定义fhandle=(arglist)expr其中,其中,expr是具体的函数表达式,是具体的函数表达式,arglist是指定的函数是指定的函数的自变量的自变量。匿名函数按照不同的分类方法可以分为不同的种类。按匿名函数按照不同的分类方法可以分为不同的种类。按照自变量的个数以及层数可以分为以下几种:单变量匿照自变量的个数以及层数可以分为以下几种:单变量匿名函数,多变量匿名函数,单重匿名函数,多重匿名函名函数,多变量匿名函数,单重匿名函数,多重

17、匿名函数数。2.单变量匿名函数单变量匿名函数f=(x)x.2;3.多变量匿名函数多变量匿名函数g=(x,y)x.2+y.2;2023-5-54.单重匿名函数单重匿名函数无论单变量还是多变量匿名函数,都属于单重匿名函数。这类匿名无论单变量还是多变量匿名函数,都属于单重匿名函数。这类匿名函数的特点是,只有一个函数的特点是,只有一个“”符号引导,符号引导,“”之后就是具体的函之后就是具体的函数表达式。自变量输入单重匿名函数后,得到的是具体的数值。除数表达式。自变量输入单重匿名函数后,得到的是具体的数值。除了单重匿名函数外,还有双层、乃至多重匿名函数。这些多重匿名了单重匿名函数外,还有双层、乃至多重匿

18、名函数。这些多重匿名函数在参数传递方面非常方便。函数在参数传递方面非常方便。5.多重匿名函数多重匿名函数f=(a,b)(x)a*x+bf=(a,b)(x)a*x+b其中其中“a,b”是外层变量,是外层变量,“x”是内层变量。可以这样理解这个表达是内层变量。可以这样理解这个表达式:每个式:每个“”符号后面括号里的变量的作用域一直到表达式的结符号后面括号里的变量的作用域一直到表达式的结尾。这样,尾。这样,“a,b”的作用域就是的作用域就是“(x)a*x+b”,而,而“x”的作用域的作用域就是就是“a*x+b”。因此,对于给定的。因此,对于给定的“a,b”,“gab=f(a,b)”是一个是一个单层以

19、单层以x为变量的单变量匿名函数。为变量的单变量匿名函数。2023-5-5二、子函数二、子函数函数函数M文件中,我们称第一个文件中,我们称第一个“function”引导引导的函数为主函数,外部调用函数文件时总是从的函数为主函数,外部调用函数文件时总是从主函数开始执行。如果整个函数文件只有一个主函数开始执行。如果整个函数文件只有一个函数,那这个函数就是主函数。函数,那这个函数就是主函数。在设计比较复杂的程序的时候,为了能够使程在设计比较复杂的程序的时候,为了能够使程序之间逻辑关系清楚,易于阅读和维护,通常序之间逻辑关系清楚,易于阅读和维护,通常会采用模块化的设计方式,这时就会涉及子函会采用模块化的

20、设计方式,这时就会涉及子函数的使用。从函数编写格式以及形态上来说,数的使用。从函数编写格式以及形态上来说,子函数和主函数并无区别,区别仅在于在函数子函数和主函数并无区别,区别仅在于在函数文件中的位置以及调用关系。文件中的位置以及调用关系。2023-5-5子函数是在同一函数文件中,主函数之后子函数是在同一函数文件中,主函数之后的由的由“function”引导的函数,一个函数文引导的函数,一个函数文件可以有多个子函数。这些子函数在函数件可以有多个子函数。这些子函数在函数文件中的排列顺序可以随意,前提是都要文件中的排列顺序可以随意,前提是都要位于主函数后。位于主函数后。子函数可以被其所在的函数文件中

21、的主函子函数可以被其所在的函数文件中的主函数和其他子函数调用,子函数也可以调用数和其他子函数调用,子函数也可以调用主函数,在设计子函数调用主函数的程序主函数,在设计子函数调用主函数的程序时一定要小心,避免形成时一定要小心,避免形成“死死”的调用循的调用循环。环。2023-5-5三、嵌套函数三、嵌套函数在程序编写中,有的数学表达式比较长,不方在程序编写中,有的数学表达式比较长,不方便用一行来表示,而且这个表达式里还有其他便用一行来表示,而且这个表达式里还有其他的参数。这时候我们就需要将其写成函数,的参数。这时候我们就需要将其写成函数,用用嵌套函数可以方便的解决参数共享问题。嵌套函数可以方便的解决

22、参数共享问题。当求解微分方程或者进行优化问题求解时,一当求解微分方程或者进行优化问题求解时,一些复杂的表达式往往涉及参数传递过程,这个些复杂的表达式往往涉及参数传递过程,这个时候,比较适合将其表达式写成嵌套函数。时候,比较适合将其表达式写成嵌套函数。在编写在编写GUI用户界面的回调函数时,参数传递用户界面的回调函数时,参数传递往往是个棘手的问题。利用嵌套函数,可以方往往是个棘手的问题。利用嵌套函数,可以方便解决这个问题。便解决这个问题。2023-5-51.嵌套函数定义嵌套函数定义嵌套函数,即嵌套函数,即nested function,顾名思义,是嵌套在函,顾名思义,是嵌套在函数体内部的函数。嵌

23、套函数以数体内部的函数。嵌套函数以function 声明,结束的时声明,结束的时候加上候加上end。需要说明的是,包含有嵌套函数的函数,。需要说明的是,包含有嵌套函数的函数,无论他是主函数、子函数或者嵌套函数,都应该在末尾无论他是主函数、子函数或者嵌套函数,都应该在末尾的地方加上的地方加上end。下面代码是一个简单的嵌套函数的例。下面代码是一个简单的嵌套函数的例子:子:function r=MyTestNestedFun(input)a=5;c=sin(input)+tan(input);function y=nestedfun(b)y=a*c+b;endr=nestedfun(5);end

24、2023-5-52.嵌套函数种类嵌套函数种类嵌套函数可以分为单重嵌套函数和多重嵌套函数嵌套函数可以分为单重嵌套函数和多重嵌套函数。单重嵌套函数,这样的函数嵌套在别的函数体内,自己单重嵌套函数,这样的函数嵌套在别的函数体内,自己内部不再有嵌套的函数,例如上面介绍的是单重嵌套函内部不再有嵌套的函数,例如上面介绍的是单重嵌套函数。数。多重嵌套函数嵌套在别的函数体内,同时自己内部又嵌多重嵌套函数嵌套在别的函数体内,同时自己内部又嵌套着别的另一层或几层函数。如下面类型的函数套着别的另一层或几层函数。如下面类型的函数:2023-5-5function x=A(p1,p2).function y1=B1(p

25、3).function z1=C1(p4).end .end.function y2=B2(p5).function z2=C2(p6).function w=D(p7).end end endend 2023-5-53.嵌套函数的变量作用域嵌套函数的变量作用域变量的作用域指的变量能够被程序访问、修改、设置等变量的作用域指的变量能够被程序访问、修改、设置等的代码范围。的代码范围。父函数和嵌套在其内的函数,他们各自的变量是可以互父函数和嵌套在其内的函数,他们各自的变量是可以互相访问的。但是必须注意的是,嵌套函数访问父函数的相访问的。但是必须注意的是,嵌套函数访问父函数的变量,可以在函数定义里直接

26、拿过来用,而父函数访问变量,可以在函数定义里直接拿过来用,而父函数访问嵌套在其内的函数里的变量则必须要经过调用之后。嵌套在其内的函数里的变量则必须要经过调用之后。彼此没有嵌套关系的嵌套函数间是不能简单得共享变量彼此没有嵌套关系的嵌套函数间是不能简单得共享变量的。如果非要共享,则只能通过它们所在的父函数来进的。如果非要共享,则只能通过它们所在的父函数来进行。行。2023-5-5四、嵌套函数彼此调用关系四、嵌套函数彼此调用关系将主函数看成将主函数看成“父亲父亲”,嵌套函数依据嵌套深,嵌套函数依据嵌套深度可以看成度可以看成“儿子儿子”,“孙子孙子”,“重孙重孙”等等等。这样最外层的主函数可以认为是所

27、有内部等。这样最外层的主函数可以认为是所有内部函数的函数的“祖先祖先”,位于不同嵌套函数里的函数,位于不同嵌套函数里的函数之间的关系类似于一个家族之间的之间的关系类似于一个家族之间的“亲属关亲属关系系”。嵌套函数之间的调用关系可以总结成下面几句嵌套函数之间的调用关系可以总结成下面几句话:父亲可以求助儿子,儿子可以求助父亲,话:父亲可以求助儿子,儿子可以求助父亲,也即父子可以互相求助。一个人不能求助孙子、也即父子可以互相求助。一个人不能求助孙子、重孙等后代,但是可以求助自己的直系祖宗重孙等后代,但是可以求助自己的直系祖宗(祖父、曾祖父等等)以及和其直系祖宗是亲(祖父、曾祖父等等)以及和其直系祖宗

28、是亲兄弟的先人。一个人可以求助自己的亲兄弟,兄弟的先人。一个人可以求助自己的亲兄弟,或者亲叔叔、亲伯伯但不能求助侄儿。或者亲叔叔、亲伯伯但不能求助侄儿。2023-5-5第五节第五节 匿名函数、子函数与嵌匿名函数、子函数与嵌套函数应用案例套函数应用案例2023-5-5一、匿名函数应用实例一、匿名函数应用实例1.匿名函数在求解方程中的应用匿名函数在求解方程中的应用【例例4.5-1】求下列方程的根:求下列方程的根:求解代码如下:求解代码如下:f=(x)exp(x)+x2+x(sqrt(x)-100%构造方程的匿名函数形式构造方程的匿名函数形式f=(x)exp(x)+x2+x(sqrt(x)-100

29、format long x0=fzero(f,3)%求方程的根,初始值为求方程的根,初始值为3x0=4.163549956946139%求出的解求出的解 f(x0)%代入原方程验证代入原方程验证ans=2.842170943040401e-0142()e100 xxf xxx2023-5-5一、匿名函数应用实例一、匿名函数应用实例【例例4.5-1序序】对于对于,求下列方程相应的,求下列方程相应的 值,并值,并画出画出 和相应的和相应的 的图像。的图像。求解代码如下:求解代码如下:f=(a)(x)exp(x)+xa+x(sqrt(x)-100;%构造函数句柄构造函数句柄format longaa

30、=0:0.01:2;plot(aa,arrayfun(a)fzero(f(a),4),aa),*-)%利用利用arrayfun求解不同的求解不同的a对应的对应的xxlabel($a$,interpreter,latex,fontsize,15)%标注标注x、y坐标轴,按照坐标轴,按照latex语法语法ylabel($x$,interpreter,latex,fontsize,15)title($mathrmex+xsqrtx+xa-100$,interpreter,latex,.fontsize,15)()e100 xaxf xxx0,0.01,0.02,.,2a xax2023-5-5【例例

31、4.5-1序序】得到的图形得到的图形2023-5-5一、匿名函数应用实例一、匿名函数应用实例2.匿名函数在显式表示隐函数方面的应用匿名函数在显式表示隐函数方面的应用隐函数一般无法在数学上显式的表达。这里说的显式表隐函数一般无法在数学上显式的表达。这里说的显式表示指的是构造一个示指的是构造一个MATLAB函数来表达隐函数,具体函数来表达隐函数,具体思路是对于给定的隐函数的自变量思路是对于给定的隐函数的自变量x,通过数值方法求,通过数值方法求解出因变量解出因变量y,这样就相当于显式表达隐函数。请看下,这样就相当于显式表达隐函数。请看下面的例子面的例子:【例例4.5-2】显式表示下列显式表示下列y关

32、于关于x的隐函数:的隐函数:利用匿名函数,我们可以在利用匿名函数,我们可以在MATLAB中显式得写出中显式得写出y和和x的关系式如下:的关系式如下:y=(x)fzero(y)(exp(y)+xy)(1/y)-x2*y,1);120yyyexx y2023-5-5一、匿名函数应用实例一、匿名函数应用实例【例例4.5-3】显式表示下列显式表示下列z关于关于x,y的隐函数:的隐函数:z=(x,y)fzero(z)z-sin(z*x-0.5)2+x*2*y2-z/10)*.exp(-(x-0.5-exp(-y+z)2+y2-z/5+3),rand);z(1,2)ans=7.36960088522280

33、8e-004z(0,0.5)ans=0.0028075073342922222sin(0.5)2exp0.5exp3105zzzzxxyxyzy 2023-5-5一、匿名函数应用实例一、匿名函数应用实例3.匿名函数在求积分区域方面的应用匿名函数在求积分区域方面的应用有的时候,我们需要根据已知的积分值和被积函数求对有的时候,我们需要根据已知的积分值和被积函数求对应的积分区域,当被积函数表达式不是很复杂的时候,应的积分区域,当被积函数表达式不是很复杂的时候,用匿名函数比较适合。请看下例:用匿名函数比较适合。请看下例:【例例4.5-4】要使要使sin(x)2./(x2)这个式子的积分值为这个式子的积

34、分值为0.99*pi,求其关于,求其关于0对称的积分区域。对称的积分区域。u0=fzero(u)0.99*pi/2-quadl(x)sin(x).2./(x.2),0,u),1)u0=32.3138103582174102023-5-5一、匿名函数应用实例一、匿名函数应用实例4.匿名函数和符号计算的结合匿名函数和符号计算的结合【例【例4.5-5】求下面函数三阶导数在求下面函数三阶导数在0,1区间的图像:区间的图像:本例如果用手算的话,比较繁琐。如果用符号运算得到本例如果用手算的话,比较繁琐。如果用符号运算得到三阶导数的解析表达式,然后再转化成匿名函数,则比三阶导数的解析表达式,然后再转化成匿名

35、函数,则比较方便。本例展示了符号计算和数值计算结算结合的一较方便。本例展示了符号计算和数值计算结算结合的一种途径。代码如下种途径。代码如下:syms xf=(x+tan(x)(sin(x);c=diff(f,3);f3=eval(x)vectorize(c);x=linspace(0,1,100);plot(x,f3(x)title(x+tan(x)(sin(x)三阶导数图像)sin()()tan()xf xxx2023-5-500.10.20.30.40.50.60.70.80.91-12000-10000-8000-6000-4000-200002000(x+tan(x)(sin(x)三

36、阶 导 数 图 像2023-5-5一、匿名函数应用实例一、匿名函数应用实例5.匿名函数在优化中的应用匿名函数在优化中的应用匿名函数在优化中的应用主要是以表示目标函数的形式匿名函数在优化中的应用主要是以表示目标函数的形式出现的出现的。【例例4.5-6】求下面函数的最小值求下面函数的最小值用匿名函数来表示目标函数如下用匿名函数来表示目标函数如下:f=(x)3*x(1)2+2*x(1)*x(2)+x(2)2;进一步求解进一步求解:x0=1,1;%初始值初始值x,fval=fminunc(f,x0)x=1.0e-006*0.2541 -0.2029fval=1.3173e-013 221122()32

37、f xxx xx2023-5-5二、子函数和嵌套函数应用实例二、子函数和嵌套函数应用实例1.在求解积分上限中的应用在求解积分上限中的应用【例例4.5-7】如下述积分表达式,如何已知如下述积分表达式,如何已知 和和 ,求得,求得?,a el002223/20(1)(1sin)aelde2023-5-5function sol=exampleIntLimit1(a,e,l)%用嵌套函数表示被积表达式用嵌套函数表示被积表达式 function f=fun1(beta)f=a.*(1-e.2)./(1-e.2.*sin(beta).2).(3/2);end%调用调用fzero求满足条件的求满足条件的b

38、eta0值值sol=fzero(beta0)fun2(beta0,l,fun1),3);end%用子函数表示积分用子函数表示积分function g=fun2(beta0,l,fhdle)g=quadl(fhdle,0,beta0)-l;end2023-5-5二、子函数和嵌套函数应用实例二、子函数和嵌套函数应用实例2.在在GUI中的应用中的应用(三角界面,见书中代码)(三角界面,见书中代码)3.在在3D作图中的应用作图中的应用【例例4.5-9】画出下列函数的图像:画出下列函数的图像:其中其中110(,)1.0!NkNn mNkmnT n meNk 02.0,02.0nm2023-5-5func

39、tion m,n,TT=plot3dnmT(N,L)%N:inf的近似,的近似,L:0,2区间的剖分个数区间的剖分个数C=zeros(N,1);%nested-function:Tmn=calcT(mm,nn)中用来存储计算结果中用来存储计算结果m=linspace(0,2,L);m,n=meshgrid(m,m);TT=zeros(size(n);%和网格数据和网格数据m,n对应的计算出来的对应的计算出来的T(m,n)网格数据网格数据for ii=1:L for jj=1:L TT(ii,jj)=calcT(m(ii,jj),n(ii,jj);endend%=计算计算T(m,n)的的nest

40、-functionfunction Tmn=calcT(mm,nn)for N1=1:N C(N1)=(mmN1/gamma(N1+1)*sum(nn.(0:N1-1)./gamma(1:N1);Tmn=1.0-exp(-mm-nn)*sum(C);endendmesh(n,m,TT);end 2023-5-54.嵌套函数表示待优化的目标函数嵌套函数表示待优化的目标函数【例例4.5-10】已知已知 求下面表达式的最小值。求下面表达式的最小值。其中,其中,m在在0,2这个区间范围内这个区间范围内 3,;22w31,2,1;22N222(1)(2)(3)000cos()(1)cos()(2)cos

41、()(3)wwwmmmytt dtNtt dtNtt dtN2023-5-5function m=Findmw=pi/2,pi,pi*1.5;N=pi/2-1,-2,-1.5*pi-1;function y=ObjecFun(m)y=(quadl(t)t.m.*cos(t),0,w(1)-N(1)2+(quadl(t)t.m.*cos(t),0,.w(2)-N(2)2+(quadl(t)t.m.*cos(t),0,w(3)-N(3)2;endm=fminbnd(ObjecFun,0,2);end2023-5-5二、子函数和嵌套函数应用实例二、子函数和嵌套函数应用实例5.嵌套函数在表示微分方程方

42、面的应用嵌套函数在表示微分方程方面的应用(求解微分方程,见书中代码)(求解微分方程,见书中代码)2023-5-5第六节第六节 编写高效的编写高效的MATLAB程程序序2023-5-5一、重新认识循环一、重新认识循环1.高版本高版本MATLAB对循环结构的优化对循环结构的优化 从从MATLAB6.5版开始,版开始,MATLAB引入了引入了JIT(just in time)技术)技术和加速器(和加速器(accelerator),并在后续版本中不断优化。到了),并在后续版本中不断优化。到了R2009a,很多情况下,循环体本身已经不是程序性能提高的瓶颈了,瓶颈更很多情况下,循环体本身已经不是程序性能提

43、高的瓶颈了,瓶颈更多的来源于循环体内部的代码实现方式,以及使用循环的方式。多的来源于循环体内部的代码实现方式,以及使用循环的方式。(详见例详见例【例例4.6-1】)2.选择循环还是向量化选择循环还是向量化凡是涉及到矩阵运算的时候,则尽量用向量化凡是涉及到矩阵运算的时候,则尽量用向量化 如果向量化可能导致超大型矩阵的产生,使用前要慎重如果向量化可能导致超大型矩阵的产生,使用前要慎重 向量化的使用要灵活,多分析其运行机制,并与循环做对比向量化的使用要灵活,多分析其运行机制,并与循环做对比MATLAB初学者要尽量多用向量化思路编程初学者要尽量多用向量化思路编程高效的编程包括高效的开发和高效的运行高效

44、的编程包括高效的开发和高效的运行 2023-5-5二、提高代码效率的方法二、提高代码效率的方法 1.预分配内存预分配内存 当矩阵尺寸较大时,预分配内存(当矩阵尺寸较大时,预分配内存(preallocation),是),是MATLAB高效编程中最应该注意,同时也是很容易把握的一个技巧高效编程中最应该注意,同时也是很容易把握的一个技巧(详见例详见例【例例4.6-5】)2.选用恰当的函数类型选用恰当的函数类型 MATLAB有多种函数类型,不同的函数类型调用效率差别相当大,有多种函数类型,不同的函数类型调用效率差别相当大,为了写出高效的为了写出高效的MATLAB代码,我们就要选用恰当的函数类型来代码,

45、我们就要选用恰当的函数类型来实现我们的任务。实现我们的任务。(详见例详见例【例例4.6-6】【例例4.6-7】)3.选用恰当的数据类型选用恰当的数据类型 MATLAB同样有多种数据类型,不同的数据类型在存储和访问效同样有多种数据类型,不同的数据类型在存储和访问效率上也不尽相同,选用恰当的数据类型对写出高效的率上也不尽相同,选用恰当的数据类型对写出高效的MATLAB代代码同样具有重要的意义码同样具有重要的意义。(详见例详见例【例例4.6-8】)2023-5-5二、提高代码效率的方法二、提高代码效率的方法 4.减少减少无谓损耗减少减少无谓损耗给一些函数给一些函数“瘦身瘦身”MATLAB自身以及工具

46、箱里的很多函数具有较广的通自身以及工具箱里的很多函数具有较广的通用性,所谓的通用性是添加必要的代码考虑一个个具体用性,所谓的通用性是添加必要的代码考虑一个个具体的情形,这样对于每个具体的情形,代码实际上都有冗的情形,这样对于每个具体的情形,代码实际上都有冗余的。如果我们的程序某些部分对通用性要求不高,那余的。如果我们的程序某些部分对通用性要求不高,那么我们在优化时要考虑将不必要的代码去掉,这样的结么我们在优化时要考虑将不必要的代码去掉,这样的结果就是重写一些简单的函数果就是重写一些简单的函数。(详见例详见例【例例4.6-9】)5.变变“勤拿少取勤拿少取”为为“少拿多取少拿多取”MATLAB函数

47、调用开销相对于一些简单的计算本身来函数调用开销相对于一些简单的计算本身来说往往相当可观,为了尽可能多得降低函数调用无谓的说往往相当可观,为了尽可能多得降低函数调用无谓的损耗,我们就要想尽办法把需要多次函数调用才能完成损耗,我们就要想尽办法把需要多次函数调用才能完成的工作用较少次数的函数调用完成的工作用较少次数的函数调用完成。我们形象的称之为:。我们形象的称之为:变变“勤拿少取勤拿少取”为为“少拿多取少拿多取”。(详见例详见例【例例4.6-10】)2023-5-5二、提高代码效率的方法二、提高代码效率的方法 6.循环注意事项循环注意事项 很多人编写循环时,往往忽略很重要的事实,那就是同样循环层数

48、、很多人编写循环时,往往忽略很重要的事实,那就是同样循环层数、次数,不同的写法可能造成速度巨大的差异。编写循环时应该遵循次数,不同的写法可能造成速度巨大的差异。编写循环时应该遵循两个重要的原则:两个重要的原则:按列优先循环;(因为按列优先循环;(因为MATLAB按列循序存储矩阵)按列循序存储矩阵)循环次数多的变量安排在内层;循环次数多的变量安排在内层;(详见例详见例【例例4.6-9】)7.逻辑索引和逻辑运算的应用逻辑索引和逻辑运算的应用 MATLAB的矩阵元素索引有两类,一类是数值索引,一类是逻辑的矩阵元素索引有两类,一类是数值索引,一类是逻辑索引。前者又可分为线性索引(索引。前者又可分为线性

49、索引(linear index)和下标索引)和下标索引(Subscripts)。就效率来说,逻辑索引要高于数值索引。所以访)。就效率来说,逻辑索引要高于数值索引。所以访问矩阵元素能用逻辑索引的就用逻辑索引。问矩阵元素能用逻辑索引的就用逻辑索引。这里需要强调的是这里需要强调的是find函数返回的是数值索引,因此,如果不需要函数返回的是数值索引,因此,如果不需要对返回的索引值做进一步的操作,只是单纯寻找满足条件的一些元对返回的索引值做进一步的操作,只是单纯寻找满足条件的一些元素,素,find函数完全可以不必要函数完全可以不必要。(详见例详见例【例例4.6-12】)2023-5-5三、养成良好的编程

50、风格三、养成良好的编程风格 1.命名规则命名规则 变量:命名应该能够反映出其意义或者用途变量:命名应该能够反映出其意义或者用途。常量:常数变量(包括全局变量)命名应该采用大写字母,用下划常量:常数变量(包括全局变量)命名应该采用大写字母,用下划线分割单词线分割单词。函数:函数命名遵循的原则和变量命名差不多,函数命名更应该强函数:函数命名遵循的原则和变量命名差不多,函数命名更应该强调有意义的命名调有意义的命名 2.程序设计注意事项程序设计注意事项 模块化:编写一个比较复杂的程序时最好的方法是利用函数将它分模块化:编写一个比较复杂的程序时最好的方法是利用函数将它分化为小块。这种方式使得程序的可读性

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

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|