1 / 38

数 学 建 模

数学是知识的工具,亦是其它知识工具的泉源。 —— 勒内 · 笛卡尔. 数 学 建 模. 第 9 章 MATLAB 编程及调试. 宋显华 songxianhua@hrbust.edu.cn. 内容. 1. 常用软件介绍. 2. MATLAB 基本操作. 3. MATLAB 编程及调试. 4. MATLAB 求解算例. 第 9 章 模型求解常用软件. 第 41 讲 MATLAB 编程及调试. 一、函数. MATLAB 提供了很多内部数学函数 对负数取平方根或对数也不会导致错误, MATLAB 会自动返回复数计算结果。

zorana
Download Presentation

数 学 建 模

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数学是知识的工具,亦是其它知识工具的泉源。数学是知识的工具,亦是其它知识工具的泉源。 ——勒内·笛卡尔 数 学 建 模

  2. 第9章 MATLAB编程及调试 宋显华 songxianhua@hrbust.edu.cn

  3. 内容 1 常用软件介绍 2 MATLAB基本操作 3 MATLAB编程及调试 4 MATLAB求解算例 数学建模

  4. 第9章 模型求解常用软件 第41讲 MATLAB编程及调试

  5. 一、函数 • MATLAB提供了很多内部数学函数 • 对负数取平方根或对数也不会导致错误,MATLAB会自动返回复数计算结果。 • MATLAB还提供了很多高级的数学函数,这些函数中的大部分都接受复数参数。 • 在命令窗口键入如下命令可以查看基本数学函数的列表。 • 键入下面的命令,可以找到更多的高级数学函数和矩阵函数。 abs,sqrt,exp,sin bessel和gamma函数 help elfun help specfun help elmat 数学建模

  6. 一、函数 • 有些函数是内部函数, • 内部函数是MATLAB内核的一部分,所以它们的计算效率很高,但计算细节无法获取。 • 有些函数是使用M文件实现的, • 对于内部函数,无法看到代码,对于其他函数,可以查看到代码甚至修改代码。 如aqrt和sin 如gamma函数 数学建模

  7. 一、函数 • 主函数 • M文件的第一个函数称为主函数,主函数后面可以有任意个子函数。 • 在多数情况下,主函数是M文件中可以从MATLAB命令行或从另一个M文件函数调用的唯一函数,调用该函数时,使用定义该函数的M文件的名称。 例如:average函数位于文件average.m中 function y = average(x) % 计算矢量元素的平均值 数学建模

  8. 一、函数 • 可以从MATLAB命令行用下面的命令计算3个数的平均值。 y = sum(x)/length(x); average([ 12 34 25]) 注:一般使主函数的名称与M文件相同,如果函数名与文件名不同,必须用文件名调用函数。 数学建模

  9. 一、函数 • 子函数 • M文件中可以包含一个以上的函数,文件中除主函数以外的其他函数称为子函数,并且它们只对主函数或同一文件中的其他函数可见。 • 主函数放在最上面,子函数放在下面,各子函数排名不分先后。 • 即使在同一个M文件中,子函数也不能获取用于主函数或其他子函数的参数,除非它们声明为全局变量,或者作为参数传递。 • 从M文件内部调用函数时,MATLAB首先检查文件,看函数是否为子函数,然后检查该名称的私有函数,最后搜索路径上的独立M文件或内部函数。因为首先检查子函数,所以可以用相同名称的子函数覆盖已经存在的M文件。 • 。 数学建模

  10. 一、函数 • 匿名函数 • 使用匿名函数,可以在不必创建M文件的情况下快速创建简单函数。可以在MATLAB命令或任何M文件函数或脚本中创建匿名函数。 • 创建匿名函数的语法格式为: fhandle = @(arglist)expr expr表示函数体,即函数要完成主要工作的代码,arglist为要传递给函数的逗号间隔的输入参数列表,返回函数句柄fhandle。 数学建模

  11. 一、函数 • 嵌套函数 • 可以在一个函数中嵌套定义一个或多个函数,嵌套函数具有类似下面的形式。 注意:M文件函数一般不需要end语句,但使用嵌套函数时需要此语句。如果M文件包含一个或多个嵌套函数,必须在M文件中使用end语句终止所主函数,不管它们是否包含嵌套函数。 function x=A(p1,p2) … function y = B(p3) … end … end 数学建模

  12. 一、函数 • 私有函数 • 私有函数是private子目录中的函数,它们只对父目录中的函数可见。因为私有函数在父目录以外是不可见的,在其他目录中可以使用与之相同的名称。 数学建模

  13. 一、函数 • 重载函数 • 有时候同一个函数可以用于多种情况,对应地有不同的输入参数,此时要用到重载函数。比如,绘制二维线形图的plot函数就有多种重载形式, • 这两个函数具有相同的函数名,不同的参数,调用plot函数时MATLAB会根据函数的参数自动选择使用。 plot(Y) plot(X1,Y1,…) 数学建模

  14. 二、M文件 • 如果需要重复调用命令行,或者命令行的行数比较多,常常将它们写成M文件的形式并进行保存。 • 脚本式M文件和函数式M文件 • 假设我们想绘制一个单位球面,并且要让球面看起来比较光滑,可以在命令窗口中键入 sphere %绘制一个单位球面 shading interp %对球面进行插值着色 axis equal %设置坐标系,使各坐标方向上的度量单位相同 数学建模

  15. 二、M文件 数学建模

  16. 二、M文件 • 现在假设除了需要生成球面以外,还想生成柱面。可以考虑标志一个绘图函数,这个函数有一个surface参数。 • 调用这个函数时,如果将参数设置为“sphere”,则生成一个单位球面,设置为“cylinder”时,则生成一个单位柱面。 数学建模

  17. 二、M文件 • 创建和编辑程序的工作在M文件编辑器中完成,在主界面中一次选择File New Function菜单项,打开M文件编辑器。在M文件 编辑器中输入下面的代码 function drawsur(surface) switch surface case 'sphere' sphere case 'cylinder' cylinder end shading interp axis equal 数学建模

  18. 二、M文件 • 然后将它保存到当前目录下,名为drawsur.m。现在,可以再命令窗口中调用drawsur函数了。 • 在命令窗口中键入下面的命令行 • 将生成相同的球面。 • 键入 drawsur(‘sphere’) drawsur('cylinder') 数学建模

  19. 二、M文件 • M文件有两种,一种是脚本式M文件,另一种是函数式M文件。上面使用的是函数式形式。为了进行比较,我们继续使用前面的例子。新建一个M文件,在编辑器中输入下面代码: • 保存为sphere.m,在命令窗口中键入 生成单位球面。 • 这里的使用方式与drawsur完全不同,它没有function关键字,没有输入参数。这就是脚本式M文件的使用方式。 sphere shading interp axis equal sphere 数学建模

  20. 二、M文件 数学建模

  21. 二、M文件 • M文件的基本结构 • 函数式M文件比较标准的格式如下所示,其中加粗的文字表示M文件的基本组成部分: 函数定义行 function [x,y]=myfun(a,b,c) % H1行—用一行文字来综述函数的功能 % 帮助文本—用一行或多行文本解释如何使用函数 % 在命令行中键入“help<functionname>”时可以使用它 数学建模

  22. 二、M文件 • 一个完整的M文件应该包括函数定义行、H1行、帮助文本、函数体、注释和函数代码等方面的内容,其中函数定义行和函数代码是必须的。 % 函数体—一般从第一个空白行后开始 % 注释—描述函数的行为,输入输出的类型等 % 在命令行中键入“help<functionname>”时不会显示注释文本 % 开始编写函数代码 x= prod(a,b); 数学建模

  23. 二、M文件 • 函数的参数 • 调用函数时,调用者通过一个参数列表传递数据,并获取返回值,MATLAB采用的是传值方式。 • 检查输入参数的个数 • 利用nargin和nargout函数可以确定函数输入参数和输出参数的个数。然后可以根据参数个数用条件语句完成不同的任务,例如, function c = testarg(a,b) if (nargin ==1) c = a.^2; elseif (nargin == 2) c = a+b; end 数学建模

  24. 二、M文件 • 传递参数 • 使用 varargin 和 varargout 函数可以传递任意个数的输入参数或者返回任意个数的输出参数给函数。 • MATLAB把所有指定的输入参数指定到一个单元数组中,每个单元可以包含任意大小或类型的数据。对于输入参数,函数代码必须把它们打包到一个单元数组中,这样,MATLAB就可以把参数返回给调用函数。 数学建模

  25. 二、M文件 • 解包varargin中的内容 • 因为varargin将所有输入参数包含在一个单元数组中,所以有必要使用单元数组索引来提取数据 • 其中,索引表达式{n}获取varargin的第n个单元。表达式(2)表示单元内容的第二个元素。 y(n) = varargin{n}(2); 数学建模

  26. 二、M文件 • 打包varargout • 当允许有任意多个输出参数时,必须将所有输出打包到varargout单元数组中,使用nargout确定输出参数的个数。例如,下面的代码接收两列输入数组,其中第一列表示一系列x坐标,第二列表示y坐标,它将数组分成单独的[xi,yi]矢量,可以将该矢量传递给testvar函数。 循环中的赋值语句使用了单元数组的赋值语法。 function [varargout] = testvar(arrayin) for k = 1:nargout varargout{k} = arrayin(k,:); % 单元数组赋值 end 数学建模

  27. 二、M文件 • 参数列表中的varargin和varargout • varargin或varargout必须出现在参数列表的最后,即函数调用必须首先指定必要的参数。例如,下面的函数声明行显示了varargin和varargout的正确位置: function [out1,out2] = example1(a,b,varargin) function [i,j,varargout] = example2(x1,y1,x2,y2,flag) 数学建模

  28. 二、M文件 • 返回输出参数 • 放在函数定义行中等号左侧的任何参数都是调用函数的返回值。如果传递任何函数可以修改的输入参数,需要把相同的参数作为输出参数。这样,调用函数可以获得更新后的值。 [test,offset] = readText(filestart,offset) 数学建模

  29. 三、程序调试和错误处理 • 用try-catch语句检查错误 • try…catch语句进行错误捕获,它把有可能引起异常的语句放在try控制块中,这样当try控制块中statement语句引起异常时,catch控制块就可以捕获它,并针对不同的错误类型,进行不同的处理。调用格式: try, statement, …, statement, catch, statement, …, statement, end 数学建模

  30. 三、程序调试和错误处理 • 错误和警告信息 • 使用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’) 警告输入内必须是字符串。 数学建模

  31. 三、程序调试和错误处理 • 用“Debug”菜单进行调试 • 在M文件编辑器中,使用“Debug”菜单可以很方便地进行程序调试,“Debug”菜单如图所示,各种方法主要分为三种,即定点调试、断点调试以及错误和警告调试等。 数学建模

  32. 三、程序调试和错误处理 • 定点调试 • 定点调试选项包括“Step”、“Step In”、“Step Out”,使用它们可以逐语句、逐函数调试或直接运行到光标处。 • 断点调试 • 进行断点调试时,程序运行到断点处就会停下来,这样有利于很快找到出现错误的位置(需要先设置断点)。 • 错误和警告调试 • 使用“Stop if Errors/Warnings…”选项,确定错误或警告出现时停止运行。 数学建模

  33. 四、编程技巧 • 矢量化 • 使程序运行更快的方法之一是将构造程序的算法进行矢量化,在其他程序语言可能使用for循环或do循环的地方,MATLAB可以使用矢量或矩阵操作,对于下面的程序: x=.01; for k = 1:1001 y(k) = log10(x); x = x+.01; end 进行矢量化后如下所示: x=.01:.01:10; y=log10(x); 数学建模

  34. 四、编程技巧 • 预分配内存空间 • 如果不能矢量化某段代码,可以通过预分配保存输出的任何矢量或数组的内存空间来加速for循环,例如,下面的代码用函数zeros预分配for循环中创建的矢量的内存空间,使得这个for循环的运行速度显著加快。 • 若没有使用内存预分配,每循环一次,MATLAB解释器就会将r矢量的元素增加一个,而内存预分配后,就取消了这个步骤,从而使运行加速。 r = zeros(32,1); for n = 1:32 r(n) = rank(magic(n)); end 数学建模

  35. 五、资料的储存与载入 • MATLAB储存变量的基本命令是save,在不加任何选项(Options)时,save会将变量以二进制(Binary)的方式储存至文档名为mat的档案,如: save:将工作空间的所有变数储存到名为matlab.mat的二进制档案。 save filename:将工作空间的所有变数储存到名为filename.mat的二进制档案。 save filename x y z :将变量x、y、z储存到名为filename.mat的二进制档案。 数学建模

  36. 五、资料的储存与载入 • 简例: who % 列出工作空间的变量 Your variables are: B h j y ans i x z save test B y % 将变量B与y储存至test.mat dir % 列出现在目录中的档案 数学建模

  37. 六、结束MATLAB • 结束MATLAB的方法 • 键入exit • 键入quit • 直接关闭MATLAB的命令视窗(Command window) 数学建模

  38. 作业

More Related