收藏 分享(赏)

MATLAB应用12.ppt

上传人:hwpkd79526 文档编号:7802427 上传时间:2019-05-26 格式:PPT 页数:50 大小:555KB
下载 相关 举报
MATLAB应用12.ppt_第1页
第1页 / 共50页
MATLAB应用12.ppt_第2页
第2页 / 共50页
MATLAB应用12.ppt_第3页
第3页 / 共50页
MATLAB应用12.ppt_第4页
第4页 / 共50页
MATLAB应用12.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、MATLAB程序设计,M文件编写与调试,交互式的命令行工作方式 M文件的程序工作方式,脚本文件(命令文件),函数文件,两类M文件,MATLAB两种工作方式,6.1 脚本文件,脚本文件(命令文件)是将需要运行的命令编辑到一个命令文件中。 在MATLAB命令窗口输入该命令文件的名字,就会顺序执行命令文件中的命令。 脚本文件没有输入参数,也不返回输出参数。,1. input函数:用于向计算机输入一个参数。 调用格式: A=input(提示信息,选项); 注:s选项,则允许用户输入一个字符串。 例如想输入一个人的姓名,可采用命令xm=input(Whats your name:,s),数据的输入,【例

2、1】 求一元二次方程ax2 +bx+c=0的根。a=input(a=?);b=input(b=?);c=input(c=?);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a) 将该程序以a1.m文件存盘,然后运行a1.m文件。,2 pause函数:暂停程序的执行。 调用格式: pause(延迟秒数) 注:如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。,hold on % 图形迭加 axis(0,100,0,120); % 设置坐标轴 k=0;A=0,0; %导弹初始位置 B=0,100; %飞机初始位置 v

3、=1;dt=1; %离散时间改变量 d=100; %相距距离 while d0.5 plot(A(1),A(2), r.); %画导弹位置 plot(B(1),B(2), b*); %画飞机位置 pause(0.2); k=k+1; B=B+v*dt,0; %飞机移动位置 e=B-A; %导弹指向飞机向量 d=norm(e); e0=e/d; %取向量方向(单位化) A=A+2.0*v*dt*e0; %导弹追击位置 end,a2.m,【例2】,数据的输出,3 disp函数:命令窗口输出函数。调用格式: disp(输出项)注:输出项为字符串或矩阵。,【例3】A=Hello,MATLAB;disp

4、(A)%输出为: Hello,MATLAB,程序结构:顺序结构MatLab程序运算顺序 选择结构(分支结构) If 条件 , 表达式; else(if), 表达式; end Switch 表达式, case 表达式,otherwise end 循环结构For 变量=表达式, 循环语句; end While 条件,语句 ; end,6.1.1 MATLAB的程序结构,【例4】 if语句运用举例:输入三角形的三条边,求面积。,A=input(请输入三角形的三条边:);if A(1)+A(2)A(3) elsedisp(不能构成一个三角形。)end %运行: 请输入三角形的三条边:4 5 6 a4.

5、m,程序结构: if选择结构,【例5】 switch语句运用举例:根据变量 num 的值来决定显示的内容。,num=input(请输入一个数);switch numcase -1disp(I am a teacher.);case 0disp(I am a student.);case 1disp(You are a teacher.);otherwisedisp(You are a student.);end,a5.m,程序结构: switch 选择结构,实现循环结构的语句: 1 for语句:格式: for 循环变量=表达式1:表达式2:表达式3循环体语句end注:其中表达式1的值为循环变量

6、的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。 2 while语句格式: while (条件)循环体语句end,程序结构:循环结构,【例6】循环语句应用举例:计算满足表达式的最大y、n值。i为正整数。y=0; i=1;while 1 %循环的条件为1。本例循环条件总是满足的,是个永真循环f=1/(2*i-1);y=y+f;if y3break;endi=i+1;endn=i-1y=y-f,Break语句break语句常用在for或while循环语句中,一般与if语句一起使用。其作用是当满足if语句时,在循环尚未结束时跳出当前循环。在嵌套循环中,brea

