MATLAB全部实验及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB全部实验及答案
实验一、MATLAB基本操作
实验内容及步骤
4、有关向量、矩阵或数组的一些运算
(1)设A=15;B=20;求C=A+B与c=a+b?
(2)设A=[1 2 3;4 5 6;7 8 9],B=[9 8 7;6 5 4;3 2 1];求A*B与
A.*B?
A*B就是线代里面的矩阵相乘 A.*B是对应位置的元素相乘(3)设a=10,b=20;求i=a/b=0.5与j=a\b=2?
(4)设a=[1 -2 3;4 5 -4;5 -6 7]
请设计出程序,分别找出小于0的矩阵元素及其位置(单下标、全
下标的形式),并将其单下标转换成全下标。
clear,clc
a=[1 -2 3;4 5 -4;5 -6 7];
[x,y]=find(a<0);
c=[];
for i=1:length(x)
c(i,1)=a(x(i),y(i));
c(i,2)=x(i);
c(i,3)=y(i);
c(i,4)=(y(i)-1)*size(a,2)+x(i);
end
c
(5)在MATLAB命令行窗口运行A=[1,2;3,4]+i*[5,6;7,8];看结果如何?如果改成运行A=[1,2;3,4]+i[5,6;7,8],结果又如何?前面那
个是虚数矩阵,后面那个出错
(6)请写出完成下列计算的指令:
a=[1 2 3;3 4 2;5 2 3],求a^2=?,a.^2=?
a^2= 22 16 16
25 26 23
26 24 28
a.^2=
1 4 9
9 16 4
25 4 9
(7)有一段指令如下,请思考并说明运行结果及其原因
clear
X=[1 2;8 9;3 6];
X( : ) 转化为列向量
(8)使用三元组方法,创建下列稀疏矩阵
2 0 8 0
0 0 0 1
0 4 0 0
6 0 0 0
方法一:
clear,clc
data=[2 8 1 4 6];
ir=[1 1 2 3 4 ];
jc=[1 3 4 2 1];
s=sparse(ir,jc,data,4,4);
full(s)
方法二:不用三元组法
clear,clc
a=zeros(4,4);
a(1,[1,3])=[2,8];
a(2,4)=1;
a(3,2)=4;
a(4,1)=6;
a
(9) 写出下列指令的运行结果
>> A = [ 1 2 3 ]; B = [ 4 5 6 ];
>> C = 3.^A
>> D = A.^B
5、 已知⎪⎭⎫
⎝⎛+⋅=-334sin 234πt e y t 若需要计算t ∈[-1,1],取间隔为
0.01,试计算出相对应的y 值。
用步长为0.01的for 循环 搞定
实验二、MATLAB 运算基础
实验内容及步骤
(一)
2、设有矩阵A和B,A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18
19 20;21 22 23 24 25],B=[3 0 16;17 -6 9;0 23 -4;9 7 0;4 13 11]
(1)求它们的乘积C
(2)将矩阵C的右下角3x2子矩阵赋给D
解:A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20;21 22
23 24 25];
B=[3 0 16;17 -6 9;0 23 -4;9 7 0;4 13 11];
c=A*B
D=c([3:5],[2:3])
D=c([3,4,5],[2,3])
3、已知A=[23 10 -78 0;41 -45 65 5;32 5 0 32;6 -54 92
14],取出其前3行构成矩阵B,其前两列构成矩阵C,其左下角3x2
子矩阵构成矩阵D,B与C的乘积构成矩阵E,分别求E<D、E&D、E|D、
~E|~D。
解:A=[23 10 -78 0;41 -45 65 5;32 5 0 32;6 -54
92 14];
B=A([1:3],:)
c=A(:,[1,2])
D=A([2:4],[1,2])
E=B*c
E<D,E&D,E|D,~E|~D
4、使用函数,实现矩阵左旋90°或右旋90°的功能
解:A=[23 10 -78 0;41 -45 65 5;32 5 0 32;6 -54 92 14] rot90(A)
rot90(A,3)
5、求S=20+21+22+23+24+……+210的值(提示:利用求和函数与累乘积函数。
)
解:a=2*ones(1,10)
b=cumprod(a)
c=sum(b)+1
aa=2*ones(1,11)
aa(1)=1
bb=cumprod(aa)
cc=sum(bb)
(二)
1、求[100,999]之间能被61整除的数及其个数(提示:先利用冒号表达式,
再利用find和length函数。
)
2、建立一个字符串向量,删除其中的大写字母(提示:利用find函数和空
矩阵。
)
解:1)clear,clc 2)clear,clc
t=[100:999]; b=['asSldSjfkSlGjFhslFf']
i=find(rem(t,61)==0); d=find(b<='Z'&b>='A');
t(i) b(d)=[]
d=size(i,1)*size(i,2)
3、写出使以下这段文字成为字符串的MATLAB指令。
注意保持这段文字的
格式:
在英式用法中,引号通常是单引号,如'Fire!'。
In GB usage quotation marks are usually single: 'fire!'.
解:a=['在英式用法中,引号通常是单引号,如''Fire!''。
' ];
b=['In GB usage quotation marks are usually single: ''fire!''. ' ];
c=strvcat(a,b)
4、用结构体数组来存储2名学生的基本情况数据,每名学生的数据包括
学号、姓名、专业和2门课程的成绩。
解:clear,clc
xuesheng=struct('num',{222,22},'name',{'mike','hike'},'major','te le','score',{rand(2,1)*100,rand(2,1)*100})
xuesheng.score
5、建立矩阵A并回答有关问题
A{1,1}=1;
A{1,2}='Brenden';
A{2,1}=reshape(1:9,3,3);
A{2,2}={12,34,2;54,21,3;4,23,67};
1)使用访问的方式如何将Brenden改写成BRENDEN?
2)分别执行A(3)=[]和A{3}=[]后,A的值各是多少?并说明原因。
解:A{1,1}=1;
A{1,2}='Brenden';
A{2,1}=reshape(1:9,3,3);
A{2,2}={12,34,2;54,21,3;4,23,67};
A{1,2}=upper(A{1,2})
A{3}=[]
A(3)=[]
6、利用MATLAB提供的rand函数和圆整函数随机生成4X3整数矩阵A,
进行如下操作
1)A各列元素的平均值和中值
2)A的最大元素和最小元素及它们的位置
3)求A的每行元素的和以及全部元素之和
4)分别对A的每列元素按升序、每行元素按降序排列
解:A=round(rand(4,3))
A_mean=mean(A)
A_median=median(A)
A_max=max(max(A))
A_min=min(min(A))
[x,y]=find(A==A_max)
[xx,yy]=find(A==A_min)
A_maxlocal=[x(1) y(1)]
A_minlocal=[xx(1) yy(1)]
A_rsum=sum(A,2)
A_sum=sum(sum(A))
A_csort=sort(A)
A_rsort=abs(sort(-A,2))
实验四 MATLAB循环结构程序设计
实验内容及步骤
1、分别使用for循环语句和while循环语句找出最小的n值,使得n!>10100,
并求出n!。
要求显示的结果为
n=70
n!=1.197857e+100>1e100
或
70!=1.197857e+100>1e100
用IF语句执行如下:
s=1;
for n=1:100
s=s*n;
if(s>10^100)
break;
end
end
str1=['n=',num2str(n)];
str2=['n!=',num2str(s)];
disp(str1)
disp(str2)
用WHILE语句执行如下:
n=1;
s=1;
while(s<=10^100)
s=s*n;
n=n+1;
end
str1=['n=',num2str(n-1)];
str2=['n!=',num2str(s)];
disp(str1)
disp(str2)
2、已知 f1=1,n=1
f2=0,n=2
f3=1,n=3
f n=f n-1-2f n-2+f n-3,n>3
求f1 ~ f50中:
1)最大值和最小值及它们的位置,各数之和(最大值给变量MAX,其位置给变量x,最小值给变量MIN,其位置给变量y,各数之和给变量SUM)。
2)正数、零、负数的个数(依次赋值给变量positive,zero,negative)。
法一: clear;
f(1)=1;
f(2)=0;
f(3)=1;
for n=4:50
f(n)=f(n-1)-2*f(n-2)+f(n-3);
end
[MAX,x]=max(f) %注意不要分号,要执行的语句
[MIN,y]=min(f)
SUM=sum(f)
positive=length(find(f>0))
zero=length(find(f==0))
negative=length(find(f<0))
MAX =
406631
x =
49
MIN =
-403795
y =
50
SUM =
76861
positive =
25
zero =
2
negative =
23
法二:clear all,clc
for n=1:50
if n==1
f(1)=1;
elseif n==2
f(2)=0;
elseif n==3
f(3)=1;
elseif n>3
f(n)=f(n-1)-2*f(n-2)+f(n-3);
end
end
[MAX,y]=max(f)
[Min,x]=min(f)
positive=length(find(f>0))
zero=length(find(f==0))
negative= length(find(f<0))
3、Fibonacci数组的元素满足Fibonacci规则:
a k+2=a k+a k+1,(k=1,2,3,…);且a1= a2=1。
请设计一段程序,求出该数组中第一个大于10000的元素
要求显示的结果为:
i=21
a(i)=10946
或者
a(21)=10946
法一:a(1)=1;
a(2)=1;
for k=1:10000 %不能是3:10000
a(k+2)=a(k)+a(k+1);
if a(k)>10000
break;
end
end
disp(['k=',num2str(k)])
disp(['a(k)=',num2str(a(k))])
法二:clear,clc
s=1;
for n=1:inf
s=s*n;
if s>10^100
break
end
end
fprintf('%d!=%1.6e>1e100\n',n,s)
实验五、MATLAB选择结构程序设计
实验内容及步骤
1、输入一个百分制成绩,要求输出成绩等级A、B、C、D、E。
其中90分
~100分为A,80分~89分为B,70分~79为C,60分~69分为D,60分
以下为E。
要求:1)分别用if语句和switch语句实现
2)对不合理的成绩应输出出错信息“输入的成绩不合理”(若
成绩出现小数,则只能是“.5”)
解:score=input('请输入您的分数:');
if rem(score,0.5)==0
switch score
case num2cell(90:0.5:100)
disp('您的成绩等级为 A')
case num2cell(80:0.5:89)
disp('您的成绩等级为 B')
case num2cell(70:0.5:79)
disp('您的成绩等级为 C')
case num2cell(60:0.5:69)
disp('您的成绩等级为 D')
case num2cell(0:0.5:59.5)
disp('您的成绩等级为 E')
otherwise
disp('你输入的成绩不合理')
end
else
disp('你输入的成绩不合理,若出现小数只能是0.5')
end
2、设计程序,完成两位数的加、减、乘、除四则运算,即产生两个两位
随机整数,再输入一个运算符号,做相应的运算,显示相应的结果,并要求结果显示类似于“a=x+y=34”。
(sy312.m)
解:a=input('请输入一个数:');
b=input('请再输入一个数:');
fuhao=input('请输入一个运算符号(+ - * /):','s');
switch fuhao
case {'+'}
he=a+b;
disp(['输入的两数和=',num2str(a),'+',num2str(b),'=',num2str(he)])
case {'-'}
he=a-b;
disp(['输入的两数差=',num2str(a),'-',num2str(b),'=',num2str(he)])
case {'*'}
he=a*b;
disp(['输入的两数乘积=',num2str(a),'*',num2str(b),'=',num2str(he)])
case {'/'}
he=a/b;
disp(['输入的两数商=',num2str(a),'/',num2str(b),'=',num2str(he)])
otherwise disp('请输入正确的符号')
end
3、求下列分段函数的值
2 2 2
6,0 56,
1,
y
χχχχ
χχχχχ
χχ
⎧+-<≠
⎪
=-+≤≠≠⎨
⎪--
⎩
且-3
0<10,2且3
其他
要求:用if语句实现,分别输出x = -5.0,-3.0,1.0,2.0,2.5,
3.0,5.0时的y值。
其中x的值以向量的形式从键盘输入。
(sy313.m)
解:x=[];
y=[];
x=input('请输入x的值:');
for k=1:length(x)
if x(k)<0 & x(k)~=-3
y(k)=x(k).^2+x(k)-6;
elseif x(k)>=0&x(k)<10&x(k)~=2&x(k)~=3
y(k)=x(k).^2-5*x(k)+6;
else
y(k)=x(k).^2-x(k)-1;
end
end
for i=1:length(y)
disp(['y(',num2str(x(i)),')','=',num2str(y(i))]);
end
实验六 MATLAB函数文件程序设计
实验内容及步骤
1、编写一个函数文件chengji.m,用于求两个矩阵的乘积和点乘,然后在命
令行窗口中调用该函数(提示:使用varargout函数)
要求:1)当两矩阵是尺寸相同的方阵时,返回它们的乘积和点乘。
2)当两矩阵不是尺寸相同的方阵时,则根据它们的尺寸,分别进行乘积或点乘
3)当两矩阵的尺寸不能满足乘积或点乘的要求时,则提示“这两个矩阵不能乘”
解:function varargout=chengji(a,b) [x,y]=size(a);
[xx,yy]=size(b);
if xx==yy&x==y&x==xx
varargout{1}=a*b;
varargout{2}=a.*b;
elseif x==xx&y==yy
varargout{1}=a.*b;
disp('只能做点乘')
varargout{2}=0;
elseif x==yy&xx==y
disp('可以做两种矩阵乘') varargout{1}=a*b;
varargout{2}=b*a;
elseif x==yy||xx==y
try
varargout{1}=a*b;
disp('只能做矩阵乘')
varargout{2}=0;
catch
varargout{1}=b*a;
disp('只能做矩阵乘')
varargout{2}=0;
end
else
error('这两个矩阵不能乘')
end
2、编写一函数qiuhe.m,实现sum(A)的功能,其中A为矩阵。
解:function y=qiuhe(a)
y=[];
[x,yy]=size(a);
if x==1
s=0;
for k=1:yy
s=s+a(1,k);
end
y=s;
else
for j=1:yy
s=0;
for i=1:x
s=s+a(i,j);
end
y(1,j)=s;
end
end
3、编写一个阶乘函数jiecheng.m,然后在试验三的编程题“分别使用for
和while语句找出最小的n值,使得n!>10100,并求出n!”程序中调用该函数。
解:function s=jiecheng(n)
s=1;
if n==0
s=1;
elseif n<0
error('n必须大于等于0')
else
for i=1:n
s=s*i;
end
end
实验八数据插值与曲线拟合实验
实验内容
1.已知原始数据)5/
=
=,,插值点为pi
x-
=,试
pi
4:3.0:0
xi*
*
y
exp(
sin(
).
x
4:1:0x
*
用四种不同的插值方法进行插值,并在一副图中绘出四种插值曲线。
解:clear,clc
x=0:1:4*pi;
y=sin(x).*exp(-x/5);
xi=0:0.3:4*pi;
y1=interp1(x,y,xi,'nearset');
y2=interp1(x,y,xi,'linear');
y3=interp1(x,y,xi,'spline');
y4=interp1(x,y,xi,'cubic');
plot(x,y,'-m',xi,y1,'*r',xi,y2,'ok',xi,y3,'^b',xi,y4,'+g')
legend('原始数据','最近点插值','线性插值','样条插值','立方插值')
title('第一题四种插值方法进行插值','FontName','隶书','FontSize',20) xlabel('X轴','FontName','隶书','FontSize',16)
ylabel('Y轴','FontName','隶书','FontSize',16)
2.考虑下面的数据,一位举重教练收集了不同性别的举重动员每个年龄的最大举重磅数,他相信这三者之间存在着函数关系,请创建一个年龄数组,以便估算当前队伍中队员(要求13~20岁每一岁都有)的最大举重。
t=[13 15 17 19 20];
sex=[0,1]';
y=[270 290 330 350 380;250 270 310 330 360 ];
x=[13:20];
sex_2=[0,1]';
y_2=interp2(t,sex,y,x,sex_2)
surf(x,sex_2,y_2)
3.某乡镇企业2004-2010年的生产利润如下
要求用多项式拟合法预测出该企业2011年和2012年的利润,并绘出拟合图。
解:x=2004:2010;
y=[70 122 144 152 174 196 202];
k=polyfit(x,y,1); %得到系数
x1=2004:2013;
y1=polyval(k,x1);
plot(x,y,'-ro',x1,y1,'-b*');
title('某乡镇企业2004-2013年的生产利润')
legend('04-10年的利润','04-13年的利润趋势线')
xlabel('年份');
ylabel('利润');
text(2011,polyval(k,2011),'<---2011年利润')
text(2012,polyval(k,2012),'<---2012年利润')
grid on
4. 先使用命令load 加载census.mat 得到一组数据(cdate,pop ),该数据是美国自1790到1990年(以10年为一单位)的总人口。
利用回归法拟合,预测出美国在2010年的人口总数,写出拟合模型),(2210cdate x pop y x a x a a y 为为其中++=,并绘出拟合图。
解:clear all,clc
load('census.mat');
nian=[1990:2010];
p=polyfit(cdate,pop,2);
z=polyval(p,cdate);
zz=polyval(p,nian);
my=mean(pop);
mz=mean(z);
R=sum((pop-my).*(z-mz))./sqrt(sum((pop-my).^2).*sum((z-mz).^2)) plot(cdate,pop,'*',cdate,z,'r',nian,zz,'b-')
xlabel('年份(十年)','FontName','隶书','FontSize',16)
ylabel('人口(百万)','FontName','隶书','FontSize',16)
title('第四题美国自1790-1990年的总人口','FontName','隶书','FontSize',20)
text(1990, 248.73,'<----之后为拟合数据')
legend('原数据','拟合曲线')
实验九 MATLAB绘图
实验内容
1、二维图形的绘制
1)设计程序,在一个图形窗体中画出函数y=e x和y=logx的特性曲线。
其中y=e x中x取值为(-2:0.1:2),y=logx中x取值为(0.1:0.1:5)。
要求:要有图例、标题('二维图')、坐标轴标签('x轴数据'和'y
轴数据');每条曲线的clm自己设置。
解:clear,clc
x1=-2:0.1:2;
y1=exp(x1);
x2=0.1:0.1:5;
y2=log(x2);
plot(x1,y1,'-r',x2,y2,'-b');
title('二维图');
legend('y=exp(x)','y=log(x)');
xlabel('x轴数据');
ylabel('y轴数据');
grid on;
2)绘制tan图形,其中x的取值为(0:pi/30:pi/2)。
要求:要有图例、标题、坐标轴标签('x轴数据'和'y轴数据');曲线的clm 自己设置。
绘制出的图形应如下右图所示。
解:x=0:pi/100:pi/2;
y=tan(x);
plot(x,y,'-r+');
axis([0 pi/2 0 5]);
title('正切函数');
legend('y=tan(x)');
xlabel('x轴数据');
ylabel('y轴数据');
3)绘制曲线 x=tcos(3t)
y=tsin2t 其中-π≤t≤π,步长取π/100。
要求:要有图例、标题、坐标轴标签;每条曲线的clm
自己设置。
解:clear,clc
t=-pi:pi/100:pi;
x=t.*cos(3*t);
y=t.*sin(t).^2;
plot(x,y);
title('曲线图');
legend(strvcat('x=tcos(3t)','y=tsin^2t'));
xlabel('x轴数据');
ylabel('y轴数据');
2、三维图形的绘制
分别用线框图和曲面图表现函数z=cos(x)sin(y)/y,其中x的取值为[-1.5pi,1.5pi],y=x,要求:要有标题、坐标轴标签
解:clear,clc
[x,y]=meshgrid(-1.5*pi:1.5*pi); z=cos(x).*sin(y)./y;
subplot(1,2,1);
surf(x,y,z)
title('三维曲线图01');
xlabel('x轴数据');
ylabel('y轴数据');
zlabel('z轴数据');
subplot(1,2,2);
mesh(x,y,z);
title('三维曲线图02');
xlabel('x轴数据');
ylabel('y轴数据');
zlabel('z轴数据');
3、特殊图形的绘制
自己举例使用子图的方式绘制出条状图、面积图、饼图、火柴杆图四种图形式。
解:clear,clc
data=[3 6 5;7 6 9;1 2 4];
subplot(2,2,1);
bar(data);
grid on;
title('条状图');
subplot(2,2,2);
area(data);
grid on;
title('面积图');
A=[0.31 0.26 0.19 0.08];
subplot(2,2,3);
pie(A);
title('饼图');
x=0:pi/20:pi*0.5;
y=2*exp(-x).*cos(2*x);
subplot(2,2,4);
stem(x,y,'fill');
grid on;
title('火柴杆图');
4、思考题:要绘制出如图所示的图形,请正确填写下列空格subplot( , , );plot(1:10);grid on; subplot( , , );plot(peaks);grid on; subplot( , , );plot(membrane);grid on; subplot( , , );surf(membrane);grid on;。