第04章MATLAB程序设计例题源程序.docx
《第04章MATLAB程序设计例题源程序.docx》由会员分享,可在线阅读,更多相关《第04章MATLAB程序设计例题源程序.docx(13页珍藏版)》请在冰豆网上搜索。
第04章MATLAB程序设计例题源程序
第4章MATLAB程序设计
例建立一个命令文件将变量a,b的值互换,然后运行该命令文件。
程序1:
首先建立命令文件并以文件名存盘:
clear;
a=1:
10;
b=[11,12,13,14;15,16,17,18];
c=a;a=b;b=c;
a
b
然后在MATLAB的命令窗口中输入exch,将会执行该命令文件。
程序2:
首先建立函数文件:
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)
例求一元二次方程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))]);
例计算分段函数:
x=input('请输入x的值:
');
ifx==10
y=cos(x+1)+sqrt(x*x+1);
else
y=x*sqrt(x+sqrt(x));
end
y
也可以用单分支if语句来实现:
x=input('请输入x的值:
');
y=cos(x+1)+sqrt(x*x+1);
ifx~=10
y=x*sqrt(x+sqrt(x));
end
y
或用以下程序:
x=input('请输入x的值:
');
ifx==10
y=cos(x+1)+sqrt(x*x+1);
end
ifx~=10
y=x*sqrt(x+sqrt(x));
end
y
例输入一个字符,假设为大写字母,那么输出其对应的小写字母;假设为小写字母,那么输出其对应的大写字母;假设为数字字符那么输出其对应的数值,假设为其他字符那么原样输出。
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
disp(c);
end
例某商场对顾客所购置的商品实行打折销售,标准如下(商品价格用price来表示):
price<200没有折扣
200≤price<5003%折扣
500≤price<10005%折扣
1000≤price<25008%折扣
2500≤price<500010%折扣
5000≤price14%折扣
输入所售商品的价格,求其实际销售价格。
price=input('请输入商品价格');
switchfix(price/100)
case{0,1}%价格小于200
rate=0;
case{2,3,4}%价格大于等于200但小于500
rate=3/100;
casenum2cell(5:
9)%价格大于等于500但小于1000
rate=5/100;
casenum2cell(10:
24)%价格大于等于1000但小于2500
rate=8/100;
casenum2cell(25:
49)%价格大于等于2500但小于5000
rate=10/100;
otherwise%价格大于等于5000
rate=14/100;
end
price=price*(1-rate)%输出商品实际销售价格
例矩阵乘法运算要求两矩阵的维数相容,否那么会出错。
先求两矩阵的乘积,假设出错,那么自动转去求两矩阵的点乘。
A=[1,2,3;4,5,6];
B=[7,8,9;10,11,12];
try
C=A*B;
catch
C=A.*B;
end
C
lasterr%显示出错原因
例一个三位整数各位数字的立方和等于该数本身那么称该数为水仙花数。
输出全部水仙花数。
form=100:
999
m1=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*m3
disp(m)
end
end
例
,当n=100时,求y的值。
y=0;n=100;
fori=1:
n
y=y+1/i/i;
end
y
在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:
n=100;
i=1:
n;
f=1./i.^2;
y=sum(f)
例设
,求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);
fori=1:
n
x=x+h;
f1=exp(-0.5*x)*sin(x+pi/6);
s=s+(f0+f1)*h/2;
f0=f1;
end
s
上述程序来源于传统的编程思想。
也可以利用向量运算,从而使得程序更加简洁,更赋有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:
n
s(i)=(f(i)+f(i+1))*h/2;
end
s=sum(s)
例写出以下程序的执行结果。
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
fork=a
s=s+k;
end
disp(s');
例从键盘输入假设干个数,当输入0时结束输入,求这些数的平均值和它们之和。
sum=0;
n=0;
x=input('Enteranumber(endin0):
');
while(x~=0)
sum=sum+x;
n=n+1;
x=input('Enteranumber(endin0):
');
end
if(n>0)
sum
mean=sum/n
end
例根据矩阵指数的幂级数展开式求矩阵指数。
X=input('EnterX:
');
E=zeros(size(X));
F=eye(size(X));
n=1;
whilenorm(F,1)>0
E=E+F;
F=F*X/n;
n=n+1;
end
E
expm(X)%调用MATLAB矩阵指数函数求矩阵指数
例求[100,200]之间第一个能被21整除的整数。
forn=100:
200
ifrem(n,21)~=0
continue
end
break
end
n
例假设一个数等于它的各个真因子之和,那么称该数为完数,如6=1+2+3,所以6是完数。
求[1,500]之间的全部完数。
例4.15用筛选法求某自然数范围内的全部素数。
m=input('m=');
p=1:
m;p
(1)=0;
fori=2:
sqrt(m)
forj=2*i:
i:
m
p(j)=0;
end
end
n=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)=[];
end
p
例编写函数文件求半径为r的圆的面积和周长。
函数文件如下:
function[s,p]=fcircle(r)
%CIRCLEcalculatetheareaandperimeterofacircleofradiir
%r圆半径
%s圆面积
%p圆周长
%2006年2月30日编
s=pi*r*r;
p=2*pi*r;
将以上函数文件以文件名存盘,然后在MATLAB命令窗口调用该函数:
[s,p]=fcircle(10)
例利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
函数文件:
function[rho,theta]=tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);
调用的命令文件:
x=input('Pleaseinputx=:
');
y=input('Pleaseinputy=:
');
[rho,the]=tran(x,y);
rho
the
例利用函数的递归调用,求n!
。
functionf=factor(n)
ifn<=1
f=1;
else
f=factor(n-1)*n;%递归调用求(n-1)!
end
在命令文件中调用函数文件求s=1!
+2!
+3!
+4!
+5!
。
s=0;
fori=1:
5
s=s+factor(i);
end
s
例4.19任意排列问题。
MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。
编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。
functionY=rndprm1(X)
%RNDPRM1用for循环产生一个行向量的任意排列
%RNDPRM1(X)产生行向量X的任意排列
[m,n]=size(X);
ifm>1
error('RNDPRM1acceptsasinputsonlyvectors');
end
Y=[];%从一个空矩阵开始
l=n;%X的元素个数
fori=1:
n
k=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)
%RNDPRM2用递归调用产生一个行向量的任意排列
%RNDPRM2(X)产生一个X的任意排列
[m,n]=size(X);
l=n;
ifm>1
error('RNDPRM2acceptsasinputsonlyvectors')
end
ifn<=1
Y=X;
else
k=1+fix(l*rand);%随机选择Y的下一个元素的位置
x=X(k);%被选择的元素
X(k)=[];%从X中删除x元素
Z=rndprm2(X);%将剩下的元素随机排列
Y=[Z,x];%构造输出向量
l=l-1;
end
例nargin用法例如。
函数文件:
functionfout=charray(a,b,c)
ifnargin==1
fout=a;
elseifnargin==2
fout=a+b;
elseifnargin==3
fout=(a*b*c)/2;
end
命令文件:
x=[1:
3];
y=[1;2;3];
examp(x)
examp(x,y')
examp(x,y,3)
例全局变量应用例如。
先建立函数文件,该函数将输入的参数加权相加。
functionf=wadd(x,y)
globalALPHABETA
f=ALPHA*x+BETA*y;
在命令窗口中输入:
globalALPHABETA
ALPHA=1;
BETA=2;
s=wadd(1,2)