7、k只能跳出包含它的最内层循环。,程序结构: while循环结构,Continue 语句continue也常和if语句一起用在for或while循环中。其作用是当满足if语句时跳过循环体内位于continue之后的那些尚未执行的语句,执行下一次循环的判断。(但不会跳出当前循环),循环的嵌套,如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。 多重循环的嵌套层数可以是任意的。可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部的循环叫作内循环,处于外部的循环叫作外循环。,【例7】多重循环结构举例:求100,1000以内的全部素数。,n=0;for m=100:1

8、000flag=1; j=m-1; i=2;while i=j %变量prime存放素数endendprime,a7.m,程序结构: 多重循环结构,6.2 函数文件,函数文件:每一个函数文件都定义一个函数。MATLAB提供的标准函数大部分都是由函数文件定义的。函数文件可以输入参数,也可返回输出参数。,与脚本(命令)文件不同,函数文件犹如一个“黑箱”,把一些数据送入处理,再把结果送出来。MATLAB提供的函数指令大部分都是由函数文件组成。,1函数文件格式,函数文件由function语句引导,其格式为:function 输出形参表=函数名(输入形参表)注释说明部分函数体 注:其中函数名的命名规则与

9、变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。如果输出形参个数多于1,则应该用方括号括起来。,2函数文件调用,函数调用的一般格式是:输出实参表=函数名(输入实参表),function Yd=DYdt(t,Y) %输入量 global G ME % 定义全局变量 xy=Y(1:2);Vxy=Y(3:4); % ,global G ME G=6.672e-11;ME=5.97e24; . t,YY=ode45(DYdt,tspan,Y0); %采用4、5阶Runge-Kutta法,结构形式上: 函数文件的第一行总是以“function”引导,称为函数申明行。该行以关键字funct

