第04章_MATLAB程序设计_例题源程序.doc
精品文档,仅供学习与交流,如有侵权请联系网站删除第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 计算分段函数:x=input('请输入x的值:');if x=10 y=cos(x+1)+sqrt(x*x+1);else y=x*sqrt(x+sqrt(x);endy也可以用单分支if语句来实现:x=input('请输入x的值:');y=cos(x+1)+sqrt(x*x+1);if x=10 y=x*sqrt(x+sqrt(x);endy或用以下程序:x=input('请输入x的值:');if x=10 y=cos(x+1)+sqrt(x*x+1);endif x=10 y=x*sqrt(x+sqrt(x);endy例4.4 输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。c=input('请输入一个字符','s');if c>='A' & c<='Z' disp(setstr(abs(c)+abs('a')-abs('A');elseif c>='a'& c<='z' disp(setstr(abs(c)- abs('a')+abs('A');elseif c>='0'& c<='9' disp(abs(c)-abs('0');else disp(c);end例4.5 某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示): price<200 没有折扣 200price<500 3%折扣 500price<1000 5%折扣 1000price<2500 8%折扣 2500price<5000 10%折扣5000price 14%折扣输入所售商品的价格,求其实际销售价格。price=input('请输入商品价格');switch fix(price/100) case 0,1 %价格小于200 rate=0; case 2,3,4 %价格大于等于200但小于500 rate=3/100; case num2cell(5:9) %价格大于等于500但小于1000 rate=5/100; case num2cell(10:24) %价格大于等于1000但小于2500 rate=8/100; case num2cell(25:49) %价格大于等于2500但小于5000 rate=10/100; otherwise %价格大于等于5000 rate=14/100;endprice=price*(1-rate) %输出商品实际销售价格例4.6 矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。A=1,2,3;4,5,6;B=7,8,9;10,11,12;try C=A*B;catch C=A.*B;endClasterr %显示出错原因例4.7 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。for m=100:999m1=fix(m/100); %求m的百位数字m2=rem(fix(m/10),10); %求m的十位数字m3=rem(m,10); %求m的个位数字if m=m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend例4.8 已知,当n=100时,求y的值。y=0; n=100;for i=1:ny=y+1/i/i;endy在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:n=100;i=1:n;f=1./i.2;y=sum(f)例4.9 设,求s=。a=0; b=3*pi;n=1000; h=(b-a)/n;x=a; s=0;f0=exp(-0.5*x)*sin(x+pi/6);for i=1:n x=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);for i=1:n s(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;for k=a s=s+k;enddisp(s');例4.11 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。sum=0;n=0;x=input('Enter a number (end in 0):');while (x=0) sum=sum+x; n=n+1; x=input('Enter a number (end in 0):');endif (n>0) sum mean=sum/nend例4.12 根据矩阵指数的幂级数展开式求矩阵指数。X=input('Enter X:');E=zeros(size(X);F=eye(size(X);n=1;while norm(F,1)>0 E=E+F; F=F*X/n; n=n+1;endEexpm(X) %调用MATLAB矩阵指数函数求矩阵指数例4.13 求100,200之间第一个能被21整除的整数。for n=100:200if rem(n,21)=0 continueendbreakendn例4.14 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求1,500之间的全部完数。例4.15 用筛选法求某自然数范围内的全部素数。 m=input('m='); p=1:m; p(1)=0;for i=2:sqrt(m) for j=2*i:i:m p(j)=0; endendn=find(p=0);p(n)关于在p中划去i的倍数(不包括i),可利用矩阵运算一步完成,从而得到更为简洁的程序:m=input('m=');p=2:m;for i=2:sqrt(m) n=find(rem(p,i)=0&p=i); p(n)=;endp例4.16 编写函数文件求半径为r的圆的面积和周长。 函数文件如下:function s,p=fcircle(r)%CIRCLE calculate the area and perimeter of a circle of radii r%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:function rho,theta=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x); 调用tran.m的命令文件main1.m:x=input('Please input x=:');y=input('Please input y=:');rho,the=tran(x,y);rhothe例4.18 利用函数的递归调用,求n!。function f=factor(n)if n<=1 f=1;else f=factor(n-1)*n; %递归调用求(n-1)!end 在命令文件main2.m中调用函数文件factor.m求s=1!+2!+3!+4!+5!。s=0;for i=1:5 s=s+factor(i);ends例4.19 任意排列问题。MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。function Y=rndprm1(X)%RNDPRM1 用for循环产生一个行向量的任意排列%RNDPRM1(X)产生行向量X的任意排列m,n=size(X);if m>1 error('RNDPRM1 accepts as inputs only vectors');endY=; %从一个空矩阵开始l=n; %X的元素个数for i=1:nk=1+fix(l*rand); %随机选择Y的下一个元素的位置x=X(k); %被选择的元素 Y=Y,x; %将X添加到Y中 X(k)=; %从X中删除x元素 l=l-1; %更新X的元素个数end第二个程序用函数的递归调用:function Y=rndprm2(X)%RNDPRM2 用递归调用产生一个行向量的任意排列%RNDPRM2(X)产生一个X的任意排列m,n=size(X);l=n;if m>1 error('RNDPRM2 accepts as inputs only vectors')endif n<=1 Y=X;elsek=1+fix(l*rand); %随机选择Y的下一个元素的位置x=X(k); %被选择的元素X(k)=; %从X中删除x元素 Z=rndprm2(X); %将剩下的元素随机排列 Y=Z,x; %构造输出向量 l=l-1;end例4.20 nargin用法示例。 函数文件examp.m:function fout=charray(a,b,c)if nargin=1 fout=a;elseif nargin=2 fout=a+b;elseif nargin=3 fout=(a*b*c)/2;end 命令文件mydemo.m:x=1:3;y=1;2;3;examp(x)examp(x,y')examp(x,y,3)例4.21 全局变量应用示例。 先建立函数文件wadd.m,该函数将输入的参数加权相加。function f=wadd(x,y)global ALPHA BETAf=ALPHA*x+BETA*y; 在命令窗口中输入:global ALPHA BETAALPHA=1;BETA=2;s=wadd(1,2)【精品文档】第 10 页