二、M文件 - 哈尔滨理工大学数学建模

Download Report

Transcript 二、M文件 - 哈尔滨理工大学数学建模

数 学 建 模
数学是知识的工具,亦是其它知识工具的泉源。
哈尔滨理工大学
应用数学系
——勒内·笛卡尔
第9章 MATLAB编程及调试
宋显华
[email protected]
哈尔滨理工大学
应用数学系
内容
1
常用软件介绍
2
MATLAB基本操作
3
MATLAB编程及调试
4
MATLAB求解算例
数学建模
第9章 模型求解常用软件
第41讲
MATLAB编程及调试
哈尔滨理工大学
应用数学系
一、函数
MATLAB提供了很多内部数学函数
abs,sqrt,exp,sin
对负数取平方根或对数也不会导致错误,MATLAB
会自动返回复数计算结果。
MATLAB还提供了很多高级的数学函数,这些函数
中的大部分都接受复数参数。 bessel和gamma函数
在命令窗口键入如下命令可以查看基本数学函数的列
表。
help elfun
键入下面的命令,可以找到更多的高级数学函数和矩
阵函数。 help specfun
help elmat
数学建模
一、函数
有些函数是内部函数, 如aqrt和sin
内部函数是MATLAB内核的一部分,所以它们的计
算效率很高,但计算细节无法获取。
有些函数是使用M文件实现的,如 gamma 函
数
对于内部函数,无法看到代码,对于其他函数,可以
查看到代码甚至修改代码。
数学建模
一、函数
主函数


M文件的第一个函数称为主函数,主函数后面可以有任意
个子函数。
在多数情况下,主函数是M文件中可以从MATLAB命令行
或从另一个M文件函数调用的唯一函数,调用该函数时,
使用定义该函数的M文件的名称。
例如:average函数位于文件average.m中
function y = average(x)
% 计算矢量元素的平均值
数学建模
一、函数
y = sum(x)/length(x);
可以从MATLAB命令行用下面的命令计算3个数的平
均值。
average([ 12 34 25])
注:一般使主函数的名称与M文件相同,如果函数
名与文件名不同,必须用文件名调用函数。
数学建模
一、函数
子函数




。
M文件中可以包含一个以上的函数,文件中除主函数以外
的其他函数称为子函数,并且它们只对主函数或同一文件
中的其他函数可见。
主函数放在最上面,子函数放在下面,各子函数排名不分
先后。
即使在同一个M文件中,子函数也不能获取用于主函数或
其他子函数的参数,除非它们声明为全局变量,或者作为
参数传递。
从M文件内部调用函数时,MATLAB首先检查文件,看函
数是否为子函数,然后检查该名称的私有函数,最后搜索
路径上的独立M文件或内部函数。因为首先检查子函数,
所以可以用相同名称的子函数覆盖已经存在的M文件。
数学建模
一、函数
匿名函数

使用匿名函数,可以在不必创建M文件的情况下快速创建
简单函数。可以在MATLAB命令或任何M文件函数或脚本
中创建匿名函数。
创建匿名函数的语法格式为:
fhandle = @(arglist)expr
expr表示函数体,即函数要完成主要工作的代码,
arglist为要传递给函数的逗号间隔的输入参数列表
,返回函数句柄fhandle。
数学建模
一、函数
嵌套函数

可以在一个函数中嵌套定义一个或多个函数,嵌套函数具
有类似下面的形式。
function x=A(p1,p2)
…
function y = B(p3)
…
end
…
end
注意:M文件函数一般不
需 要 end 语 句 , 但 使 用 嵌
套函数时需要此语句。如
果M文件包含一个或多个
嵌套函数,必须在M文件
中 使 用 end 语 句 终 止 所 主
函数,不管它们是否包含
嵌套函数。
数学建模
一、函数
私有函数

私有函数是private子目录中的函数,它们只对父目录中的
函数可见。因为私有函数在父目录以外是不可见的,在其
他目录中可以使用与之相同的名称。
数学建模
一、函数
重载函数

有时候同一个函数可以用于多种情况,对应地有不同的输
入参数,此时要用到重载函数。比如,绘制二维线形图的
plot函数就有多种重载形式,
plot(Y)
plot(X1,Y1,…)

这两个函数具有相同的函数名,不同的参数,调用plot函数
时MATLAB会根据函数的参数自动选择使用。
数学建模
二、M文件
如果需要重复调用命令行,或者命令行的行数比较多
,常常将它们写成M文件的形式并进行保存。
脚本式M文件和函数式M文件

