数学建模社区-数学中国

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

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

  [  ?# z: F+ `! s6 o& G* F然后我们在正方形内生成随机的点。然后统计点在弧线下方出现的次数。弧下方的点数/总点数=1/4倍的单位圆面积=(
πr^2)/4,r=1。然后我们就可以得出pi的值。1 z! G2 z) g9 T! L
) J7 k1 X- k0 i$ Q
以下是鄙人的蒙特卡罗模拟求pi的python程序:
% w) I- [- ^- e#Author : Naupio1 m; J- |2 @2 |! x: ~
import random as rd
+ M+ V* m5 V; u& v6 b7 d& V! m
4 c7 t& i1 t4 D8 i9 v
! t8 K8 {) L6 K4 wdef findpi(times = 1000):
) X- B+ x8 L+ c( c/ E) t    counts = 0.0
9 B8 k0 ?8 K6 d. B& a! R4 A    for i in range(times):
2 D9 L" E  \' Q8 K8 d3 Y        x = rd.random()
/ G3 T2 R- n0 Q, F4 f( W' P        y = rd.random()/ O. R2 \* i" [' D$ F& U, s2 w
        if (x**2+y**2)<1:
. D1 ~3 }1 w& s) C& s5 C            counts+=1
2 F. i9 |) k  B* e+ l" t& Q    return (counts*4)/(times*1)
2 L& h) L% g9 l% l3 |  U- N6 y% f
2 J% F3 a6 h3 O$ U! K1 o3 S
print "蒙特卡罗模拟一千次得出的pi近似值为:",findpi(1000)
3 I0 i$ h* Q( }/ N, Z0 \3 {print "蒙特卡罗模拟一万次得出的pi近似值为:",findpi(10000)# G1 Y9 A  C, I! y8 p3 W( i
print "蒙特卡罗模拟十万次次得出的pi近似值为:",findpi(100000)
& R6 U$ H# r9 I8 r, s. i/ E; o7 R9 gprint "蒙特卡罗模拟一百万次得出的pi近似值为:",findpi(1000000)4 D( @+ f3 {) Q9 z! l
print "蒙特卡罗模拟一千万次得出的pi近似值为:",findpi(10000000)
* e7 Z. P# S- @. oprint "蒙特卡罗模拟五千万次得出的pi近似值为:",findpi(50000000) 9 B' I7 w. Z4 r  x" ]; V* v
& q1 I) e* @3 l4 Z
以下是蒙特卡罗模拟的结果图: & v) ]) i5 {% w+ y8 d$ W+ N3 ]

8 i% q  F  ]4 y: w+ k' L6 D: u1 Q% `3 }, }
最后鄙人说几句:
2 A4 w$ r/ \* h从模拟的结果来看,是非常成功的,随着模拟次数的增加,结果越来越接近pi的真实值 。蒙特卡罗模拟当然还有很多用法,下次有空时,鄙人会尝试用蒙特卡罗模拟来求解积分值。# C. w3 A4 K$ M7 V
@madio @百年孤独 @数学中国—罂粟 $ _( L6 Q" H+ l) B7 p
ps :鄙人无法保证绝对的正确性,如有误导之处,欢迎指正,同时也欢迎交流,转载请注明出去,版权所有。2 B# v" ?3 P8 h1 q, [. a# d% G

& Z/ _3 p* {, O* w
# z" i  _  t6 G# f- _1 u0 `
9 V: `1 i4 z1 E' G1 v# Y1 F
- f: C/ Q, z% y$ @0 P: j

作者: dazhou123    时间: 2015-2-4 13:15
我来赞一个 ,,用Python会更方便( |! V. h/ F# ?  B

作者: 深梦沉睡    时间: 2016-4-16 11:49
感谢楼主分享
) @/ q) Y' D' y6 U




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