使用 monte carlo 方法求出两个重叠圆的面积

Find area of two overlapping circles using monte carlo method

其实我有两个相交的圆,如图所示

我想在 Matlab 中使用 Monte carlo 方法分别计算每个部分的面积。

代码没有正确绘制矩形或圆形,所以 我想我对 x 和 y 的计算有问题,我不太了解求解它的几何方程,所以我需要有关方程的帮助。

到目前为止,这是我的代码:

n=1000;
%supposing that a rectangle will contain both circles so :
% the mid point of the distance between 2 circles will be (0,6) 
% then by adding the radius of the left and right circles the total distance 
% will be 27 , 11 from the left and 16 from the right 
% width of rectangle = 24

x=27.*rand(n-1)-11;
y=24.*rand(n-1)+2;
count=0;

for i=1:n

if((x(i))^2+(y(i))^2<=25 && (x(i))^2+(y(i)-12)^2<=100)
count=count+1;        
    figure(2);
    plot(x(i),y(i),'b+')
    hold on

elseif(~(x(i))^2+(y(i))^2<=25 &&(x(i))^2+(y(i)-12)^2<=100)  
    figure(2);
    plot(x(i),y(i),'y+')
    hold on

else 
     figure(2);
    plot(x(i),y(i),'r+')

end

end

以下是我发现的错误:

x = 27*rand(n,1)-5
y = 24*rand(n,1)-12

矩形范围不正确,如果您使用 rand(n-1) 将为您提供 (n-1) x (n-1) 矩阵。

首先如果:

(x(i))^2+(y(i))^2<=25 && (x(i)-12)^2+(y(i))^2<=100

大圆的中心在 x=12 而不是 y=12

第二个如果:

~(x(i))^2+(y(i))^2<=25 &&(x(i)-12)^2+(y(i))^2<=100

可以使用逻辑索引改进此代码。

例如,使用R,你可以这样做(Matlab代码留作练习):

n = 10000
x = 27*runif(n)-5
y = 24*runif(n)-12
plot(x,y)

r = (x^2 + y^2)<=25 & ((x-12)^2 + y^2)<=100
g = (x^2 + y^2)<=25
b = ((x-12)^2 + y^2)<=100
points(x[g],y[g],col="green")
points(x[b],y[b],col="blue")
points(x[r],y[r],col="red")

给出:

这是我对任意两个圆圈的通用解决方案(没有任何硬编码值):

function [ P ] = circles_intersection_area( k1, k2, N )
%CIRCLES_INTERSECTION_AREA Summary...
%   Adnan A.
x1 = k1(1);
y1 = k1(2);
r1 = k1(3);

x2 = k2(1);
y2 = k2(2);
r2 = k2(3);

if sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) >= (r1 + r2)
    % no intersection
    P = 0;
    return
end

% Wrapper rectangle config
a_min = x1 - r1 - 2*r2;
a_max = x1 + r1 + 2*r2;
b_min = y1 - r1 - 2*r2;
b_max = y1 + r1 + 2*r2;

% Monte Carlo algorithm
n = 0;
for i = 1:N
    rand_x = unifrnd(a_min, a_max);
    rand_y = unifrnd(b_min, b_max);

    if sqrt((rand_x - x1)^2 + (rand_y - y1)^2) < r1 && sqrt((rand_x - x2)^2 + (rand_y - y2)^2) < r2
        % is a point in the both of circles
        n = n + 1;
        plot(rand_x,rand_y, 'go-');
        hold on;
    else
        plot(rand_x,rand_y, 'ko-');
        hold on;
    end
end

P = (a_max - a_min) * (b_max - b_min) * n / N;

end

这样称呼它:circles_intersection_area([-0.4,0,1], [0.4,0,1], 10000) 其中第一个参数是第一个圆 (x,y,r),第二个参数是第二个圆。

不使用 For 循环。

    n = 100000;
    data = rand(2,n);
    data = data*2*30 - 30;
    x = data(1,:);
    y = data(2,:);
    plot(x,y,'ro');
    inside5 = find(x.^2 + y.^2 <=25);
    hold on 
    plot (x(inside5),y(inside5),'bo');
    hold on 
    inside12 = find(x.^2 + (y-12).^2<=144);
    plot (x(inside12),y(inside12),'g');
    hold on 
    insidefinal1 = find(x.^2 + y.^2 <=25 & x.^2 + (y-12).^2>=144);
    insidefinal2 = find(x.^2 + y.^2 >=25 & x.^2 + (y-12).^2<=144);
    % plot(x(insidefinal1),y(insidefinal1),'bo');
    hold on
    % plot(x(insidefinal2),y(insidefinal2),'ro');
    insidefinal3 = find(x.^2 + y.^2 <=25 & x.^2 + (y-12).^2<=144);
    % plot(x(insidefinal3),y(insidefinal3),'ro');
    area1=(60^2)*(length(insidefinal1)/n);
    area3=(60^2)*(length(insidefinal2)/n);
    area2= (60^2)*(length(insidefinal3)/n);