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])
我有一个 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])