2014 第一轮上机练习题答案matlab程序设计练习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习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=[1 2 2 3 4;0 0 0 0 0;4 5 6 2 3;0 0 0 0 0;];
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µÄÖµ:');
if x>=-3&x<-1
y=(-x.^2-4*x-3)/2;
elseif x>=-1&x<1
y=-x.^2+1;
elseif x>=1&x<=3
y=(-x.^2+4*x-3)/2;
else
y='error'
end
y
7.有一列分数序列:
求前15项的和。
解:a=1;
b=2;
sum=0;
for k=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('please input n:');
x=1:n;
prod(x)
9.将任意大于6的偶数m写成两个素数p1、p2的和(试着写出所有的m=p1+p2的可能形式)。
解:function y=f(n);
n=input('ÇëÊäÈënµÄÖµ:');
if mod(n,2);
error('n²»ÊÇËØÊý.ÇëÖØÐÂÔËÐгÌÐò.')
elseif n<=6;
error('n±ØÐë´óÓÚ6.ÇëÖØÐÂÔËÐгÌÐò.')
else
for m=1:n;
for k=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
的可能形式)?
解:function y=fg(n);
n=input('请输入n的值:');
if mod(n,3);
error('n不是3的倍数.请重新运行.')
elseif n<6;
error('n必须不小于6.')
else
for m=1:n;
for k=m:n;
for p=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.通过测量得到一组数据:
分别采用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建立被积函数文件
function f=jifen1(t)
f=exp(-2*t);
2.在命令窗口输入:
[z1,n]=quad(@jifen1,0,2)
得到结果:
z1=0.4908 n =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=[0 0.3 0.8 1.1 1.6 2.3];
y=[0.5 0.82 1.14 1.25 1.35 1.41];
分别采用多项式:y=a0+a1t+a2t2
和指数函数y=b0+b1e^t+b2te^t
进行拟合,并计算均方误差、画出拟合效果图进行比较。
解:此题可用工具箱来求解:可在commend window中输入cftool,调出工具箱。
选择date;之后选择fitting,建立new fit,选择自定义,定义所需函数即可。
详细过程略。
15.观察函数:y=e^x-1.5cos(2*pi*x)
在区间[-1,1]上的函数图像,完成下列两题:
(1)用函数fzero求解上述函数在[-1,1]的所有根,验证你的结果;(2)用函数fminbnd求解上述函数在[-1,1]上的极小、极大、最小和最大值,在函数图像
上标出你求得的最小值点作出验证。
注:可以用help fzero命令查看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')
hold on
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
function y=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
function y=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;
for i=101:200
for j=1:i
if (round(i/j)==(i/j)&j~=1&j~=i)
break
end
end
if j==i s(t)=i; t=t+1;
end
end
disp(['ËØÊý:',num2str(s)])
length(s)
2.题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
编写以fun2为名的脚本文件。
程序分析:利用for循环控制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);
for i=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;
for i=1:len
if str(i)>='0'&&str(i)<='9'
sz=sz+1;
elseif((str(i)>='A'&&str(i)<='Z')|| (str(i)>='a'&&str(i)<='z'))
zm=zm+1;
elseif str(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为名的脚本文件。
===========================================================
for n = 1:1000
s=0;
for i=1:n/2
if rem(n,i)==0
s=s+i;
end;
end;
if n==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=')
if n<=10
i=0.1*n
else
if 10<n&n<=20
i=10*0.1+(n-10)*0.075
else
if 20<n&n<=40
i=10*0.1+10*0.075+(n-20)*0.05
else
if 40<n&n<=60
i=10*0.1+10*0.075+20*0.05+(n-40)*0.03
else
if 60<n&n<=100
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后再开方,如果开方后的结果满足如下条件,即是结果。
===========================================================
for i = 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:');
if x>=y&&y>=z
t=z;
m=y;
n=x;
elseif x>=z&&z>=y
t=y;
m=z;
n=x;
elseif y>=x&&x>=z
t=z;
m=x;
n=y;
elseif y>=z&&z>=x
t=x;
m=z;
n=y;
elseif z>=x&&x>=y
t=y;
m=x;
n=z;
elseif z>=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控制列。
===========================================================
for i=1:9
for j=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;
for n=1:i
s=s+a/b;
t=a;
a=a+b;
b=t;
end
fprintf(['sum is:', num2str(s)])
11. 题目:编写以fun11为名的函数文件。
将所输入的5个字符,以
相反顺序打印出来。
===========================================================
b=[3 4 5 4 7]
for i= 1:5
if a(5)<a(i)
m=a(i);
a(i)=a(5);
a(5)=m;
elseif a(4)<a(2)
n=a(2)
a(2)=a(4)
a(4)=n
end
end
b
另:可用
Fliplr([4 5 7 8 9])
A=’bgf89’
B=A(end:-1:1)
12. 题目:对n个数进行排序。
即输入n个数,输出结果为由大到小的顺序。
编写以fun12为名的函数文件。
程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。
===========================================================
A=[1,9,7,8,5]
Sort(A)<任意输入n个数即可>
13. 题目:编写一个函数,输入n为偶数时,求1/2+1/4+...+1/n,当输入n为奇数时,求1/1+1/3+...+1/n。
编写以fun13为名的函数文件。
n=input('ÇëÊäÈën=')
if (rem(n,2)==0)
for i=2:2:n
s=s+1/i;
end
else
s=0;
for i=1:2:n
s=s+1/i;
end
end
s
另:此题可以把他们看成级数,只需:
S=symsum(1/(2*n),1,n)
S=symsum(1/(2*n-1),1,n)
14. 题目:输入数字a,按以下规则进行。
每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
编写以fun14为名的函数文件。
==================================================== x1=input('ÇëÊäÈëÒ»¸öËÄλÊý£º')
a1=fix(x1/1000);
a2=fix((x1-a1*1000)/100);
a3=fix((x1-a1*1000-a2*100)/10);
a4=fix(x1-a1*1000-a2*100-a3*10);
a=rem((a4+5),10);
b=rem((a3+5),10);
c=rem((a2+5),10);
d=rem((a1+5),10);
x=a*1000+b*100+c*10+d
15. 题目:求出1到m之间(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。
输入m,输出a,n。
编写以fun15为名的函数文件。
n=0;
for i=1:1:m
if rem(i,7)==0|rem(i,11)==0
n=n+1;
end end n
16. 题目:根据以下公式计算s ,计算结果作为函数值返回;n 通过形参传入。
S=1+1/(1+2)+1/(1+2+3)+……+1/(1+2+3+…+n)。
编写以fun16为名的函数文件。
n=input('n=')
s=0; m=0; for i=1:1:n m=m+i; s=s+1/m; end s
练习3 优化问题练习
1、线性规划
规划问题不等式约束默认是≤,所有不等式约束都要变成b x f ≤)(的形式。
函数原型:X=linprog(f,A,b,Aeq,beq,LB,UB,X0,OPTIONS) f :目标函数的系数列向量
A :不等式约束条件的系数矩阵 b :不等式约束条件的
Aeq :等式约束条件的系数矩阵 beq :等式约束条件的 lb :未知数的下界 ub :未知数的上界 x0:初值 option :选项 例:
脚本文件:
clear all,clc;
f=[-5;-4;-6];
A=[1 -1 1;3 2 4;3 2 0];
b=[20;42; 30];
lb=[0;0;0];% lb=zeros(3,1);
[x,fval]=linprog(f,A,b,[],[],lb)
2、二次规划
函数原型:X=quadprog(H,f,A,b,Aeq,beq,LB,UB,X0,OPTIONS) 将目标函数写成如下形式:
例:
脚本文件:
clear all ,clc;
H=[1 -1;-1 2];
f=[-2; -6]
A=[1 1;-1 2];
b=[2;3];
lb=[0;0];
[x,fval]=quadprog(H,f,A,b,[],[],lb)
3、0-1规划
函数原型:X = bintprog(f,A,b,Aeq,beq,X0,OPTIONS) 例:
4、有约束的最值问题
函数原型:X=fimincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS) fun :目标函数句柄
nonlcon :非线性约束条件函数句柄 例1:
写目标函数:
function y=objectf2(x) y=-x(1)*x(2)*x(3);
写脚本文件:
clear all ,clc; x0=[10;10;10]; A=[1 2 3;-1 -2 -3]; b=[72;0];
[x,fval]=fmincon(@objectf2,x0,A,b)
例2:目标函数:2122
12)1()(100)(x x x x f -+-=
约束条件: 12
22
1≤+x x
function y=objectf3(x)
y=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
非线性约束函数:
function [c,ceq]=unitdisk(x)
c=x(1)^2+x(2)^2-1;%不等式约束,不等式右边缺省值是0,不等号为
ceq=[];%等式约束;无等式约束写成空矩阵
脚本文件:
clear all,clc;
x0=[0 0];
[x,fval]=fmincon(@objectf3,[0 0],[],[],[],[],[],[],@unitdisk)
21。