题目:正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生1000000个点(即1000000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。
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('圆和散点图');
题目:计算函数 y = x2 在 [0, 1] 区间的积分。
思路:这个函数在 (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.
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).
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