数学建模之蒙特卡洛算法初探

数学建模常用算法–蒙特卡洛算法

  • 简介:蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
  • 蒙特卡罗方法(随机取样法)是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。
  • 步骤:
    • 1、人为构造或描述问题的概率过程
    • 2、从已知概率分布中进行抽样(随机变量抽样)
    • 3、求各统计量的估计
    • 4、使用统计量的估计最终求近似解
例1、求 π \pi π

题目:正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生1000000个点(即1000000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。
数学建模之蒙特卡洛算法初探_第1张图片
matlab实现:

%圆与正方形面积之比
tic
N=10000000;    %随机点的数目
x=rand(N,1);  %rand 生成均匀分布的伪随机数。分布在(0~1)之间
y=rand(N,1);  %矩阵的维数为N×1
count=0;

for i=1:N
%如果点在圆内,计数器加1
	if (x(i) - 0.5)^2 + (y(i)-0.5)^2 <= 0.25
		count = count+1;
	end

end

PI=4*count/N
toc

运行结果:

PI =

    3.1414

Elapsed time is 0.639570 seconds.

附:作图程序

N = 100;
x1 = rand(N, 1);
y1 = rand(N, 1);
%圆心和半径数据
x = 0.5;
y = 0.5;
r = 0.5;
%画圆
theta = 0:2*pi/3600:2*pi;
circle1 = x + r*cos(theta);
circle2 = y + r*sin(theta);
plot(circle1, circle2, 'm', 'LineWidth', 1);
hold on;
%画散点图
scatter(x1, y1,'*','b');
grid on;
xlabel('x');
ylabel('y');
title('圆和散点图');

例2、求定积分的值

题目:计算函数 y = x2 在 [0, 1] 区间的积分。
数学建模之蒙特卡洛算法初探_第2张图片
思路:这个函数在 (1,1) 点的取值为1,所以整个区域在一个面积为1的正方形里面。在该正方形内部,产生大量随机点,可以计算出有多少点落在目标函数曲线下方(判断条件 y < x^2)。这个比重就是所要求的积分值。
matlab程序:

clc
clear
N = 10000000;

x = rand(N, 1);
y = rand(N, 1);
count = 0;
for i = 1:N
    if x(i)^2 >= y(i)
        count = count + 1;
    end
end
interal = 1*count/N

运行结果:

interal =

    0.3334

附:作图程序

%散点
N = 100;
x1 = rand(N, 1);
y1 = rand(N ,1);
%积分函数
x = 0:0.01:1;
y = x.^2;

%画图
plot(x, y, 'b');
hold on;
%散点
scatter(x1, y1, 'r', '*');
xlabel('x');
ylabel('y');

升级版:求任意区间的定积分。
matlab程序:

%计算y=x^2在[0, 1]定积分
clc 
clear all;
tic
N = 10000000;
%定积分数值范围
k1 = 2;
k2 = 4;
deta_k = k2 - k1;
%产生随机坐标
x = deta_k*rand(N, 1) + k1;
%这种方式不可取,不是真正的随机
%y = (deta_k*rand(N, 1) + k1).^2;
%这个地方直接平方求范围即可。
y = (k2^2 - k1^2)*rand(N, 1) + k1^2;
count = 0;
%开始计数
for i = 1:N
    if x(i)^2 > y(i)
        count = count + 1;
    end
end
%求解面积的公式
intergal = (k2 - k1)*(k2^2 - k1^2)*count/N + (k2-k1)*k1^2
toc

该程序是求2-4的定积分。
运行结果:

intergal =

   18.6676

Elapsed time is 0.677739 seconds.

升级加简化版本:看到这篇文章学到的函数,真方便!蒙特卡洛
matlab程序:

%计算y=x^2在[5, 8]定积分
clc 
clear all;
tic
N = 10000000;
%定积分数值范围
k1 = 5;
k2 = 8;
%产生随机坐标
x = unifrnd(k1, k2, [1, N]);
y = unifrnd(k1^2, k2^2, [1, N]);
%频数
count = sum(x.^2 > y);
%求解面积的公式
intergal = (k2 - k1)*(k2^2 - k1^2)*count/N + (k2-k1)*k1^2
toc

运行结果:

intergal =

  129.0010

Elapsed time is 0.459701 seconds.
例3、求定积分的值。

y = ∫ 0 4 c o s ( x ) + 2   d x y=\int_{0}^{4} cos(x)+2 \,dx y=04cos(x)+2dx
求y值。
根据函数图像确定计算区域x∈(0, 4),y∈(0, 3).

数学建模之蒙特卡洛算法初探_第3张图片

matlab程序:

clc
clear all;
N = 10000000;
x = unifrnd(0, 4, [1, N]);
y = unifrnd(0, 3, [1, N]);
count = sum(cos(x) + 2 > y);

integral = 3*4*count/N

运行结果:

integral =

    7.2432

你可能感兴趣的:(数学建模,蒙特卡洛算法,数学建模,蒙特卡洛算法)