哈工大《结构力学》ch02m文件与matlab程序设计.ppt
Ch02 M文件与MATLAB程序设计,教学目标,用交互式的方式来编写程序适用于命令行比较简单,输入比较方便,同时处理的问题步骤较少的情况。当需要处理重复、复杂且容易出错的问题时,可以进行控制流的程序设计,这就是M文件的编程工作方式。,教学重点,MATLAB 的控制流语言变量和函数的种类了解程序的调试和优化,教学过程,M文本编辑器的基本知识MATLAB 的控制流语言变量和函数的种类程序设计的辅助函数程序的调试和优化,提问,1.例举几个MATLAB中常用的函数,以及简要阐述其相应的功能。2.等差向量的生成方法有哪些?3.如何输入多项式?如何求多项式的根?4.如何创建函数式M文件?5.请简要介绍MATLAB程序设计中的for循环和while循环的使用方法及它们的主要区别。,1.M文本编辑器的基本知识,我们前面所介绍在MATLAB所做的运算,是适合于所要计算的算式不太长或是想以交谈式方式做运算,如果要计算的算式很长有数十行或是须要一再执行的算式,则那样的方式就行不通了。MATLAB提供了所谓的 M-file 的方式,可让使用者自行将指令及算式写成巨集程式然后储存成一个特别的文档,其扩展名是m,譬如 picture.m,其中的picture就是文件名称。,%新建M-file,area.m%计算一个球的体积 r=input(Type radius 输入半径:);Area=pi*r2;volume=(4/3)*pi*r3;fprintf(半径 The radius is%12.5fn,r)fprintf(面积 The area of a circle is%12.5fn,Area)fprintf(体积 The volume of a sphere is%12.5fn,volume)在指令窗口运行指令 area,1.M文本编辑器的基本知识,1.M文本编辑器的基本知识,M文本编辑器 M文件的基本属性 M文件的组成部分 脚本式M文件 函数式M文件,(1)M文本编辑器,M文件的语法类似于一般高级语言,是一种程序化的编程语言,但是,与传统的高级语言相比,M文件又有自己的特点。它只是一个简单的ASC型码文本文件,因此,它的语法比一般的高级语言要简单,程序也容易调试,并且有很好的交互性。,M文件的基本属性*,M文件有两种,一种为脚本式(Script),一种为函数式(Function)。函数M文件必须满足一些标准,另外,它们还应该满足一些MATLAB 的属性。主要有以下几点:函数式M文件名和出现在文件的第一行的函数名必须相同。实际上,MATLAB 忽略了第一行的函数名,并且根据存储在硬盘上的文件名来执行函数。,M文件的组成部分*,函数式M文件的组成部分。调出M-edit窗口,在里边输入如下内容:function f=fact(n)%函数的定义行%Compute a factorial value.%H1行%FACT(N)returns the factorial of N,%帮助文本%usually denoted by N!%Put simply,FACT(N)is PROD(1:N).%注释f=prod(1:n);%函数体,M文件的组成部分及其功能*,M文件的组成部分及其功能,(2)脚本式M文件,用户可以将需要重复输入的所有命令按顺序放到一个扩展名为m的文本文件下,每次运行时只要输入该M文件的文件名即可。用户自己创建的M文件的文件名要避免与MATLAB 的内置函数和工具箱中的函数重名,以免发生内置函数被替换的情况。,脚本式M文件举例,本脚本式M文件绘制一个正弦曲线:%此文件用于绘制【2pi,2pi】区间的正弦曲线图x=-2*pi:0.05:2*pi;y=sin(x);plot(x,y,c+)legend(正弦曲线图),(3)函数式M文件,函数式M文件一般都要自带参数,并且有返回结果。函数式M文件的第一行都是以function开始,说明此文件是一个函数。函数式M文件中的变量都不是全局变量,仅在函数运行期间有效,函数运行完毕之后,它所定义的变量将从工作区间中清除。,例题,举例说明一个名为cylinder的函数,它输入两个参数:圆柱的高与底面半径,并且产生返回变量volume。,function volume=cylinder(height,radius)%function to compute the volume of a cylinder%volume=cylinder(height,radius)base=pi*radius2;volume=base*height;,function s=jiecheng(n)%此函数用来求非负整数n的阶乘%参数n可以为任意的非负整数%编写日期:2007-5-2if n0%若用户将输入参数误写成负值,则报错 error(输入参数不能为负值!);return;else if n=0%若n为0,则其阶乘为1 s=1;else s=1;for i=1:n s=s*i;end endend,函数的嵌套调用,function s=sum_jiecheng(n)%此函数用来求1+1/2!+.+1/n!的值%参数n为任意非负整数%编写日期:2007-5-3if n0%若用户将输入参数误写成负值,则报错 disp(输入参数不能为负值!);return;else s=0;for i=1:n s=s+1/jiecheng(i);%调用求n的阶乘的函数jiecheng endend,【练习】,请编写求解扭矩T的函数,并利用该函数求解。,function Niuju=f(F,f,r,theta)degree=theta/180*pi;Niuju=4*f*F*r*sin(degree/2)/(degree+sin(degree);,clcclearF=250;f=0.35;r=0.4;theta=60;T=Niuju(F,f,r,theta),2.MATLAB程序设计,三种:顺序结构、循环结构和分支结构最简单的程序控制就是顺序结构,用户依次输入命令语句即可。MATLAB 语言还提供了4种高级的控制结构。它们是:if-else-end结构、switch-case-otherwise-end结构、for循环和while循环。,(1)顺序结构,顺序结构是最简单的程序结构,用户在编写好程序之后,系统将按照程序的物理位置顺次执行。a=1;b=2;c=3;s1=a+bs2=s1+cs3=s2/s2,disp(这是一个顺序结构的例子);disp(矩阵A,B分别为);A=1 2;3 4;B=5 6;7 8;A,Bdisp(A与B的和为:);C=A+B,(2)if-else-end 语句,只有一种选择时的情况。最简单的If-Else-End结构是:if 表达式执行语句end,如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的commands,【例】apples=10;cost=apples*25;if apples5 cost=(1-20/100)*cost;end cost cost=200,(2)if-else-end 语句,ifend语句,有两种选择时的情况 if 表达式 执行语句1 else 执行语句2end,在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。,ifend语句,有3种或3种以上选择时的情况 if expression1 commands evaluated if expression1 is True elseif expression2 commands evaluated if expression2 is True elseif expression3 commands evaluated if expression3 is True elseif expression4 commands evaluated if expression4 is True elseif else commands evaluated if no other expression is True end,最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。而且,最后的else命令可有可无。,【例】if rand(1)0.5 disp(i love you)else disp(i donot love you)end,ifend语句,【例题】编写一个脚本,利用input()函数录入一个由百分数表示的等级数,然后根据下表,用if语句将其转化为一个字母等级:90%或者更大:A80%90%:B70%80%:C60%70%:D小于60%:F请通过反复输入合法和不合法的等级百分数来测试你的程序。,grade=input(what grade?);if grade=90 letter=Aelseif grade=80 letter=Belseif grade=70 letter=Celseif grade=60 letter=Delse letter=Fend,(3)switchcaseend语句*,switch开关语句 可代替系列if-elseif-else-end结构 case条件语句,执行语句,执行语句 case 条件语句1,条件语句2,条件语句3,执行语句,执行语句 otherwise,执行语句,执行语句 end,(4)trycatchend*,try-catch模块提供了一种错误捕获机制。换句话说,利用try-catch模块,MATLAB 编译系统发现的错误将被其捕获,用户可以控制MATLAB 怎样对发生的错误进行处理。try 执行语句1catch执行语句 2end,(5)for循环语句,For语句是一种循环语句,可以很方地实现循环操作,从而可以从容地应付大规模的循环语句。for i=表达式,执行语句,执行语句 end,For循环允许一组命令以固定的和预定的次数重复在for和end语句之间的commands按数组中的每一列执行一次。,【例】for n=1:10 x(n)=sin(n*pi/10);end xx=Columns 1 through 7 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 0.0000,(5)for循环语句,编程求出sin(n/10)的值,其中n取110之间的整数。,For循环可按需要嵌套n=0:1:10;for i=1:11 for j=1:11 y(i)=sin(n(i);n(j)=n(j)*10;endend,y=Columns 1 through 7 0-0.5064 0.9300-0.8027-0.1425-0.9765-0.5118 Columns 8 through 11 0.8586-0.9957 0.9917 0.9287n=1.0e+012*Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000可以利用break命令跳出for循环,(5)for循环语句,【例】一个简单的for循环示例。for i=1:10;%i依次取1,2,10,.x(i)=i;%对每个i值,重复执行由该指令构成的循环体end;x%要求显示运行后数组x的值。x=1 2 3 4 5 6 7 8 9 10,(5)for循环语句,例:tang.ma=2;b=2;x=-a:0.2:a;y=-b:0.2:b;for i=1:length(y)for j=1:length(x)if x(j)+y(i)1 z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2-1.5*x(j);elseif x(j)+y(i)=-1 z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2+1.5*x(j);else z(i,j)=0.7575*exp(-y(i)2-6.*x(j)2);end endendaxis(-a,a,-b,b,min(min(z),max(max(z);colormap(flipud(winter);surf(x,y,z);,(6)while循环语句,与for循环不同,while循环的判断控制可以是逻辑判断语句,因此,它的循环次数可以是一个不定数。这样就赋予了它比for循环更广泛的用途。while表达式执行语句end,与For循环以固定次数求一组命令的值相反,While 循环以不定的次数求一组语句的值。While循环的一般形式是:while expression commands end只要在表达式里的所有元素为真,就执行while和end 语句之间的commands。,(6)while循环语句,【例】num=0;EPS=1;while(1+EPS)1 EPS=EPS/2;num=num+1;end num num=53 EPS=2*EPS EPS=2.2204e-016,(6)while循环语句,【例】x=zeros(1,6);%x是一个的零矩阵 i=1;while i=6,x(i)=1/i;i=i+1;end xx=1.0000 0.5000 0.3333 0.2500 0.2000 0.1667可以利用break命令跳出while循环while循环可按需要嵌套。,(6)while循环语句,课堂练习,【练习】用 for 循环求 1200 之间的偶数之和。,编程:total=0;for n=2:2:200 total=total+n;end,【课堂练习】,【练习】利用while函数编程求出sin(n/10)的值,其中n取110之间的整数。,n=1;while n=10 x(n)=sin(n*pi/10);n=n+1;end,课堂练习,【练习】级数收敛性判定。计算并显示级数Sn的项数N,Sn如下:,当收敛到终值S=2/6的0.01%以内时,项数N为多少?请编程计算。,编程,series=1;k=2;exact=pi2/6;while abs(series-exact)/exact)=1e-4 series=series+1/k2;k=k+1;enddisp(k-1),(7)人机交互命令,终止命令break和return 继续命令continue 等待用户反应命令pause echo命令 用户输入提示命令input 请求键盘输入命令keyboard,MATLAB的输入与输出语句,1.输入语句 输入数值 x=input(please input a number:)please input a number:22x=22输入字符串 x=input(please input a string:,s)please input a string:this is a string x=this is a string,2.输出语句 输出显示命令 自由格式(disp)disp(23+454-29*4)361disp(11 22 33;44 55 66;77 88 99)11 22 3344 55 66 77 88 99disp(this is a string)this is a string格式化输出(fprintf)。fprintf(The area is%8.5fn,area)%注意输出格式前须有%符号,%跳行符号须有符号 The area is 12.56637%输出值为8位数含5位小数,MATLAB的输入与输出语句,错误消息显示命令 error(this is an error)?this is an error,MATLAB的输入与输出语句,3.变量和函数种类*,与其他语言一样,MATLAB 的变量有输入变量、输出变量和函数内使用的变量之分,而函数也有主函数、局部函数和子函数之分,本节将介绍这些不同种类变量和函数的特点。,4.程序设计的辅助函数,执行函数 容错函数 时间运算函数,(1)执行函数,执行函数及其功能,(2)容错函数,程序设计的好坏在很大程度上取决于其容错能力的大小。MATLAB 语言提供了相应的报错及警告函数error、warning、lasterr、lastwarn以及errortrap on/off等,可以很方便地实现这方面的功能。,(3)时间运算函数,常用的时间控制函数及其功能,1.Tic和Toc函数,Tic:计时的开始Toc:计时的结束(两个函数配合使用),TIC Start a stopwatch(秒表)timer.The sequence of commandsTIC,operation,TOC prints the number of seconds required for the operation.TOC Read the stopwatch timer.TOC,by itself,prints the elapsed time(in seconds)since TIC was used.t=TOC;saves the elapsed time in t,instead of printing it out.,Example,for n=1:100A=rand(n,n);b=rand(n,1);ticx=Ab;t(n)=toc;endplot(t)t=toct=44.0160,2.Cputime函数,Cputime函数返回从调用该函数起所用的总的CPU时间,单位以秒计算。,CPUTIME CPU time in seconds.CPUTIME returns the CPU time in seconds that has been used by the MATLAB process since MATLAB started.,Example,t=cputime;A=magic(4)*rand(4)A=8.2387 10.6807 31.7618 6.7995 8.4032 6.9841 27.3817 13.8630 8.1096 8.3133 29.6338 10.0430 9.1195 6.6930 25.0056 18.2593e=cputime-te=43.6410,5.程序的调试和优化,程序的调试 程序的错误种类 错误的识别和程序调试 程序的优化 程序优劣的分析 程序优化的技巧 有效地使用内存,(1)程序的错误种类,在MATLAB 的表达式中可能存在两种类型的错误,即语法错误和运行错误:语法错误 语法错误发生在M文件程序代码的生成过程中,一般是由函数参数输入类型有误或是矩阵运算阶数不符等引起。运行错误 运行错误一般指在程序运行过程中,出现溢出或是死循环等异常现象。,(2)错误的识别和程序调试,对于简单的问题,使用下面的一种或几种方法可以方便地求解:将函数中输出关键值的行的分号(;)去掉,这样,这些运算的中间结果将在命令窗口中予以显示,用户可以据此来检查中间结果的正确性。在函数中添加一些语句,用来显示用户认为很重要的变量的值。使用keyboard命令中断程序,该命令实现函数工作区间和命令窗口工作区间的交互,从而获得用户所需要的信息,使用该命令后,程序将处于调试状态,此时命令窗口的提示符由“”变为“K”,用户可以进行相应的操作。在函数头前加“%”,这样就将函数式M文件变为脚本式M文件,而脚本式M文件运行时,其工作区间就是MATLAB 的工作区间,这样在出现错误的时候就可以查询这个工作区间。,错误的识别和程序调试,错误识别函数及其功能,错误的识别和程序调试,程序断点的设置,(3)程序优劣的分析,在MATLAB 语言中,使用profile函数以及计时函数tic和toc来分析程序中各个部分的耗时情况,从而帮助用户找出程序中需要改进的地方。其中profile在计算相对耗时以及查找文件执行过程中瓶颈问题时更为有效,而tic和toc函数在计算绝对耗时时更为有效。,(4)程序优化的技巧,程序的向量化操作 循环运算是MATLAB中的最大弱点,在程序设计中,应当尽量避免使用循环运算。用户可以通过将M文件向量化来优化M文件,所谓向量化就是使用向量和矩阵运算来代替for循环和while循环。数据的预定义 使用for循环和while循环来增加数据结构的大小时,将影响系统和内存的使用。提高效率的可行办法是进行预定义。,1.程序的向量化操作,就是使用向量和矩阵运算来代替for循环和while循环。,T1=cputime;i=0;for t=0:.01:2000 i=i+1;y(i)=sin(t);endT=cputime-T1T=6.0150,T1=cputime;t=0:.01:2000;y=sin(t);T=cputime-T1T=0.0160,2.数据的预定义,对可能出现变量维数不断扩大的问题,应当预先估计变量可能的最大维数,进行预先定义。,T1=cputime;x=0;for k=2:30000 x(k)=x(k-1)+5;endT=cputime-T1T=15.2970,T1=cputime;x=zeros(1,50000);for k=2:50000 x(k)=x(k-1)+5;endT=cputime-T1T=0,3.有效地使用内存,MATLAB本身不具备管理系统资源地能力,在进行较大规模计算时,尽可能关闭那些不需要地窗口和应用程序,以节约资源。WhosPackClearSaveLoadQuit,Clear:从内存中清除所有的变量,CLEAR Clear variables and functions from memory.CLEAR removes all variables from the workspace.CLEAR VARIABLES does the same thing.CLEAR GLOBAL removes all global variables.CLEAR FUNCTIONS removes all compiled M-and MEX-functions.,Save:有选择地将变量保存至磁盘,SAVE Save workspace variables to disk.SAVE FILENAME saves all workspace variables to the binary(二进位的)MAT-file”named FILENAME.mat.The data may be retrieved with LOAD.If FILENAME has no extension,.mat is assumed.,3.有效地使用内存,Load:从磁盘中调出由save命令保存地变量,LOAD Load workspace variables from disk.LOAD FILENAME retrieves all variables from a file given a full pathname or a MATLABPATH relative partial pathname(see PARTIALPATH).,Quit:退出Matlab环境,释放所有内存,3.有效地使用内存,END,