数学科学学院:汪小平wxiaoping325@163.com第二章MATLAB程序设计方法表达式和运算符命令文件(程序文件)程序设计中的流程控制函数文件的编写格式12/32表达式——由变量、运算符、函数、数字组成球坐标变换————表达式和运算符————用赋值语句创建变量变量名=数据变量名=表达式coscosRxsincosRysinRzx=R*cos(theta)*cos(fai);y=R*cos(theta)*sin(fai);z=R*sin(theta);——纬度——经度3/32例2.1格林威治天文台建于1675年,其经度为零,纬度为北纬510。计算格林威治天文台在地心直角坐标系中的坐标并在球面上标记[X,Y,Z]=sphere(24);mesh(X,Y,Z),holdonfai=0;theta=51*pi/180;x0=cos(theta)*cos(fai);y0=cos(theta)*sin(fai);z0=sin(theta);plot3(x0,y0,z0,'ro','linewidth',2)view(124,30)4/32例2.2四边形柱面绘图原理和方法。设四边形顶点为(-1,-1),(1,-1),(1,1),(-1,1).设柱面高为1,创建Z坐标矩阵1111100000Z创建柱面的X坐标和Y矩阵1111111111X1111111111Y-101-10100.515/32cylinder(R,N)创建单位高度绕Z轴旋转曲面,R为母线,N表示圆圈上点数,N缺省默认值为20。Cylinder%单位高度二十边形柱面[x,y,z]=cylinder([1,1],4);mesh(x,y,z)%单位高度四边形柱面[x,y,z]=cylinder([1,0],3);mesh(x,y,z)%单位高度的三角形锥面使用cylinder绘柱面6/32+加-减*乘.*点乘/右除./点右除\左除.\点左除^矩阵幂.^点幂1.算术运算符2.关系运算符小于=小于等于大于=大于等于==等于~=不等于3.逻辑运算符&与(and)|或(or)~非(not)————表达式和运算符————7/32运算优先级①函数运算②算术运算③关系运算④逻辑运算exp()、log()、sin()、abs()、fix()、···.^、^、.*、./、*、/、+、–、;、=、、=、==、~=&、|表达式(1+fix(pi))*mod(2,4)+2*3^2结果为ans=26;三角形任意两边之和大于第三边的逻辑表达式(A)a+b=c|a+c=b|b+c=a(B)a+b=c|a+c=b|b+c=a(C)a+bc|a+cb|b+ca(D)a+bc&a+cb&b+ca8/32————命令文件————计算机程序主要功能——接收数据和处理数据,并将处理后的数据完整有效地提供给用户例2.3将地球模型取为半径为R=6400(km)的球体,计算高度为1万公里的地球同步卫星对地面的覆盖率在编辑窗口编写文件planet.m在命令窗口键入planet结果显示:ans=30.4878d=10000;R=6400;S0=4*pi*R*R;S=2*pi*R*R*d/(R+d);S/S0*1009/32命令文件——MATLAB命令的有序集合。文件执行——对文件中命令进行批处理,即从第一条命令开始按顺序执行,直到最后一条命令。如果中间某条命令出错,则中断并输出错误信息M文件分为命令文件和函数文件两种①在编辑窗口中编写;②保存并对文件命名;③命令窗口键入文件名运行;④观察运行结果;·······························10/32条件控制;循环控制;错误控制;终止运行控制条件控制——有选择地运行程序块1.if/elseif语句例2.8判润年程序————程序设计中的流程控制————year=input('inputyear:=');n1=year/4;n2=year/100;n3=year/400;ifn1==fix(n1)&n2~=fix(n2)disp('是润年')elseifn1==fix(n1)&n3==fix(n3)disp('是润年')elsedisp('不是润年')end润年条件有二①能被4整除,但不能被100整除;②能被4整除,又能被400整除。11/321.for循环语法:for变量=初值:步长:终值可执行语句end————程序设计中的循环控制————例2.4裴波拉奇数列n=input('inputn:=');f(1)=1;f(2)=1;fork=3:nf(k)=f(k-1)+f(k-2);endf(n)f(44)=70140873312/32例2.5程序功能如下:把边长为2以原点为中心的正方形旋转pi/24,将其压缩(r=0.89),重复24次并绘图xy=[-1-1;1-1;11;-11;-1-1];A=[cos(pi/24)-sin(pi/24);%创建正交矩阵sin(pi/24)cos(pi/24)];x=xy(:,1);y=xy(:,2);%提取坐标数据line(x,y),pause(1)%画线并暂停一秒fork=1:24xy=.89*xy*A’;%旋转并压缩x=xy(:,1);y=xy(:,2);line(x,y),pause(1)end-1-0.500.51-1-0.500.5113/32例2.6利用帧动画方法演示马鞍面旋转过程。M=moviein(24);[x,y]=meshgrid(-6:.5:6);z=x.^2-y.^2;%创建马鞍面坐标数据AZ=-30;fork=1:24mesh(x,y,z),axisoff%绘图colormap([001]),view(AZ,20)%旋转15OM(:,k)=getframe;%帧设计AZ=AZ+15;endmovie(M,2)%帧播放14/322.while循环将循环体中语句循环执行直到条件不成立为止。语法:while条件表达式可执行语句end条件表达式一般由变量、数字、逻辑运算、关系运算符和一般运算符组成,以判断循环的进行和停止;只要表达式的值(逻辑值)结果为正确(非0),循环继续;直到表达式值为0,循环停止。————程序设计中的循环控制————15/32例2.73n+1问题.n=input(‘inputn=’);%输入数据whilen~=1r=rem(n,2);%求n/2的余数ifr==0n=n/2%第一种操作elsen=3*n+1%第二种操作endend对任一自然数n,按如下法则进行运算:若n为偶数,则将n除2;若n为奇数,则将n乘3加1。将运算结果按上面法则继续运算,重复若干次后结果最终是1.n=516,8,4,2,1————程序设计中的流程控制————16/323.continue命令通常用于for或while循环语句中,与if语句一起使用,跳过本次循环,去执行下一轮循环4.break命令通常用于for或while循环语句中,与if语句一起使用,中止本次循环,跳出最内层循环If条件表达式,break,end5.error(‘message’)显示文本message,并中断程序执行If条件表达式,error(‘message’),end————程序设计中的流程控制————17/32红、绿两队从相距100公里的地点同时出发相向行军红队速度为10(公里/小时)绿队速度为8(公里/小时)开始时,通讯员骑摩托从红队出发为行进中的两队传递消息。摩托车的速度为60(公里/小时)往返于两队之间.每遇一队,立即折回驶向另一队.当两队距离小于0.2公里时,摩托车停止。计算通讯员驾驶摩托车跑了多少趟(从一队驶向另一队为一趟)。例2.8摩托车问题18/32将红队、绿队和摩托车假设为A、B、C三个点.A点初始位置A=0,速度va=10(运动向右);B点初始位置B=100,速度vb=8(运动向左);C点初始位置C=0,速度vc=60(f=±1表示运动方向)当C向右运动时,C、B相遇时间:tk=(B–A)/(8+60)当C向左运动时,A、C相遇时间:tk=(B–A)/(60+10)利用相遇时间tk、及时计算A,B的最新位置当(B–A)0.2时程序结束。相遇问题的数学模型19/32while(B-A)0.2iff==1tk=(B-A)/(vb+vc);elsetk=(B-A)/(vc+va);endA=A+va*tk;B=B-vb*tk;plot(A,0,'R.',B,0,'g.'),pause(1)f=-f;k=k+1;endkwhoYourvariablesare:AftkvbBkvavcA=0;B=100;va=10;vb=8;vc=60;f=1;k=0;plot(A,0,'ro',B,0,'go'),holdon20/32function返回变量列表=函数名(输入变量列表)%注解说明输入变量检测,输出变量检测函数体————函数文件的编写————functionY=young(n)ifnargin==0,n=3;endY=eye(n);Y(:,1)=ones(n,1);fork=3:nY(k,2:k-1)=Y(k-1,1:k-2)+Y(k-1,2:k-1);end例2.9杨辉三角形21/32函数内所有变量是局部变量,既不影响其他M文件中同名变量,也不被其他M文件中同名变量所影响函数文件中的输出变量要等于某个确定的表达式函数文件的第一行必须按特定格式书写————函数文件的编写————输入/输出变量检测命令:nargin、nargout当函数文件被用户调用时(程序执行时)nargin返回函数被调用时输入变量的个数。nargout返回当函数被调用时输出变量的个数。22/32例2.10设地球半径6400km,以150经差绘三维地球。functionearthface()R=6400;[theta,fai]=meshgrid(-90:15:90,-180:15:180);theta=theta*pi/180;fai=fai*pi/180;X=R*cos(theta).*cos(fai);Y=R*cos(theta).*sin(fai);Z=R*sin(theta);colormap([001])mesh(X,Y,Z),axisoff特例之一:无输入无输出变量的函数文件15————函数文件的编写————23/32球函数的图形)35(123)(2213xxxP记勒让德多项式令cosx0球谐函数cos)(cos),(1313PY20cossinxsinsinycosz令),(13Y在球坐标系数绘球谐函数图24/32functionsphefun()t=linspace(0,pi,40);s=linspace(0,2*pi,60);[theta,fai]=meshgrid(t,s);x=cos(theta);w=sqrt(1-x.^2);P31=3*(5*x.^2-1)/2;YR=w.*P31.*cos(fai);X=YR.*sin(theta).*cos(fai);Y=YR.*sin(theta).*sin(fai);Z=YR.*cos(theta);surf(X,Y,Z),axisoff25/3212nABC例2.11Hanoi问题(递归算法)有A、B、C三个塔柱。柱A上n个有孔圆盘,由上而下由小到大叠放。要将柱A上圆盘移到柱C上,并仍按同样顺序叠放。移动圆盘过程中,不允许大圆盘压小圆盘,可将圆盘移至A,B,C中任何一柱上。26/32问题分析:n张盘片,A、B、C三根柱子将A做为开始塔柱,C为目标塔柱,B为中间塔柱。要列出整个转移的操作过程,应用递归技术。①将A上的n-1个盘转移到B上②将A上第n号盘转移到C上③将B上的n-1个盘转移到C上。第一步是n-1个盘问题(A开始,C中间,B目标);第二步是1个盘问题;