10、ion开头,函数名以及函数的输入输出变量都在这一行被定义。 函数申明行之后以%开头的第一行称注释行。这行供lookfor关键字查询。 第一注释行及其之后的连续以%开头的所有注释行构成整个在线帮助文本。可通过help查询到,称为帮助文本区。 与在线帮助文本区相隔一个“空”行,也以%开头,标志编写及修改该M文件的作者和日期,称为编写和修改记录。 接下来是函数体。为清晰起见,它与前面的注释行以“空”格隔开。,6.2.1 函数文件的结构与特点,function Yd=DYdt(t,Y) %输入量 global G ME % 定义全局变量 xy=Y(1:2);Vxy=Y(3:4); % r=sqrt(s

11、um(xy.2); % Yd=Vxy;-G*ME*xy/r3; %计算Y(t),运行上与脚本文件运行不同 : -脚本文件运行后 ,所产生的所有变量都驻留在 MATLAB基本工作空间(Base workspace)中。只要用户不使用清除指令(clear), MATLAB指令窗不关闭,这些变量将一直保存在基本工作空间中。 -函数文件运行时,MATLAB专门为它开辟一个临时工作空间,称为函数工作空间(Function workspace)。当执行文件最后一行指令时,就结束该函数文件的运行,同时该临时函数工作空间及其所有的中间变量就会立即被清除。,6.2.1 函数文件的结构与特点,6.2.2 函数文件

12、调用,调用格式:输出实参表=函数名(输入实参表) 函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。调用时先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。 函数调用可以嵌套,一个函数可以调用别的函数,甚至可以调用它自己(递归调用)。 文件名与函数名必须一一对应,这样才能保证调用成功。如果函数名和文件名不一致时以文件名为主,【例8】 编写函数文件求小于任意自然数n的 Fibonacci数列。,function f=ffib(n)%用于求Fibonacci数列的函数文件%f=ffib(n)%1999年30日编f=1,1;i=1;while f(i)

13、+f(i+1)nf(i+2)=f(i)+f(i+1);i=i+1;end,将以上函数文件以文件名ffib.m存盘,然后在MATLAB命令窗口输入以下命令,可求小于2000的Fibonacci数: ffib(2000),函数文件编写与调用,【例9】 利用函数文件,实现直角坐标(x,y)与极坐标(,)之间的转换。,函数文件tran.m:function gama,theta=tran(x,y)gama=sqrt(x*x+y*y);theta=atan(y/x);,转换公式:极坐标的矢径:=极坐标的幅角:tg()=y/x,命令窗口直接调用: g,th=tran(1,2),函数文件编写与调用,调用文件

14、main1.m:x=input(Please input x=:);y=input(Please input y=:);gam,the=tran(x,y);gam, the,main1,6.2.2 函数文件调用,调用格式:输出实参表=函数名(输入实参表) MATLAB允许使用比“标称数目”少的输入输出参数,实现对函数的调用。 调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。 只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。,【例10】 nargin用法示例,函数文件

15、charry.m:function fout=charry(a,b,c)if nargin=1fout=a;elseif nargin=2fout=a+b;elseif nargin=3fout=(a*b*c)/2;end,命令文件mydemo.m:x=1:3;y=4;charry (x)charry (x,3)charry (x,y,3),执行mydemo.m后的输出是:ans =1 2 3ans =4 5 6ans =6 12 18 %注意:nargin和nargout本身都是函数,所以用户不能赋值,也不能直接显示,函数文件编写与调用,函数的类别,主函数和子函数:开头定义的函数文件为主函数

16、,而在函数体内定义的其他函数为子函数。子函数只能被主函数或者同一主函数下的其他子函数所调用。 局部函数 Matlab语言中把存放在目录private下的函数称为局部函数,这些函数只有private目录的父目录中的函数才可以调用,而子函数只能被其所在M文件的主函数所调用,所以,局部函数在可用范围上大于子函数。 注:M文件调用函数时,首先检测该函数是否为此文件的子函数;如不是,再检测是否为可用的局部函数;仍然为否时,再检测该函数是否为Matlab搜索路径上的其他M文件。,6.2.3全局变量和局部变量,全局(Global)变量:通过 global 指令定义,MATLAB允许几个不同的函数以及基本工作

17、空间共享同一个变量,这种被共享的变量称为全局变量。 局部(Local)变量:它存在于函数内部的中间变量,产生于函数的运行过程中,其影响范围仅限于该函数本身 %全局变量的作用域是整个MATLAB工作空间,即全程有效。因此,定义全局变量是函数间传递信息的一种手段。但由于所有的函数都可以对它进行存取和修改,故易出错。,【例11】建立函数文件wadd.m,函数将输入的参数乘以相应 的系数后相加。,function f=wadd(x,y)% add two variable global ALPHA BETA % 识别命令窗口的alpha beta值f=ALPHA*x+BETA*y;,在命令窗口中输入:

18、global ALPHA BETAALPHA=1;BETA=2;s=wadd(4,5) 输出为:s = 14,M函数全局变量应用示例,油膜扩散范围计算,模型方程 :,Q-椭圆短轴的长度;R-椭圆长轴的长度;o、w- 油和水的密度,kg/m3;V-溢油初始体积,m3;t-扩散时间,s;W10-地面10m风速,m/s;C1、C2-经验常数,取C1=1.1,C2=0.03。,编制函数文件计算:o=825kg/m3 ; w=1000kg/m3;t=60h; W10=3.8m/s;溢油量为1800t时 的油膜扩散范围。,perfect,Po=825; %油的密度,Kg/m3 Pw=1000; %水的密度

19、,Kg/m3 W10=3.8; %地面10m风速,m/s T=60*3600; %扩散时间,s V=input(V=?); %溢油量,t C1=1.1; %经验常数 C2=0.03; %经验常数 v=V/Po; %溢油量换算 Q=C1*(Pw-Po)/Po)(1/3)*v(1/3)*T(1/4) %椭圆短轴的长度 R=Q+C2*W10(4/3)*T(3/4) %椭圆长轴的长度 S=pi*(Q/2)*(R/2) %扩散面积%杜磊;李建涛,调用运算,po=input(po)pw=input(pw)t=input(t) W10=input(W10)V=input(V)q,r=ym(po,pw,t,W

20、10,V) S=pi*q*r/4,Main.m,ym.m,function Q,R=ym(po,pw,t,W10,V) C1=1.1;C2=0.03; Q=C1*(pw-po)/po)(1/3)*V(1/3)*t(1/4), R=Q+C2*W10(4/3)*t(3/4),常用文件操作命令,6.3 M 文件操作,1type 显示文件内容命令 格式: type文件名,显示M-文件的内容。如 type a5 2which 寻找函数命令 格式:which 函数名,显示函数所在的文件位置,给出路径。 例如: which a5 3 load, save 取出与保存结果命令 从磁盘上读出或保存计算结果。如:

