高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai1第4章MATLAB程序设计例4.1建立一个命令文件将变量a,b的值互换,然后运行该命令文件。程序1:首先建立命令文件并以文件名exch.m存盘:clear;a=1:10;b=[11,12,13,14;15,16,17,18];c=a;a=b;b=c;ab然后在MATLAB的命令窗口中输入exch,将会执行该命令文件。程序2:首先建立函数文件fexch.m:function[a,b]=exch(a,b)c=a;a=b;b=c;然后在MATLAB的命令窗口调用该函数文件:clear;x=1:10;y=[11,12,13,14;15,16,17,18];[x,y]=fexch(x,y)例4.2求一元二次方程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)];disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);例4.3计算分段函数:2cos(1)1,10,10xxxyxxxxx=input('请输入x的值:');高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai2ifx==10y=cos(x+1)+sqrt(x*x+1);elsey=x*sqrt(x+sqrt(x));endy也可以用单分支if语句来实现:x=input('请输入x的值:');y=cos(x+1)+sqrt(x*x+1);ifx~=10y=x*sqrt(x+sqrt(x));endy或用以下程序:x=input('请输入x的值:');ifx==10y=cos(x+1)+sqrt(x*x+1);endifx~=10y=x*sqrt(x+sqrt(x));endy例4.4输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。c=input('请输入一个字符','s');ifc='A'&c='Z'disp(setstr(abs(c)+abs('a')-abs('A')));elseifc='a'&c='z'disp(setstr(abs(c)-abs('a')+abs('A')));elseifc='0'&c='9'disp(abs(c)-abs('0'));else高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai3disp(c);end例4.5某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):price200没有折扣200≤price5003%折扣500≤price10005%折扣1000≤price25008%折扣2500≤price500010%折扣5000≤price14%折扣输入所售商品的价格,求其实际销售价格。price=input('请输入商品价格');switchfix(price/100)case{0,1}%价格小于200rate=0;case{2,3,4}%价格大于等于200但小于500rate=3/100;casenum2cell(5:9)%价格大于等于500但小于1000rate=5/100;casenum2cell(10:24)%价格大于等于1000但小于2500rate=8/100;casenum2cell(25:49)%价格大于等于2500但小于5000rate=10/100;otherwise%价格大于等于5000rate=14/100;endprice=price*(1-rate)%输出商品实际销售价格例4.6矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai4catchC=A.*B;endClasterr%显示出错原因例4.7一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。form=100:999m1=fix(m/100);%求m的百位数字m2=rem(fix(m/10),10);%求m的十位数字m3=rem(m,10);%求m的个位数字ifm==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend例4.8已知22221111123ynL,当n=100时,求y的值。y=0;n=100;fori=1:ny=y+1/i/i;endy在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:n=100;i=1:n;f=1./i.^2;y=sum(f)例4.9设0.5π()esin()6xfxx,求s=3π0()dfxx。a=0;b=3*pi;n=1000;h=(b-a)/n;x=a;s=0;高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai5f0=exp(-0.5*x)*sin(x+pi/6);fori=1:nx=x+h;f1=exp(-0.5*x)*sin(x+pi/6);s=s+(f0+f1)*h/2;f0=f1;ends上述程序来源于传统的编程思想。也可以利用向量运算,从而使得程序更加简洁,更赋有MATLAB的特点。程序如下:a=0;b=3*pi;n=1000;h=(b-a)/n;x=a:h:b;f=exp(-0.5*x).*sin(x+pi/6);fori=1:ns(i)=(f(i)+f(i+1))*h/2;ends=sum(s)例4.10写出下列程序的执行结果。s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];fork=as=s+k;enddisp(s');例4.11从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。sum=0;n=0;x=input('Enteranumber(endin0):');while(x~=0)sum=sum+x;n=n+1;高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai6x=input('Enteranumber(endin0):');endif(n0)summean=sum/nend例4.12根据矩阵指数的幂级数展开式求矩阵指数。23e2!3!!nXXXXIXnLLX=input('EnterX:');E=zeros(size(X));F=eye(size(X));n=1;whilenorm(F,1)0E=E+F;F=F*X/n;n=n+1;endEexpm(X)%调用MATLAB矩阵指数函数求矩阵指数例4.13求[100,200]之间第一个能被21整除的整数。forn=100:200ifrem(n,21)~=0continueendbreakendn例4.14若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。例4.15用筛选法求某自然数范围内的全部素数。m=input('m=');高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai7p=1:m;p(1)=0;fori=2:sqrt(m)forj=2*i:i:mp(j)=0;endendn=find(p~=0);p(n)关于在p中划去i的倍数(不包括i),可利用矩阵运算一步完成,从而得到更为简洁的程序:m=input('m=');p=2:m;fori=2:sqrt(m)n=find(rem(p,i)==0&p~=i);p(n)=[];endp例4.16编写函数文件求半径为r的圆的面积和周长。函数文件如下:function[s,p]=fcircle(r)%CIRCLEcalculatetheareaandperimeterofacircleofradiir%r圆半径%s圆面积%p圆周长%2006年2月30日编s=pi*r*r;p=2*pi*r;将以上函数文件以文件名fcircle.m存盘,然后在MATLAB命令窗口调用该函数:[s,p]=fcircle(10)例4.17利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。函数文件tran.m:高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai8function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);调用tran.m的命令文件main1.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y);rhothe例4.18利用函数的递归调用,求n!。functionf=factor(n)ifn=1f=1;elsef=factor(n-1)*n;%递归调用求(n-1)!end在命令文件main2.m中调用函数文件factor.m求s=1!+2!+3!+4!+5!。s=0;fori=1:5s=s+factor(i);ends例4.19任意排列问题。MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。functionY=rndprm1(X)%RNDPRM1用for循环产生一个行向量的任意排列%RNDPRM1(X)产生行向量X的任意排列[m,n]=size(X);ifm1error('RNDPRM1acceptsasinputsonlyvectors');end高教社刘卫国《MATLAB程序设计与应用》(第二版)例题源程序第4章:MATLAB程序设计王成优©山东大学(威海)MATLAB语言WangChengyou©ShandongUniversity,Weihai9Y=[];%从一个空矩阵开始l=n;%X的元素个数fori=1:nk=1+fix(l*rand);%随机选择Y的下一个元素的位置x=X(k);%被选择的元素Y=[Y,x];%将X添加到Y中X(k)=[];%从X中删除x元素l=l-1;%更新X的元素个数end第二个程序用函数的递归调用:functionY=rndprm2(X