蒙特卡洛方法可以用于产生接近 π \pi π的近似值。图1显示了一个带有1/4内切圆在内的边长为1的正方形。正方形的面积是1,该1/4圆的面积为 π / 4 \pi/4 π/4。通过编程实现在这个正方形中产生均匀分布的点。落在圈内(红点)的点和总的投在正方形(红和绿点)上的点的比率给出了 π / 4 \pi/4 π/4的近似值。这一过程称为使用蒙特卡洛方法来仿真逼近 π \pi π实际值。令N表示总的投在正方形的点。当投点个数分别是20, 50, 100, 200, 300, 500, 1000, 5000时, π \pi π值分别是多少?对于每个N,每次实验算出 π \pi π值,重复这个过程20次,并在表中记下均值和方差。
我们现在尝试通过蒙特卡洛的方法求解如下的积分:
∫ 0 1 x 3 \int_0^1 x^3 ∫01x3
该积分的求解我们可以直接求解,即有 ∫ x = 0 1 x 3 = 1 / 4 \int_{x=0}^1 x^3=1/4 ∫x=01x3=1/4。如果你用蒙特卡洛的方法求解该积分,你认为x可以通过什么分布采样获得?如果采样次数是分别是N = 5, 10, 20, 30, 40, 50, 60, 70, 80, 100,积分结果有多好?对于每个采样次数N,重复蒙特卡洛过程100次,求出均值和方差,然后在表格中记录对应的均值和方差。
我们现在尝试通过蒙特卡洛的方法求解如下的更复杂的积分:
∫ x = 2 4 ∫ y = − 1 1 f ( x , y ) = y 2 ∗ e − y 2 + x 4 ∗ e − x 2 x ∗ e − x 2 \int_{x=2}^4\int_{y=-1}^1 f(x,y)=\frac{y^2*e^{-y^2}+x^4*e^{-x^2}}{x*e^{-x^2}} ∫x=24∫y=−11f(x,y)=x∗e−x2y2∗e−y2+x4∗e−x2
你能够通过公式直接求解上述的积分吗?如果你用蒙特卡洛的方法求解该积分,你认为(x, y)可以通过什么分布采样获得?如果点(x, y)的采样次数是分别是N = 10, 20, 30, 40, 50, 60, 70, 80, 100, 200, 500, 积分结果有多好?对于每个采样次数N,重复蒙特卡洛过程100次,求出均值和方差,然后在表格中记录对应的均值和方差。
Monte Carlo Methods的两种表达:
Way1—投点估计法
function [mu,sigma_2,pis] = MonteCarloPI(N)
round = 100;
pis = zeros(1,round);
for i=1:round
x=rand(1,N);
y=rand(1,N);
dis_2=x.*x+y.*y; % 采样点与远点的距离平方
pis(i)=numel(find(dis_2<1))/N*4; %pi=距离平方
测试表格:
N | 20 | 50 | 100 | 200 | 300 | 500 | 1000 | 5000 |
---|---|---|---|---|---|---|---|---|
μ \mu μ | 3.1400 | 3.1296 | 3.1252 | 3.1466 | 3.1424 | 3.1497 | 3.1443 | 3.1416 |
σ 2 \sigma^2 σ2 | 0.1232 | 0.0621 | 0.0257 | 0.0145 | 0.0085 | 0.0067 | 0.0023 | 0.0005 |
Way2—公式计算法
function [mu,sigma_2,pis] = MonteCarloMethodsPI(N)
round = 100;
pis = zeros(1,round);
for i=1:round
x=rand(1,N); % 得到随机x样本
y=sqrt(1-x.^2); % 计算对应的y值,y=sqrt(1-x^2)
F_N=mean(y); % 计算y的均值
pis(i)=F_N*4; % 通过均值*x的宽度计算面积
end
mu=mean(pis);
sigma_2=var(pis);
Way1—投点估计法
function [mu,sigma_2,result] = MonteCarloIntegration(N)
round = 100;
result =zeros(1,round);
for i=1:round
x=rand(1,N);
y=rand(1,N);
dis_2=y-x.^3; % 检测随机点是否在图像下方
result(i)=numel(find(dis_2<0))/N; % 计算下方点的个数与样点总数的比值*样本区间面积1
end
mu=mean(result);
sigma_2=var(result);
Way2—公式计算法
function [mu,sigma_2,result] = MonteCarloMethodsIntegration(N)
round = 100;
result =zeros(1,round);
for i=1:round
x=rand(1,N); % 产生随机样本x
y=x.^3; % 计算样本x对应函数值
result(i)=mean(y); % 面积=y的均值*x区间范围(1-0)
end
mu=mean(result);
sigma_2=var(result);
测试表格:
N | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 100 |
---|---|---|---|---|---|---|---|---|---|
μ \mu μ | 0.2480 | 0.2552 | 0.2518 | 0.2541 | 0.2515 | 0.2460 | 0.2524 | 0.2517 | 0.2494 |
σ 2 \sigma ^2 σ2 | 0.0083 | 0.0046 | 0.0027 | 0.0026 | 0.0016 | 0.0011 | 0.0013 | 0.0009 | 0.0008 |
定义积分函数:
function [f] = DoubleIntegrationFunc(x,y)
numerator = y.^2.*exp(-y.^2)+x.^4.*exp(-x.^2);
denominator = x.*exp(-x.^2);
f = numerator./denominator;
Way1—投点估计法
function [mu,sigma_2,result] = MonteCarloDoubleIntegration(N)
round = 100;
zmax=1000000; % 定义最大z值
v=2*2*zmax; % 测试体积=x区间宽度*y区间宽度*z区间宽度
result =zeros(1,round);
for i=1:round
x=rand(1,N)*2+2; % 产生随机x样本
y=rand(1,N)*2-1; % 产生随机y样本
z=rand(1,N)*zmax; % 产生随机z样本
f=DoubleIntegrationFunc(x,y); % 计算x,y对应函数值
dis_2=z-f; % 检测点的有效性
result(i)=numel(find(dis_2<0))/N*v; % 积分体积=有效点个数/总个数*测试体积
end
mu=mean(result);
sigma_2=var(result);
Way2—公式计算法
function [mu,sigma_2,result] = MonteCarloMethodsDoubleIntegration(N)
round = 100;
result =zeros(1,round);
for i=1:round
x=rand(1,N)*2+2;
y=rand(1,N)*2-1;
z=DoubleIntegrationFunc(x,y); % 计算x,y对应函数值
result(i)=2*2*mean(z); % 积分体积=函数值的均值*x区间宽度*y区间宽度
end
mu=mean(result);
sigma_2=var(result);
DoubleIntegrationFunc
函数测试表格:
N | 10 | 30 | 50 | 70 | 80 | 100 | 200 | 500 |
---|---|---|---|---|---|---|---|---|
μ \mu μ | 108174 | 114960 | 109254 | 112050 | 115700 | 107773 | 113405 | 111568 |
σ 2 \sigma^2 σ2 ( 1 0 8 ) (10^8) (108) | 128.2220 | 48.5696 | 19.0571 | 20.1571 | 15.6664 | 10.4848 | 6.6438 | 2.4848 |
第二题的x样本和第三题的(x,y)样本都采自均匀分布,用rand函数产生。
从表格数据可以看出,样点数N越大,样本均值 μ \mu μ越接近正确值,方差 σ 2 \sigma ^2 σ2越小。