|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。 ) }# z6 q9 u, b9 T( \3 R7 ]
Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 y' V0 @6 {- B4 [3 w+ C9 h* ^
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。
9 ?2 X8 q( w; C$ m- m$ g3 U 可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
! g) y6 G! D# H9 f$ L! B 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
4 z* k$ ~# K5 R1 G' [; H T* v 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
4 t/ S9 ?( c0 w# }# V(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:. I# X% @$ F( \- @ t9 F5 K3 g* @
---------------------------------------------------------------------------------------------------. i% r) B; U, ?# T I1 G
function val = ballvol(n, m)
n' ?3 r8 H7 ?1 U! Z% BALLVOL Compute volume of unit ball in R^n- B9 P$ \) q. p# g
%
6 d1 }3 y2 p! r, b- L$ m" K1 Z5 p: \% Computes the volume of the n-dimensional unit ball J3 _" P9 d" ]0 W+ ?
% using monte-carlo method.1 S n6 m5 w4 \9 N
% usage: val = BallVol(n, m)
- l1 G& e* E7 O5 V% where: n = dimension / Y( Z3 q: z; H( M
% m = number of realisations
1 v. m& u: M! i1 [) G2 ?& Z5 z0 g9 A% If the second argument is omitted, 1e4 is taken as default for m.* H7 c6 O+ h' u1 C+ Z7 ]6 Z
( P( s# f# H0 ?& i& G9 ~3 l* s4 r% (c) 1998, Rolf Krause, krause@math.fu-berlin.de+ j" X' N7 ~8 p" s
& J4 Q& w$ l G; }& G2 f
M = 1e4;- J% a' t# I* } i* u5 ~
error = 0;- Y. f1 o$ ^( y9 N9 J7 b8 {' r
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end1 C f: p8 I7 S L+ x
if nargin == 2, M = m; end - t% `% E* p9 K8 ?% e* h+ R
0 C5 P! L7 g6 [3 S; r! J4 qR = rand(n, M);
! ]$ W1 E' ~/ f* V) x, ein = 0;
3 L6 r* f, y4 h6 d# c7 H$ v. Jfor i=1:M- g$ L# ]3 t9 n
if(norm(R(:,i),2) <= 1.0), in = in+1; end
3 F" @0 p& C6 eend
' W: c" E1 N* i- y6 }
6 F+ B% K* i8 `; Gval = 2^n*in/M;
. f: U. v2 K8 F6 v0 j4 R' H' n--------------------------------------------------------------------------------------------------
+ `8 I( Q1 _/ E |