python - 使用快速傅里叶变换生成相关随机势
问题描述
我想在具有指定自相关函数的 1D 或 2D 空间中生成随机势,并且根据一些数学推导,包括 Wiener-Khinchin 定理和傅里叶变换的性质,事实证明这可以使用以下等式完成:
其中phi(k)
均匀分布在区间 [0, 1) 中。而这个功能满足,就是保证所产生的势永远是真实的。自相关函数应该不会影响我在这里做的事情,我采取了一个简单的高斯分布。
相位项和条件的选择phi(k)
基于以下性质
相位项的模数必须为 1(根据 Wiener-Khinchin 定理,即函数的自相关的傅里叶变换等于该函数的傅里叶变换的模数);
实函数的傅里叶变换必须满足(通过直接检查傅里叶变换的积分形式的定义)。
产生的电位和自相关都是真实的。
通过结合这三个属性,该术语只能采用上述形式。
相关数学可参考以下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()
并且情节类似于如下所示 :
然而,生成的势能变得很复杂,虚部与实部处于同一数量级,这是意料之中的。我已经检查了很多次数学,但我找不到任何问题。所以我在想它是否与实现问题有关,例如数据点是否足够密集以进行快速傅里叶变换等。
解决方案
推荐阅读
- git - 在 Git 中从提交 ID 获取修订号,反之亦然
- windows - 英特尔 vtune 仅显示飞溅但不运行
- python - Pandas,查找行组合出现在不同列 ID 下的次数
- node.js - 如何确保获得相同的 npm 包?
- java - 如何从地理围栏列表中删除地理围栏?
- reactjs - 如何更改json文件中某些字符的颜色?
- android - Kotlin viewModels() 委托 -> 未解决的参考
- java - Java 8:使用集合流按流表示日期以升序方式对集合进行排序
- bash - 将命令输出发送回管道中的前一个子 shell 进行处理
- reactjs - AWS Amplify Amplify.configure(awsconfig) 错误