|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
1 m1 g0 B5 I+ i6 h# z* o Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。
( W1 Y! X ^0 h) S+ O8 M) `* ^ 考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 ( m1 v% w J+ M! t0 l
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
6 @# s" Z( a! o: ~# T6 @+ u9 G" t* S3 D 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。 . I- K7 T- K3 `& ? {1 k
另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
3 \! w8 m+ M: P, `(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:+ }' ~2 l6 F( b3 k$ y% \
---------------------------------------------------------------------------------------------------
! Y6 V* m6 ^3 k% k4 x; J" yfunction val = ballvol(n, m)
- G: u6 b+ l* e% BALLVOL Compute volume of unit ball in R^n
+ G4 F% x" m! t" k, V* I+ b%
* y; @5 g- Z) H" z9 m d6 S% Computes the volume of the n-dimensional unit ball ' m+ }! W7 r+ h) P6 N* e
% using monte-carlo method.
% }3 U1 ?' N4 [% usage: val = BallVol(n, m)
4 P* z4 g* a3 k) A0 W% where: n = dimension
/ [! w8 `$ v( E4 G0 `( a0 V% m = number of realisations& g9 q) p& g1 E2 O% m5 A) H
% If the second argument is omitted, 1e4 is taken as default for m.
' n) b1 f+ J* }1 Y# D2 q) m+ F4 ]! G' ]9 _# V7 F
% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
! Q1 z5 V% [( |7 M" ~" {3 \5 p; w, T! a, Y; I
M = 1e4;/ ?) [* r% j3 {$ W7 u& o$ L+ ?
error = 0;; T9 w! E$ W# s) @' m6 i5 v
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end
0 b5 z( A* Q a, D9 W6 U4 wif nargin == 2, M = m; end 0 l8 i. E: \! u1 S
, P3 W$ ]% W& g' @
R = rand(n, M);/ w9 B/ k$ U) @; w6 I& t3 _1 \# k
in = 0;
6 K1 o. X- H: Lfor i=1:M M* Z7 d, t1 A9 O
if(norm(R(:,i),2) <= 1.0), in = in+1; end6 c0 }6 l, ^+ l$ g5 p" k
end
8 {0 z6 w2 ~+ g9 h, k% ~
3 r9 |* \7 O3 F! h, E. l* bval = 2^n*in/M;
( m- O9 y7 O& P$ V/ W% g' p! s& @--------------------------------------------------------------------------------------------------
1 c1 ?6 Z$ p7 Q# B |