我想要在1D或2D空间中生成具有指定自相关函数的随机势能。经过一些数学推导,包括维纳-金钦定理和傅里叶变换的属性,发现可以使用以下方程进行操作:
其中,
相位项和
对于相关的数学内容,您可以参考以下pdf文件的第16页:https://d-nb.info/1007346671/34。
我使用均匀分布随机生成了一个numpy数组,并将该数组的负数与原始数组连接起来,以满足上述
我尝试了1D和2D两种情况,下面仅显示了1D情况。
phi(k)
在区间[0,1)内是均匀分布的。这个函数需要满足条件 ,以确保生成的势能始终为实数。
自相关函数不应影响我在此处执行的操作,我选取了简单的高斯分布。相位项和
phi(k)
的选择基于以下属性:
相位项必须具有模1 (根据维纳-金钦定理,即函数的自相关的傅里叶变换等于该函数的傅里叶变换的模);
一个实函数的傅里叶变换必须满足(通过直接检查积分形式的傅里叶变换的定义)。
生成的势能和自相关函数都是实数。
对于相关的数学内容,您可以参考以下pdf文件的第16页:https://d-nb.info/1007346671/34。
我使用均匀分布随机生成了一个numpy数组,并将该数组的负数与原始数组连接起来,以满足上述
phi(k)
的条件。然后执行了numpy(逆)快速傅里叶变换。我尝试了1D和2D两种情况,下面仅显示了1D情况。
import numpy as np
from numpy.fft import fft, ifft
import matplotlib.pyplot as plt
## The Gaussian autocorrelation function
def c(x, V0, rho):
return V0**2 * np.exp(-x**2/rho**2)
x_min, x_max, interval_x = -10, 10, 10000
x = np.linspace(x_min, x_max, interval_x, endpoint=False)
V0 = 1
## the correlation length
rho = 1
## (Uniformly) randomly generated array for k>0
phi1 = np.random.rand(int(interval_x)/2)
phi = np.concatenate((-1*phi1[::-1], phi1))
phase = np.exp(2j*np.pi*phi)
C = c(x, V0, rho)
V = ifft(np.power(fft(C), 0.5)*phase)
plt.plot(x, V.real)
plt.plot(x, V.imag)
plt.show()
以下是相似的情节:
然而,所生成的电位是复杂的,虚部与实部的数量级相同,这是意料之外的。我已经多次检查了数学计算,但没有发现任何问题。因此,我在考虑它是否与实现问题有关,例如数据点是否足够密集进行快速傅里叶变换等。
matrix1
和matrix2
,然后按正确的维度沿axis=0
连接np.zeros
,matrix1
,np.zeros
,matrix2
,然后定义matrix3 = np.flipur(flipld(matrix2))
和matrix4 = np.flipur(flipld(matrix1))
,并沿axis=1
连接上述两个连接的矩阵,并在最上面加上一个np.zeros
,中间再加上一个np.zeros
。但是那似乎效果不好。 - Sato