|
蒙特卡罗(Monte Carlo)方法,或称计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战进研制原子弹的“曼哈顿计划”。该计划的主持人之一、数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo—来命名这种方法,为它蒙上了一层神秘色彩。
/ P; b4 T$ u4 k* P0 B Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定圆周率π。本世纪40年代电子计算机的出现,特别是近年来高速电子计算机的出现,使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。
* ]: c$ N2 h# ^ 考虑平面上的一个边长为1的正方形及其内部的一个形状不规则的“图形”,如何求出这个“图形”的面积呢?Monte Carlo方法是这样一种“随机化”的方法:向该正方形“随机地”投掷N个点落于“图形”内,则该“图形”的面积近似为M/N。
; [+ Q# @2 w# J3 V' r1 L4 V 可用民意测验来作一个不严格的比喻。民意测验的人不是征询每一个登记选民的意见,而是通过对选民进行小规模的抽样调查来确定可能的优胜者。其基本思想是一样的。
" b" U/ }/ N% P2 \7 ` 科技计算中的问题比这要复杂得多。比如金融衍生产品(期权、期货、掉期等)的定价及交易风险估算,问题的维数(即变量的个数)可能高达数百甚至数千。对这类问题,难度随维数的增加呈指数增长,这就是所谓的“维数的灾难”(Course Dimensionality),传统的数值方法难以对付(即使使用速度最快的计算机)。Monte Carlo方法能很好地用来对付维数的灾难,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。
4 L& X" O- [- P9 Z8 e) }+ R" h 另一类形式与Monte Carlo方法相似,但理论基础不同的方法—“拟蒙特卡罗方法”
; ?$ T5 X( |6 J+ a: M: g: X+ M(Quasi-Monte Carlo方法)—近年来也获得迅速发展。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般可比Monte Carlo方法提出高数百倍,并可计算精确度。 具体实现的matlab代码:
3 y: A+ L' z$ ?0 X+ x# _! s---------------------------------------------------------------------------------------------------6 r+ k, T- \3 R; _
function val = ballvol(n, m)2 w+ o6 }. v+ X2 N. t$ d5 z
% BALLVOL Compute volume of unit ball in R^n
7 J9 t$ U6 c4 e7 M) h" f%! s3 t% V3 O# E6 O" w' z ]
% Computes the volume of the n-dimensional unit ball * C* j' o+ T/ s+ D6 `
% using monte-carlo method.$ D" N0 t7 S# |
% usage: val = BallVol(n, m)
. q( U3 h* R; Z4 \: K6 v; w% Q, c8 ?) M% where: n = dimension 3 W5 f4 v( X( J' M* ]
% m = number of realisations
$ L4 ~6 t5 v) D: Y! {: j% If the second argument is omitted, 1e4 is taken as default for m.
, s @1 q& p c5 F5 w; |4 A- q
2 s& v! V- i5 C7 t. e% (c) 1998, Rolf Krause, krause@math.fu-berlin.de/ m4 v" L( m3 s) [8 ?6 @
# w% M! o$ ]" d" r! A" K- {M = 1e4;2 ~3 a# W2 l- |6 L4 H7 u
error = 0;
3 u9 o5 x" ?7 M0 c. L$ h# Q" {' Hif(nargin <1 | nargin > 2), error('wrong number of arguments'); end
9 U0 H6 F1 G( j2 g% A5 S+ u" X+ Kif nargin == 2, M = m; end $ s M/ h& }& ^
5 i3 R t/ F- N8 ~- u! B3 P9 tR = rand(n, M);+ Z C5 }8 K J
in = 0;
9 C& N+ \3 T! l) X, Z6 E5 X8 S/ ?6 cfor i=1:M( z5 x4 m% x- ~" w' @# b
if(norm(R(:,i),2) <= 1.0), in = in+1; end1 ~5 w7 B3 F: b2 c
end% @% X3 ^* u0 m+ ]- `! M6 B- V6 _) v
: {# y- e, U' b$ r
val = 2^n*in/M;7 \& Z7 _+ L3 ?4 J7 ~8 t: j1 J
--------------------------------------------------------------------------------------------------
9 i6 F& S) Z$ [% {: |; F |