二、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)
数学建模
作业