|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。 ; z3 q# H/ K2 J9 w- t. m
Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 9 {/ j( l7 V$ ]: r3 O: ]
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。
3 I' H' c5 V" o' Z6 O 可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。 ' U0 \2 G a7 Y1 n7 [
科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。 $ S0 C$ _" m- U& f3 J* H: g
另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法” * w/ A$ h6 h _. w! r9 m1 X
(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码: s) {' S/ _: k: `# c& J0 m
---------------------------------------------------------------------------------------------------! a% H1 B" G1 ?; T' ~0 P+ t5 y
function val = ballvol(n, m)
1 Z& l: o0 }, B/ t- U4 w4 b% z! E% BALLVOL Compute volume of unit ball in R^n0 P" ?: g6 u7 [9 x5 ?4 ?
%" `: j/ r. U7 B9 J L
% Computes the volume of the n-dimensional unit ball
4 q/ c% l5 ~! U9 t% using monte-carlo method.
+ `$ |8 [8 c5 S, L4 n/ m% usage: val = BallVol(n, m)! Q& c5 o" z' H0 O
% where: n = dimension
" R7 U/ S- L* T+ z& a9 F6 ?% m = number of realisations
, O- m: o# `7 k" ~: d4 `- j& W9 r2 I% If the second argument is omitted, 1e4 is taken as default for m.
]9 h5 @8 ^: K! c- w% t- ?
1 l W5 }6 U( V: y: W |3 D% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
/ A8 |# U3 Z5 m7 G2 ^ t. t) j# j4 S/ E. x( a o
M = 1e4;
# b% s! b, J9 G' |error = 0;9 z$ r% [! u) i' `+ Q. |) U
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end2 _! n6 z5 T; r$ T: |4 Z) H V
if nargin == 2, M = m; end
. O/ \8 y% D* W7 N. `- K6 Y3 m5 ^/ f& k4 C0 s. H' @ I E4 Q
R = rand(n, M);
! t3 Y- _& P2 I0 n9 z) x% G7 p4 ~in = 0;1 T/ _3 C+ q' @0 t1 f; H# ^6 C
for i=1:M
4 m3 x4 ?# o3 I5 T( |: Iif(norm(R(:,i),2) <= 1.0), in = in+1; end
4 A* r: Y( G/ U4 Q9 y. h1 iend; o7 g# Z( o* O0 a
# v! v6 W) M' xval = 2^n*in/M;
4 r# u F( x9 T2 k" T! G3 Y--------------------------------------------------------------------------------------------------
3 ?' h* c, o# F4 O1 Q7 M, o |