数学建模社区-数学中国
标题:
数学建模————统计问题之仿真(四)
[打印本页]
作者:
杨利霞
时间:
2019-4-10 10:59
标题:
数学建模————统计问题之仿真(四)
数学建模————统计问题之仿真(四)
4 B1 U$ k) ^+ t* \6 w4 P9 J* }% I/ D
仿真,顾名思义,就是利用计算机模拟研究对象,对于那些用数学公式或者规则描述的系统,计算机可以将其通过数值模拟出来,还能实现可视化。就好比我们看的小说一样,创造一个世界,需要有初始的人或物质,再加上法则(规则),那么这个世界就会逐步成型,仿真也是如此,我们需要给这个模拟世界一个初始的状态(包含应有的数据),然后告诉他运转的规则。
& U9 [* k- u \
4 ~ c! w [3 s' s5 c
7 H( ?9 _' N5 Q4 n
- R: z' M; y3 X( Z( ^8 T1 W3 k
真实的系统往往存在着很多不确定因素 ,比如:要模拟某条道路的交通,我们就得知道路上的行车的情况,除了基本的交通规则之外,我们需要的是车辆的模拟。一般来说,我们都会给车流量一个分布,这样我们就相当于有了一个车辆生成器,然后通过行车规则,就可以完整的模拟出整条道路的交通。
1 Y0 n: a, z/ F" L2 V
不过,大多数时候我们都只是设定几个交通状况指标,然后仿真不同时间的情况,就可以实现交通状况的数值模拟。当然,有时候为了论文(观赏)效果,还可以将整条道路分成很多个小块,当车经过时就让小块发亮,这样就可以看到整个交通的运行情况,这种方法我们叫做元胞自动机。
- l' v* @( B! g
! i) q( g- F+ s# i0 w
- ^2 N) ]9 Q8 [
既然是模拟系统,那么就需要一个系统的推进方式,我们依此可以将仿真分为时间步长法和事件步长法。时间步长法即将每经过一定时间步长就仿真一次活动,然后推进下去,而事件步长法即每发生一件事情就推进一次,当然这个步长也可以看做是每两个事件之间的时间。
. ^- s. k7 [3 W( }
. o. f4 |7 i$ l! v: [8 d% f" J
上面介绍的仿真方法都讲究推进,也就是说是动态的 ,除此之外还有静态仿真。静态仿真比较有名的是蒙特卡洛模拟,下面给大家展示一道百度校招笔试题:
x2 s' o( ^1 |) Z8 [, `0 I
在平面上有一组间距为d的平行线,将一根长度为l(l<d)的针任意掷在这个平面上,求此针与平行线中任意一根相交的概率,用高等数学(微积分、概率的方法)求解,基于布丰投针的结论,任选一种编程语言(C/C++, matlab, Python, Java),写出模拟投针实验(程序中允许把一个理想的π作为常量使用),求解圆周率。
* A% y5 f9 E2 C* p
注:前面的高等数学部分可以求解,已证明这个概率=2l / πd,另外针中点到相邻平行线的距离x≤l/2sinφ,l是针的长度,φ是针与平行线的夹角。
2 e* b) Q! I4 a: t& ?
/ C2 F' M; `: j) i; s" r7 E! [
现在我们知道了规则,那就是x≤l/2sinφ,为了模拟各种情况,我们现在需要做的就是对未知量x和未知夹角φ进行随机模拟,然后计算符合规则的概率,最后依次计算圆周率。
9 t$ E+ Y; k4 ~# [# U
* k* U7 x9 ?% `/ _7 W6 Z
- A8 K3 ?) N9 }" b6 d
$ _( T Q6 V3 s: {8 z! i; S
5 x+ J0 {# ?2 a- r- q) q
clc;clear;close all;
! Z3 \* h$ D: W) P& @, l) O, w
d = 2;%设定平行线之间的距离
# Z/ k* h" |( P
l = 1;%设定针的长度
1 G) D% S$ g1 r+ J. E$ p
n = 1000;%设定投针个数
) b! u0 P# @, \ u0 g; c
beta = 0 : 0.002 : pi;
3 ^ X' a% k/ C' m- C
plot(beta, l/2*sin(beta), 'k-')%绘出l/2*sin(φ)曲线
7 k* A( X6 i: k0 G, B/ I
axis([0, pi, 0, d/2])%横坐标范围设在0~pi,纵坐标范围设在0~d/2
+ U- p5 l* j% e9 f
title('蒲丰投针实验')
( O! l E% C$ H+ M0 P j5 G+ I" |
hold on
- e- A4 X" B8 J: k' z5 L
beta = rand(1, n) * pi;%随机生成n个角度(0~180度)
8 n J3 c! @; l! r- z( @2 I, C2 Y
x = (d/2) * rand(1, n);%在平行线中线以下生成n个针中心
9 a" @8 G+ D7 s2 j) D {
m = 0;
+ B7 ]* q: Y" b0 M5 `# |2 f
for i = 1 : n
! S4 b) I5 ?+ P: `' z/ q
if x(i) <= l/2 * sin(beta(i))
$ M$ W; e6 H7 z3 |) B" l
m = m + 1;%符合条件就增计数
& }+ ~& ~5 }) |; W8 q2 r
plot(beta(i), x(i), '.r')%将符合条件的针以红点形式画在图中
+ D3 _7 f1 w* {) ]
pause(0.00001)
( V% \/ G2 g# I% F; C" |
else
, a/ z& ]% E$ x1 |9 K: H
plot(beta(i),x(i),'.b')%将不符合条件的针以蓝点形式画在图中
4 V3 v! _8 p5 z& E. L9 c
pause(0.00001)
. n/ Z+ i6 i6 w& I* @2 M4 T
end
. F- l; g: A Y5 D, n
end
3 F7 O% Q4 E- y% ?
p = m/n;%计算概率
) q( K2 E" d6 E# v: B( f9 F6 Z
pai = 2*l / (d*p);%计算圆周率
' _; @) Y! d6 b, o, y [& v
disp(['圆周率为:',num2str(pai)])
7 ]* e; u6 I1 j4 j- a& r/ h8 ~
+ Y m0 r# F, [9 I% f+ y
$ a8 ?+ U7 |* ~
% F. Z9 V4 Z5 e( p' ~- ]
结果如下:
% S5 }8 C4 W$ B. f) J
1 e1 ?4 e0 @1 a5 V9 N2 ]
; t+ f7 U- {% ]1 T
2 i& F* j: F3 \
' b" c8 x8 ]. E6 v; E* x
% H: O) _/ k$ ~; ^' {9 s
9 \1 J0 x4 M& N' E5 S7 g
) ^8 J7 d/ s* L" h, o
2018全国数学建模总结.docx
2019-4-10 11:36 上传
点击文件名下载附件
下载积分: 体力 -2 点
17.26 KB, 下载次数: 0, 下载积分: 体力 -2 点
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5