圈内的随机点,每平方尺固定密度(matlab)

时间:2016-01-03 20:15:53

标签: matlab

我必须在matlab中生成,随机数据点均匀分布在以[0,0]和半径r = 30m为中心的圆内。我希望这些点的密度为0.3点/平方公尺。

我写的代码是:

n = 848;
Rc = 30;
Xc = 0;
Yc = 0;
theta = rand(1,n)*(2*pi);
r = Rc*sqrt(rand(1,n));  
x = Xc + r.*cos(theta);
y = Yc + r.*sin(theta);
plot(x,y,'.'); axis square;

我使用了固定数量的数据点(848点),以确保圆区域内的密度保持为0.3。

然而,在绘制结果坐标后,我看到它们每平方米不均匀分布,我想知道我做错了什么?

问题是我无法确定每平方米的密度......有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

想象一下由橡胶制成的可伸缩环。在这个戒指上均匀分布几个点。半径小时,点密度高。但是当你试图通过拉伸来增加半径或环时,环上的点的密度会下降。这是算法中的主要问题。

相反,请尝试以下方法: 1.在一张方形纸上画一个最大的圆圈 2.在纸上随意放一点 3.如果它在圆圈拒绝点之外并转到步骤2 4.重复步骤2-3,直到获得必要的密度

上述算法使用带循环的复数实现:

n = 848;
Rc = 30;
Xc = 0;
Yc = 0;
x = 2*(rand(1,n) + 1i*rand(1,n)) - 1 - 1i;
for i = 1:length(x)
    while abs(x(i)-Xc-1i*Yc) > 1
        x(i) = 2*(rand + 1i*rand) - 1 - 1i;
    end
end
x = Rc * x + Xc + 1i*Yc;
plot(x,'.');
t = linspace(0,2*pi);
hold on
plot(Rc*cos(t)+Xc,Rc*sin(t)+Yc)
axis equal;
hold off;

第5行产生848个随机点,xy坐标在-1和1之间。然后,循环检查每个随机点是否在单位圆内,如果不是,则将其替换为另一个随机点。最后,我们将您的随机点乘以30并沿X和Y轴移动它们(在您的情况下为零移位)。这样你就得到了结果:

enter image description here

UPD对OP的评论:对于任何m ^ 2,它并不完全是每平方米0.3,但它接近这个数字。如果您希望使用正方形检查,则可以将其定义为x的某个范围和y的某个范围。然后你可以使用:

xmin = 5;
xmax = 20;
ymin = 5;
ymax = 20;

if all(abs([xmin + ymin*1i, xmin + ymax*1i, xmax + ymin*1i, xmax + ymax*1i]) < Rc)
    density = nnz(real(x) > xmin & real(x) < xmax & imag(x) > ymin & imag(x) < ymax)/(xmax-xmin)/(ymax-ymin)
else
    error('Square is outside circle')
end

density =

    0.2800

因此,您手动定义形成测试平方的x和y限制。然后,检查正方形是否在圆内,如果是,则检查密度。

答案 1 :(得分:0)

为了查看密度形状,您需要足够的样本。

一个848样本集不一致,但如果你增加样本,你可以看到均匀分布的形状。

我将向您展示如何使用以下代码评估您的代码。

    n = 848;
    Rc = 30;
    Xc = 0;
    Yc = 0;

    minX=-30;
    maxX=30;
    minY=-30;
    maxY=30;
    delta=5; %%% area 5m^2


    sum_PDF=0;

    iterN=100; % 100 times average to get density

    for a=1:iterN;


%%% generate uniform distribution in circle%%%

        theta = rand(1,n)*(2*pi);
        r = Rc*sqrt(rand(1,n));  
        x = Xc + r.*cos(theta);
        y = Yc + r.*sin(theta);

        d=[x;y];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%get density function per each iteration%%%

        axisX=minX:delta:maxX;
        axisY=minY:delta:maxY;

        nPDF_X=length(axisX);
        nPDF_Y=length(axisY);

        PDF=zeros(nPDF_X,nPDF_Y);

        temp=0;
        count_i=1;
        count_j=1;

        for i=axisX;

             lowlimit_x=i-delta/2;
             upperlimit_x =i+delta/2;

                 for j=axisY;

                    lowlimit_y=j-delta/2;
                    upperlimit_y =j+delta/2;
                    temp=0;

                    for k=1:length(d(1,:)); 

                        if lowlimit_x<=d(1,k) & d(1,k)<upperlimit_x
                             if lowlimit_y<=d(2,k) & d(2,k)<upperlimit_y
                                 temp=temp+1;
                             else 
                             end
                        else
                        end
                    end

                    PDF(count_i,count_j)=temp;
                    count_j=count_j+1;
                 end
            count_i=count_i+1;
            count_j=1;
        end

        randVar_X=minX:delta:maxX;
        randVar_Y=minY:delta:maxY;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%Summing all density functions%%%%%%%%%

        sum_PDF=sum_PDF+PDF;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    end

%%%%%%%%%%%%%%%number per 1m^2%%%%%%%%%%%%%%%%

    meanPDF=(1/delta^2)*(1/iterN)*sum_PDF; 

    surf(randVar_X,randVar_Y,meanPDF')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

我在所有区域计算5m ^ 2的数量,100次。 并且,我平均所有密度函数和估计数在1平方公尺。 因此,您的代码可以在0.3 in 1m ^ 2的圆圈内生成均匀分布。

最终密度函数如下。

enter image description here