数学建模社区-数学中国

标题: 使用python做蒙特卡罗模拟求pi [打印本页]

作者: 思考者-Instrive    时间: 2014-9-18 17:12
标题: 使用python做蒙特卡罗模拟求pi
神奇的随机,蒙特卡罗模拟求pi
以下摘自百度百科:# m5 ^  a  ~, j6 n
蒙特卡罗模拟因摩纳哥著名的赌场而得名。它能够帮助人们从数学上表述物理、化学、工程、经济学以及环境动力学中一些非常复杂的相互作用。数学家们称这种表述为“模式”, 而当一种模式足够精确时, 他能产生与实际操作中对同一条件相同的反应。但蒙特卡罗模拟有一个危险的缺陷: 如果必须输入一个模式中的随机数并不像设想的那样是随机数, 而却构成一些微妙的非随机模式, 那么整个的模拟(及其预测结果)都可能是错的。, L; x( Z2 D9 w: r1 l/ {
! T7 m( \+ v3 {0 B4 `/ T) w
鄙人谈几句话:) s- S4 q5 \% w& ~& v4 d
蒙特卡罗模拟的用处非常广,而且蒙特卡罗模拟听起来有点高端霸气上档次,其实蒙特卡罗模拟的原理很简单,就是利用“随机”去创造一个数学模型,从而模拟复杂的系统来解决问题。下面是蒙特卡罗模拟的一个简单应用例子,求解pi的近似解。我们知道pi的9位有效数字的近似值是3.14159265。然后我使用的蒙特卡罗原理是这样的:单位长度为1的正方形中,我们在其中的一条对角线画一条弧得出一个扇形,刚好是单位为1的圆的1/4。如graph1。

: w0 `2 v5 H* |' F5 a9 B) w3 h  J% S. Y$ ^
然后我们在正方形内生成随机的点。然后统计点在弧线下方出现的次数。弧下方的点数/总点数=1/4倍的单位圆面积=(
πr^2)/4,r=1。然后我们就可以得出pi的值。  \; G/ B# }4 ^" A$ P! c- L$ a
* N! @' s) H/ g' ~# t* ^3 {
以下是鄙人的蒙特卡罗模拟求pi的python程序:
# n6 y% G9 M& L1 x" z3 P2 e8 ^#Author : Naupio
$ e; l! Q4 Z# {, q( i5 A1 qimport random as rd/ ~$ {; `+ A2 z& `( B
/ o3 s3 I' h# p3 k3 [& K

8 y6 f& V: L6 |3 vdef findpi(times = 1000):4 r; w+ q+ ?( _$ G" n
    counts = 0.0
$ w) {6 H' v+ L2 f# {' W' D; J9 q    for i in range(times):* h4 X$ X- |' P6 j# M/ S
        x = rd.random()" v1 p. a4 ~/ n
        y = rd.random()6 ^. n1 Y. m0 j% {7 M, }% @5 @
        if (x**2+y**2)<1:' w. Q1 @6 t4 `0 g* @
            counts+=1# c" T* N$ }. c+ n9 `' F5 l
    return (counts*4)/(times*1)
$ S; d$ ~1 T+ G  Y7 E" t% H% e% l; }' t& ~+ X/ h* h

2 I3 l) j7 J: o$ ?3 Iprint "蒙特卡罗模拟一千次得出的pi近似值为:",findpi(1000)0 f& d4 z5 z/ Y  O1 ]
print "蒙特卡罗模拟一万次得出的pi近似值为:",findpi(10000)
5 J" F' H( I0 {  L! Oprint "蒙特卡罗模拟十万次次得出的pi近似值为:",findpi(100000), p' m  O/ r) c% F: e, Q' \
print "蒙特卡罗模拟一百万次得出的pi近似值为:",findpi(1000000)
: Y+ P3 S9 M6 z, P: jprint "蒙特卡罗模拟一千万次得出的pi近似值为:",findpi(10000000)
% |# u1 i4 k' j9 v8 B; bprint "蒙特卡罗模拟五千万次得出的pi近似值为:",findpi(50000000)
& [+ O8 p/ v( W
+ q6 E! v6 M+ `4 v以下是蒙特卡罗模拟的结果图: 9 Z$ W- F1 ?* n; K4 q2 x; Q& ]
' e, V& J. A) s( r
4 [! s  E2 F7 V" R2 Q% B. k
最后鄙人说几句:
/ j0 |- T0 C6 ^从模拟的结果来看,是非常成功的,随着模拟次数的增加,结果越来越接近pi的真实值 。蒙特卡罗模拟当然还有很多用法,下次有空时,鄙人会尝试用蒙特卡罗模拟来求解积分值。
4 b$ q3 U1 `3 \- I7 c@madio @百年孤独 @数学中国—罂粟 ( N' T5 W! [! y6 V+ j. i; w( P
ps :鄙人无法保证绝对的正确性,如有误导之处,欢迎指正,同时也欢迎交流,转载请注明出去,版权所有。
, ]3 U5 b, u& h5 `
0 Y, {8 W; N1 R$ A2 l" l9 N" K3 a& R. t

/ B& M  l2 W3 B$ ~4 [! I- {
/ Q) ]# ^  I5 Z; B  |( C
作者: dazhou123    时间: 2015-2-4 13:15
我来赞一个 ,,用Python会更方便
3 U! L4 G' j9 J+ c
作者: 深梦沉睡    时间: 2016-4-16 11:49
感谢楼主分享7 W( _/ g* y$ M( ~





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5