21、 save test % load test 将变量存入test.mat文件中。%save test x y 仅保存x ,y 变量。 4 clear 清除变量命令 格式: 变量名 如: clear x y, load test 5delete 删除文件或对象命令 格式: delete 文件名 如: delete a6.mdelete(对象)如:H=ezplot(exp(-t/2)*t),delete (H) % 删除H,1 . fopen打开文件 在读写文件之前,必须先用fopen命令打开一个文件,并指定允许对该文件进行的操作。fopen函数格式为:Fid= fopen(filename,pe

22、rmission) 其中filename为文件名,permission为文件格式 2 . fclose关闭文件 文件在进行完读、写等操作后,应及时关闭,以保证文件的安全可靠。关闭文件命令格式为: Sta=fclose(Fid) %Fid为fopen的右端变量名 Sta表示关闭文件操作的返回代码,关闭成功返回0,否则返回-1,6.3.1 文件的打开与关闭,permission文件格式选项,如:打开一个名为std.dat的数据文件并进行读操作,其命令格式为:Fid=fopen( std.dat, r ),二进制格式数据,ASCII数据格式,Matlab文件数据格式有二种:二进制格式和ASCII文本

23、文件。系统对这两类文件提供了不同的读写功能函数。 ASCII文本格式,在上述permission文件格式选项格式字符串中加上字符t,例如用rt表示以ASCII格式打开供读操作的数据文件。,如:打开一个名为std.dat的ASCII文本格式数据文件并进行读操作,其命令格式为:Fid=fopen( std.dat, rt ),6.3.2 文件的读写操作,1 、二进制数据文件 fread 读二进制数据文件。格式为: A,COUNT=fread(Fid,size,precision) 其中A为数据矩阵,COUNT返回所读取的数据元素个数。size为可选项,若不选用则读取整个文件内容。size可以为下列

24、值:,precision用于控制所读数据的精度格式,缺省格式为 uchar,例: Fid=fopen(std.dat, r); A=fread(Fid, 100, long); Sta=fclose(fid) %以读数据方式打开数据文件std.dat,并按长整型数据格式读取文件的前100个数据放入向量A,然后关闭文件。,precision精度格式选项,文件的读写操作,fwrite 函数以二进制格式向数据文件写数据,其格式为:COUNT=fwrite (Fid,A,precision) 例:建立一数据文件test.dat,用于存放矩阵A的数据。 已知 A=-0.6515 -0.2727 -0.4

25、354 -0.3190 -0.9047-0.7534 -0.4567 -0.3212 -0.4132 -0.3583-0.9264 -0.8173 -0.7823 -0.3265 -0.0631-0.1735 -0.7373 -0.0972 -0.3267 -0.6298-0.4768 -0.6773 -0.6574 -0.1923 -0.4389 Fid=fopen(test.dat,w); cnt=fwrite(Fid, A, float);fclose(Fid) %将矩阵A的数据以二进制浮点数格式写入文件test.dat Fid=fopen(test.dat,r); B,cnt=frea

