|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
% u: g$ O8 J8 q$ X: h; ~ Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 B- M- T) Q: f5 s6 O+ X" ^
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 3 [: e9 w4 `8 H4 ^& J5 @5 w
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
/ O" X8 L: u5 b5 Q# M+ r 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
6 C$ n9 w$ F B4 z& `# L 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法” ) _# Q8 T. y# ]* |2 U% v& s" S7 i
(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:
/ d' b% @/ p6 T. C) M( e---------------------------------------------------------------------------------------------------
% ]5 ]2 W5 ?/ L( R: Ofunction val = ballvol(n, m)& y# |3 g) ^0 ~% ~/ j O3 s8 X" B
% BALLVOL Compute volume of unit ball in R^n
8 g0 C0 Y1 d8 G0 m! _%
" a6 i% e, Q8 _. Y( t; }% Computes the volume of the n-dimensional unit ball 7 e7 n0 g/ e7 ]. E8 _
% using monte-carlo method.
6 c' a: h# t/ ^: r5 H( ^% usage: val = BallVol(n, m)5 e u# o9 L+ s( K
% where: n = dimension
( g {% T! P& S$ M6 f% m = number of realisations" Q. L9 g/ a l6 K8 f% |
% If the second argument is omitted, 1e4 is taken as default for m.) x/ V( e! ?& v! r8 U( i
8 A7 h8 x" o" v9 C7 k
% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
) z4 d( U0 e( X' g3 n8 K( N" u8 y
8 q8 w; k+ w7 v- m4 m k) F$ uM = 1e4;
- E: w \$ Q/ l. N, i- |error = 0;- j- H% Z5 F2 N
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end( G! i) s3 s3 ^
if nargin == 2, M = m; end 4 n6 O! m0 \* M4 u& J& q: f
) K( ~( p! {' b a a& ?# L, D& d cR = rand(n, M);7 m0 y: J2 E t% Z7 [ Q! O9 D
in = 0;( D2 o; _, m7 Z4 `, v- z5 D
for i=1:M
& k& M( B' m: u4 p' W: Bif(norm(R(:,i),2) <= 1.0), in = in+1; end) a* D% E; b+ h J* n9 s" y
end* m5 R" X' e: }* k4 ^
" G3 k" x- t: g, L' eval = 2^n*in/M;# n' }& C% K/ }" [
--------------------------------------------------------------------------------------------------# S8 J' n6 |/ b" W: p
|