正如我的问题所述,我想计算傅里叶变换径向函数(定义在并且像指数一样衰减大体上) 在 Fortran 中尽可能准确。函数值来自数据文件(例如,我可以很容易地通过三次插值对其进行插值,并推断出整个行为已知)。
我在 3D 中使用傅里叶变换的“物理”定义,它给出了(因为是径向的):
我首先尝试为一些选定的值计算这个积分通过使用 Gauss-Legendre 求积,通过 NAG 例程 D01BCF(D01BCF 链接)生成大约 60 或 100 个横坐标和权重。在高斯勒让德求积的情况下,问题是选择区间在其上集成。而函数损失 4 到 5 个数量级到(例),选择作为对计算结果的强烈影响......当我将结果与“近乎精确”的计算进行比较时(使用 MATLAB 进行但计算时间很长),我发现实际上这仅适用于的小值(大约 5,当我必须处理大到 150 的值时)。Gauss-Laguerre 求积并没有给出更好的结果,可能是因为被积函数的振荡部分。
然后我尝试为某些给定的值计算这个傅里叶变换使用例程 D01ASF (D01ASF 链接)。它是一个“一维求积、自适应、半无限区间、权重函数或 ”,正是我所需要的。如果我输入 10E-5 的绝对误差容限,对于高达 80 或 100的q ,结果非常令人信服。问题是:我需要更大的,并且傅里叶变换F(q)在这样的q处以 ~10E-6 的幅度振荡。将容差降低到 10E-5 已经需要一些时间,甚至会使整个事情从子程序输出一些错误消息,所以我不知道 10E-6 是否可行。
因此,我目前想知道尝试用 FFT 计算这个傅里叶变换是否不是一个好主意?我面临的问题是我不知道如何用 FFT 计算径向波函数(而且我什至不知道如何正确使用 FFT,因为变换的定义甚至不一样(指数符号和论点)并且我以前从未使用过它)。
你有想法吗?
编辑:这来自https://stackoverflow.com/q/39127340/2320757,有人建议我把它放在 stackoverflow 上。
编辑:我尝试了 FFT(使用 NAG 库中的例程C06FAF)。值,它工作得很好。我面临的问题是总是有一些恒定的标准化因素需要考虑。我不明白为什么。这个归一化因子随着网格中使用它具有幂律的: 归一化因子近似(见图,其中黑线是“精确”傅里叶变换,绿色、品红色、蓝色、红色和黄色值计算的 FFT )。