|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
0 V" f( {4 p. _4 z- z+ ]+ R; M Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。
2 ~& w# B% k6 p2 J2 S3 K% I2 Y 考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。
! m9 q* h7 w2 q, @ 可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。 " B: k6 z0 i: e& e v R: F" ~
科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
( q3 [+ O! X) e; A/ z# _; U% d 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
2 N6 E# F- o+ Z) y- \- y(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:; b9 _+ V5 R5 [5 ]: z7 ~. G
---------------------------------------------------------------------------------------------------; u& `! H7 w& l7 a6 y
function val = ballvol(n, m): W4 t) b. R( Y1 j
% BALLVOL Compute volume of unit ball in R^n! O z' v3 Y# U- @: |/ c
%
2 P' h! `& N. u! b% Computes the volume of the n-dimensional unit ball
. Q5 z2 Y" ?! u1 m0 p% using monte-carlo method.( C$ S& ~9 L9 C8 g+ L6 L
% usage: val = BallVol(n, m)
: F1 s) O4 t; Y4 T9 u w. U% C9 h% where: n = dimension
+ c8 \5 L" `$ r( `9 f* `% m = number of realisations
f% O% D/ [- s% If the second argument is omitted, 1e4 is taken as default for m.9 ]6 X- T, w% y2 k3 H) @
5 h$ R8 |4 X" M0 V0 `! _9 ~- @% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
/ _' Q/ Z# r- y4 ]9 Z4 w+ T) T3 Q2 h& x$ M
M = 1e4;
6 e2 k( C* T' y- rerror = 0;2 a) \, W' ~% x2 }' H
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end
7 e* g" O' \+ _3 i5 x3 K, iif nargin == 2, M = m; end 3 w0 e" a6 Y! C8 s
! M6 E: r: I* h! K8 vR = rand(n, M);. K( t0 y; E6 T% Q. ~! y" v. x
in = 0;. y0 j1 n4 Q) h0 l- _
for i=1:M/ Q4 N5 u7 X2 y
if(norm(R(:,i),2) <= 1.0), in = in+1; end
( h4 G% a. d8 ^- `end
9 C9 p' `6 T7 Q1 @- X1 ~2 l" s8 s, f: w7 i( ~6 k5 h
val = 2^n*in/M;
7 F% u( N) J0 z7 V' `2 S--------------------------------------------------------------------------------------------------
# \* y! f9 K4 D8 \+ m |