假设我们想绘制一个单位球面,并且要让球面看起来比较
光滑,可以在命令窗口中键入
sphere
%绘制一个单位球面
shading interp %对球面进行插值着色
axis equal
%设置坐标系,使各坐标方向
上的度量单位相同
数学建模
二、M文件
数学建模
二、M文件
现在假设除了需要生成球面以外,还想生成柱面。可
以考虑标志一个绘图函数,这个函数有一个surface
参数。
调用这个函数时,如果将参数设置为“sphere”,则
生成一个单位球面,设置为“cylinder”时,则生成一
个单位柱面。
数学建模
二、M文件
创建和编辑程序的工作在M文件编辑器中完成,在主
界面中一次选择File New Function菜单项,打开M
文件编辑器。在M文件 编辑器中输入下面的代码
function drawsur(surface)
switch surface
case 'sphere'
sphere
case 'cylinder'
cylinder
end
shading interp
axis equal
数学建模
二、M文件
然后将它保存到当前目录下,名为drawsur.m。现在
,可以再命令窗口中调用drawsur函数了。
在命令窗口中键入下面的命令行
drawsur(‘sphere’)
将生成相同的球面。
键入
drawsur('cylinder')
数学建模
二、M文件
M文件有两种,一种是脚本式M文件,另一种是函数
式M文件。上面使用的是函数式形式。为了进行比较
,我们继续使用前面的例子。新建一个M文件,在编
辑器中输入下面代码:sphere
shading interp
axis equal
sphere
保存为sphere.m,在命令窗口中键入
生成单位球面。
这 里 的 使 用 方 式 与 drawsur 完 全 不 同 , 它 没 有
function关键字,没有输入参数。这就是脚本式M文
件的使用方式。
数学建模
二、M文件
脚本式M文件
不接受输入参数,没有
返回值
基于工作空间中的数据
进行操作
函数式M文件
可以接受输入参数,可
以有返回值
默认时,文件中参数的
作用范围只限于函数内
部
自动完成需要花费很多 扩展MATLAB语言功能
时间的多步操作时使用 使用
数学建模
二、M文件
M文件的基本结构

函数式M文件比较标准的格式如下所示,其中加粗的文字
表示M文件的基本组成部分:
函数定义行
function [x,y]=myfun(a,b,c)
% H1行—用一行文字来综述函数的功能
% 帮助文本—用一行或多行文本解释如何使用函数
% 在命令行中键入“help<functionname>”时可以使用它
数学建模
二、M文件
% 函数体—一般从第一个空白行后开始
% 注释—描述函数的行为,输入输出的类型等
% 在命令行中键入“help<functionname>”时不会显示注释文本
% 开始编写函数代码
x= prod(a,b);
一个完整的M文件应该包括函数定义行、H1行、帮
助文本、函数体、注释和函数代码等方面的内容,其
中函数定义行和函数代码是必须的。
数学建模
二、M文件
 函数的参数

调用函数时,调用者通过一个参数列表传递数据,并获取
返回值,MATLAB采用的是传值方式。
 检查输入参数的个数

利用nargin和nargout函数可以确定函数输入参数和输出参
数的个数。然后可以根据参数个数用条件语句完成不同的
任务,例如, function c = testarg(a,b)
if (nargin ==1)
c = a.^2;
elseif (nargin == 2)
c = a+b;
end
数学建模
二、M文件
传递参数


使用 varargin 和 varargout 函数可以传递任意个数的输入
参数或者返回任意个数的输出参数给函数。
MATLAB把所有指定的输入参数指定到一个单元数组中,
每个单元可以包含任意大小或类型的数据。对于输入参数
,函数代码必须把它们打包到一个单元数组中,这样,
MATLAB就可以把参数返回给调用函数。
数学建模
二、M文件
解包varargin中的内容

因为varargin将所有输入参数包含在一个单元数组中,所以
有必要使用单元数组索引来提取数据
y(n) = varargin{n}(2);

其中,索引表达式{n}获取varargin的第n个单元。表达式(2)
表示单元内容的第二个元素。
数学建模
二、M文件
打包varargout

