蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
' X, U6 C3 m1 t0 _+ ^% X" o' q Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 ! X3 l( U! F3 H4 u
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。
( N1 B' [# U. K" f% s" `2 O 可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。 ! N* h; T' I: i2 k2 i. c- f1 q
科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
! `2 ~) l& ~+ @3 C, i5 O; l) M 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
/ f# w5 S4 T2 F. |(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码: b# W j2 b, Y) j6 @+ M
---------------------------------------------------------------------------------------------------
! j; B. |6 H) R8 i: ufunction val = ballvol(n, m)) G$ w: T( P+ Q8 s7 d$ ^
% BALLVOL Compute volume of unit ball in R^n/ d5 T' L; R/ i W0 u6 `
%
/ R9 P: o$ }+ c, L! W, ?' p" k% Computes the volume of the n-dimensional unit ball " x( l( [ P. Z$ Q
% using monte-carlo method.8 R# y4 o0 d3 u% w' ~
% usage: val = BallVol(n, m)
7 R, Z* w! O ^/ B% where: n = dimension . S$ e8 ^9 \) _' a# h' ^/ m; n
% m = number of realisations* c- d% ~& Y* A l% u: n
% If the second argument is omitted, 1e4 is taken as default for m.
W/ j' z4 j& ^0 _* p
5 }9 m# a, w4 W7 n5 y! D! t/ H5 l% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
; l; ]8 g8 V# y6 _
9 J* x% J$ |- V1 r) YM = 1e4;
% L4 ~1 P! {! s: W( ~error = 0;
& h4 z0 @" f4 m Bif(nargin <1 | nargin > 2), error('wrong number of arguments'); end
: _; c( p: Y5 X7 O9 Sif nargin == 2, M = m; end
. j# ~* Q; n8 D2 F
- y4 J. J4 d5 I3 K1 _, WR = rand(n, M);
; c7 l8 a5 P: _0 [7 X, lin = 0; ^+ F, _, Z* C
for i=1:M
$ x. R. H+ s; g0 ^( X1 Tif(norm(R(:,i),2) <= 1.0), in = in+1; end
7 N& k! r& d; t6 iend
% b; ]& i9 X& ^4 _. ^9 l+ m7 N
/ g. D% [: Y9 t/ t3 N2 ]val = 2^n*in/M;
% M5 v9 ]( F- q8 b$ \--------------------------------------------------------------------------------------------------1 m( N3 L5 h0 V0 {5 V% N" [2 @
|