Monte Carlo方法也叫随机模拟、随机抽样或者统计实验方法。其主要用途用于模拟一些无法用数值产生的随机系统。比如当系统的各个单元的特征量已知,但系统过于复杂导致无法预测其准确数学模型,这个时候可以用随机模拟法计算系统的相关参数。
蒙特卡罗的基本思想,为了求解数学、物理、生产管理等方面的问题,首先需要建立一个概率模型或者一个抽样试验来计算所求参数的统计特征,最后通过计算机模拟求出近似解。
我们说蒙特卡罗模拟的是随机现象,那么不同的问题的随机现象是不同的。比如掷骰子,各个点数等概率出现,模拟的均匀分布。去某个地方排队,人来的过程是一个随时间陆续变化的,这种一般认为符合指数分布。再有正态分布的例子太多,一般的统计数据没特殊要求都认为是服从正态分布的。每个分布都有对应的函数来表示。
假设一个随机事件在一次实验中发生的概率为P(x),显然
再看一些密度函数
下面采用matlab进行蒙特卡罗的一些小实验
首先关于matlab产生上述具有特定分布的随机数都有特定的函数,常用的有三种:
还有一些其他的生成函数:
unifrnd():和rand()类似,这个函数生成某个区间内均匀分布的随机数
normrnd():和randn()类似,此函数生成指定均值、标准差的正态分布的随机数
chi2rnd():函数生成服从卡方(Chi-square)分布的随机数。卡方分布只有一个参数:自由度v
frnd():函数生成服从F分布的随机数。F分布有2个参数:v1, v2
trnd():函数生成服从t分布的随机数。t分布有1个参数:自由度v
betarnd():此函数生成服从Beta分布的随机数。Beta分布有两个参数分别是A和B
exprnd():此函数生成服从指数分布的随机数。指数分布只有一个参数: mu
gamrnd():生成服从Gamma分布的随机数。Gamma分布有两个参数:A和B
例如:用蒙塔卡罗方法计算图像的面积,这里为了方便起见计算一下圆的面积,顺便用这种方法预估一下
代码如下:
clc
clear
%生成num个(-1,1)的均匀点
num = 100000;
data = 2*rand(2,num)-1;
plot(data(1,:),data(2,:),‘*‘)
hold on;
%
num_in_circle = 0;
radius = 1;%小于1
%plot circle
theta = 0:0.1:2*pi;
plot(radius*cos(theta),radius*sin(theta),‘r‘,‘LineWidth‘,3);
%test samples
for i=1:num
%随机点在圆内
if (data(1,i)^2 + data(2,i)^2) <= radius^2
num_in_circle = num_in_circle + 1;
end
end
area = 4*num_in_circle/num;%矩形面积为4
PI = area/(radius^2);%
title([‘num=‘,num2str(num),‘ 半径=‘,num2str(radius),‘ 模拟的PI值 = ‘,num2str(PI)])
可以看到num样本越多预测的越准,当再大些时,基本上可以和
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/on2way/article/details/47280671