蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。 3 U, @) [/ U' ^/ V6 ?/ c5 q% C
Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 5 e0 Q, f0 Q: V( a7 [! I
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 4 w. Q4 v6 f& J, L7 o
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
# E3 T, _* d! l5 m( Y! w 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。 9 U' D& y/ f: H2 o# u* e
另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法” 8 @ K. O! J/ Z b u. l _
(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:
$ c& q, n2 M! |6 v6 p: H X---------------------------------------------------------------------------------------------------9 G* C* W) n* c- L* c& ]) Y) {
function val = ballvol(n, m)
2 W& p( p- P" o8 o. g* S/ x% BALLVOL Compute volume of unit ball in R^n
# e# W& f" l& \# K$ G6 h%
7 ^6 X1 n9 m3 S! `* W+ |% Computes the volume of the n-dimensional unit ball
4 z% j) A/ p- Y. v; _: x! U% using monte-carlo method." W2 X; p& r H6 F+ y) h
% usage: val = BallVol(n, m)
& q) v( x5 ^, B7 I" ^2 {) y% where: n = dimension d/ M1 N5 P% S5 f5 j1 O' t( V+ }: }
% m = number of realisations
) |/ z0 f. j; V8 S9 u% ^% If the second argument is omitted, 1e4 is taken as default for m.
* D( l1 W6 L6 j( D- v& x; O1 g' D' i0 R+ H6 x
% (c) 1998, Rolf Krause, krause@math.fu-berlin.de# k3 O* k X: S% \
4 ]" t# t4 ~, |% _
M = 1e4;+ {5 F( p# ~# p! B) e; g
error = 0;
/ I. [ w+ U% ~% X0 R: v& Tif(nargin <1 | nargin > 2), error('wrong number of arguments'); end2 |' g9 m+ h, l2 k y8 E3 j# P' H5 O
if nargin == 2, M = m; end
$ V4 M( r* M1 A6 y3 B, H- N
6 [1 C; y, ]. g5 \4 M# yR = rand(n, M);/ J0 H# k7 |- m
in = 0;
" L0 x+ @! ], ?- vfor i=1:M/ J0 c$ T+ w" l: a$ n) N5 g5 B$ x
if(norm(R(:,i),2) <= 1.0), in = in+1; end: U8 s( r4 ^9 `8 V
end
' a3 u- S& p1 n% M1 W) ?* H l% s1 e: l" I. K
val = 2^n*in/M;! q1 |( ^. S9 o- u. E, G% n# Q M
--------------------------------------------------------------------------------------------------
/ R9 y/ Y/ ]+ z6 ] |