8MATLAB程序设计.ppt_第1页
8MATLAB程序设计.ppt_第2页
8MATLAB程序设计.ppt_第3页
8MATLAB程序设计.ppt_第4页
8MATLAB程序设计.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第8章MATLAB程序设计M FileProgramming 8 1M文件8 2程序流程控制8 3函数调用和参数传递8 4M文件性能的优化和加速8 5内联函数8 7利用函数句柄执行函数 8 1M文件 ScriptsandFunctions MATLAB程序代码所编写的文件通常以 m 为扩展名 因此这些文件称为M文件 MATLABM file M文件是一个ASC 码文件 M文件有两种形式 M脚本文件 Scripts 和M函数文件 Functions M函数文件是MATLAB程序设计的主流 8 1 1M文本编辑器 M FileEditor M文件编辑 调试器窗口是集编辑与调试功能于一体的环境 8 1 2M脚本文件 ScriptM files 脚本文件的特点 1 脚本文件中的命令格式和前后位置 与在命令窗口中输入的没有任何区别 2 MATLAB在运行脚本文件时 只是简单地按顺序从文件中读取一条条命令 送到MATLAB命令窗口中去执行 3 与在命令窗口中直接运行命令一样 脚本文件运行产生的变量都是驻留在MATLAB的工作空间 workspace 中 可以很方便地查看变量 除非用clear命令清除 脚本文件的命令也可以访问工作空间的所有数据 因此要注意避免变量的覆盖而造成程序出错 函数声明行H1行 用 开头的注释行 在线帮助文本 用 开头 编写和修改记录 用 开头 函数体 M函数文件的基本格式 functiony Ex0802 zeta EX0802二阶系统时域响应曲线 Stepresponseofquadraticsystem zeta阻尼系数 y时域响应 copyright2010 05 14x 0 0 1 20 y plot x y 8 1 3M函数文件 FunctionM files 1 函数声明行以 function 引导 是M函数文件必须有的 M脚本文件没有 函数名和文件名一致 当不一致时 MATLAB以文件名为准 函数声明行的格式 function 输出变量列表 函数名 输入变量列表 2 H1行通常包含大写的函数文件名 可以提供给help和lookfor关键词查询使用 3 在线帮助文本通常包含函数输入 输出变量的含义 格式说明 4 编写和修改记录一般在空一行后 记录作者 日期和版本记录 用于软件档案管理 5 函数体由MATLAB的命令或者通过流程控制结构组织的命令组成 通过函数体实现函数的功能 函数文件的特点 1 第一行总是以 function 引导的函数声明行 function 输出变量列表 函数名 输入变量列表 2 函数文件在运行过程中产生的变量都存放在函数本身的工作空间中 函数的工作空间随具体的M函数文件调用而产生 随调用结束而删除 是独立的 临时的 在MATLAB运行过程中可以产生任意多个临时的函数空间 3 当文件执行完最后一条命令或遇到 return 命令时 就结束函数文件的运行 同时函数工作空间的变量就被清除 4 在函数文件中需要将输出变量列表赋值 8 2程序流程控制8 2 1for end循环结构 说明 执行的次数就是array的列数 array可以是向量也可以是矩阵 循环变量依次取array的各列 每取一次循环体执行一次 for循环变量 array循环体end 例 forn 1 2 10循环五次 8 2 2while end循环结构 说明 表达式可以是向量也可以是矩阵 如果为矩阵则当所有的元素都为真才执行循环体 如果表达式为nan MATLAB认为是假 不执行循环体 while表达式循环体end 例如 whilen 0end 8 2 3if else end条件转移结构 if条件式1语句段1elseif条件式2语句段2 else语句段n 1end 说明 If else end结构也可以是没有elseif和else的简单结构 8 2 4switch case开关结构 switch开关表达式case表达式1语句段1case表达式2语句段2 otherwise语句段nend 说明 1 如果表达式1不满足 则与下一个表达式2比较 如果都不满足则执行otherwise后面的语句段n 2 开关表达式只能是标量或字符串 3 case后面的表达式可以是标量 字符串或元胞数组 如果是元胞数组则将开关表达式与元胞数组的所有元素进行比较 8 2 5try catch end试探结构 TrappingErrors try语句段1catch语句段2end 说明 首先执行语句段1 如果出现错误 则将错误信息赋给保留的lasterr变量 执行语句段2 当又出现错误 则终止该结构 8 2 6流程控制语句 1 break命令使包含break的最内层的for或while语句强制终止 立即跳出该结构 执行end后面的命令 2 continue命令用于结束本次for或while循环 只结束本次循环而继续进行下次循环 3 return命令终止当前命令的执行 并且立即返回到上一级调用函数或等待键盘输入命令 可以用来提前结束程序的运行 4 pause命令用来使程序运行暂停等待用户按任意键继续 pause 暂停pause n 暂停n秒5 keyboard命令用来使程序暂停运行 等待键盘命令 输入return语句 程序就继续运行 6 input命令用来提示用户应从键盘输入数值 字符串和表达式 并接受该输入 8 2 7循环结构与动画 MATLAB产生动画的方式有两种 1 影片方式以图像的方式预存多个画面 再将这些画面逐帧播放 就可以得到动画的效果 2 对象方式保持图形窗口中大部分对象即整个背景不变 而只更新部分运动的对象 以便加快整幅图像的实时生成速度 使用对象方式所产生的动画 可以实现实时的变化 也不需要太高的内存需求 但其缺点是无法产生太复杂的动画 1 以电影方式产生动画以电影方式产生动画 有两个步骤 1 使用getframe命令来抓取图形作为画面 每个画面都是以一个列向量的方式 置于存放整个电影的矩阵M中 2 使用movie M k 命令来播放电影 并可指定矩阵M播放的重复次数k 例8 10续 使用电影方式制作动画 显示二阶系统的时域波形 n 20 fori 1 nx 0 0 1 i y 1 1 sqrt 1 0 3 2 exp 0 3 x sin sqrt 1 0 3 2 x acos 0 3 plot x y axis 0 20 0 1 5 固定坐标轴M i getframe 抓取画面end movie M 3 播放3次 2 以对象方式产生动画产生动画的具体步骤是 1 先产生一个对象 其EraseMode属性为xor background或none 2 然后在循环中产生动画 每次循环改变此对象的位置属性xdata或ydata 或两者 3 最后使用drawnow命令刷新屏幕 1 擦除属性EraseMode以对象方式产生动画需要设置EraseMode属性 EraseMode为一个字符串 代表对象的擦除方式 即对于旧对象的处理方式 EraseMode属性有以下几种 normal 计算整个画面的数据 重画整个图形 xor 将旧对象的点以xor的方式还原 即只画与屏幕色不一致的新对象点 擦除不一致的原对象点 这种方式不会擦除被擦对象下面的其他图像 background 将旧对象的点变成背景颜色 实现擦除 这种方式会擦除被擦对象下面的其他图像 none 保留旧对象的点 不做任何擦除 在上述四种EraseMode中 耗费时间的次序是 normal xor background none 2 对象的位置属性通常在动画过程中 会改变对象的位置或尺寸 颜色等外观属性 位置属性有 xdata 为一个向量 代表对象的x坐标值 ydata 为一个向量 代表对象的y坐标值 3 屏幕刷新当新对象的属性设置后 应刷新屏幕 使新对象显示出来 刷新屏幕用drawnow命令实现 例8 10续 使用对象方式产生用一个红色的小球沿着曲线运动的动画 x 0 0 1 20 y 1 1 sqrt 1 0 3 2 exp 0 3 x sin sqrt 1 0 3 2 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 005秒drawnow 刷新屏幕end 8 3函数调用和参数传递8 3 1子函数和私有函数 1 子函数 Subfunctions 在M函数文件中只有一个主函数 其它则为子函数 1 在一个M文件中 主函数必须出现在最上方 其后是子函数 子函数的次序无任何限制 2 子函数不能被其它文件的函数调用 只能被同一文件中的函数 可以是主函数或子函数 调用 3 同一文件的主函数和子函数变量的工作空间相互独立 4 用help和lookfor命令不能提供子函数的帮助信息 functionEx0811 z1 0 3 Ex0802 z1 调用Ex0802holdonz1 0 5Ex0802 z1 调用Ex0802z1 0 707 Ex0802 z1 调用Ex0802functiony Ex0802 zeta 子函数 画二阶系统时域曲线x 0 0 1 20 y 1 1 sqrt 1 zeta 2 exp zeta x sin sqrt 1 zeta 2 x acos zeta plot x y 主函数 调用子函数 子函数 例8 11 将画二阶系统时域曲线的函数作为子函数 编写画多条曲线的程序 functionEx0811 EX0811使用函数调用绘制二阶系统时域响应z1 0 3 Ex0802 z1 调用Ex0802holdonz1 0 5Ex0802 z1 调用Ex0802z1 0 707 Ex0802 z1 调用Ex0802 functiony Ex0802 zeta 子函数 画二阶系统时域曲线x 0 0 1 20 y plot x y 附录F程序的调试 Debug 在调试时检测和跟踪逻辑错误的方法主要有 1 删除某些语句行末尾的分号 2 将函数调用中的被调函数单独调试 将第一句函数声明行前加 给输入变量定义并赋值 就可以以脚本的方式来执行该函数 3 在程序中加keyboard语句 当程序运行至此时会暂停 并在命令窗口显示 k 提示符 这时就可以在命令窗口查看和修改各变量的内容 4 使用MATLAB的M文件调试器 可以方便地查看和修改变量 准确地找到错误 用于调试的菜单有两个 Debug 和 Breakpoints 菜单 Debug菜单Step 快捷键F10 单步运行 Stepin 快捷键F11 单步运行进函数 Stepout 快捷键shift F11 从函数中出来 Continue 快捷键F5 从当前语句行执行程序到遇到下一个断点或程序结束 2 Breakpoints菜单Breakpoints菜单主要用来设置和清除断点 1 Set ClearBreakpoints 快捷键F12 设置和清除所在行的断点 2 ClearallBreakpoints 清除所有断点 3 StopIfError 在出错行暂停 4 StopIfWarning 在警告语句行暂停 5 StopIfNanOrInf 在有Nan或Inf的语句行暂停 6 StopIfAllError 在所有的出错语句行暂停 包括任何运行错误 包括 try catch end 结构中的出错也暂停 3 检查变量4 单元操作 2 私有函数 PrivateFunctions 私有函数是指存放在private子目录中的M函数文件 具有以下性质 1 在private目录下的私有函数 只能被其父目录的M函数文件所调用 而不能被其它目录的函数调用 2 私有函数父目录的M脚本文件也不可调用私有函数 3 在函数调用搜索时 私有函数优先于其它MATLAB路径上的函数 3 调用函数的搜索顺序在MATLAB中调用一个函数 搜索的顺序如下 查找是否子函数 查找是否私有函数 从当前路径中搜索此函数 从搜索路径中搜索此函数 8 3 2局部变量和全局变量 1 局部变量局部变量 LocalVariables 是在函数体内部使用的变量 其影响范围只能在本函数内 局部变量只在函数执行期间存在 当函数执行完变量就消失 2 全局变量全局变量 GlobalVariables 是可以在不同的函数工作空间和MATALB工作空间中共享使用的变量 全局变量在使用前必须用global定义 functionEx0812 globalXX 0 0 1 20 z1 0 3 Ex0802 z1 holdonz1 0 5 Ex0802 z1 z1 0 707 Ex0802 z1 functiony Ex0802 zeta 子函数 画二阶系统时域曲线globalXy plot X y 全局变量 8 3 3函数的参数 FunctionArguments 函数调用的格式 输出参数1 输出参数2 函数名 输入参数1 输入参数2 1 参数传递规则函数内变量与外界 包括其它函数和工作空间 的唯一联系就是通过函数的输入输出参数 输入参数在函数中的任何变化 都仅在函数内进行 不会传递回去 2 函数参数的个数 1 nargin和nargout变量函数的输入输出参数的个数可以通过变量nargin和nargout获得 nargin用于获得输入参数的个数 nargout用于获得输出参数的个数 2 varargin和varargout变量 varargin 和 varargout 可以获得输入输出变量的各元素内容 varargin和varargout都是元胞数组 8 3 4程序举例 Examples 在命令窗口中调用Ex0816函数 y Ex0816 0 5 例8 16 functiony Ex0816 z1 EX0816主函数调用子函数 根据阻尼系数绘制二阶系统时域曲线t 0 0 1 20 if z1 0 end 例8 17续 使用控件设计用户界面 根据阻尼系数绘制二阶系统的时域曲线 弹出式菜单的回调函数程序如下functionvarargout popupmenu zeta Callback h eventdata handles varargin val get h value switchvalcase1handles data 0case2handles data 0 3case3handles data 0 5case4handles data 0 707endguidata h handles 8 4M文件性能的优化和加速8 4 1P码文件 P码文件的生成P码文件使用pcode命令生成 生成的P码文件与原M文件名相同 其扩展名为 p pcodeFilename m 在当前目录生成Filename ppcodeFilename m inplace 在Filename m所在目录生成Filename p pcodeEx0817 m则在当前目录就生成了P码文件Ex0817 p 2 P码文件的特点 1 P码文件的运行速度比原M文件速度快一个M文件第一次被调用时 MATLAB就将其进行语法分析 并生成P码文件 又称伪代码 存放在内存中 2 存在同名的M文件和P码文件时则P码文件被调用 3 P码文件保密性好用字处理软件打开Ex0817 p文件 看到的是乱码 8 4 2M文件性能优化 1 使用循环时提高速度的措施循环语句及循环体是MATLAB编程的瓶颈问题 改进这种状况有三种方法 1 尽量用向量的运算来代替循环操作 2 在必须使用多重循环的情况下 如果两个循环执行的次数不同 则建议在循环的外环执行循环次数少的 内环执行循环次数多的 也可以显著提高速度 3 应用Mex技术如果耗时的循环不可避免 就应该考虑用其他语言 如C或Fortran语言 按照Mex技术要求的格式编写相应部分的程序 然后通过编译联接 形成在MATLAB可以直接调用的动态链接库 DLL 文件 这样就可以显著地加快运算速度 2 大型矩阵的预先定维给大型矩阵动态地定维是个很费时间的事 3 优先考虑内在函数矩阵运算应该尽量采用MATLAB的内在函数 因为内在函数是由更底层的C语言构造的 其执行速度显然很快 4 采用高效的算法在实际应用中 解决同样的数学问题经常有各种各样的算法 因此 应寻求更高效的算法 5 尽量使用M函数文件代替M脚本文件由于M脚本文件每次运行时 都必须把程序装入内存 然后逐句解释执行 十分费时 8 4 3程序性能剖析窗口 程序性能剖析窗口对程序中命令的运行时间进行分析 找出运行的 瓶颈 8 5内联函数 1 内联函数的创建inline string arg1 arg2 创建内联函数说明 string 必须是不带赋值号 的字符串 arg1和arg2是函数的输入变量 例8 19 创建内联函数 f inline sin x exp z x x z y f 5 0 3 调用函数fy 0 2140 8 6利用函数句柄执行函数8 6 1函数句柄的创建 1 函数句柄 FunctionHandles 的创建h fun fun 创建函数句柄h fun str2func fun 创建函数句柄2 利用函数句柄执行函数的优点 1 在更大范围调用函数函数句柄包含了函数文件的路径和函数类型 2 提高函数调用的速度 3 使函数调用象使用变量一样方便 简单 4 可迅速获得同名重载函数的位置 类型信息 8 6 2用feval命令执行函数 函数也可以使用feval命令直接执行 feval命令可以使用函数句柄或函数名 y1 y2 feval h fun arg1 arg2 y1 y2 feval funname arg1 arg2 说明 h fun是函数句柄 funname 是函数名 arg1 arg2 是输入参数 y1 y2 是输出参数 在MATLAB的命令窗口调用该Ex0821函数有三种格式 1 用feval命令利用函数句柄执行 h Ex0821 str2func Ex0821 h Ex0821 Ex0821 y feval h Ex0821 1 2 用feval命令利用函数名执行y feval Ex0821 1 3 直接调用函数y Ex0821 1 8 7利用泛函命令进行数值分析 在MATLAB中所有以函数为输入变量的命令 都称为泛函命令 输出变量列表 函数名 h fun 输入变量列表 输出变量列表 函数名 funname 输入变量列表 说明 h fun是要被执行的M函数文件的句柄 使用 符号加在函数名前面表示句柄 或者是内联函数和字符串 funname 是M函数文件名 8 7 1求极小值 1 fminbnd函数fminbnd函数用来计算单变量非线性函数的极小值 x y fminbnd h fun x1 x2 options x y fminbnd funname x1 x2 options x是fun函数在区间x1 x x2上的局部最小值的发生点 y是对应的最小值 2 fminsearch函数fminsearch函数是求多变量无束缚非线性最小值 x fminsearch h fun x0 x fminsearch funname x0 x0是最小值点的初始猜测值 8 7 2求过零点 fzero函数可以寻找一维函数的零点 即求f x 0的根 x fzero h fun x0 tol trace x fzero funname x0 tol trace 说明 h fun是待求零点的函数句柄 x0有两个作用 预定待搜索零点的大致位置和搜索起始点 tol用来控制结果的相对精度 默认值为eps trace指定迭代信息是否在运算中显示 8 7 3数值积分 函数quad和quad8是基于数学上的正方形概念来计算函数的面积 quad8比quad更精确速度更快 s quad h fun x1 x2 tol t

温馨提示

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

评论

0/150

提交评论