数学建模社区-数学中国
标题:
数学建模————统计问题之仿真(四)
[打印本页]
作者:
杨利霞
时间:
2019-4-10 10:59
标题:
数学建模————统计问题之仿真(四)
数学建模————统计问题之仿真(四)
. G T$ C5 c; h, z* T+ g
仿真,顾名思义,就是利用计算机模拟研究对象,对于那些用数学公式或者规则描述的系统,计算机可以将其通过数值模拟出来,还能实现可视化。就好比我们看的小说一样,创造一个世界,需要有初始的人或物质,再加上法则(规则),那么这个世界就会逐步成型,仿真也是如此,我们需要给这个模拟世界一个初始的状态(包含应有的数据),然后告诉他运转的规则。
6 P# i+ \5 F0 X) {3 T
, ?# y9 u1 B4 d3 C$ d, R: o$ ^
) X0 W9 {8 b% [6 d* E
7 Y+ T9 j6 k0 B7 \1 z" w
真实的系统往往存在着很多不确定因素 ,比如:要模拟某条道路的交通,我们就得知道路上的行车的情况,除了基本的交通规则之外,我们需要的是车辆的模拟。一般来说,我们都会给车流量一个分布,这样我们就相当于有了一个车辆生成器,然后通过行车规则,就可以完整的模拟出整条道路的交通。
9 D5 c$ O4 B. B$ N% f1 I+ q
不过,大多数时候我们都只是设定几个交通状况指标,然后仿真不同时间的情况,就可以实现交通状况的数值模拟。当然,有时候为了论文(观赏)效果,还可以将整条道路分成很多个小块,当车经过时就让小块发亮,这样就可以看到整个交通的运行情况,这种方法我们叫做元胞自动机。
$ L& u+ z& c0 E* z0 ^! \7 `
( j( @* X/ B' ~! O% q3 G8 {" B I
: V1 _4 e+ f) c+ q# q2 I& O
既然是模拟系统,那么就需要一个系统的推进方式,我们依此可以将仿真分为时间步长法和事件步长法。时间步长法即将每经过一定时间步长就仿真一次活动,然后推进下去,而事件步长法即每发生一件事情就推进一次,当然这个步长也可以看做是每两个事件之间的时间。
: F: ~: \$ X N! \: j- G! ]
2 r- A. i: A* e$ `' x% Z% m
上面介绍的仿真方法都讲究推进,也就是说是动态的 ,除此之外还有静态仿真。静态仿真比较有名的是蒙特卡洛模拟,下面给大家展示一道百度校招笔试题:
5 | G, k1 c+ R8 v8 M# c4 w8 L
在平面上有一组间距为d的平行线,将一根长度为l(l<d)的针任意掷在这个平面上,求此针与平行线中任意一根相交的概率,用高等数学(微积分、概率的方法)求解,基于布丰投针的结论,任选一种编程语言(C/C++, matlab, Python, Java),写出模拟投针实验(程序中允许把一个理想的π作为常量使用),求解圆周率。
! u# e4 |* d- {% H
注:前面的高等数学部分可以求解,已证明这个概率=2l / πd,另外针中点到相邻平行线的距离x≤l/2sinφ,l是针的长度,φ是针与平行线的夹角。
$ m/ r4 F& M8 @1 {6 |" v9 K' e
1 A5 f1 t+ e: \7 j3 j8 q
现在我们知道了规则,那就是x≤l/2sinφ,为了模拟各种情况,我们现在需要做的就是对未知量x和未知夹角φ进行随机模拟,然后计算符合规则的概率,最后依次计算圆周率。
# d+ z6 j; t( K
% B6 t- p8 D4 `& h
% n9 b4 `" w- g4 a5 U* P1 }
! Q6 f8 `- N/ `" q
4 u) k" Q% X3 w( K7 m9 H
clc;clear;close all;
- J" @4 v+ H' e8 s& V. o- @
d = 2;%设定平行线之间的距离
$ |6 O; i! h K4 z! Q
l = 1;%设定针的长度
) { z. K. a1 O0 L8 \
n = 1000;%设定投针个数
/ g8 s! v. `0 p6 s! r& b0 ]
beta = 0 : 0.002 : pi;
# Q" F2 [# v) b6 }; O% `
plot(beta, l/2*sin(beta), 'k-')%绘出l/2*sin(φ)曲线
" }& X* O- Y0 ^2 Z# s
axis([0, pi, 0, d/2])%横坐标范围设在0~pi,纵坐标范围设在0~d/2
1 S# A: O% r5 c# c
title('蒲丰投针实验')
+ E. v- W9 R' I& `! }- K
hold on
2 a6 c, r; N2 {+ q! F
beta = rand(1, n) * pi;%随机生成n个角度(0~180度)
& _; M1 a: U5 h3 N J3 v8 }
x = (d/2) * rand(1, n);%在平行线中线以下生成n个针中心
" h+ ^2 ^6 e& g& n: `) m% j
m = 0;
" ^1 n! v' c% R/ Y! e
for i = 1 : n
% T, c) S% u4 N" n3 `5 O
if x(i) <= l/2 * sin(beta(i))
1 l" w7 W1 `' f: g+ z3 Q
m = m + 1;%符合条件就增计数
. z3 O. a& }" f+ Z1 p: }/ d: i
plot(beta(i), x(i), '.r')%将符合条件的针以红点形式画在图中
9 x: e' T" p( \5 G- t
pause(0.00001)
9 _/ C: s) p/ o9 q6 z/ r
else
3 `# m# d+ ]) U8 t7 j6 W$ g
plot(beta(i),x(i),'.b')%将不符合条件的针以蓝点形式画在图中
! l7 `1 x5 s' _4 g. j2 _" x
pause(0.00001)
' S# @; z, R% l8 h
end
v" K% J7 }2 i9 W; r" b" d
end
- X- s$ }$ C5 E. P
p = m/n;%计算概率
, c( }" I x5 S% v0 y
pai = 2*l / (d*p);%计算圆周率
; ]. y" _7 c/ V ?' ?
disp(['圆周率为:',num2str(pai)])
- J1 I- B% j( }! f. m
; D( l$ R9 J7 K4 Q2 Y
3 S) b n$ y! k' ~. \' z. \
% A$ x) k# O# s$ |) H
结果如下:
2 p+ X* D! m( H+ \/ f( _; j
0 C( U0 |( z0 c/ d
0 f& t- G4 N( [. V9 z' {
2 e* z8 c0 E$ O G9 ^
8 n$ a; Q3 p5 y9 ~
; a# A6 F" L" `& ^' U' a: p- V
; S F4 A) B6 m. u2 a& F
l6 f* l; s. [/ T
2018全国数学建模总结.docx
2019-4-10 11:36 上传
点击文件名下载附件
下载积分: 体力 -2 点
17.26 KB, 下载次数: 0, 下载积分: 体力 -2 点
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5