26、d(Fid, 5,inf, float), fclose(Fid) %读取文件test.dat的内容并赋值给B,文件的读写操作,2 、ASCII文本文件 fscanf 读ASCII文本文件 A,COUNT= fscanf (Fid, format, size) %其中A为数据矩阵,用以存放读取的数据,COUNT返回所读取的数据元素个数。format用以控制读取的数据格式,由%加上格式符组成,格式符为: d, i, o, u, x, e, f, g, s, c与. . . fprintf 写ASCII数据文件,其格式为:COUNT= fprintf(Fid, format, A,) %其中A为要

27、写入文件的数据矩阵,先按format格式化数据矩阵A,后写入到Fid所指定的文件 例:s=fscanf(fid, %s) %读取一个字符串; a=fscanf(fid, %5d); b= fscanf(fid, %6.2f) %读取5位数整数和浮点数 x = 0: 0.1: 1; y = x; exp(x);Fid = fopen(exp.txt, wt); fprintf(Fid,%6.2f %12.8fn,y);fclose(Fid);,输出字符解释,Specifier Description %c Single character %d Decimal notation (signed)

28、 %e Exponential notation (using a lowercase e as in 3.1415e+00) %E Exponential notation (using an uppercase E as in 3.1415E+00) %f Fixed-point notation %g The more compact of %e or %f, insignificant zeros do not print. %G Same as %g, but using an uppercase E %i Decimal notation (signed) %o Octal not

29、ation (unsigned) %s String of characters %u Decimal notation (unsigned) %x Hexadecimal notation (using lowercase letters a-f) %X Hexadecimal notation (using uppercase letters A-F),换码符(Escape Characters),Character Description b Backspace f Form feed 换页 n New line 新起一行 r Carriage return 回车 t Horizonta

30、l tab Backslash 反斜杠 or (two single quotes) Single quotation mark % Percent character,数据文件定位写操作,1.fseek函数定位文件位置指针,格式为: status=fseek(Fid, offset, origin)其中Fid为文件句柄,offset表示位置指针相对移动的字节数,若为正整数表示向文件尾方向移动,若为负整数表示向文件头方向移动,origin表示位置指针移动的参照位置,它的取值有三种可能:cof 表示文件的当前位置,bof 表示文件的开始位置,eof 表示文件的结束位置。若定位成功status返回

31、值为0,否则返回值为1。 2. ftell函数返回文件指针的当前位置,格式为:position=ftell (Fid)返回值为从文件开始到指针当前位置的字节数。若返回值为1表示获取文件当前位置失败。,数据文件定位写操作,例:下述程序段说明函数fseek和ftell的使用a=1: 5;Fid=fopen(fdat.bin,w);%以写方式打开文件fdat.binfwrite(Fid, a,int16 );% 将a中的数据元素以16字节整型格式写入status=fclose(Fid); % 文件fdat.binFid=fopen(fdat.bin,r);%以读数据方式打开文件 status=fse

32、ek(Fid, 6, bof)%将文件数据指针从开始位置向尾部移动6个字节 four=fread(Fid, 1,int16)%读取当前数据,即第4个数据,并移动指针到下一个数据 position=ftell(Fid) five=fread(Fid, 1, int16) % 读取第5个数据 status=fclose(Fid);,6.3.3 M 文件调试,编写 M文件时,错误有两种:语法(Syntax)错误和运行(Run-time)错误。,语法错误是指变量名、函数名的误写,标点符号的缺、漏等。对于这类错误,通常能在运行时发现,终止执行,并给出相应的错误原因以及所在行号。,运行错误是算法本身引起的

33、,发生在运行过程中。相对语法错误而言,运行错误较难处理 。尤其是M函数文件,它一旦运行停止,其中间变量被删除一空,错误很难查找。,有两种调试方法:直接调试法和工具调试法。,程序调试辅助指令,常用辅助函数:return, echo, input, pause, keyboard, break, error, warning return 程序运行中止命令 echo 命令可以使文件命令在执行时可见,这对程序的调试和演示很有用 input 用户在命令窗口输入提示命令 keyboard 请求键盘输入命令,点击执行命令继续 pause 等待用户反映命令,按enter键继续 break 中断命令 erro

