一、ATLBA程序的基本设计原则 自动控制网www.eadianqi.com版权所有 (一)%后面的内容是程序的注解,要善于运用注解使程序更具可读性。 自动控制网www.eadianqi.com版权所有
(二)养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其他变量对程序运行的影响。但注意在子程序中不要用clear。 本文来自www.eadianqi.com (三)参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显示,以提高执行速度。 本文来自www.eadianqi.com (四)input指令可以用来输入一些临时的数据;而对于大量参数,则通过建立一个存储参数的子程序,在主程序中用子程序的名称来调用。 自动控制网www.eadianqi.com版权所有
(五)程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。 自动控制网www.eadianqi.com版权所有
(六)充分利用Debugger来进行程序的调试(设置断点单步执行连续执行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果集成到一起。 本文来自www.eadianqi.com
(七)设置好MATLAB的工作路径,以便程序运行。 自动控制网www.eadianqi.com版权所有
(八)MATLAB程序的基本组成结构 本文来自www.eadianqi.com %说明 本文来自www.eadianqi.com 清除命令:清除workspace中的变量和图形(clear,close) 自动控制网www.eadianqi.com版权所有 定义变量:包括全局变量的声明及参数值的设定 本文来自www.eadianqi.com 逐行执行命令:指MATLAB提供的运算指令或工具箱 本文来自www.eadianqi.com ………提供的专用命令 本文来自www.eadianqi.com
控制循环:包含for,ifthen,switch,while等语句 本文来自www.eadianqi.com
逐行执行命令 自动控制网www.eadianqi.com版权所有
……… 本文来自www.eadianqi.com end 本文来自www.eadianqi.com 绘图命令:将运算结果绘制出来 自动控制网www.eadianqi.com版权所有
当然更复杂程序还需要调用子程序,或与simulink以及其他应用程序结合起来。 本文来自www.eadianqi.com 二、文件的编辑及MATLAB工作路径的设置 本文来自www.eadianqi.com 进入MATLAB的Editor/Debugger窗口来编辑程序 本文来自www.eadianqi.com 在编辑环境中,文字的不同颜色显示表明文字的不同属性。 本文来自www.eadianqi.com 绿色:注解;黑色:程序主体;红色:属性值的设定;蓝色:控制流程。 自动控制网www.eadianqi.com版权所有
在运行程序之前,必须设置好MATLAB的工作路径,使得所要运行的程序及运行程序所需要的其他文件处在当前目录之下,只有这样,才可以使程序得以正常运行。否则可能导致无法读取某些系统文件或数据,从而程序无法执行。 本文来自www.eadianqi.com
通过cd指令在命令窗口中可以更改显示当前工作路径。 自动控制网www.eadianqi.com版权所有 通过路径浏览器(pathbrowser)也可以进行设置 自动控制网www.eadianqi.com版权所有
三、ATLAB的程序类型 自动控制网www.eadianqi.com版权所有 MATLAB的程序类型有三种,一种是在命令窗口下执行的脚本M文件;另外一种是可以存取的M文件,也即程序文件;最后一种是函数(function)文件。 本文来自www.eadianqi.com
(一)脚本M文件 自动控制网www.eadianqi.com版权所有 在命令窗口中输入并执行,它所用的变量都要在工作空间中获取,不需要输入输出参数的调用,退出MATLAB后就释放了。 本文来自www.eadianqi.com (二)程序文件 自动控制网www.eadianqi.com版权所有 以.m格式进行存取,包含一连串的MATLAB指令和必要的注解。需要在工作空间中创建并获取变量,也就是说处理的数据为命令窗口中的数据,没有输入参数,也不会返回参数。 自动控制网www.eadianqi.com版权所有 程序运行时只需在工作空间中键入其名称即可。 本文来自www.eadianqi.com (三)函数文件 自动控制网www.eadianqi.com版权所有 与在命令窗口中输入命令一样,函数接受输入参数,然后执行并输出结果。用help命令可以显示它的注释说明。 自动控制网www.eadianqi.com版权所有 具有标准的基本结构。 本文来自www.eadianqi.com 1.函数定义行(关键字function) 本文来自www.eadianqi.com function[out1,out2,..]=filename(in1,in2,..) 自动控制网www.eadianqi.com版权所有 输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保留的变量来给出。 自动控制网www.eadianqi.com版权所有
2.第一行帮助行,即H1行 本文来自www.eadianqi.com 以(%)开头,作为lookfor指令搜索的行 本文来自www.eadianqi.com
3.函数体说明及有关注解 自动控制网www.eadianqi.com版权所有
以(%)开头,用以说明函数的作用及有关内容 自动控制网www.eadianqi.com版权所有 如果不希望显示某段信息,可在它的前面加空行 本文来自www.eadianqi.com 例myhilb1.m;myhilb.m 自动控制网www.eadianqi.com版权所有
function[A,B]=myhilb(n,m) 本文来自www.eadianqi.com %问题:生成一个Hilbert矩阵,该矩阵是一个n×m矩阵,它的第i行 本文来自www.eadianqi.com %第j列的元素为1/(i+j-1)。如果想在编写的函数中实现下面几点: 自动控制网www.eadianqi.com版权所有 %1)如果只给出一个输入参数,则会自动生成一个方阵,即有m=n 本文来自www.eadianqi.com %2)如果想返回两个参数A和B,则返回的B矩阵为A矩阵的平方, 本文来自www.eadianqi.com %即B=A'A 自动控制网www.eadianqi.com版权所有 %3)在函数中给出合适的帮助信息,包括基本功能调用方式 自动控制网www.eadianqi.com版权所有
%和参数说明 自动控制网www.eadianqi.com版权所有 %myhilb生成一个Hilbert矩阵 本文来自www.eadianqi.com %[A,B]=myhilb(n,m) 自动控制网www.eadianqi.com版权所有 %where 自动控制网www.eadianqi.com版权所有 %n,maresizeoftheHilbertmatrix,ifonlyone 自动控制网www.eadianqi.com版权所有 %argumentgiven,thenasquarematrixisgenerated 自动控制网www.eadianqi.com版权所有 %AistheHilbertmatrix 自动控制网www.eadianqi.com版权所有
%B:iftwomatricestobereturned,Bisassignedto 本文来自www.eadianqi.com %A'*A 自动控制网www.eadianqi.com版权所有 %2001/12/1 本文来自www.eadianqi.com ifnargin==1,m=n;end 本文来自www.eadianqi.com fori=1:n 本文来自www.eadianqi.com forj=1:m 本文来自www.eadianqi.com A(i,j)=1/(i+j-1); 自动控制网www.eadianqi.com版权所有 end 自动控制网www.eadianqi.com版权所有
end 本文来自www.eadianqi.com if(nargout==2),B=A'*A;end 本文来自www.eadianqi.com function[A,B]=myhilb(n,m) 本文来自www.eadianqi.com %MYHILB生成一个Hilbert矩阵 自动控制网www.eadianqi.com版权所有
%[A,B]=myhilb(n,m) 本文来自www.eadianqi.com %where 本文来自www.eadianqi.com %n,maresizeoftheHilbertmatrix,ifonlyone 本文来自www.eadianqi.com %argumentgiven,thenasquarematrixisgenerated 自动控制网www.eadianqi.com版权所有
%AistheHilbertmatrix 本文来自www.eadianqi.com %B:iftwomatricestobereturned,Bisassignedto 自动控制网www.eadianqi.com版权所有
%A'*A 本文来自www.eadianqi.com
%2001/12/1 本文来自www.eadianqi.com ifnargin==1,m=n;end 自动控制网www.eadianqi.com版权所有 fori=1:n 自动控制网www.eadianqi.com版权所有 forj=1:m 本文来自www.eadianqi.com A(i,j)=1/(i+j-1); 自动控制网www.eadianqi.com版权所有 end 本文来自www.eadianqi.com end 本文来自www.eadianqi.com if(nargout==2),B=A'*A;end 自动控制网www.eadianqi.com版权所有 4.函数体语句 自动控制网www.eadianqi.com版权所有 函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。 本文来自www.eadianqi.com 四、明子程序(函数程序)变量 本文来自www.eadianqi.com (一)子程序与主程序之间的数据是通过参数进行传递的,子程序应用主程序传递来的参数进行计算后,将结果返回主程序。 自动控制网www.eadianqi.com版权所有
例exp2_9.m 本文来自www.eadianqi.com
%主程序exp2_9.m 自动控制网www.eadianqi.com版权所有 a=input('pleaseinputvalueofa='); 自动控制网www.eadianqi.com版权所有
b=input('pleaseinputvalueofb='); 本文来自www.eadianqi.com
c=sumhe(a,b) 本文来自www.eadianqi.com
%在此例中,主程序exp2_9.m设定了两个参数a和b来调用 本文来自www.eadianqi.com %子程序sumhe.m(为一个函数文件), 本文来自www.eadianqi.com %所以执行主程序时,子程序就会调用主程序传递过来的 自动控制网www.eadianqi.com版权所有 %a和b值进行计算,再将结果返回主程序。 自动控制网www.eadianqi.com版权所有 自动控制网www.eadianqi.com版权所有 %子程序sumhe.m 本文来自www.eadianqi.com %functionresult=sumhe(a,b) 自动控制网www.eadianqi.com版权所有
%sumhe(a,b)sumtheserialofnumbersfromatob 本文来自www.eadianqi.com %result=sum(a:b); 本文来自www.eadianqi.com (二)如果一个函数内的变量没有特别声明,那么这个变量只在函数内部使用,即为局部变量。如果两个或多个函数共用一个变量(或者说在子程序中也要用到主程序中的变量,注意不是参数),那么可以用global来将它声明为全局变量。 自动控制网www.eadianqi.com版权所有 全局变量的使用可以减少参数传递,合理利用全局变量可以提高程序执行的效率。 自动控制网www.eadianqi.com版权所有
五、符串及其宏命令 自动控制网www.eadianqi.com版权所有 字符串要用单引号并用括号括在里面。如: 本文来自www.eadianqi.com 》disp(‘textstring’)%disp字符串显示命令 本文来自www.eadianqi.com textstring 本文来自www.eadianqi.com
在单引号里边的字符串可以作为矢量或矩阵的元素。使用disp命令或输入变量名就可以显示它们表示的字符串。如: 本文来自www.eadianqi.com 》a=['thisisa';'textstring'] 本文来自www.eadianqi.com Allrowsinthebracketedexpressionmusthavethesamenumberofcolumns.(元素1含9个字符,包括空格;元素2含有11个字符;因此只要在元素1中加入2个空格即可解决问题) 自动控制网www.eadianqi.com版权所有
》aa=['thisisa';'textstring']》disp(aa) 自动控制网www.eadianqi.com版权所有 aa=aa= 自动控制网www.eadianqi.com版权所有
thisisathisisa 自动控制网www.eadianqi.com版权所有 textstringtextstring 自动控制网www.eadianqi.com版权所有 宏是MATLAB语言用在常用命令部分的缩写。它可以被存储用于建立M文件的一部分。宏命令采用字符串,并使用eval命令去执行宏命令。下例是采用宏命令计算阶乘的例子。 本文来自www.eadianqi.com 》fct=‘prod(1:n)’;%求10的阶乘 本文来自www.eadianqi.com
》n=10;eval(fct) 自动控制网www.eadianqi.com版权所有 ans=3628800 自动控制网www.eadianqi.com版权所有 六、用的编程命令 自动控制网www.eadianqi.com版权所有 pause:停止m文件的执行直至有键按下。pause(n)将使程序暂停n秒。 本文来自www.eadianqi.com echoon/off:控制是否在屏幕上显示程序内容。 自动控制网www.eadianqi.com版权所有 keyboard:停止程序执行,把控制权交给键盘。输入return并回车后继续程序执行。 自动控制网www.eadianqi.com版权所有
x=input(‘prompt’):把输入的字符串作为提示符,等待使用者输入一个响应,然后把它赋值到x。 自动控制网www.eadianqi.com版权所有
echooff%不显示程序内容 自动控制网www.eadianqi.com版权所有 例exp2_8.m 本文来自www.eadianqi.com clear 自动控制网www.eadianqi.com版权所有
clc 本文来自www.eadianqi.com a=4; 本文来自www.eadianqi.com b=6 自动控制网www.eadianqi.com版权所有 disp('暂停,请按任意键继续')%disp指令可以用来显示字符 自动控制网www.eadianqi.com版权所有 pause%暂停,直到用户按任意键 本文来自www.eadianqi.com echoon 本文来自www.eadianqi.com
%显示程序内容,注意matlab默认是不显示 自动控制网www.eadianqi.com版权所有
c=a+b 本文来自www.eadianqi.com %暂时把控制权交给键盘(在命令窗口中出现k提示符), 本文来自www.eadianqi.com %输入return,回车后退出,继续执行下面的语句。 本文来自www.eadianqi.com keyboard 本文来自www.eadianqi.com d=input('Enterthevalueofd=');%提示用户输入d的值 本文来自www.eadianqi.com
e=a*24+b*8+d*6-c 本文来自www.eadianqi.com f=e/d 本文来自www.eadianqi.com disp('workpause30second')%disp指令可以用来显示字符 本文来自www.eadianqi.com pause(10)%暂停10秒 自动控制网www.eadianqi.com版权所有
disp(f)%显示指定变量的结果,而不显示变量名称 自动控制网www.eadianqi.com版权所有 echooff 本文来自www.eadianqi.com 七、系与逻辑运算符 本文来自www.eadianqi.com MATLAB的运算符有三种类型:算术运算符关系运算符逻辑运算符。它们的处理顺序依次为算术运算符关系运算符逻辑运算符。在前面我们已经介绍例算术运算符,这里我们着重介绍后两种运算符。 自动控制网www.eadianqi.com版权所有 (一)关系运算符 本文来自www.eadianqi.com 假设有:A=[12-1-5]B=[0231] 本文来自www.eadianqi.com
<1ans=[0011] <小于A 本文来自www.eadianqi.com >大于A>Bans=[1000]A>1ans=[0100] 自动控制网www.eadianqi.com版权所有 <=小于等于A<=Bans=[0111] 自动控制网www.eadianqi.com版权所有
>=大于等于A>=Bans=[1100] 自动控制网www.eadianqi.com版权所有 ==等于A=Bans=[0100];A=1ans=[1000] 自动控制网www.eadianqi.com版权所有 ~=不等于A~=Bans=[1011];A~=1ans=[0111] 本文来自www.eadianqi.com ~非 自动控制网www.eadianqi.com版权所有 ~A=[0010]~1=0 本文来自www.eadianqi.com (二)逻辑运算符 自动控制网www.eadianqi.com版权所有 注意:在处理逻辑运算时,运算元只有两个值即0和1,所以如果指定的数为0,MATLAB认为其为0,而任何数不等于0,则认为是1。 自动控制网www.eadianqi.com版权所有 设有:A=[5-40-0.5]B=[0109] 本文来自www.eadianqi.com &与 自动控制网www.eadianqi.com版权所有 A&B=[0101]A&1=[1101] 本文来自www.eadianqi.com |或 自动控制网www.eadianqi.com版权所有 A|B=[1101]A|1=[1111] 本文来自www.eadianqi.com 步长缺省值为1,可以在正实数或负实数范围内任意指定。对于正数,循环变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束。循环结构可以嵌套使用。 自动控制网www.eadianqi.com版权所有
书写格式不必太过于拘泥,在Editor编辑器中会自动进行处理。 本文来自www.eadianqi.com 八、序流程控制 自动控制网www.eadianqi.com版权所有
(一)for循环语句 自动控制网www.eadianqi.com版权所有 基本格式 自动控制网www.eadianqi.com版权所有 for循环变量=起始值:步长:终止值 本文来自www.eadianqi.com 循环体 自动控制网www.eadianqi.com版权所有 End 自动控制网www.eadianqi.com版权所有 例exp2_11.m 本文来自www.eadianqi.com
sum=0; 自动控制网www.eadianqi.com版权所有
fori=1:100 自动控制网www.eadianqi.com版权所有 sum=sum+i; 本文来自www.eadianqi.com end 自动控制网www.eadianqi.com版权所有 sum 自动控制网www.eadianqi.com版权所有 i 自动控制网www.eadianqi.com版权所有 (二)while循环语句 自动控制网www.eadianqi.com版权所有 基本格式 自动控制网www.eadianqi.com版权所有 while表达式 自动控制网www.eadianqi.com版权所有 循环体 本文来自www.eadianqi.com end 自动控制网www.eadianqi.com版权所有 若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真,若不为真,则跳出循环体,向下继续执行。 本文来自www.eadianqi.com
例exp2_12.m 本文来自www.eadianqi.com sum=0;j=0; 本文来自www.eadianqi.com
whilesum<100 自动控制网www.eadianqi.com版权所有 j=j+1; 本文来自www.eadianqi.com sum=sum+j; 自动控制网www.eadianqi.com版权所有 end 自动控制网www.eadianqi.com版权所有 j 本文来自www.eadianqi.com sum 本文来自www.eadianqi.com
While循环和for循环的区别在于,while循环结构的循环体被执行的次数不是确定的,而for结构中循环体的执行次数是确定的。 自动控制网www.eadianqi.com版权所有 (三)if,else,elseif语句 本文来自www.eadianqi.com 1.if逻辑表达式 本文来自www.eadianqi.com 执行语句 自动控制网www.eadianqi.com版权所有 end 自动控制网www.eadianqi.com版权所有 当逻辑表达式的值为真时,执行该结构中的执行语句,执行完之后继续向下进行;若为假,则跳过结构中的内容,向下执行。 本文来自www.eadianqi.com 2.if逻辑表达式3.if逻辑表达式1 自动控制网www.eadianqi.com版权所有 执行语句1执行语句1 本文来自www.eadianqi.com elseelseif逻辑表达式2 自动控制网www.eadianqi.com版权所有 执行语句2执行语句2 本文来自www.eadianqi.com end… 自动控制网www.eadianqi.com版权所有
end 自动控制网www.eadianqi.com版权所有 if-else的执行方式为:如果逻辑表达式的值为真,则执行语句1,然后跳过语句2,向下执行;如果为假,则执行语句2,然后向下执行。 本文来自www.eadianqi.com if-elseif的执行方式为:如果逻辑表达式1的值为真,则执行语句1;如果为假,则判断逻辑表达式2,如果为真,则执行语句2,否则向下执行。 本文来自www.eadianqi.com 例exp2_13.m 自动控制网www.eadianqi.com版权所有 clc 自动控制网www.eadianqi.com版权所有 clear 本文来自www.eadianqi.com forj=1:10 本文来自www.eadianqi.com a(j)=j; 本文来自www.eadianqi.com ifj>5 自动控制网www.eadianqi.com版权所有 a(j)=10-j; 自动控制网www.eadianqi.com版权所有
end 本文来自www.eadianqi.com
end 自动控制网www.eadianqi.com版权所有 j=1:10; 自动控制网www.eadianqi.com版权所有
b=a(j) 自动控制网www.eadianqi.com版权所有
本文来自www.eadianqi.com
(四)switch语句 自动控制网www.eadianqi.com版权所有
格式:switch表达式(%可以是标量或字符串) 本文来自www.eadianqi.com case值1 本文来自www.eadianqi.com 语句1 自动控制网www.eadianqi.com版权所有 case值2 自动控制网www.eadianqi.com版权所有 语句2 自动控制网www.eadianqi.com版权所有 …. 自动控制网www.eadianqi.com版权所有
otherwise 自动控制网www.eadianqi.com版权所有 语句3 自动控制网www.eadianqi.com版权所有 end 本文来自www.eadianqi.com 例exp2_14.m 本文来自www.eadianqi.com clear 本文来自www.eadianqi.com clc 自动控制网www.eadianqi.com版权所有 close 本文来自www.eadianqi.com t=-pi:0.1:pi; 自动控制网www.eadianqi.com版权所有 trigname=input('Inputtrigfunctionsname:') 自动控制网www.eadianqi.com版权所有 switchtrigname 自动控制网www.eadianqi.com版权所有 case'sin' 自动控制网www.eadianqi.com版权所有 plot(t,sin(t)) 本文来自www.eadianqi.com case'cos' 本文来自www.eadianqi.com
plot(t,cos(t)) 本文来自www.eadianqi.com otherwise 自动控制网www.eadianqi.com版权所有
break%终止,跳出switch语句 本文来自www.eadianqi.com end 本文来自www.eadianqi.com 执行方式:表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,如果不同,则执行otherwise中的语句。格式中也可以不包括otherwise,这时如果表达式的值与列出的各种情况都不相同,则继续向下执行。 自动控制网www.eadianqi.com版权所有 |