《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《新编MATLAB&Simulink自学一本通》课件第4章 Matlab程序设计.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新编MATLAB&Simulink自学一本通 新编MATLAB&Simulink自学一本通课件第4章 Matlab程序设计 新编 MATLAB Simulink 自学 课件 程序设计
- 资源描述:
-
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.嵌套函数的变量作用域嵌套函数的变量作用域变量的作用域指的变量能够被程序访问、修改、设置等变量的作用域指的变量能够被程序访问、修改、设置等的代码范围。的代码范围。父函数和嵌套在其内的函数,他们各自的变量是可以互父函数和嵌套在其内的函数,他们各自的变量是可以互相访问的。但是必须注意的是,嵌套函数访问父函数的相访问的。但是必须注意的是,嵌套函数访问父函数的变量,可以在函数定义里直接
展开阅读全文