第7章程序设计_第1页
第7章程序设计_第2页
第7章程序设计_第3页
第7章程序设计_第4页
第7章程序设计_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB7.0从入门到精通哈尔滨工业大学(威海)汽车工程学院2/5/20231课程主要内容第1章MATLAB简介第2章数值运算第3章单元数组和结构第4章字符串第5章符号运算第6章MATLAB绘图基础第7章程序设计第8章计算方法的MATLAB实现第9章优化设计第10章SIMULINK仿真初探2/5/20232第7章程序设计MATLAB作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算、符号计算、矩阵运算的能力和丰富的绘图功能,还可以像C语言、FORTRAN等计算机高级语言一样进行程序设计,编写扩展名为.m的M文件,实现各种复杂的运算,同时MATLAB自带的许多函数就是M文件函数,用户也可以利用M文件来生成和扩充自己的函数库。2/5/202337.1脚本和函数所谓M文件,简单来说就是用户把要实现的命令写在一个以.m作为扩展名的文件中,然后由MATLAB系统进行解释,最后运行出结果。M文件有函数和脚本两种格式。两者只是在语法和使用上有些不同。脚本式M文件没有输入参数或输出参数,而函数式M文件有输入参数和输出参数;函数可以有零个或多个输入或输出变量。2/5/202347.1.1脚本脚本是一个扩展名为.m的文件,其中包含了MATLAB的各种命令,与批处理文件很类似,在MATLAB命令窗口下直接输入此文件的主文件名,MATLAB可逐一执行在此文件内的所有命令,和在命令窗口逐行输入这些命令一样。脚本式M文件运行产生的所有变量都是全局变量,运行脚本后,所产生的所有变量都驻留在MATLAB基本工作空间,只要用户不使用clear命令加以清除,且MATLAB指令窗口不关闭,这些变量将一直保存。基本空间随MATLAB的启动而产生,在关闭MATLAB软件时该基本空间被删除。例:huitu0.m2/5/20235huitu0程序结果2/5/202367.1.2函数MATLAB中许多常用的函数都是函数式M文件,使用时,MATLAB获取传递给它的变量,利用操作系统所给的输入,运算得到要求的结果,然后返回这些结果。函数文件类似于一个黑箱,由函数执行的命令以及这些命令所创建的中间变量都是隐含的。运算过程中的中间变量都是局部变量(除特别声明外),存放在函数本身的工作空间内,不会和MATLAB基本工作空间的变量相互覆盖,对用户来说,可见的只是输入和输出,因此易于使程序模块化,特别适合于大型程序代码。例:huitu.m2/5/20237huitu(1,2,3)程序结果2/5/202387.2M文件的程序结构程序结构一般分为顺序结构、循环结构、分支结构三种。理论上讲,只要有以上三种结构就可以构造功能强大的程序。与大多数计算机语言一样,MATLAB也提供了上述三种程序结构。虽然MATLAB没有C语言那样具有丰富的控制结构,但是MATLAB自身的强大功能弥补了这个不足,使用户在编程时几乎感觉不到困难。下面分别对这三种结构进行介绍。2/5/202397.2.1顺序结构顺序结构就是依次顺序地执行程序的各条语句。顺序结构一般不含有其他子结构或控制语句,批处理文件就是典型的顺序结构的文件。例:jizhi.m2/5/202310jizhi程序结果2/5/2023117.2.2循环结构在实际计算中,经常会碰到许多有规律的重复计算,此时就要对某些语句进行重复执行。一组被重复执行的语句称为循环体,每个循环语句都要有循环条件,以判断循环是否要继续进行下去。MATLAB中的循环语句包括for循环与while循环。2/5/2023121、for循环for循环允许一组命令以固定的和预定的次数重复执行,for循环的一般形式如下所示:for循环变量=数组循环体(执行语句);end在for与end语句之间的执行语句是按矩阵(或数组)中的每一列执行一次,即在每一次循环中,矩阵(或数组)元素一个一个地被赋给循环变量,然后由执行语句执行。例:for1.m,specmat.m2/5/202313程序结果>>for1x=Columns1through72.03041.80081.51311.41651.71832.51113.7462Columns8through105.26206.85878.38912/5/202314>>specmat(6)ans=1111111234561361015151410101515151515151516151515152/5/202315用for循环语句需要注意以下事项:(1)不能在for循环体内重新对循环变量n赋值来终止循环的执行。(2)for循环可以进行嵌套循环。(3)循环语句内的“;”可防止中间变量的输出。2/5/2023162、while循环与for循环固定的次数求一组命令的值相反,while循环以不定的次数来求一组命令的值。while循环的一般形式如下:while表达式循环体();n+1;(自增)end只要表达式中的元素为真,就执行while和end语句之间的命令。通常,表达式给出的是一个标量值,但数组(或矩阵)同样有效。若为数组(或矩阵),则要求所有的元素都必须为真。例:while1.m2/5/202317程序结果>>while1a=2.46192/5/202318程序实例问题描述:根据统计学的基础知识分析样本的平均值和标准差。例:for2.m和while2.m2/5/202319程序结果>>for2Enterthenumberofthepoints:6Enterthevalue:1Enterthevalue:3Enterthevalue:5Enterthevalue:7Enterthevalue:9Enterthevalue:0Themeanofthisdatasetis:4.166667Thestandarddeviationis:3.488075Thenumberofdatais:62/5/202320>>while2Enterthefirstvalue:1Enterthefirstvalue:3Enterthefirstvalue:5Enterthefirstvalue:7Enterthefirstvalue:9Enterthefirstvalue:0Enterthefirstvalue:-1Themeanofthisdatasetis:4.166667Thestandarddeviationis:3.488075Thenumberofdatais:62/5/2023217.2.3分支结构在程序设计中,经常要根据一定的条件来执行不同的语句。当某些条件满足时,只执行其中的某个语句或某些语句。在这种情况下,分支结构就会是很好的选择了。在MATLAB中的分支结构语句包括if-else-end语句与switch-case-otherwise语句。2/5/2023221、if-else-end选择语句if-else-end选择语句的结构如下所示:if条件式1表达式1;elseif条件式2表达式2;...else表达式n;end哪一个if后的表达式中值为真,就执行该if后的表达式,否则跳过该表达式进行其它判断。例:ff.m2/5/202323程序结果>>ff(-1)ans=1>>ff(2)ans=0.5000>>ff(8)ans=0.9894>>ff(16)ans=42/5/202324采用plot(x,ff(x))绘分段函数图。x1=-2:0.01:0;x2=0.5:0.01:5;x3=5.01:0.01:10;x4=10.01:0.01:12;plot(x1,ff(x1))holdonplot(x2,ff(x2))holdonplot(x3,ff(x3))holdonplot(x4,ff(x4))gridon2/5/202325程序结果2/5/202326MATLAB中的选择语句switch-case-otherwise,是特别让熟悉C等高级语言的用户方便地编写M文件而专门添加的。switch-case-otherwise语句的通用格式如下:swithexpressioncasevalue1statements1;...casevaluenstatementsn;otherwisestatements;end2、switch-case-otherwise分支语句2/5/202327其中,switch-expression给出了开关条件,当有case-expression与之匹配时,就执行其后的语句,如果没有case-expression与之匹配,就执行otherwise后面的语句。在执行过程中,只有一个case命令被执行,当执行完命令后,程序就跳出分支结构,执行end下面的语句。例:fm.m2/5/202328程序结果>>fm(0)ans=20>>fm(1)ans=40>>fm(2)ans=60>>fm(3)ans=80>>fm(5)ans=1002/5/202329工程实例问题描述:向上斜抛的小球,具有如下的运动模型,仿真小球的运动轨迹。例:ball.m2/5/202330程序结果>>ballEntertheinitialvelocity:20Rangeversusangletheta:00.000057.07321013.93161520.36662026.18282531.20343035.27603538.27674040.11442/5/2023314540.73325040.11445538.27676035.27606531.20347026.18287520.36668013.9316857.0732900.0000Maxrangesis40.7332at45degrees.2/5/202332图形结果2/5/2023337.3程序流控制在许多程序设计语言中,经常要碰到提前终止循环、跳出程序、显示出错信息等,此时就需要用到控制程序流的命令。在MATLAB中,同样有这样的程序控制流命令。下面逐一介绍MATLAB中的程序流的控制命令。2/5/2023341、continue命令continue命令经常与for或while语句一起使用,其作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断。注:当条件满足时,continue语句才被调用,跳出后面的语句,循环继续,条件不满足则继续执行后面的程序。例:continue1.m2/5/202335程序结果>>continue1357911468101257911136810121479111315810121416911131517101214161811131517191214161820

