使用蒙特卡罗方法找到两个重叠圆的区域

时间:2016-02-28 13:00:15

标签: performance matlab montecarlo

实际上我有两个相交的圆圈,如图所示

我想在Matlab中使用蒙特卡罗方法分别找到每个部分的面积。

代码不能正确绘制矩形或圆圈 我想错误的是我对x和y的计算,我不太了解解决它的几何方程,所以我需要有关方程的帮助。

enter image description here 到目前为止,这是我的代码:

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

3 个答案:

答案 0 :(得分:2)

以下是我发现的错误:

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

矩形范围不正确,如果你使用rand(n-1)将给你一个(n-1)乘(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")

给出:

Colored regions

答案 1 :(得分:0)

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

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),第二个参数是第二个圆。

答案 2 :(得分:0)

不使用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);

enter image description here