《数学建模 matlab程序设计专题》由会员分享,可在线阅读,更多相关《数学建模 matlab程序设计专题(37页珍藏版)》请在金锄头文库上搜索。
1、2018/11/7,MATLAB_程序设计,1,MATLAB程序设计专题,M文件有两种形式 M脚本文件 M函数文件,2018/11/7,MATLAB_程序设计,2,M脚本文件的特点,1、脚本文件中的命令格式和前后位置与在命令窗口中输入相同。 2、运行脚本文件时,只是按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行。,2018/11/7,MATLAB_程序设计,3,M脚本文件的特点,3、与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空间(workspace)中,可以很方便地查看变量;脚本文件的命令也可以访问工作空间的所有数据,因此要注意避免变量的
2、覆盖而造成程序出错。,2018/11/7,MATLAB_程序设计,4,M函数文件的基本格式,函数声明行,function 输出变量列表 = 函数名(输入变量列表),H1行(用%开头的注释行) 在线帮助文本 (用%开头) 编写和修改记录(用%开头),函数体,2018/11/7,MATLAB_程序设计,5,创建M函数文件并调用的步骤,编写函数代码 将函数文件保存为“函数名.m”。 在命令窗口输入命令调用程序,2018/11/7,MATLAB_程序设计,6,M函数文件的特点,1、第一行总是以“function”引导的函数声明行; 2、函数文件在运行过程中产生的变量都存放在函数本身的工作空间; 3、当
3、文件执行完最后一条命令或遇到“return”命令时,就结束函数文件的运行,同时函数工作空间的变量就被清除;,2018/11/7,MATLAB_程序设计,7,M函数文件的特点,4、函数的工作空间随具体的M函数文件调用而产生,随调用结束而删除,是独立的、临时的,在MATLAB运行过程中可以产生任意多个临时的函数空间。 5、文件名与函数名相同。,2018/11/7,MATLAB_程序设计,8,程序流程控制,三种控制结构 顺序 循环 分支,2018/11/7,MATLAB_程序设计,9,循环结构,1、for . end循环结构 for 循环变量=array 循环体 end 说明:循环体执行的次数就是a
4、rray的列数。循环变量依次取array的各列,每取一次循环体执行一次。,2018/11/7,MATLAB_程序设计,10,循环结构,2、while . end循环结构 while 表达式 循环体 end 说明:只要表达式为逻辑真,就执行循环体;一旦表达式为假,就结束循环。,2018/11/7,MATLAB_程序设计,11,分支结构,1、ifelseend条件转移结构 if 条件式1 语句段1 elseif 条件式2 语句段2 . else 语句段n+1 end,2018/11/7,MATLAB_程序设计,12,if分支结构例子,2018/11/7,MATLAB_程序设计,13,functio
5、n y=Ex01(x) %Ex01 根据x值求y if x0 y=NaN elseif x15 y=40/15*x+10 elseif x30 y=50 elseif x=60 y=50-10/15*(x-30) else y=NaN end,2018/11/7,MATLAB_程序设计,14,学生成绩判定(ifelsef.m),function ifelsef() % ifelsef 使用if结构的成绩评定 grade=input(input the grade:) if (grade=0) end rank,2018/11/7,MATLAB_程序设计,15,分支结构,2、switchcase
6、开关结构 switch 开关表达式 case 表达式1 语句段1 case 表达式2 语句段2 . otherwise 语句段n end,2018/11/7,MATLAB_程序设计,16,分支结构,2、switchcase开关结构说明: (1)开关表达式只能是标量或字符串。 (2)case后面的表达式可以是标量、字符串或元胞数组,如果是元胞数组则将开关表达式与元胞数组的所有元素进行比较,只要某个元素与开关表达式相等,就执行其后的语句段。,2018/11/7,MATLAB_程序设计,17,switch分支结构例子,季节判断(swtichf.m),2018/11/7,MATLAB_程序设计,18,
7、分支结构,3、try. catch. end试探结构 try 语句段1 catch 语句段2 end,2018/11/7,MATLAB_程序设计,19,分支结构,3、try. catch. end试探结构 说明:首先试探性地执行语句段1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并放弃这段语句,转而执行语句段2中的语句,当执行语句段2又出现错误,则终止该结构。,2018/11/7,MATLAB_程序设计,20,流程控制语句,1. break命令 break命令可以使包含break的最内层的for或while语句强制终止,立即跳出该结构,执行end后面的命令,b
8、reak命令一般和if结构结合使用。 2. continue命令 continue命令用于结束本次循环,只结束本次循环而继续进行下次循环。,2018/11/7,MATLAB_程序设计,21,流程控制语句,3. return命令 return命令是终止当前命令的执行,并且立即返回到上一级调用函数或等待键盘输入命令,可以用来提前结束程序的运行。 4. pause命令 pause命令用来使程序运行暂停,等待用户按任意键继续。,2018/11/7,MATLAB_程序设计,22,流程控制语句,5. keyboard命令 keyboard命令用来使程序暂停运行,等待键盘命令,执行完自己的工作后,输入ret
9、urn语句,程序就继续运行。 6. input命令 input命令用来提示用户应该从键盘输入数值、字符串和表达式,并接受该输入。,2018/11/7,MATLAB_程序设计,23,局部变量和全局变量,根据变量的作用域不同,可以将MATLAB程序中的变量分为局部变量和全局变量.,2018/11/7,MATLAB_程序设计,24,局部变量,局部变量(Local Variables)是在函数体内部使用的变量,其影响范围只能在本函数内; 因为每个函数在运行时,都占用独立的函数工作空间,与MATLAB的工作空间是相互独立的,所以局部变量只在函数执行期间存在。,2018/11/7,MATLAB_程序设计,
10、25,全局变量,全局变量(Global Variables)是可以在不同的函数工作空间和MATALB工作空间中共享使用的变量。 用 global定义, 而且每个要共享全局变量的函数和工作空间,都必须逐个定义, 先定义后使用. 注意:由于全局变量在任何定义过的函数中都可以修改,因此不提倡使用全局变量;使用时应十分小心,建议把全局变量的定义放在函数体的开始,全局变量用大写字符命名。,2018/11/7,MATLAB_程序设计,26,函数的参数,函数调用格式: 输出参数1,输出参数2,=函数名(输入参数1,输入参数2,),2018/11/7,MATLAB_程序设计,27,函数参数的个数,(1) na
11、rgin和nargout变量(sumf.m) nargin %在函数体内获取实际输入变量的个数 nargout %在函数体内获取实际输出变量的个数,2018/11/7,MATLAB_程序设计,28,函数参数的个数,(1) nargin和nargout变量 nargin(fun) %在函数体外获取定义的输入参数个数 nargout(fun) %在函数体外获取定义的输出参数个数,2018/11/7,MATLAB_程序设计,29,函数的参数个数,(2) varargin和varargout变量 varargin和varargout可以获得输入输出变量的各元素内容。 varargin和varargou
12、t都是元胞数组。 调用形式:vararginm,2018/11/7,MATLAB_程序设计,30,M文件性能优化,1. 使用循环时提高速度的措施 (1) 尽量用向量的运算来代替循环操作。 (2) 在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的,也可以显著提高速度。,2018/11/7,MATLAB_程序设计,31,M文件性能优化,2. 大型矩阵的预先定维 3. 优先考虑内在函数 4. 采用高效的算法 5. 尽量使用M函数文件代替M脚本文件,2018/11/7,MATLAB_程序设计,32,泛函命令,在MATLAB中,所有以函数为
13、输入变量的命令,都称为泛函命令。,2018/11/7,MATLAB_程序设计,33,泛函命令调用方式,输出变量列表=函数名(h_fun, 输入变量列表) 输出变量列表=函数名(funname, 输入变量列表) 说明:h_fun是要被执行的M函数文件的句柄,或者是内联函数和字符串;funname是M函数文件名。,2018/11/7,MATLAB_程序设计,34,利用泛函命令求极小值,1. fminbnd函数:用来计算单变量非线性函数的最小值。 x,y=fminbnd(h_fun,x1,x2,options) x,y=fminbnd(funname,x1,x2,options) x是fun函数在区
14、间x1xx2上的局部最小值的发生点;y是对应的最小值。 options是用来控制算法的参数向量,默认值为0可省略。,2018/11/7,MATLAB_程序设计,35,利用泛函命令求极小值,2. fminsearch函数 :求多变量无约束非线性最小值。 x=fminsearch(h_fun,x0) x=fminsearch(funname,x0) x0是最小值点的初始猜测值。,2018/11/7,MATLAB_程序设计,36,其它泛函命令,3 .fzero函数:求一维函数的零点,即求f(x)=0的根。 x=fzero(h_fun, x0, tol, trace) x=fzero(funname, x0, tol, trace) x0有两个作用:预定待搜索零点的大致位置和搜索起始点;tol用来控制结果的相对精度,默认值为eps;trace指定迭代信息是否在运算中显示。,2018/11/7,MATLAB_程序设计,37,其它泛函命令,4. 数值积分:quad和quad8是基于数学上的正方形概念来计算函数的面积。 5. 微分方程的数值解:MATLAB提供ode23、ode45和ode113等多个函数求解微分方程的数值解。,