数学建模社区-数学中国
标题:
数学建模————统计问题之仿真(四)
[打印本页]
作者:
杨利霞
时间:
2019-4-10 10:59
标题:
数学建模————统计问题之仿真(四)
数学建模————统计问题之仿真(四)
+ c. b' A! n8 @2 O: f3 T
仿真,顾名思义,就是利用计算机模拟研究对象,对于那些用数学公式或者规则描述的系统,计算机可以将其通过数值模拟出来,还能实现可视化。就好比我们看的小说一样,创造一个世界,需要有初始的人或物质,再加上法则(规则),那么这个世界就会逐步成型,仿真也是如此,我们需要给这个模拟世界一个初始的状态(包含应有的数据),然后告诉他运转的规则。
, S: _ c; O! r y8 V4 {7 I- q
3 O! T% \* o( D9 t
& O. k9 e! }0 ~$ T( e: \
+ f0 L/ Q4 K6 S' U
真实的系统往往存在着很多不确定因素 ,比如:要模拟某条道路的交通,我们就得知道路上的行车的情况,除了基本的交通规则之外,我们需要的是车辆的模拟。一般来说,我们都会给车流量一个分布,这样我们就相当于有了一个车辆生成器,然后通过行车规则,就可以完整的模拟出整条道路的交通。
* m& L3 H. q3 `: L' f, e3 {. a) f* W4 j
不过,大多数时候我们都只是设定几个交通状况指标,然后仿真不同时间的情况,就可以实现交通状况的数值模拟。当然,有时候为了论文(观赏)效果,还可以将整条道路分成很多个小块,当车经过时就让小块发亮,这样就可以看到整个交通的运行情况,这种方法我们叫做元胞自动机。
+ J1 s, P8 q# W# ?0 O: z, g- B5 _8 w
0 U/ k+ |* A+ I5 R+ H" O( r/ |4 A
$ a4 \* {1 n( j( d
既然是模拟系统,那么就需要一个系统的推进方式,我们依此可以将仿真分为时间步长法和事件步长法。时间步长法即将每经过一定时间步长就仿真一次活动,然后推进下去,而事件步长法即每发生一件事情就推进一次,当然这个步长也可以看做是每两个事件之间的时间。
& F9 y- x5 R' }6 U; i
8 f- ` p( S- C4 m
上面介绍的仿真方法都讲究推进,也就是说是动态的 ,除此之外还有静态仿真。静态仿真比较有名的是蒙特卡洛模拟,下面给大家展示一道百度校招笔试题:
8 R3 {) C8 P# ~4 l; m: T6 {9 E
在平面上有一组间距为d的平行线,将一根长度为l(l<d)的针任意掷在这个平面上,求此针与平行线中任意一根相交的概率,用高等数学(微积分、概率的方法)求解,基于布丰投针的结论,任选一种编程语言(C/C++, matlab, Python, Java),写出模拟投针实验(程序中允许把一个理想的π作为常量使用),求解圆周率。
% {+ T' p0 Q, E, r- n
注:前面的高等数学部分可以求解,已证明这个概率=2l / πd,另外针中点到相邻平行线的距离x≤l/2sinφ,l是针的长度,φ是针与平行线的夹角。
4 A2 q; x+ u* [: ^3 D4 X t6 t
Z8 d% f! b# e
现在我们知道了规则,那就是x≤l/2sinφ,为了模拟各种情况,我们现在需要做的就是对未知量x和未知夹角φ进行随机模拟,然后计算符合规则的概率,最后依次计算圆周率。
# i2 O4 d' z: N0 L
8 }" Q8 j6 p9 \( l8 V
; C7 b) _! u4 {# ]! n
" E# J5 R0 Q' b! |
0 z) [, X1 z: ~* w
clc;clear;close all;
6 U4 \5 S4 z# a! f, I9 {
d = 2;%设定平行线之间的距离
! j/ S& S* V/ C. X
l = 1;%设定针的长度
- S# ~: Z$ B( x( R( M/ w
n = 1000;%设定投针个数
- a, p) w( m4 n) T! h, Z9 F5 C" ~
beta = 0 : 0.002 : pi;
$ I- e: H3 M8 b5 M: @% ]
plot(beta, l/2*sin(beta), 'k-')%绘出l/2*sin(φ)曲线
9 ^) T3 n6 _; G0 D1 {
axis([0, pi, 0, d/2])%横坐标范围设在0~pi,纵坐标范围设在0~d/2
- W L1 n; z! R9 F8 a
title('蒲丰投针实验')
9 D. m% D# k& A& c
hold on
5 w, [% c. c$ A, D1 R, f; z
beta = rand(1, n) * pi;%随机生成n个角度(0~180度)
, [: q6 ?- _0 ~+ u& r$ R- ~
x = (d/2) * rand(1, n);%在平行线中线以下生成n个针中心
# b# o4 [% ?" `
m = 0;
6 ~6 Y4 V C& \2 b
for i = 1 : n
0 z9 {6 J0 P$ B9 e% Q% b S
if x(i) <= l/2 * sin(beta(i))
$ y( S! z7 u0 Z. _6 w+ I
m = m + 1;%符合条件就增计数
7 b) I$ x) ~- [- \
plot(beta(i), x(i), '.r')%将符合条件的针以红点形式画在图中
3 u- b. s5 @0 e0 v/ K
pause(0.00001)
/ R6 w) q x8 W( {. E
else
" [) S' Z+ Y2 ]/ X) ? @; X
plot(beta(i),x(i),'.b')%将不符合条件的针以蓝点形式画在图中
. f. N" B2 C- W" j% j8 C
pause(0.00001)
0 w2 r/ O. [+ Z
end
5 a) W6 ^' r1 e- ]: |
end
3 y! m1 t/ Q( c p2 ]7 g
p = m/n;%计算概率
. Q& E- Y' |* e- l
pai = 2*l / (d*p);%计算圆周率
4 r: d2 R' b4 s, O8 E& `
disp(['圆周率为:',num2str(pai)])
) x5 G4 z5 [6 C8 E% M, k
4 |+ b) C4 W3 ?! w0 h1 z F
: P, u4 D3 X7 _! w
4 m; Z6 Q9 m- X* u: O+ m) k. j B
结果如下:
0 |# g) c! y' {9 S2 H
* L( z. v$ E9 T5 N
; M8 @$ H* ~! R
' O) o' M- s. Z& g
3 ~& A: y0 w0 g3 {' P- y
; ~( ~3 l/ n/ m1 [
" r; p f" v. z. ?+ h
# _) k& I2 ?' F# i- k. \' j) w
2018全国数学建模总结.docx
2019-4-10 11:36 上传
点击文件名下载附件
下载积分: 体力 -2 点
17.26 KB, 下载次数: 0, 下载积分: 体力 -2 点
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5