22 第一音 MATLAB系统与语言简介 elseif表达式2 语句组2 语句组3 它们的语义与通常的程序设计语句的语义是相同的 1.3.2M文件、 MATLAB函数与函数型函数 MATLAB采用的是行命令模式,用户每输入一行命令,回车后 MATLAB就解释并执 行这条命令,并根据要求显示运算结果。此外, MATLAB也可以执行某个文件中的 MATLAB语句序列(类似于DOS的批处理文件)。这两种模式一起,构成了 MATLAB的 解环境。 包含 MATLAB语句序列的文本文件称为M文件,其文件名以m为扩展名。例如,文 件 bessel.m包含的 MATLAB语句用于计算 Bessel函数。在M文件的语句中可以引用另 外的M文件,也可以递归地调用其自身。M文件可以用任何文本编辑器生成,例如用 Windows95的 notepad编辑器生成。 MATLAB定义了两种类型的M文件:程序M文件 和函数M文件。程序M文件的内容是 MATLAB语句流(也可称为批处理),而函数M文 件总是提供某种特定的处理功能作为 MATLAB函数的扩展。程序M文件和函数M文件 都是AScH码文本文件。 1.程序M文件 当一个程序M文件启动后 MATLAB就解释执行它所遇到的每一条 MATLAB语句 每条语句都是在 MATLAB的工作环境中执行的。为了设计、修改、分析一段较长的 MATLAB语句序列,可以将这些语句编写成一个程序M文件,以便反复运行与修改。下面 是一个程序M文件的例子,假设它的文件名字是tbno.m,其语句序列如下: %An M-file to calculate Fibonacci numbers f=[11]; while f(i)+f(i+1)<1000 f(+2)=f(i)+f(i+1); =i+1 plot(f) 在 MATLAB命令窗口中键入fbno命令后, MATLAB将计算前16个 Fibonacci数,并画 出一辐图。该文件执行完毕时变量f和保留在 MATLAB工作环境中。 MATLAB提供的演示程序说明了如何用程序M文件求解复杂问题。每次启动 MATLAB系统时,系统自动执行 startup.m文件。用户可以根据自己的需要将可能用到的 有关常数等写入该文件中这样,这些常用量就被装入到 MATLAB的工作环境中。该文件 的作用有点类似于DOS系统的 autoexec.bat文件。另一个M文件是 malabre. m,它的作
1.3简单程序设计 用是设置一些必要的系统参数,类似于DOS系统的 config.sys文件 2函数M文件 如果M文件的第一行以关键字 function开始,则称该行为函数说明语句,这个文件称 为函数M文件。函数M文件与程序M文件的主要区别是函数M文件可以用来传递参数或 变量而且函数M文件中定义和管理的变量都是局部变量。当函数M文件运行完毕时,这 些变量被清除。函数M文件主要用于编写新的 MATLAB函数。下面是一个简单的函数M 文件的例子,其文件名为m function y meanvalue(x) MEAN Average or mean value For vectors, MEAN(x)returns the mean value For matrices, MEAN(x)is a row vector containing the mean value of each column % [m, n=size(x); if mmd sum(x)/m: 该文件定义一个新的函数mean。在命令窗口的提示符下用函数M文件的文件名和附加的 调用参数(如果需要的话)可以调用函数。在上述例子中,设z是从1到99的向量即 z=1:99,则下列函数调用 》mean(z 的结果是 ans 3.函数型函数 在 MATLAB中有一类函数是以某些数学函数为处理对象的〔或它的输入参数为另 个函数),这种函数在 MATLAB中被称为函数型函数。 MATLAB的基本系统中已定义的 函数型函数有:数值积分;非线性方程求解及其优化;常徵分方程数值求解 MATLAB用函数M文件定义数学函数。例如函数 0.01 可以用名为 humps. n的函数M文件来实现 function y=humps(x) y=1./(x-0.3).^2+0.01)+1./(x-0.9).2+0.04)-6; 该函数在区间[-1,2]上的图形可以用下列语句得到 》plot(x, humps(x));
第章 MATLAB系统与语盲简介 (1)数值积分(求积公式) 函数f(x)与坐标横轴所围区域的代数面积可以由它的定积分求得。 MATLAB函数 quad可以用来求定积分的近似值。该函数以被积函数为第一输入参数,定积分的下限与上 限分别为第二和第三输入参数。前面定义的函数 humps.n在[0,1]上的定积分为 >>q- quad(humps,C, 1) 29.8583 函数quad使用自适应的 Simpson求积规则求解。另一个数值求积的函数型函数是 quad8,其算法为8节点自适应 Newton-Cotes求积规则注意:函数quad和quad8的第一个 输入参数是单引号括起来的函数名,它们是施加在另一个函数上的运算,在这种意义下,把 它们称为函数型函数 (2)非线性方程求解与函数优化 下面几个 MATLAB函数型函数用于求解非线性方程和函数优化问题: 单变量函数的极小值 fmins 多变量函数的极小值(无约束非线性优化) fzero 单变量非线性方程求根 仍以函数 humps.m为例,该函数在[0.5,1]区间上的最小值位置可由fmin函数求出: > xm= fmin('humps',0.5, 1) 0.6378 最小值的近似值为 从 humps的图形中可以看出,该函数有两个零点在x=0附近的零点是 》xzl= fzero( humps,0) xzl= 0.1316 而x=1附近的零点是 》xz2=fero( humps2,1) x22= 1.2995 在 MATLAB的最优化工具箱中还增加了7个用于求解非线性方程与函数优化的函 数型函数,它们分别是: 多目标优化函数 约束最优化函数 无约束最优化函数 fsolve 非线性方程组求解
1.3简单程序设计 25 非线性最小二乘解 极小极大解 半无限优化 (3)常微分方程数值求解 用于常微分方程数值求解的 MATLAB函数型函数有: 2阶/3阶 Runge-Kutta方法 ode45 4阶/5阶 Runge-Kutta- Fehlberg方法 例如,考查二阶 Van der pol方程 x+(x2-1)x+X=0 的数值解。这个方程可以改写成等价的一阶常微分方程组 第一步工作是编写描述这组方程的M文件,该文件的名字设为 vdpol. m: nction xdo dot zeros(2. 1) xdot(1)=x(1),(1-x(2).^2)-x(2); dot(2)=x(1); 为了在区间0≤≤20上求解由 vdpol. m定义的微分方程,启动函数ode23如下 》t0=0;t=20 》x0=[0,0.25]; >>Lt, x]=ode 23('vdpol, tO, tf, xO) > plot(t, x) 有关系统模拟的内容读者可以参考 MATLAB附带的有关 SIMULINK使用的帮助 文件。 4.变量 nargin和 margo 在前面的函数M文件mean,m中,有一个输入形式参数x和一个输出形式参数y。定 义函数M文件时形式参数的个数可以是任意多个。在调用函数时 MATLAB用两个永久 变量 nargin和 nargout分别记录调用语句的输入和输出实参数的个数。这样, MATLAB允 许调用语句中的实参数个数可以与函数M文件定义中的形式参数个数不同。 5编写函数的在线帮助 用户可以为自已的函数编写在线的帮助信息。在 MATLAB环境中,下面的命令 》help函数名 将显示出该函数M文件的注释信息,即函数说明语句后几条连续的注释行。例如,本书 1.3.2节中的M文件 meanm的2~5行。因此,用户可以将有关的对函数功能进行说明的 信息作为注释行写在函数说明语句的后面。help命令只是显示跟随在函数说明语句后的连 续的注释行块,而忽略其他的注释行。故应该将最主要的说明放在第一行注释行内。在有些 情况下, MATLAB只访问第一行的内容。例如, MATLAB命令 lookfor就只在第一行中查
第一章 MATLAB系统与语言简介 找用户指定的关键字 6.函数的编译 当用户第一次调用一个函数时, MATLAB会对其进行编译并将其装入内存。如果再次 调用该函数,则不用再编译直到退出 MATLAB系统或用户将该函数从内存中清除。what 命令可以用来显示当前目录下可用的函数M文件名,type命令可用于打印指定的M文件 内容。当用户输入一个名字,例如 whoopie时, MATLAB将按照下列的步骤作解释 (1)在工作空间中寻找变量 (2)检查 whoopie是否为 MATLAB的内部函数; (3)在当前目录中查找文件 whoopie.m; (4)在 MATLAB搜索路径的目录中查找文件 whoopie. m 这样,对每个名字, MATLAB首先将其作为变量在工作环境中查找然后再作为函数 解释。如果不是以上这些情况, MATLAE系统就报告错误信息 全程变量 通常每一个由M文件定义的函数,都有自己的局部变量,这些变量独立于其他函数独 立于工作环境,独立于任何非函数的普通M文件。函数的输出量可以赋给工作环境中的任 何变量达到修改该变量的目的而函数的局部变量在退出函数体时被系统自动清除但是, 在一些函数内将某个变量说明为全程变量,则这些函数之间甚至与工作环境之间可以共享 全程变量的同一个拷贝值。在任何一个这样的函数中,对全程变量的任何赋值其他的函数 再使用该全程变量时,将按新的值用于计算。换句话说若在任何一个地方改变了全程变量 的值,则其后所有用到全程变量的地方都以新的值作计箅。为了便于区别在程序中习惯于 用大写字母表示全程变量。例如,假设为研究 Lotka-volterra捕食模型 y2+By,y 中的系数a和对方程解的影响首先编写一个名为 lotka. m的函数M文件,其内容如下 function yp= lotka(t, y) LOTKA Lotka-Volterra predator prey model global ALPHA BETA p=[y(1)- ALPHA*y(1)*y(2);-y(2)+BETA*y(1)*y(2)]; 然后交互地输入下列语句(第一句输入一次即可) global ALPHA BETA ALPHA = 0.01 S BETA 0 02 [t,y]=ode23(loka',0,10,[1;1]); plot(t, y) 上述两条全程变量说明语句 global说明了变量 ALPHA和BETA是全程变量,对 ALPHA 和BETA的任何赋值,函数 lotka可以立即使用。输入不同的ALPA和BETA即可得到