我想要以下方面的帮助:
L2=10^9;
nP=10^6;
x(:,1)=L2.*rand(nP,1);
y(:,1)=L2.*rand(nP,1); % Select initial partice position randomly (only positive values) NS
z(:,1)= L2.*rand(nP,1);
for ip=1:nP
r1(ip,1)= sqrt(x(ip,1)^2 + y(ip,1)^2 + z(ip,1)^2); % distance from (0,0,0) for each iteration
while r1(ip,1)>=L2
x(ip,1)=L2.*rand(1,1);
y(ip,1)=L2.*rand(1,1); % Select initial partice position randomly (only positive values) NS
z(ip,1)=L2.*rand(1,1);
r1(ip,1)= sqrt(x(ip,1)^2 + y(ip,1)^2 + z(ip,1)^2);
end
end
我面临的问题是:
1( 由于半径L2非常大,当我将L2与rand相乘时,我得到的值非常接近长方体的边界(例如10^8(,我希望粒子均匀分布在球体周围。
2( 同样,在我运行while命令之后,得到的分布不再均匀。
从概念上讲,这可以分三个阶段完成:
- 在单位球体的表面上生成点
- 缩放每个点以均匀填充球体内部;以及
- 将它们重新缩放到所需的半径
在实践中,这些步骤可以组合在一起。
请注意,我不是Matlab用户,也没有它的副本,所以请将以下内容视为伪代码。
在避免接受/拒绝方法的同时,生成随机分布在k维球体表面上的点的最简单和最通用的方法是生成k独立的标准法线,并根据每个点与原点的距离对其进行归一化。对于三维:
x = randn
y = randn
z = randn
scale_factor = 1 / sqrt(x^2 + y^2 + z^2)
x = x * scale_factor
y = y * scale_factor
z = z * scale_factor
若要将点缩放到球体内部,需要应用0到1之间的比例因子。但是,如果均匀缩放因子,则结果将不会在三维上均匀。请注意,半径为1/2的球体的体积只有单位球体的1/8,因此我们需要相应地调整比例因子,以使预期的点数与体积成比例。k维球体的正确比例因子是取均匀(0,1(随机数的第k根(有关此原理的二维说明,请参见Wolfram(,因此在您的情况下,您希望使用立方根调整比例因子。将上面的scale_factor
更改为:
scale_factor = (rand^(1/3)) / sqrt(x^2 + y^2 + z^2)
最后,要重新缩放到L2
的实际所需半径,您实际需要的是:
scale_factor = L2 * (rand^(1/3)) / sqrt(x^2 + y^2 + z^2)