34、r 中止函数执行,在命令窗口显示error,把控制权返回给键盘 warning 警告命令,函数继续执行程序强制结束: Ctrl + c,直接调试法,*在M文件中,将某些语句后面的分号去掉, 迫使M文件输出一些中间计算结果,以便发现可能的错误。,*在适当的位置,添加显示某些关键变量值的语句(包括使用 disp 在内)。,* 利用 echo 指令,使运行时在屏幕上逐行显示文件内容。echo on 能显示M脚本文件;echo FunName on 能显示名为FunName 的M函数文件。,* 在原M脚本或函数文件的适当位置,增添指令 keyboard 。 keyboard 语句可以设置程序的断点 。

35、return返回。,*通过将原M函数文件的函数申明行注释掉,可使一个中间变量难于观察的M函数文件变为一个所有变量都保留在基本工作空间中的M脚本文件。,工具调试法,Debug菜单项:该菜单项用于程序调试(matlab 7.0以下版本需要与Breakpoints菜单项配合使用)Set/Clear Breakpoint:设置/清除光标处的断点 。 Continue:恢复程序运行至结束或另一个断点 。 Single Step:单步执行函数。Step In:深入下层局部工作区 。 Quit Debugging:退出调试状态。Stop if Error:运行至出错或结束。 Stop if Warning:

36、运行至警告消息或结束。 Stop if NaN of Inf:运行至运算结果出现 NaN 或 Inf。,M文件应用举例:,通过M脚本文件,画出下列分段函数所表示的曲面。,脚本文件,%s_file.m This is my first example. a=2;b=2; clf; 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)1z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2-1.5*x(j);elseif x(j)+y(i)=-1z(i,j)=0.5457*exp(-0.

37、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);endend end axis(-a,a,-b,b,min(min(z),max(max(z); colormap(flipud(winter);surf(x,y,z);,(s_file.m),M文件的编写技巧,尽量避免使用循环。循环语句及循环体经常被认为是MATLAB 编程的瓶颈问题。有两种方法改进: (1) 尽量用向量化的运算来代替循环操作。 (2)在必须使用多重循环的情况下,如果两个循环执行的次数不同,则在循环的外环执行循环次数少的,内环执行循环次数多

38、的。这样也可以显著提高速度。 大型矩阵的预先定维 给大型矩阵动态地定维是个很费时间的事。建议在定义大矩阵时,首先用 MATLAB 的内在函数,如zeros() 或 ones() 对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间。 对二重循环这样的特殊问题,我们还可以使用 meshgrid() 函数构造两个 NxM 矩阵 i 和 j,从而直接得出矩阵,更进一步地加快速度。,M文件的编写技巧,优先考虑内在函数 矩阵运算应该尽量采用 MATLAB 的内在函数,因为内在函数是由更底层的编程语言 C 构造的,其执行速度显然快于使用循环的矩阵运算。 采用有效的算法 在实际应用中,解决同样的数学

39、问题经常有各种各样的算法。例如求解定积分的数值解法在 MATLAB 中就提供了两个函数 quad() 和 quad8(),其中后一个算法在精度、速度上都明显高于前一种方法。所以说,在科学计算领域是存在“多快好省”的途径的。如果一个方法不能满足要求,可以尝试其他的方法。,M文件的编写技巧,应用 Mex 技术 虽然采用了很多措施,但执行速度仍然很慢,比如说耗时的循环是不可避免的,这样就应该考虑用其他语言,如 C 或 Fortran 语言。按照 Mex 技术要求的格式编写相应部分的程序,然后通过编译联接,形成在 MATLAB 可以直接调用的动态连接库 (DLL) 文件,这样可以显著地加快运算速度,Matlab的外部接口,在Matlab中调用C程序,用C语言编写Matlab的MEX程序,用mcc将.m文件翻译为cpp源文件,然后调用 在VC中直接调用Matlab的C+ Math Library 利用Matcom(MIDEVA),在VC中调用Matlab,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报