matlab第2章练习及答案.docx
《matlab第2章练习及答案.docx》由会员分享,可在线阅读,更多相关《matlab第2章练习及答案.docx(19页珍藏版)》请在冰点文库上搜索。
matlab第2章练习及答案
第二章例题
命令文件(ScriptFile)和函数文件(FunctionFile)例2-1
建立一个M文件,其功能是:
用两个实变量R、M生成复变量RM,然后运行该M文件。
程序1:
建立一个命令文件。
clear;
R=[1,2,3;4,5,6];
M=[11,12,13;14,15,16];
RM=R+i*M
以文件名setcomp保存命令文件,然后在MATLAB的命令窗口中输入setcomp,将会执行该命令文件,输出为:
程序2:
建立一个函数文件。
functionRM=fsetcomp(R,M)
RM=R+i*M;
以文件名fsetcomp保存命令文件,
然后在MATLAB的命令窗口中输入fsetcomp,将会输出出错信息。
在命令窗口输入:
a=[1,2,3;4,5,6];
b=[11,12,13;14,15,16];
c=fsetcomp(a,b)
顺序结构例2-2
求一元二次方程ax2 + bx + c = 0的根。
由于MATLAB能进行复数运算,所以不需要判断方程的判别式,而直接根据求根公式求根。
程序如下:
a=2;
b=6;
c=3;
%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))]);
用网孔分析法或节点电压法分析
1、用网孔分析法求下图中电流I1,I2,I3
解:
建模:
(1)标出网孔电流方向及符号(如下图)
(2)列网孔方程
(3)写成矩阵形式
(4)待求量与网孔电流的关系
I1=Ia;I2=-Ib;I3=Ia-Ib;
编程:
clear,closeall,formatcompact
R1=6;R2=3;R3=6;Us1=24;Us2=30;%输入已知参数
r11=R1+R3;r12=-R3;%为已知矩阵元素赋值
r21=-R3;r22=R2+R3;
R=[r11r12;r21r22];Us=[Us1;Us2];%列出已知矩阵
I=R\Us;%算出未知矩阵
Ia=I
(1),Ib=I
(2),%从矩阵元素中求出网孔电流
pause(5)%暂停5秒
I1=Ia;I2=-Ib;I3=Ia-Ib;%写出待求量与网孔电流的关系
disp(['I1=',num2str(I1),',I2=',num2str(I2),',I3=',num2str(I3)]);
选择结构例2-3
%判断是否为偶数,单分支
x=input('输入x=');%当x为矩阵时,逻辑判断里面的每一个元素
ifrem(x,2)==0
disp('xiseven');
end
%判断是否全为偶数,双分支
x=input('输入x=');
ifrem(x,2)==0
disp('xisalleven');
else
disp('xisnotalleven');
end
%计算分段函数:
程序如下:
x=input('请输入x的值:
');
ifx<0
y=log(x*x+1)+sqrt(x*x+1);
else
y=sin(x)/(x+1);
end
disp(y)
多分支if语句:
例2-4
%%判断是否全为偶数,多分支
x=input('输入x=');
ifisempty(x)
disp('xisempty')
elseifisnan(x)
disp('xisnotanumber')
elseifisinf(x)
disp('xisainf')
elseifisstr(x)
disp('xisastring')
elseifrem(x,2)==0
disp('xisalleven');
elsedisp('xisnotalleven');
end
%输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应数的平方,若为其他字符则原样输出。
c=input('请输入一个字符','s');
ifc>='A'&c<='Z'
disp(lower(c));
elseifc>='a'&c<='z'
disp(upper(c));
elseifc>='0'&c<='9'
disp(str2num(c)^2);
else
disp(c);
end
switch语句例2-5:
将上例改用switch语句实现。
c=input('请输入一个字符:
','s');
cc=abs(c);
switch(cc)
casenum2cell(abs('A'):
abs('Z'))
disp(lower(c));
casenum2cell(abs('a'):
abs('z'))
disp(upper(c));
casenum2cell(abs('0'):
abs('9'))
disp((abs(c)-abs('0'))^2);
otherwise
disp(c);
end
%num2cell函数是将数值矩阵转化为单元矩阵,num2cell(1:
5)等价于{1,2,3,4,5}。
%编写一个函数,将百分制的学生成绩转换为五级制的成绩
functionf=trangrade(x)
switchfix(x/10)%向0舍入为整数
case{10,9}
f='A';
case8
f='B';
case7
f='C';
case6
f='D';
otherwise
f='E';
end
try语句例2-6
矩阵乘法运算要求两矩阵的维数相容,否则会出错。
先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。
A=input('请输入A矩阵:
');
B=input('请输入B矩阵:
');
lasterr('');%清除原有的错误信息
try
C=A*B;
catch
C=A.*B;
end
C
disp(lasterr)%显示出错原因
分别计算[123;456],[789;101112]和[123;456],[12;34;56]时的值
%计算各元素的和,如果有输入元素出错则输出和为0并显示出错的原因
x=input('请输入');
try
sum=sum(x)
catch
sum=0,
end
lasterr%显示出错的原因
分别输入[123b9]和[12379]
for语句例2-7
%一个3位整数各位数字的立方和等于该数本身则称该数为水仙花数。
输出全部水仙花数。
shu=[];%用于存放结果,先赋空值
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
shu=[shu,m];%存入结果
end
end
shu
%用for语句为数组x赋值
x
(1)=10;
fori=2:
6
x(i)=2*x(i-1);
end
plot(x)
x
%AnM-filescripttoproduce"flowerpetal"plots
theta=-pi:
0.01:
pi;
rho(1,:
)=2*sin(5*theta).^2;
rho(2,:
)=cos(10*theta).^3;
rho(3,:
)=sin(theta).^2;
rho(4,:
)=5*cos(3.5*theta).^3;
fori=1:
4
polar(theta,rho(i,:
))%极坐标画图
pause
end
%已知
,求y的值
y=0;
n=100;
fori=1:
n
y=y+(-1)^(i-1)/i;
end
disp(y)
%写出下列程序的执行结果。
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
fork=a
s=s+k;
end
disp(s);
while语句例2-8
求使最小的n。
程序如下:
y=0;
n=0;
while(y<=1.5)
n=n+1;
y=y+1/n/n;
end
disp(['满足条件的n是:
',num2str(n)])
%输入两个整数,求它们的最小公倍数。
程序如下:
x=input('请输入第一个数:
');
y=input('请输入第二个数:
');
z=max(x,y);
whileor(rem(z,x)~=0,rem(z,y)~=0)
z=z+1;
end
disp([num2str(x),'和',num2str(y),'的最小公倍数是:
',num2str(z)])
%搜寻最小的阶乘为100位数字的整数n值。
n=1;
whileprod(1:
n)<1e99%prod(1:
n)是把1到n之间的元素相乘
n=n+1;
end
n
break语句例2-9
%搜寻最小的阶乘为100位数字的整数n值。
也可以编写程序如下:
n=1;
whilen>0
n=n+1;
ifprod(1:
n)>=1e99%prod(1:
n)是把1到n之间的元素相乘
break
end
end
n
%设计一个计算平均成绩及不及格率的程序,若输入成绩为负值,则显示出错信息
clear,closeall
sum=0;%给总分初始值
fail=0;%给不及格人数初始值
x=input('输入成绩');
fori=1:
length(x)
ifx(i)<0
disp('Error:
variablemustbepositive');
break;
elseifx(i)<60
fail=fail+1;
end
sum=sum+x(i);
end
ifx>0
average=sum/length(x)
failrate=fail/length(x)
end
continue语句例2-10
%设计一个计算及格率及不及格率的程序,
x=input('请输入成绩')
i=0;m=0;n=0;%n不及格人数,m及格人数,给初始值
whileii=i+1;
ifx(i)>=60
m=m+1;
continue
end
n=n+1;
end
pass=m/i
fail=n/i
【例2.12】设x,y,z均为正整数,求下列不定方程组共有多少组解。
这类方程的个数少于未知数的个数的方程称为不定方程,一般没有唯一解,而有多组解。
对于这类问题,可采用穷举法,即将所有可能的取值一个一个地去试,看是否满足方程,如满足即是方程的解。
首先确定3个变量的可取值,x、y、z均为正整数,所以3个数的最小值是1,而其和为20,所以3者的最大值是18。
n=0;
a=[];
forx=1:
18
fory=1:
18
z=20-x-y;
if25*x+20*y+16*z==400
a=[a;x,y,z];
n=n+1;
end
end
end
disp(['方程组共有',num2str(n),'组解']);
disp(a)
函数文件的基本结构例2-11:
functiony=mean(x,dim)
%MEANAverageormeanvalue.
%Forvectors,MEAN(X)isthemeanvalueoftheelementsinX.For
%matrices,MEAN(X)isarowvectorcontainingthemeanvalueof
%eachcolumn.ForN-Darrays,MEAN(X)isthemeanvalueofthe
%elementsalongthefirstnon-singletondimensionofX.
%
%MEAN(X,DIM)takesthemeanalongthedimensionDIMofX.
%
%Example:
IfX=[012
%345]
%
%thenmean(X,1)is[1.52.53.5]andmean(X,2)is[1
%4]
%
%SeealsoMEDIAN,STD,MIN,MAX,COV.
%Copyright1984-2002TheMathWorks,Inc.
%$Revision:
5.17$$Date:
2002/06/0517:
06:
39$
ifnargin==1,
%DeterminewhichdimensionSUMwilluse
dim=min(find(size(x)~=1));
ifisempty(dim),dim=1;end
y=sum(x)/size(x,dim);
else
y=sum(x,dim)/size(x,dim);
end
函数定义行定义了的函数的名称,以及输入输出参数的数量和名称
H1行当使用lookfor命令来查询函数的帮助时显示的信息
帮助文本用help命令可查询到帮助文本
函数主体函数中真正计算和输出赋值等工作的代码
注释为了增加函数体中代码的可读性而加入的说明性文本
用type命令可显示以上所有的信息
编写求一个向量之和以及向量平均值的函数文件。
function[s,m]=fvector(v)
%VECTORfvector.mcalculatessumandmeanofavector
%v向量
%s和
%m平均值
%2008年12月10日编
[m,n]=size(v);
if(m>1&n>1)|(m==1&n==1)
error('Inputmustbeavector')
end
s=sum(v);%求向量和
m=s/length(v);%求向量平均值
将以上函数文件以文件名fvector.m存盘,然后在MATLAB命令窗口调用该函数:
[s,p]=fvector(1:
10)
用lookfor、help、type命令分别显示函数的相关信息
函数文件中的return语句例2-12
编写一个计算阶乘的函数,如果阶乘的值小于等于四位,则输出阶乘的值y。
如果阶乘的值大于四位,则输出最小的阶乘为5位数字的整数i
functionf=prod1(m)
f=1;
fori=2:
m
iff>=1e4
f=i-1;
return%中止当前执行的命令,返回到调用函数或等待键盘输入指令
end
f=f*i;
end
函数调用例2-13
利用函数文件,实现直角坐标(x,y)与极坐标(ρ,)之间的转换。
函数文件tran.m:
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)
利用函数的递归调用,求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
nargin用法示例例2-14
输入参数为一个时进行平方运算,输入参数为两个时进行加法运算,为三个时,三个参数相乘除以3。
functionfout=charray(a,b,c)
ifnargin==1
fout=a.^2;
elseifnargin==2
fout=a+b;
elseifnargin==3
fout=(a*b*c)/2;
end
命令文件main3.m:
x=examp(1:
3)
y=examp(1:
3,4:
6)
z=examp(1:
3,[1;2;3],15)
全局变量应用例2-15
函数文件wadd.m
functionf=wadd(x,y)
globalALPHABETA
f=ALPHA*x+BETA*y;
在命令窗口中输入:
globalALPHABETA
ALPHA=1;
BETA=2;
s=wadd(1,2)
程序优化例2-16
计算,当n = 100时,求y的值。
tic
y=0;
n=10000;
fori=1:
n
y=y+1/i/i;
end
toc
disp(y)
%向量求和
tic
n=10000;
i=1:
n;
f=(-1).^(i-1)./i;
y=sum(f);
toc
disp(y)
clear;
a=0;
forn=2:
1000
a(n)=a(n-1)+10;
end
%预留内存空间2:
clear;
a=zeros(1,1000);
forn=2:
1000
a(n)=a(n-1)+10;
end
clear;
a=rand(1000);%生成一个32×32的矩阵
tic
x=a.^3;
toc
tic
y=a.*a.*a;
toc