|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。 * p' z6 Q7 w( a/ ~) g ^. h
Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。
9 t" o4 G- o' {! z6 j' D 考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 7 C, d9 } i$ E. [' x" _9 V& u* Y
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。 + Q+ k. w4 K: Z7 ]6 P5 [
科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。 ( o9 f% M/ B o, A# H" o$ ?
另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法” & B9 [' e% j' k2 {! Y6 N; A
(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:' q* O. ]* q7 ?$ w- q
---------------------------------------------------------------------------------------------------
8 c3 I. \6 V9 Z7 Z V* ofunction val = ballvol(n, m)( P& S+ \4 C7 L) W$ x6 P5 g
% BALLVOL Compute volume of unit ball in R^n: m9 t9 J/ d6 g# v
%
8 e: W3 E8 w6 v- m/ i7 X/ B% Computes the volume of the n-dimensional unit ball * K- n8 r* ]0 u( b) u) E/ y0 [
% using monte-carlo method.
9 n! O6 n! z5 ]% o% usage: val = BallVol(n, m)7 z; N- N4 F1 `, U
% where: n = dimension
" t$ X! Q0 k6 C$ G( O' @7 ^7 ?% m = number of realisations
9 D) c) J* h1 d8 j/ G. M% If the second argument is omitted, 1e4 is taken as default for m.
, a! a1 F* `3 @! v3 R+ H( @2 i( w" p% f- X& m8 N' g- y
% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
o% g6 }- d( [/ `+ l: }* P5 ^& C, n; `7 M: [& @5 [
M = 1e4;
w7 e( y. q7 {% yerror = 0;0 F. d' \/ W, q9 t) x8 S4 N
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end! N$ v) A# B5 j# \% m4 b
if nargin == 2, M = m; end
) K! l- ?* I6 f, K# R1 p# E! T3 o6 ~3 |
R = rand(n, M);! e9 k9 B* }6 |" E
in = 0;# d2 U: }, t+ u Z; O, u0 N4 X- m
for i=1:M" V) n5 X7 ]* p+ ~3 @
if(norm(R(:,i),2) <= 1.0), in = in+1; end
% Z+ F3 m4 d: h" o6 Uend
7 P* h1 X! t8 |5 L; A$ R7 W7 Z& z. M/ ~8 [+ y9 ]1 i" h
val = 2^n*in/M;
" W0 s/ @! `+ F3 x( b--------------------------------------------------------------------------------------------------
6 L4 L# F- c8 s m |