XY 网格中遵循 1/R 密度分布的点?

Points that follow a 1/R density distribution in an XY grid?

我有一个 XY 网格,其中一些网格点分配了特定的值,在这种情况下,每个值都表示特定的质量,因此基本上是网格中的点质量。我现在想要获得一组遵循 1/R 密度分布的点,其中 R 是距中心的距离,因此 R = sqrt(x^2 + y^2)。通过密度分布,我的意思是点数必须下降为 1/R。我将如何编写代码?

我的代码如下:

import numpy as np
x = np.linspace(-50,50,100)
y = np.linspace(-50,50,100)
X, Y = np.meshgrid(x,y)
zeta_a = (25,25)
zeta_b = (-10,5) 
M_a = 150
M_b = 150 

zeta_a 和 zeta_b 对应于质量为 150 个单位的 2 个点质量。我还需要使用这些点进行后续计算,所以我也想知道如何使用更通用的格式而不是使用 'a'、'b'、'c' for n-质点。

感谢您的帮助。

假设我理解你的问题(如果不欢迎评论):

创建任何给定分布的方法是对分布 CDF 的逆进行插值。这是我的职责:

import numpy as np
import matplotlib.pyplot as plt

def randdist(PDF, x, n):
    """Create a distribution following PDF(x). PDF and x
    must be of the same length. n is the number of samples."""
    fp = np.random.rand(n,)
    CDF = np.cumsum(PDF)
    return np.interp(fp, CDF, x)

现在,对于您的情况,我们将在极坐标系中工作,R 分布为 1/r,Theta 均匀分布:

num = 1000   # The number of points
r = np.linspace(-50, 50, 100)
PDF = np.abs(1/r)
PDF = PDF/np.sum(PDF)    # PDF should be normalized
R = randdist(PDF, r, num)
Theta = 2*np.pi*np.random.rand(num,)

现在让我们创建点 x 和 y 向量

x = [R[k]*np.cos(Theta[k]) for k in range(num)]
y = [R[k]*np.sin(Theta[k]) for k in range(num)]

绘制

plot(x,y,'.')

请注意,在我的回答中,r=50 处有一个硬截止值。有很多方法可以克服这个问题,但现在我保持原样。

现在您似乎还想将点嵌入二维网格中,就像直方图一样。您可以使用

z, _, _ = np.histogram2d(x, y, [100, 100])