您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > MATLAB软件设计上机指南
MATLAB软件设计应用技术学院2008-6第一章MATLAB程序设计一、M文件用户如想灵活应用matlab去解决实际问题,充分调用matlab的科学技术资源,就需要编辑m文件包含matlab语言代码的文件称为m文件,其扩展名为m。编辑m文件可使用各种文本编辑器。m文件的类型是普通的文本文件,我们可以使用系统认可的文本文件编辑器来建立m文件。如dos下的edit,windows的记事本和word等。具体的创建方法:1.在matlab命令窗口点击file菜单newm-file2..m文件m文件的语法类似于c语言,但又有其自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序,matlab是解释性的编程语言。m文件有两类独立的m文件—称命令文件、可调用m文件—称函数文件(1).命令文件—简单的m文件命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数命令文件包括两部分:注释文件和程序文件%RANKNumberoflinearlyindependentrowsorcolumns.%K=RANK(X)isthenumberofsingularvaluesofX%thatarelargerthanMAX(SIZE(X))*NORM(X)*EPS.%K=RANK(X,tol)isthenumberofsingularvaluesofXthat%arelargerthantol.%Copyright(c)1984-94byTheMathWorks,Inc.s=svd(x);if(nargin==1)tol=max(size(x))*max(s)*eps;endr=sum(stol);(2).matlab内置函数文件matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数——用typesin查不到。调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*pi;y=sin(2*x)plot(x,y)函数m文件的格式:function返回变量=函数名(输入变量)注释说明语句段程序语句段特定规则:1.函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:function因变量=函数名(自变量)2.m文件的文件名必须是函数名.m。3.程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效二、微分方程一般微分方程式描述系统内部变量的变化率如何受系统内部变量和外部激励,如输入,的影响。当常微分方程式能够解析求解时,可用MATLAB的符号工具箱中的功能找到精确解。在本书的后面将介绍该工具箱的一些特点。在微分方程难以获得解析解的情况下,可以方便地在数值上求解。为了说明起见,考虑描述振荡器的经典的范得波(VarderPol)微分方程。01234567-1-0.8-0.6-0.4-0.200.20.40.60.81dxdtxdxdtx22210()与所有的数值求解微分方程组的方法一样,高阶微分方程式必须等价地变换成一阶微分方程组。对于上述微分方程,通过重新定义两个新的变量,来实现这种变换。令y1=x且y2=dy/dx则dy1/dt=y2dydtyy2211/()根据这个微分方程组,可用MATLAB的函数ode23和ode45求出系统随时间变化的运动情况。调用这些函数时,需要编写一个函数M文件,给定当前时间及y1和y2的当前值,该函数返回上述导数值。MATLAB中,这些导数由一个列向量给出。在本例中,这个列向量为yprime。同样,y1和y2合并写成列向量y。所得函数M文件是:functionyprime=vdpol(t,y);%VDPOL(t,y)returnsderivativesoftheVanderPolequation:%%x‘‘-mu*(1-x^2)*x‘+x=0(‘=d/dx,‘‘=d^2/dx^2)%%lety(1)=xandy(2)=x‘%%theny(1)‘=y(2)%y(2)‘=MU*(1-y(1)^2)*y(2)-y(1)globalMU%choose0MU10inCommandworkspaceyprime=[y(2)MU*(1-y(1)^2)*y(2)-y(1)];%outputmustbeacolumn给定这个完整地描述微分方程的函数,计算结果如下:globalMU%defineMUasaglobalvariableintheCommandWorkspaceMU=2;%setglobalparametertodesiredvalue[t,y]=ode23(‘vdpol‘,0,30,[1;0]);%to=0,tf=30,yo=[1;0]y1=y(:,1);%firstcolumnisy(1)versustimepointsinty2=y(:,2);%secondcolumnisy(2)plot(t,y1,t,y2,‘--‘)xlabel(‘Time,Second‘),ylabel(‘Y(1)andY(2)‘)title(‘VanderPolSolutionformu=2‘)当mu=2时的范得波方程的运动曲线第二章流程控制与绘图一、流程控制1.For循环For循环允许一组命令以固定的和预定的次数重复。For循环的一般形式是:forx=array{commands}end在for和end语句之间的{commands}按数组中的每一列执行一次。在每一次迭代中,x被指定为数组的下一列,即在第n次循环中,x=array(:,n)。例如,»forn=1:10x(n)=sin(n*pi/10);end»xx=Columns1through70.30900.58780.80900.95111.00000.95110.8090Columns8through100.58780.30900.0000换句话,第一语句是说:对n等于1到10,求所有语句的值,直至下一个end语句。第一次通过For循环n=1,第二次,n=2,如此继续,直至n=10。在n=10以后,For循环结束,然后求end语句后面的任何命令值,在这种情况下显示所计算的x的元素。For循环的其它重要方面是:1.For循环不能用For循环内重新赋值循环变量n来终止。»forn=1:10x(n)=sin(n*pi/10);n=10;end»xx=Columns1through70.30900.58780.80900.95111.00000.95110.8090Columns8through100.58780.30900.00002.语句1:10是一个标准的MATLAB数组创建语句。在For循环内接受任何有效的MATLAB数组。»data=[39456;716-15]data=39456716-15forn=datax=n(1)-n(2)endx=-4x=-7x=46x=13.For循环可按需要嵌套。forn=1:5form=5:-1:1A(n,m)=n^2+m^2;enddisp(n)end12345»AA=25101726581320291013182534172025324126293441504.当有一个等效的数组方法来解给定的问题时,应避免用For循环。例如,上面的第一个例子可被重写为»n=1:10;»x=sin(n*pi/10)x=Columns1through70.30900.58780.80900.95111.00000.95110.8090Columns8through100.58780.30900.0000两种方法得出同样的结果,而后者执行更快,更直观,要求较少的输入。5.为了得到最大的速度,在For循环(While循环)被执行之前,应预先分配数组。例如,前面所考虑的第一种情况,在For循环内每执行一次命令,变量x的大小增加1。迫使MATLAB每通过一次循环要花费时间对x分配更多的内存。为了消去这个步骤,For循环的例子应重写为»x=zeros(1,10);%preallocatedmemoryforx»forn=1:10x(n)=sin(n*pi/10);end现在,只有x(n)的值需要改变。2.While循环与For循环以固定次数求一组命令的值相反,While循环以不定的次数求一组语句的值。While循环的一般形式是:whileexpression{commands}end只要在表达式里的所有元素为真,就执行while和end语句之间的{commands}。通常,表达式的求值给出一个标量值,但数组值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。考虑下列例子:»num=0;EPS=1;»while(1+EPS)1EPS=EPS/2;num=num+1;end»numnum=53»EPS=2*EPSEPS=2.2204e-016这个例子表明了计算特殊MATLAB值eps的一种方法,它是一个可加到1,而使结果以有限精度大于1的最小数值。这里我们用大写EPS,因此MATLAB的eps的值不会被覆盖掉。在这个例子里,EPS以1开始。只要(1+EPS)1为真(非零),就一直求While循环内的命令值。由于EPS不断地被2除,EPS逐渐变小以致于EPS+1不大于1。(记住,发生这种情况是因为计算机使用固定数的数值来表示数。MATLAB用16位,因此,我们只能期望EPS接近10-16。)在这一点上,(1+EPS)1是假(零),于是While循环结束。最后,EPS与2相乘,因为最后除2使EPS太小。3.IF-ELSE-END结构很多情况下,命令的序列必须根据关系的检验有条件地执行。在编程语言里,这种逻辑由某种If-Else-End结构来提供。最简单的If-Else-End结构是:ifexpression{commands}end如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的{commands}。在表达式包含有几个逻辑子表达式时,即使前一个子表达式决定了表达式的最后逻辑状态,仍要计算所有的子表达式。例如,»apples=10;%numberofapples»cost=apples*25%costofapplescost=250»ifapples5%give20%discountforlargerpurchasescost=(1-20/100)*cost;end»costcost=200假如有两个选择,If-Else-End结构是:ifexpressioncommandsevaluatedifTrueelsecommandsevaluatedifFalseend在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。当有三个或更多的选择时,If-Else-End结构采用形式ifexpression1commandsevaluatedifexpression1isTrueelseifexpression2commandsevaluatedifexpression2isTrueelseifexpression3commandsevaluatedifexpression3isTrueelseifexpression4commandsevaluatedifexpression4isTrueelseif……...elsecommandsevaluatedifnootherexpressionisTrueend最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。而且,最后的else命令可有可无。现在我们知道了如何用If-Else-End结构来决策,就有可能提出一种合理的方法来跳出或中断For循环和While循环。»EPS=1;»fornum=1:1000EPS=EPS/2;if(1+
本文标题:MATLAB软件设计上机指南
链接地址:https://www.777doc.com/doc-3179916 .html