2/5/2023362、break命令break命令也经常与for或while等语句一起使用,其作用是终止本次循环,跳出最内层的循环。使用break命令可以不必等到循环的自然结束,而是根据条件,强制退出循环。这在很多情况下是必须的。注:当条件满足时,break语句才被调用,系统将在循环尚未结束时跳出当前循环,条件不满足则继续执行后面的程序。例:jitu.m2/5/202337程序结果>>jituThenumberofchickenis22.Thenumberofrabbitis14.2/5/2023383、return命令return命令能使当前正在运行的函数正常退出,并返回调用它的函数,继续运行。这个语句经常用于函数的末尾,以正常结束函数的运行。当然,也可用于函数的其他地方,对某些条件进行判断,如果条件不符合要求,调用return语句终止当前运行,并返回调用它的函数或环境。实际上,MATLAB中此语句的作用与其他的程序设计语言中的作用相同。例:dreturn.m2/5/202339程序实例>>dreturn('2')ans=5>>dreturn('')ans=5>>dreturn('')ans=12/5/2023404、echo语句通常在MATLAB中执行M文件时,在命令窗口是看不到执行过程的。但在特殊情况下,比如需要对M文件演示时,要求M文件的每条命令都要显示出来,此时用echo命令就可以实现这样的操作。对于脚本式M文件与函数式M文件,echo命令略有不同。对于脚本式M文件,可以用以下方式来实现:echoon%显示其后所有执行的命令文件的指令echooff%不显示其后所有执行的命令文件的指令echo%在上述两种情况下进行切换对于函数式M文件,可以用以下方式来实现:echofilenameon%使filename指定的M文件的执行指令显示出来echofilenameoff%使filename指定的M文件的执行指令不显示出来echoonall%其后的所有M文件的执行指令显示2/5/2023415、error语句在进行程序设计时,许多情况下有错误出现,此时如果能把错误信息显示出来,那样就会使用户了解到是什么原因引起错误,以采取适合的方式防止错误的再次发生。MATLAB中的error(‘错误信息?就用于实现上述功能。此命令能显示错误信息并终止当前函数的运行,将控制信息返回到键盘。该指令用来指示出错信息并终止当前函数的运行。error(‘message’)类似的是warning,区别是warning之后程序继续运行。2/5/2023426、try...catch语句try...catch语句的作用与上面的error语句类似,是用于对异常进行处理的命令。把有可能引起异常的语句放在try控制块中,这样当try控制块中statement语句引起异常时,catch控制块就可以捕获它,并针对不同的错误类型,进行不同的处理。它与C++程序设计语言中的try...catch命令作用一样。try...catch命令的调用格式如下:try(commands1),catch(commands2),end组命令1总被执行,当执行出现错误时,catch控制块就可捕获它,执行组命令2,针对不同错误类型进行不同的处理。可用lasterr函数查询出错原因。注意try和catch控制块中的语句之间用逗号隔开。例:chucuo.m2/5/202343程序结果>>chucuoa_end=492ans=Attemptedtoaccessa(4,:);indexoutofboundsbecausesize(a)=[3,3].2/5/2023447、input语句input命令用来提示用户从键盘输入数据、字符串或表达式,并接受输入值。r=input(‘prompt’)在屏幕上显示提示信息prompt,等待用户输入,并将值赋给r,直接回车则输出空矩阵。r=input(‘prompt’,’s’)返回的字符串作为文本变量而不作为变量名或者数值。例:test.m2/5/202345程序结果>>testDoyouwantmore?Y/N[Y]:Yyouhaveselectedthefirstcharacter>>testDoyouwantmore?Y/N[Y]:Nyouhaveselectedthesecondone>>testDoyouwantmore?Y/N[Y]:syouhaveselectedthesecondone2/5/2023468、pause命令pause命令用于暂时终止程序的运行,等待用户按任意键继续进行。pause暂停M文件的执行,按任意键继续pause(n)终止程序n秒,n是任意实数pauseon允许后面的pause命令起作用pauseoff使后面的pause命令不起作用例:pause1.m2/5/2023477.4脚本文件脚本文件只是逐条的解释文件中的程序条,与命令窗口直接输入一样,只是它具有了存储能力,且可以方便的多次运行该程序段,在命令窗口中只需输入存储的文件名即可,且存储的文件名没有特殊要求。脚本文件中可以调用函数,只需调用函数名即可。2/5/2023487.5函数文件函数的格式必须加function,并且M文件的存储名必须与函数名相同。一般函数都有输入和输出。2/5/202349谢谢!2/5/202350huitu0.mx=-pi:0.01:pi;y=cos(x);plot(x,y);gridon返回2/5/202351huitu.mfunctionf=huitu(a,b,c)x=-pi:0.01:pi;f=a*sin(b*x+c);plot(x,f);gridon返回2/5/202352jizhi.mx=-pi:0.01:pi;y=sin(x)+sin(2*x)-cos(3*x);h=plot(x,y);x=get(h,'XData');y=get(h,'YData');imin=find(min(y)==y);imax=find(max(y)==y);holdontext(x(imin),y(imin),['minimum=',num2str(y(imin))]);text(x(imax),y(imax),['maximum=',num2str(y(imax))]);gridonplot(x(imin),y(imin),'o')plot(x(imax),y(imax),'*')返回2/5/202353for1.mforn=1:10x(n)=exp(n/5)+cos(n*pi/5);endx返回2/5/202354specmat.mfunctionA=specmat(n)A=ones(n);forr=1:nforc=1:nifr>1&c>1s=A(r-1,c)+A(r,c-1);ifs<20A(r,c)=s;elseA(r,c)=max(A(r-1,c),A(r,c-1));endendendend返回2/5/202355while1.mn=1;a=0;whilen<10a=a+log(n)/n;n=n+1;enda返回2/5/202356for2.msum1=0;sum2=0;n=input('Enterthenumberofthepoints:');ifn<2disp('Atleast2valuesmustbeentered.');elsefori=1:nx=input('Enterthevalue:');sum1=sum1+x;sum2=sum2+x^2;endxvar=sum1/n;std_dev=sqrt((n*sum2-sum1^2)/(n*(n-1)));fprintf('Themeanofthisdatasetis:%f\n',xvar);fprintf('Thestandarddeviationis:%f\n',std_dev);fprintf('Thenumberofdatais:%d\n',n);end返回2/5/202357while2.mn=0;sum1=0;sum2=0;x=input('Enterthefirstvalue:');whilex>=0n=n+1;sum1=sum1+x;sum2=sum2+x^2;x=input('Enterthefirstvalue:');endxvar=sum1/n;std_dev=sqrt((n*sum2-sum1^2)/(n*(n-1)));fprintf('Themeanofthisdatasetis:%f\n',xvar);fprintf('Thestandarddeviationis:%f\n',std_dev);fprintf('Thenumberofdatais:%d\n',n);返回2/5/202358ff.mfunctiony=ff(x)ifx<=0y=x.^2;elseif0<x&x<=5y=1./x;elseif5<x&x<=10y=sin(x);elseifx>10y=x./4;end返回2/5/202359fm.mfunctionf=fm(n)switchncase0f=20;case1f=40;case2f=60;case3f=80;otherwisef=100;end返回2/5/202360ball.mconv=pi/180;g=-9.82;v0=input('Entertheinitialvelocity:');range=zeros(1,91);%计算最大的水平距离。fori=1:91theta=i-1;vx0=v0*cos(theta*conv);vy0=v0*sin(theta*conv);maxtime=-2*vy0/g;range(i)=vx0*maxtime;end2/5/202361%显示计算水平距离的列表。fprintf('Rangeversusangletheta:\n');fori=1:5:91theta=i-1;fprintf('%2d%8.4f\n',theta,range(i));end%计算最大的角度和水平距离。[maxrangeindex]=max(range);maxangle=index-1;fprintf('\nMaxrangesis%8.4fat%2ddegrees.\n',maxrange,maxangle);2/5/202362%绘制轨迹图形。fori=5:10:80theta=i;vx0=v0*cos(theta*conv);vy0=v0*sin(theta*conv);maxtime=-2*vy0/g;%计算小球轨迹的x,y坐标数值。x=zeros(1,21);y=zeros(1,21);forj=1:21time=(j-1)*maxtime/20;x(j)=vx0*time;y(j)=vy0*time+0.5*g*time^2;endplot(x,y,'g')ifi==5holdon;endend2/5/202363%添加图形的标题和坐标轴名称。title('TrajectoryofBallvsInitialAngle\theta');xlabel('x(meters)');ylabel('y(meters)');axis([0max(range)+50-v0^2/2/g]);gridon2/5/202364%绘制最大水平的轨迹图形。vx0=v0*cos(maxangle*conv);vy0=v0*sin(maxangle*conv);maxtime=-2*vy0/g;x=zeros(1,21);y=zeros(1,21)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论