随机模拟实验
基础训练
假设学生到达图书馆的间隔时间服从在区间[0, 5](单位:秒)上的均匀分布,请编程产生100个学生的到达时刻。
解:
all=[];
ddsk=0;
for i=1:100
j=5*rand(1);
ddsk=ddsk+j;
all=[all;ddsk];
end
disp(all)
>> Untitled
1.5755
3.4824
3.5724
6.0906
6.7256
余下省略
假设在某30分钟内学生到达图书馆的间隔时间服从在区间[0,5](单位:秒)上均匀分布,请编程产生30分钟内所有到达图书馆的学生的到达时刻,并输出到达人数.
解:
all=[];
ddsk=0;
i=0;
while true
j=5*rand(1);
ddsk=ddsk+j;
if ddsk>30*60
break
end
all=[all;ddsk];
i=i+1;
end
fprintf('到达人数为%d\n',i)
disp(vpa(all,4))
到达人数为724
1.778
2.615
5.497
8.954
11.99
16.72
…
1791.0
1793.0
1795.0
1800.0
综合训练
一.实验任务
请用蒙特卡罗法求解下列优化模型。
m
i
n
f
(
x
)
=
2
(
x
1
−
1
)
2
+
3
(
x
2
−
4
)
2
+
x
1
x
2
+
(
2
x
3
−
5
)
2
min{f}(x)=2(x_1-1)^2+3(x_2-4)^2+x_1x_2+(2x_3-5)^2
minf(x)=2(x1−1)2+3(x2−4)2+x1x2+(2x3−5)2
3
x
1
+
2
x
2
+
6
x
3
≤
20
4
x
1
+
5
x
2
+
2
x
3
≤
21
0
≤
x
1
≤
15
0
≤
x
2
≤
9
0
≤
x
3
≤
25
且
x
3
为整数
.
3x_1+2x_2+6x_3≤20 \\4x_1+5x_2+2x_3≤21\\ 0≤x_1≤15\\ 0≤x_2≤9\\ 0≤x_3≤25且x_3为整数.
3x1+2x2+6x3≤204x1+5x2+2x3≤210≤x1≤150≤x2≤90≤x3≤25且x3为整数.
二. 实验目的
熟悉蒙特卡罗法求解优化问题的原理。
三. 实验过程
all=[];
for i=1:1000000
x1=15*rand(1);
x2=9*rand(1);
x3=fix(26*rand(1));
if 3*x1+2*x2+6*x3<=20&4*x1+5*x2+2*x3<=21
all=[all;x1,x2,x3];
end
end
x1=all(:,1);
x2=all(:,2);
x3=all(:,3);
f=inline('2*(x1-1).^2+3*(x2-4).^2+x1.*x2+(2*x3-5).^2');
s=f(x1,x2,x3);
l=length(s);
fmin=min(s);
fprintf('其中最小值为%d,一百万个点中落在范围内的共有%d个\n',fmin,l)
>> Untitled
其中最小值为4.207e+00,一百万个点中落在范围内的共有7454个
四.实验自评与改进方向
基本上完成了实验的任务 在最后一个实验的过程中 最开始采用的是利用find直接找出所有符合条件的点的位置 但是考虑到有三个未知数 并且不熟悉find输出 的含义的情况下 没有采用find而是采用了for循环
随后在和同学的讨论中 找到了自己对find的误区 利用find一次性找出所有点的程序如下
N=1000000;
x1=15*rand(1,N);
x2=9*rand(1,N);
x3=fix(26*rand(1,N));
a=find(3*x1+2*x2+6*x3<=20&4*x1+5*x2+2*x3<=21);
xx1=x1(a);
xx2=x2(a);
xx3=x3(a);
f=inline('2*(x1-1).^2+3*(x2-4).^2+x1.*x2+(2*x3-5).^2');
s=f(xx1,xx2,xx3);
l=length(s);
fmin=min(s);
fprintf('其中最小值为%d,%d个点中落在范围内的共有%d个\n',fmin,N,l)
其中最小值为4.114575e+00,1000000个点中落在范围内的共有7718个
五. 实验体会,收获及建议
本次上机实验不仅使我们基本了解了随机数实验的相关函数命令,了解了蒙特卡罗方法的思想,并且能用这种思想去解决一些随机分布问题、概率问题、面积体积问题。也使得我们对Matlab的–些编程技巧更加熟悉,收获很大。
在编程中遇到的一些意想不到的问题也让我意识到,要在平时多加练习,不能眼高手低。不能仅仅掌握课堂上的函数命令,在课余时间多去看一些编程,丰富自己的函数储备,并且学习思路,从而让自己的编程更加容易。
同时针对最后一题,我认为x1 x2 x3给出的范围并不合适,从输出结果来看,在x1 x2 x3所给的范围内随机摇点,最终满足结果的仅有不到百分之一,这意味着设置一百万个点仅能有不到一万个点满足要求。所以我建议根据前两个不等式,改变下未知数的范围,这可以让模拟的结果更加明显,而不至于出现:设置了十万个点所得结果仍然无法趋于稳定的情况。