蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
' N. Q0 O7 v+ B+ u) @ Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 2 d1 X% |3 Z+ J- |% |
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 & `; K+ S* b# G/ N- f
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
- y1 L: F9 X+ g% L1 P; Q0 q# j8 \ 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。 Z$ m% |- v A. z$ I3 }
另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
) k) E5 q2 ^( V1 t(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:
$ r, e6 E! r1 W9 a4 s) S2 x---------------------------------------------------------------------------------------------------
0 c. m! S7 G& v4 R5 `' ]; X, @function val = ballvol(n, m)
% o2 y6 B! c2 r: _4 O% BALLVOL Compute volume of unit ball in R^n
% G1 ^2 e9 {& A' |/ ^%
+ u9 {% X0 P6 ~% Computes the volume of the n-dimensional unit ball & k n$ ?+ s0 E7 y8 [% P
% using monte-carlo method.
. L3 U+ s9 I4 B3 y% usage: val = BallVol(n, m)
8 @. O4 {1 A: b% where: n = dimension 8 y; p" i+ `) G" S/ J3 d9 @
% m = number of realisations
2 g8 ?4 C3 e0 z: c8 a4 ~% If the second argument is omitted, 1e4 is taken as default for m.6 L% @- N2 R/ c9 f' F' ?
" b, c q: c. d. e8 R6 }4 ~( G% U% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
# {: p& g' m8 f) Q+ H5 w. F
+ G- a2 O$ m6 ?5 x) i+ C8 eM = 1e4;
& ~% O& [% J! s! H+ Merror = 0;, [: j! }5 v6 Y: A/ ?7 h. M
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end' t& ~ C" w* n8 T
if nargin == 2, M = m; end
y0 K# y2 R! |2 }) k1 R4 w. B: t9 y& x) s4 V
R = rand(n, M);! N: H4 p- z4 l" s9 K0 O+ G' F
in = 0;
7 C* Q# Z/ X1 Efor i=1:M$ G! \6 k% {1 D; G
if(norm(R(:,i),2) <= 1.0), in = in+1; end, g; W% |5 O# h! P
end
1 F& |1 b; @$ u, z8 U# B, k" s t3 u( H( }
val = 2^n*in/M;$ q; E8 L3 V0 A P4 Q. n* N5 k3 Q
--------------------------------------------------------------------------------------------------
7 o# A$ w( L. a! P$ n& n |