我必须在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。
然而,在绘制结果坐标后,我看到它们每平方米不均匀分布,我想知道我做错了什么?
问题是我无法确定每平方米的密度......有人可以帮忙吗?
答案 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个随机点,x
和y
坐标在-1和1之间。然后,循环检查每个随机点是否在单位圆内,如果不是,则将其替换为另一个随机点。最后,我们将您的随机点乘以30并沿X和Y轴移动它们(在您的情况下为零移位)。这样你就得到了结果:
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的圆圈内生成均匀分布。
最终密度函数如下。