1 程序设计基础实验
1.1 基础训练
请编程计算 s = 1.04 + 1.0 4 2 + 1.0 4 3 + ⋯ + 1.0 4 2 5 s=1.04+1.04^2+1.04^3+\cdots+1.04^25 s=1.04+1.042+1.043+⋯+1.0425. 编写一个函数返回计算结果s.
function s=myfun
a=1.04;
s=0;
for i=1:25
s=s+a^i;
end
end
ans =
43.3117
将区间[0,52]上等间隔的取50个数据(含区间端点)赋给变量v,并将v的元素逆序排列赋给向量w.
解:
v=linspace(0,52,50);
w=v(end:-1:end-size(v, 2)+1)
w =
1 至 5 列
52.0000 50.9388 49.8776 48.8163 47.7551
后边省略不写
数列
x
n
,
x
1
=
0
,
x
2
=
1
,
x
n
=
x
n
−
1
+
2
x
n
−
2
{x_n},x_1=0,x_2=1,x_n=x_{n-1}+2x_{n-2}
xn,x1=0,x2=1,xn=xn−1+2xn−2
用循环语句编程给出该数列的前40项(要求将结果用行向量x存储)。
解:
x1=0;
x2=1;
x=[x1,x2];
for i=3:40
xi=x(1,(i-1))+2*x(1,(i-2));
x=[x,xi];
end
disp(x)
由于数目过大 matlab采用了科学计数法 输出结果为:
ans =
1.0e+11 *
1 至 5 列
0 0.0000 0.0000 0.0000 0.0000 …
34 至 40 列
0.0286 0.0573 0.1145 0.2291 0.4581 0.9163 1.8325
想要看出规律可以减少循环次数 比如前十项:
ans =
1 至 8 列
0 1 1 3 5 11 21 43
9 至 10 列
85 171 …
算法设计, 循环语句与枚举法
请找出1到1000中满足 a 2 − 100 b = a a^2-100b=a a2−100b=a的正整数 a , b ( 1 ≤ a ≤ 1000 , 1 ≤ b ≤ 1000 ) a,b(1\le a \le 1000, 1\le b \le 1000) a,b(1≤a≤1000,1≤b≤1000)。编写函数依次返回行向量a,b(其中a(i), b(i)为第i组解),其中数组a中元素是递增排列。请先写出求解算法,再给出程序。
解:
function [a,b]=myfun
a=[];
b=[];
for x=1:1000
for y=1:1000
if x^2-x-100*y==0
a=[a,x];
b=[b,y];
end
end
end
>> [a,b]=myfun
a =
1 至 8 列
25 76 100 101 125 176 200 201
9 至 12 列
225 276 300 301
b =
1 至 8 列
6 57 99 101 155 308 398 402
9 至 12 列
504 759 897 903
请在区间[-2,2]上随机投点,估算出 f ( x ) = 5 x 2 − e x s i n x − 8 f(x)=5x^2-e^{xsinx}-8 f(x)=5x2−exsinx−8在该区间上的最小值点. 提示:用代码-2+4*rand可以产生区间[-2,2]上的随机数.画出曲线图,标出最小值点。
解:
f=@(x)5*x^2-exp(x*sin(x))-8;%定义函数
Y=[];
X=[];
for i=1:200 %循环随机取值
x=-2+4*rand;
X=[X,x];
Y=[Y,f(x)];%向量存储
end
plot(X,Y,'r.') %绘图
ymin=min(Y);%找到最小点
[a,b]=find(Y==ymin)%最小点的位置
xmin=X(a,b);%最小点对应的x
str=strcat('(',num2str(xmin),',',num2str(min(y)),')');%转化为符变量
text(xmin,ymin,str)
1.2 综合训练
一.实验问题
背景:用长度为1200厘米的条材,分别截成长度为64厘米与85厘米的两种成品。
请用穷举法找出一根条材的所有切割方式,并给出每种切割方式的具体信息(包括余料长度)。说明:一根条材最多截出18根64厘米的成品,或14根85厘米的成品。
二. 实验目的
认识穷举法及其实现方式。熟悉for语句在穷举法中的应用。
三.实验过程
fprintf('切割方式可以为:\n')
for i=0:18
y=l-64*i;
j=floor(y/85);
yuliao=l-i*64-j*85;
if yuliao<64
fprintf('64厘米%d根;85厘米%d根;余料%d厘米\n',i,j,yuliao)
end
end
>> Untitled2
切割方式可以为:
64厘米0根;85厘米14根;余料10厘米
64厘米1根;85厘米13根;余料31厘米
64厘米2根;85厘米12根;余料52厘米
64厘米4根;85厘米11根;余料9厘米
64厘米5根;85厘米10根;余料30厘米
64厘米6根;85厘米9根;余料51厘米
64厘米8根;85厘米8根;余料8厘米
64厘米9根;85厘米7根;余料29厘米
64厘米10根;85厘米6根;余料50厘米
64厘米12根;85厘米5根;余料7厘米
64厘米13根;85厘米4根;余料28厘米
64厘米14根;85厘米3根;余料49厘米
64厘米16根;85厘米2根;余料6厘米
64厘米17根;85厘米1根;余料27厘米
64厘米18根;85厘米0根;余料48厘米
四. 实验自评与改进方向
总体完成情况还算可以,达到了题目的要求。但是输出不是很美观。后续的改进可以使用数组存储的方法,第一行输出长度,下边输出切割的根数。即类似表格的展示方式。这样的输出更为美观。
另外在前边的第三题中,由于科学计数法输出结果,导致前边较小的数字无法正常显示,课后可以学习一下如何调整输出的方式。
五. 实验体会,收获及建议
题目主要涉及的是循环的相关知识,这是整个实验中最基础的内容,合理的使用用matlab去解决实际问题。将知识真正的应用到了实际生活中。
在编程中遇到的一些意想不到的问题也让我意识到,要在平时多加练习,不能眼高手低。不能仅仅掌握课堂上的函数命令,在课余时间多去看一些编程,丰富自己的函数储备,并且学习思路,从而让自己的编程更加容易。