当允许有任意多个输出参数时,必须将所有输出打包到
varargout单元数组中,使用nargout确定输出参数的个数。
例如,下面的代码接收两列输入数组,其中第一列表示一
系列x坐标,第二列表示y坐标,它将数组分成单独的[xi,yi]
矢量,可以将该矢量传递给testvar函数。
循环中的赋值语
句使用了单元数
组的赋值语法。
function [varargout] = testvar(arrayin)
for k = 1:nargout
varargout{k} = arrayin(k,:); % 单元数组赋值
end
数学建模
二、M文件
参数列表中的varargin和varargout

varargin或varargout必须出现在参数列表的最后,即函数
调用必须首先指定必要的参数。例如,下面的函数声明行
显示了varargin和varargout的正确位置:
function [out1,out2] = example1(a,b,varargin)
function [i,j,varargout] = example2(x1,y1,x2,y2,flag)
数学建模
二、M文件
返回输出参数

放在函数定义行中等号左侧的任何参数都是调用函数的返
回值。如果传递任何函数可以修改的输入参数,需要把相
同的参数作为输出参数。这样,调用函数可以获得更新后
的值。
[test,offset] = readText(filestart,offset)
数学建模
三、程序调试和错误处理
用try-catch语句检查错误

try…catch语句进行错误捕获,它把有
可能引起异常的语句放在try控制块中
,这样当try控制块中statement语句引
起异常时,catch控制块就可以捕获它
,并针对不同的错误类型,进行不同
的处理。调用格式:
try,
statement,
…,
statement,
catch,
statement,
…,
statement,
end
数学建模
三、程序调试和错误处理
错误和警告信息

使用MATLAB的error和warning函数可以报告错误和警告信
息并延迟程序的运行。
if n<1
error(‘n must be 1 or greater’)
end
如果n小于1,给出出错信息“n must be 1 or greater”;
同样,warning 函数给出警告信息
warning(‘Input must be a string’)
警告输入内必须是字符串。
数学建模
三、程序调试和错误处理
用“Debug”菜单进行调试

在M文件编辑器中,使用“Debug”菜单可以很方便地进行程
序调试,“Debug”菜单如图所示,各种方法主要分为三种,
即定点调试、断点调试以及错误和警告调试等。
数学建模
三、程序调试和错误处理
定点调试

定点调试选项包括“Step”、“Step In”、“Step Out”,使用它
们可以逐语句、逐函数调试或直接运行到光标处。
断点调试

进行断点调试时,程序运行到断点处就会停下来,这样有
利于很快找到出现错误的位置(需要先设置断点)。
错误和警告调试

使用“Stop if Errors/Warnings…”选项,确定错误或警告出
现时停止运行。
数学建模
四、编程技巧
矢量化

使程序运行更快的方法之一是将构造程序的算法进行矢量
化,在其他程序语言可能使用for循环或do循环的地方,
MATLAB可以使用矢量或矩阵操作,对于下面的程序:
x=.01;
for k = 1:1001
y(k) = log10(x);
x = x+.01;
end
进行矢量化后如下所示:
x=.01:.01:10;
y=log10(x);
数学建模
四、编程技巧
预分配内存空间

如果不能矢量化某段代码,可以通过预分配保存输出的任
何矢量或数组的内存空间来加速for循环,例如,下面的代
码用函数zeros预分配for循环中创建的矢量的内存空间,使
得这个for循环的运行速度显著加快。
r = zeros(32,1);
for n = 1:32
r(n) = rank(magic(n));
end

若没有使用内存预分配,每循环一次,MATLAB解释器就
会将r矢量的元素增加一个,而内存预分配后,就取消了这
个步骤,从而使运行加速。
数学建模
五、资料的储存与载入
MATLAB储存变量的基本命令是save,在不加任何
选项(Options)时,save会将变量以二进制(
Binary)的方式储存至文档名为mat的档案,如:
save:将工作空间的所有变数储存到名为matlab.mat的
二进制档案。
save filename: 将 工 作空 间的所 有变数 储存到 名 为
filename.mat的二进制档案。
save filename x y z :将变量x、y、z储存到名为
filename.mat的二进制档案。
数学建模
五、资料的储存与载入
简例:
who % 列出工作空间的变量
Your variables are:
Bhjy
ans i x z
save test B y % 将变量B与y储存至test.mat
dir % 列出现在目录中的档案
数学建模
六、结束MATLAB
结束MATLAB的方法

键入exit

键入quit

直接关闭MATLAB的命令视窗(Command window)
数学建模
作业