第一轮上机练习题答案matlab程序设计练习解析.docx
- 文档编号:30640903
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:26
- 大小:134.03KB
第一轮上机练习题答案matlab程序设计练习解析.docx
《第一轮上机练习题答案matlab程序设计练习解析.docx》由会员分享,可在线阅读,更多相关《第一轮上机练习题答案matlab程序设计练习解析.docx(26页珍藏版)》请在冰豆网上搜索。
第一轮上机练习题答案matlab程序设计练习解析
练习1基础练习
一、矩阵及数组操作:
1.利用基本矩阵产生3×3和15×8的单位矩阵、全1矩阵、全0矩阵、均匀分布随机矩阵([-1,1]之间)、正态分布矩阵(均值为1,方差为4)。
解eye(3)eye(15,8)ones(3)ones(15,8)zeros(3)zeros(15,8)
X1=(1+(1-(-1))*rand(3))
X2=(1+(1-(-1))*rand(15,8))
Y1=1+sqrt(4)*randn(3)
Y2=1+sqrt(4)*randn(15,8)
2.利用fix及rand函数生成[0,10]上的均匀分布的10×10的整数随机矩阵a,然后统计a中大于等于5的元素个数。
解:
a=fix((10-0+1)*rand(10)+0)
x=5
i=find(a>=x)
n=length(i)
3.在给定的矩阵中删除含有整行内容全为0的行,删除整列内容全为0的列。
解:
A=[12234;00000;45623;00000;];
A([2,4],:
)=[]
B=A';
B(:
[2,4])=[]
二、绘图:
4.在同一图形窗口画出下列两条曲线图像:
y1=2x+5;y2=x^2-3x+1,
并且用legend标注。
解:
x=0:
0.01:
10;
y1=2*x+5;
y2=x.^2-3*x+1;
plot(x,y1,x,y2)
legend('y1','y2')
5.画出下列函数的曲面及等高线:
z=x^2+y^2+sin(xy).
解:
[x,y]=meshgrid(0:
0.25:
4*pi);
z=x.^2+y.^2+sin(x.*y);
contour3(x,y,z);
meshc(x,y,z)
三、程序设计:
6.编写程序计算(x在[-3,3],间隔0.01)
解:
x=input('ÇëÊäÈëxµÄÖµ:
');
ifx>=-3&x<-1
y=(-x.^2-4*x-3)/2;
elseifx>=-1&x<1
y=-x.^2+1;
elseifx>=1&x<=3
y=(-x.^2+4*x-3)/2;
else
y='error'
end
y
7.有一列分数序列:
求前15项的和。
解:
a=1;
b=2;
sum=0;
fork=1:
15
c=b/a;
sum=sum+c;
t=b;
b=a+b;
a=t;
end
sum
8.用至少三种方法编写函数实现求任意整数n的阶乘。
解:
法一:
s=factorial(n)
法二:
gamma(n)求出的是(n-1)!
法三:
n=input('pleaseinputn:
');
x=1:
n;
prod(x)
9.将任意大于6的偶数m写成两个素数p1、p2的和(试着写出所有的m=p1+p2的可能形式)。
解:
functiony=f(n);
n=input('ÇëÊäÈënµÄÖµ:
');
ifmod(n,2);
error('n²»ÊÇËØÊý.ÇëÖØÐÂÔËÐгÌÐò.')
elseifn<=6;
error('n±ØÐë´óÓÚ6.ÇëÖØÐÂÔËÐгÌÐò.')
else
form=1:
n;
fork=m:
n;
if(isprime(m))&(isprime(k))&(m+k==n);
disp([num2str(n),'=',num2str(m),'+',num2str(k)]);
break;
end;
end;
end;
end;
10.是否任意3的倍数m可以写成两个素数p1、p2、p3的和(试着写出所有的m=p1+p2+p3
的可能形式)?
解:
functiony=fg(n);
n=input('请输入n的值:
');
ifmod(n,3);
error('n不是3的倍数.请重新运行.')
elseifn<6;
error('n必须不小于6.')
else
form=1:
n;
fork=m:
n;
forp=k:
n
if(isprime(m))&(isprime(k))&(isprime(p))&(m+k+p==n);
disp([num2str(n),'=',num2str(m),'+',num2str(k),'+',num2str(p)]);
break;
end;
end;
end;
end;
end;
四、数据处理与拟合初步:
11.通过测量得到一组数据:
t
1
2
3
4
5
6
7
8
9
10
y
4.842
4.362
3.754
3.368
3.169
3.038
3.034
3.016
3.012
3.005
分别采用y=c1+c2e^(-t)和y=d1+d2te^(-t)进行拟合,并画出拟合曲线进行对比。
解:
t=1:
10;
y=[4.842,4.362,3.754,3.368,3.169,3.038,3.034,3.016,3.012,3.005];
x1=exp(-t);
x2=t.*exp(-t);
y1=polyfit(x1,y,1)
可以写出:
y1=5.2165*exp(-t)+3.1564
y2=polyfit(x2,y,1)
可以写出:
y2=5.0273*t.*exp(-t)+2.9973
plot(t,y,t,y1,'r--',t,y2,'gx')
另:
此题也可以采用工具箱直接进行运算。
12.计算下列定积分:
方法有很多种:
解:
(1)1建立被积函数文件
functionf=jifen1(t)
f=exp(-2*t);
2.在命令窗口输入:
[z1,n]=quad(@jifen1,0,2)
得到结果:
z1=0.4908n=25
(2)x=0:
0.01:
2;
z2=exp(2*x);
trapz(x,z2)
得到结果:
ans=26.8000
(3)z=quadl(inline('x.^2-3*x+0.5'),-1,1)
得到结果:
z=1.6667
13.微分方程组
当t=0时,x1(0)=1,x2(0)=-0.5,求微分方程t在[0,25]上的解,并画出相空间轨道图像。
解:
t=0:
0.01:
25;
[x,y]=dsolve('Dx=0.5-x','Dy=x-4*y','x(0)=1','y(0)=-0.5','t')
x=1/2+1/2*exp(-t)
y=1/8+1/6*exp(-t)-19/24*exp(-4*t)
plot(t,x,t,y)
图像:
t=0:
0.01:
25;
x=1/2+1/2*exp(-t);
y=1/8+1/6*exp(-t)-19/24*exp(-4*t);
plot(t,x,t,y)
14.设通过测量得到时间t与变量y的数据:
t=[00.30.81.11.62.3];
y=[0.50.821.141.251.351.41];
分别采用多项式:
y=a0+a1t+a2t2
和指数函数 y=b0+b1e^t+b2te^t
进行拟合,并计算均方误差、画出拟合效果图进行比较。
解:
此题可用工具箱来求解:
可在commendwindow中输入cftool,调出工具箱。
选择date;之后选择fitting,建立newfit,选择自定义,定义所需函数即可。
详细过程略。
15.观察函数:
y=e^x-1.5cos(2*pi*x)
在区间[-1,1]上的函数图像,完成下列两题:
(1)用函数fzero求解上述函数在[-1,1]的所有根,验证你的结果;
(2)用函数fminbnd求解上述函数在[-1,1]上的极小、极大、最小和最大值,在函数图像
上标出你求得的最小值点作出验证。
注:
可以用helpfzero命令查看fzero的调用格式,fzero典型的调用方法是:
fzero(@myfun,x0)%返回函数myfun在x0附近的根;
fminbnd典型的调用方法是:
fminbnd(@myfun,x1,x2)%返回函数myfun在区间[x1,x2]上的最小值。
解:
(1)x=-1:
0.01:
1;
y=exp(x)-1.5*cos(2*pi*x);
plot(x,y,'g')
holdon
y0=0;
plot(x,y0,'k')
z=fzero('f',-0.8)
z=
-0.7985
z=fzero('f',-0.1)
z=
-0.1531
z=fzero('f',0.1)
z=
0.1154
(2)f.m
functiony=f(x);
y=exp(x)-1.5*cos(2*pi*x);
x=fminsearch('f',-0.2,0.2)
x=
-0.0166
x=fminsearch('f',-1,1)
x=
-1.0062
f1.m
functiony=f(x);
y=-exp(x)+1.5*cos(2*pi*x);
x=fminsearch('f1',0.4,0.6)
x=
0.5288
x=fminsearch('f1',-0.6,-0.4)
x=
-0.4897
x1=-1.0062;
y1=exp(x1)-1.5*cos(2*pi*x1)
y1=
-1.1333
plot(x1,y1,'*')
练习2编程练习
1.题目:
判断101-200之间有多少个素数,并输出所有素数。
编写以fun1为名的脚本文件。
程序分析:
判断素数的方法:
用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
====================================================
t=1;
fori=101:
200
forj=1:
i
if(round(i/j)==(i/j)&j~=1&j~=i)
break
end
end
ifj==is(t)=i;t=t+1;
end
end
disp(['ËØÊý:
',num2str(s)])
length(s)
2.题目:
打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
例如:
153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
编写以fun2为名的脚本文件。
程序分析:
利用for循环控制100-999个数,每个数分解出个位,十位,百位。
fori=100:
999
n1=fix(i/100);
n2=fix((i-n1*100)/10);
n3=i-n1*100-n2*10;
if(n1^3+n2^3+n3^3==i)
disp(i)
end
end
3.题目:
将一个正整数分解质因数。
例如:
输入90,打印出90=2*3*3*5。
编写以fun3为名的函数文件。
程序分析:
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
n=input('ÇëÊäÈëÒªÇóµÄÊý:
');
A=factor(n);
str=sprintf('%d%s%d',n,'=',A(1,1));
[s,d]=size(A);
fori=2:
d
str=sprintf('%s%s%d',str,'*',A(1,i));
end
str
4.题目:
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
编写以fun4为名的函数文件。
==========================================================
str=input('ÊäÈë×Ö·û´®s','s')
len=length(str);
sz=0;
zm=0;
kg=0;
qt=0;
fori=1:
len
ifstr(i)>='0'&&str(i)<='9'
sz=sz+1;
elseif((str(i)>='A'&&str(i)<='Z')||(str(i)>='a'&&str(i)<='z'))
zm=zm+1;
elseifstr(i)==''
kg=kg+1;
else
qt=qt+1;
end
end
disp(['×Öĸ:
',num2str(zm)]);
disp(['Êý×Ö:
',num2str(sz)]);
disp(['¿Õ¸ñ:
',num2str(kg)]);
disp(['ÆäËû:
',num2str(qt)]);
5.题目:
一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如6=1+2+3.编程找出1000以内的所有完数。
编写以fun5为名的脚本文件。
===========================================================
forn=1:
1000
s=0;
fori=1:
n/2
ifrem(n,i)==0
s=s+i;
end;
end;
ifn==s
disp(n);
end
end
6.题目:
企业发放的奖金根据利润提成。
利润x低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润x,求应发放奖金总数?
编写以fun6为名的函数文件。
n=input('n=')
ifn<=10
i=0.1*n
else
if10 i=10*0.1+(n-10)*0.075 else if20 i=10*0.1+10*0.075+(n-20)*0.05 else if40 i=10*0.1+10*0.075+20*0.05+(n-40)*0.03 else if60 i=10*0.1+10*0.075+20*0.05+20*0.03+(n-60)*0.015 else n>100 i=10*0.1+10*0.075+20*0.05+20*0.03+40*0.015+(n-100)*0.01 end end end end end 7.题目: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 编写以fun7为名的脚本文件。 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足如下条件,即是结果。 =========================================================== fori=1: 10000 x=fix(sqrt(i+100)); y=fix(sqrt(i+268)); if(x*x==i+100&&y*y==i+268) i end end 8.题目: 输入三个整数x,y,z,请把这三个数由小到大输出。 编写以fun15为名的函数文件。 程序分析: 我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 ========================================================== x=input('ÊäÈëx: '); y=input('ÊäÈëy: '); z=input('ÊäÈëz: '); ifx>=y&&y>=z t=z; m=y; n=x; elseifx>=z&&z>=y t=y; m=z; n=x; elseify>=x&&x>=z t=z; m=x; n=y; elseify>=z&&z>=x t=x; m=z; n=y; elseifz>=x&&x>=y t=y; m=x; n=z; elseifz>=y&&y>=x t=x; m=y; n=z; end disp(['ÕâÈý¸öÊýÓÉСµ½´ó£º',num2str(t),num2str(m),num2str(n)]) 9.题目: 输出9*9口诀。 编写以fun9为名的脚本文件。 程序分析: 分行与列考虑,共9行9列,i控制行,j控制列。 =========================================================== fori=1: 9 forj=1: i k=i*j; fprintf([num2str(j),'*',num2str(i),'=',num2str(k),'\t']) end fprintf('\n') end 10.题目: 有一分数序列: 2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前n项之和。 输入n,输出和s。 编写以fun10为名的函数文件。 程序分析: 请抓住分子与分母的变化规律。 ========================================================== i=input('i=') a=2,b=1,s=0; forn=1: i s=s+a/b; t=a; a=a+b; b=t; end fprintf(['sumis: ',num2str(s)]) 11.题目: 编写以fun11为名的函数文件。 将所输入的5个字符,以相反顺序打印出来。 =========================================================== b=[34547] fori=1: 5 ifa(5) m=a(i); a(i)=a(5); a(5)=m;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第一轮 上机 练习题 答案 matlab 程序设计 练习 解析