|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。 5 E1 S/ a8 ?9 z/ i# ^7 A4 g7 q3 g
Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 ' m5 a& l& [ B, h# X
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 " M1 u" y. Z2 O- B/ G7 j
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。 % x; R- e, w, z& D8 x
科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
6 m3 F) ]: m8 ? 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法” ! E& d' N7 p, n+ |7 w
(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:7 Y" g. q C, V* l- u; J% c
---------------------------------------------------------------------------------------------------
" ]+ \( V& ]6 d3 y. ^0 v; Ffunction val = ballvol(n, m)) D; ]. }4 M; p/ w
% BALLVOL Compute volume of unit ball in R^n$ @; N* g, G! g6 d
%' A( t' Z: I0 ?; P$ x* {% H
% Computes the volume of the n-dimensional unit ball
% S# b7 w. q. G% using monte-carlo method.
7 L* o% z9 t' e" Q3 T; l4 ]( t8 C% usage: val = BallVol(n, m)
( d3 ], h' ]- M6 H1 V9 h8 Q% where: n = dimension . i/ I7 J0 }& ]8 ]8 ] n
% m = number of realisations
0 g6 E1 i5 }4 g% f. {4 h6 J+ a0 c% If the second argument is omitted, 1e4 is taken as default for m.; i4 a7 U- F- B% l4 G% {
. S6 V) m. T; J9 _9 t( t% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
$ ~" N6 W/ P2 N6 y: c8 _# g" `2 R; H" J/ I
M = 1e4;' F) I, g+ J/ R& `! H h2 d
error = 0;' J* ?4 R' Y. W1 D
if(nargin <1 | nargin > 2), error('wrong number of arguments'); end
8 [6 Q$ N" w. W1 Bif nargin == 2, M = m; end
p/ D4 t g/ i0 e9 L4 v F# U* Z7 s, h, a( y& m: M) }; c9 {
R = rand(n, M);2 ~. d5 n4 u+ H0 r- V" |3 D7 ^
in = 0;: N; r2 V5 j& U
for i=1:M
4 ?; N. w+ }/ P- [# dif(norm(R(:,i),2) <= 1.0), in = in+1; end
9 V( E2 p* e3 m& Z6 n$ Q6 lend: N7 p" k, [) U2 U
! U6 Q0 \: I' [) e/ b) ^/ q: I
val = 2^n*in/M;
8 k$ T% ^4 P5 a& E7 s0 M--------------------------------------------------------------------------------------------------
" y- V% S+ G+ G+ F6 U |