|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
2 {! l9 I5 P/ z. v Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。 " q6 V8 M2 D- c# S% E9 o0 `2 e' V
考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。 ; x* X* Y- s _1 \- d, O" K9 j/ x
可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。 3 x; t: O: b, a5 ^) g4 W9 n7 f
科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
" P; E& S. R' o3 z. @7 V+ B0 O. X 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
- h$ j: t2 O1 O+ q& ?(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:
9 k. t8 f3 g3 E% P! E0 k/ l& P; U---------------------------------------------------------------------------------------------------
0 g2 l: E- y5 O: ?5 a4 y$ jfunction val = ballvol(n, m)
, b- W8 K6 Z6 U% O% BALLVOL Compute volume of unit ball in R^n1 K+ C2 T% K7 k& f3 ]/ b/ E
%
, C$ ]: d, K6 T) x S% Computes the volume of the n-dimensional unit ball 8 _, \% \: |1 s
% using monte-carlo method.
0 B6 ~( ]% m( e b% usage: val = BallVol(n, m)
& r0 X& _9 q6 \3 ]0 j( N1 d5 K% where: n = dimension
% B0 E! l2 e! Y+ s+ W% m = number of realisations) V% S; R/ N3 F% n+ `
% If the second argument is omitted, 1e4 is taken as default for m.
* h5 G9 N7 @2 p2 n& G+ r, v2 f- I7 ]& G
% (c) 1998, Rolf Krause, krause@math.fu-berlin.de
o" z" B9 n3 {/ Y' y$ J. j" F6 M' d& r8 H8 s3 z$ k# U
M = 1e4;" [5 f' B) Y1 C& j0 f e
error = 0;
4 O# X8 @- f5 o, O0 Zif(nargin <1 | nargin > 2), error('wrong number of arguments'); end3 e: t# o) h; ~' \
if nargin == 2, M = m; end . h8 q8 }; M% }3 c$ i$ l o" Z
% p( H) m u- [3 U1 J; M7 j) k
R = rand(n, M);
4 |' E3 y, `" D3 Win = 0;7 K; ~& i" K, r( y. F5 q4 U5 D# W
for i=1:M
& z# h8 A, Z- ^# v3 q9 P# mif(norm(R(:,i),2) <= 1.0), in = in+1; end
$ n6 E& B" c; G. tend; W# h5 F7 R% h- x* Q% o
+ f( X" w" X5 Xval = 2^n*in/M;
' ~5 a, _, v" a2 i2 r--------------------------------------------------------------------------------------------------
/ }. @8 g2 X& ? |