【问题标题】:Disribute particles uniformly inside a sphere with huge radius (10^9) - Matlab在具有大半径(10^9)的球体内均匀分布粒子 - Matlab
【发布时间】:2020-06-21 22:21:15
【问题描述】:

我需要以下方面的帮助:

   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 命令后,生成的分布不再均匀。

【问题讨论】:

  • 为什么说点接近边界?为什么你说它们不是随机分布的?你的代码对我来说看起来是正确的。我认为您没有正确评估结果(除了我认为是拼写错误,因为存在一些语法错误)。
  • 注意10^9最好写成1e9
  • 我更正了您代码中的两个语法错误,请确保它与您正在运行的代码匹配。
  • 如果您有一个球体,那么您可能希望使用球坐标生成随机点。给定球体的形状,靠近外边界的体积比靠近中心的体积大得多。对边界的一些偏见是可以预料的。
  • 这个问题是询问分布在球体surface上的点,但你可能会找到一些灵感:stackoverflow.com/questions/30158433/…

标签: matlab random distribution


【解决方案1】:

从概念上讲,这可以分三个阶段完成:

  1. 在单位球面上生成点;
  2. 缩放每个点以均匀填充球体内部;和
  3. 将它们重新缩放到所需的半径。

在实践中,这些步骤可以组合起来。

请注意,我不是 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-th 根(参见 Wolfram 以获得 2 -d 说明此原理),因此在您的情况下,您想使用立方根来调整比例因子。把上面的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) 

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 2016-07-13
    • 2011-07-21
    • 2018-01-25
    • 2013-03-30
    • 2015-02-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多