数学建模社区-数学中国
标题:
数学建模————统计问题之仿真(四)
[打印本页]
作者:
杨利霞
时间:
2019-4-10 10:59
标题:
数学建模————统计问题之仿真(四)
数学建模————统计问题之仿真(四)
7 Z( d i' i. l b2 I8 z6 K
仿真,顾名思义,就是利用计算机模拟研究对象,对于那些用数学公式或者规则描述的系统,计算机可以将其通过数值模拟出来,还能实现可视化。就好比我们看的小说一样,创造一个世界,需要有初始的人或物质,再加上法则(规则),那么这个世界就会逐步成型,仿真也是如此,我们需要给这个模拟世界一个初始的状态(包含应有的数据),然后告诉他运转的规则。
; |/ N/ A4 Q: e' W! q0 G
% `8 p$ }( r* M2 g$ |# o2 }- i) r
2 ~+ l5 N: U. \0 ~! r6 q* }5 U2 u
1 N' W, Y. |7 b5 s: J, P" v {
真实的系统往往存在着很多不确定因素 ,比如:要模拟某条道路的交通,我们就得知道路上的行车的情况,除了基本的交通规则之外,我们需要的是车辆的模拟。一般来说,我们都会给车流量一个分布,这样我们就相当于有了一个车辆生成器,然后通过行车规则,就可以完整的模拟出整条道路的交通。
( x. o2 b" O! F& j4 Y
不过,大多数时候我们都只是设定几个交通状况指标,然后仿真不同时间的情况,就可以实现交通状况的数值模拟。当然,有时候为了论文(观赏)效果,还可以将整条道路分成很多个小块,当车经过时就让小块发亮,这样就可以看到整个交通的运行情况,这种方法我们叫做元胞自动机。
7 d- @" }$ b9 f* A7 P9 y
T* G! |) H# B6 U2 k }
8 W2 L5 E& F8 z( u
既然是模拟系统,那么就需要一个系统的推进方式,我们依此可以将仿真分为时间步长法和事件步长法。时间步长法即将每经过一定时间步长就仿真一次活动,然后推进下去,而事件步长法即每发生一件事情就推进一次,当然这个步长也可以看做是每两个事件之间的时间。
+ {9 |8 ` q; z4 H6 R" q+ y
' Q5 i. O4 | U
上面介绍的仿真方法都讲究推进,也就是说是动态的 ,除此之外还有静态仿真。静态仿真比较有名的是蒙特卡洛模拟,下面给大家展示一道百度校招笔试题:
3 D% @3 _' H& I) I' `5 ^
在平面上有一组间距为d的平行线,将一根长度为l(l<d)的针任意掷在这个平面上,求此针与平行线中任意一根相交的概率,用高等数学(微积分、概率的方法)求解,基于布丰投针的结论,任选一种编程语言(C/C++, matlab, Python, Java),写出模拟投针实验(程序中允许把一个理想的π作为常量使用),求解圆周率。
3 j! k/ b, p- e: W% y0 u$ }* p5 N# Z
注:前面的高等数学部分可以求解,已证明这个概率=2l / πd,另外针中点到相邻平行线的距离x≤l/2sinφ,l是针的长度,φ是针与平行线的夹角。
$ o: B! x$ ^7 Q$ _$ c7 z8 c: u
# Y. l( q* Y: e9 D8 {
现在我们知道了规则,那就是x≤l/2sinφ,为了模拟各种情况,我们现在需要做的就是对未知量x和未知夹角φ进行随机模拟,然后计算符合规则的概率,最后依次计算圆周率。
" s: Y2 v( o9 E; w6 ^
# K1 B$ b/ G: T ` b( L: Q
" l) p$ Y3 U1 l1 T
% d" M9 E2 p0 o& _
; n* |7 b' }& o0 }% [7 @( j
clc;clear;close all;
" X; i3 l# T3 D6 V
d = 2;%设定平行线之间的距离
7 L) b$ T% l$ R
l = 1;%设定针的长度
- r! a% X2 I4 W- e( g2 M w
n = 1000;%设定投针个数
1 |: F+ T- f/ O: e. v/ K
beta = 0 : 0.002 : pi;
+ z7 G1 F' a0 ^4 u) |2 N$ T- M7 V0 o
plot(beta, l/2*sin(beta), 'k-')%绘出l/2*sin(φ)曲线
0 L" P0 w1 N3 \" a9 o6 ]9 y) u
axis([0, pi, 0, d/2])%横坐标范围设在0~pi,纵坐标范围设在0~d/2
* W8 _& F( B$ V; f. U; l
title('蒲丰投针实验')
4 ]1 k2 T* _+ m9 u2 G; ^# J
hold on
8 e- U3 c" @: W# Q; C: q0 H
beta = rand(1, n) * pi;%随机生成n个角度(0~180度)
: E$ I# R8 I9 R0 l; Q& E! C: Y" K
x = (d/2) * rand(1, n);%在平行线中线以下生成n个针中心
H: Y& v+ [. _8 D( w4 Y4 @# x
m = 0;
: ]' l- c3 m0 J. I/ X2 h& j
for i = 1 : n
' h4 f/ ?) I! q; U6 b- s. O
if x(i) <= l/2 * sin(beta(i))
- @, Y$ v1 P; _9 A9 a% X2 @
m = m + 1;%符合条件就增计数
, ]" L1 }5 X2 @/ A. n
plot(beta(i), x(i), '.r')%将符合条件的针以红点形式画在图中
% o3 r$ [( _, d1 E- Y; M
pause(0.00001)
/ q: Y9 X) d9 q2 ^9 ^( E" ~. ]
else
& q9 @+ `5 e- {
plot(beta(i),x(i),'.b')%将不符合条件的针以蓝点形式画在图中
f1 O; Y+ h; F- k+ v: u
pause(0.00001)
$ X4 T. e M4 `# ?4 D5 C4 V0 O
end
5 Y5 Q1 c- O2 Z+ _, }
end
& j+ W2 Z: t& \7 Z
p = m/n;%计算概率
4 q( V a' X! P L2 b9 A! O
pai = 2*l / (d*p);%计算圆周率
4 P% j9 x/ K- @7 A
disp(['圆周率为:',num2str(pai)])
?+ C+ L2 ^* c8 F
; O$ U& `* _9 b4 _. b
7 U3 I& L' E) R' E
0 q. ?# M. t8 n3 D0 l8 G$ A7 L
结果如下:
8 X4 k0 _; \ [2 P, E( ^
) T- S+ E7 I4 [& W$ n0 x
* n' a2 ?2 X, ?4 U ^
7 \; I. Q5 z, F2 m
* [7 B7 C9 c5 i1 G1 ~7 d
3 |" c% x) M" ^! K( E* ^
# w# g' a8 q9 e
( H$ f5 ^+ V5 b: V T, E, m k& ^+ S
2018全国数学建模总结.docx
2019-4-10 11:36 上传
点击文件名下载附件
下载积分: 体力 -2 点
17.26 KB, 下载次数: 0, 下载积分: 体力 -2 点
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5