|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。 : q7 W4 t2 X X, [, k
Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 # Z1 n3 j l& a1 }, @" @( X
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。
( r) [- r: t b2 F( h' [ 可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
! H: Y2 D$ }. G t$ q" i 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
; s: e% A. i( P. w) O# y. [. f 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
1 M. Z ]. O# r% s7 }. D5 d/ I: b(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:
& \7 Z. C6 f% h: u/ ]; t1 E) e---------------------------------------------------------------------------------------------------
9 l5 i! G; ~; O8 ~( m: H! [& B% Mfunction val = ballvol(n, m), \9 s! w w! p
% BALLVOL Compute volume of unit ball in R^n
! E( f; R" Y- ]9 k%
& \) V5 @$ Z4 N: n. z1 D+ O% Computes the volume of the n-dimensional unit ball 8 [+ T- c1 D( d" H8 O1 k" W8 g
% using monte-carlo method.6 Y7 i9 @: x9 ~/ M! o% r5 T
% usage: val = BallVol(n, m)* b- a; z1 \; p2 G( P) x5 `
% where: n = dimension
/ V% Z9 l2 I1 p9 f: ]! B% m = number of realisations
3 G- y8 c7 ~1 ?# g" d/ o0 f' X% If the second argument is omitted, 1e4 is taken as default for m.. x3 \) ^( D9 i: I6 q# V3 U- {
4 Q% k' X" K9 u* a
% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
$ b; _! A! e6 {' y% }( O. G
1 F3 i9 d- o7 J* r! A; U, {: n! SM = 1e4;% y! }9 ~ Z! \5 Y
error = 0;
* x& V" k7 o Rif(nargin <1 | nargin > 2), error('wrong number of arguments'); end
- B/ C# s r; P: rif nargin == 2, M = m; end
' C+ R3 U; G7 N5 v. f: d
6 w& M2 G1 I, t/ c# G' pR = rand(n, M);
* u7 a, }9 a+ e6 l: o6 G0 A3 ]in = 0;
0 k2 S6 @# I) I: i6 X% ufor i=1:M6 a- [6 t9 q, a! @
if(norm(R(:,i),2) <= 1.0), in = in+1; end
( J) Z. Y T; I0 P1 V) `! [2 Nend: ~6 g# P( ~6 t
! B4 { N. d( ~5 l% D3 i. p9 H( M& z
val = 2^n*in/M;0 f, x5 e+ m3 d" d* z8 {2 X
--------------------------------------------------------------------------------------------------; G: D- T4 E" m: y r7 S* C
|