0

正如我的问题所述,我想计算径向函数 f(r) 的傅里叶变换 F(q)(在 [0,infinity[ 上定义,并且在大 r 处像指数 exp(-Ar +b) 一样衰减)为在 Fortran 中尽可能准确。函数值来自一个数据文件(例如,我可以很容易地通过三次插值对其进行插值并进行外推,因为大 r 的行为是已知的)。

我在 3D 中使用傅里叶变换的“物理”定义,它给出(因为 f 是径向的):在此处输入图像描述

我首先尝试通过使用 Gauss-Legendre 求积法,通过 NAG 例程 D01BCF(D01BCF 链接)生成一些 60 或 100 个横坐标和权重来计算某些选定值的 q 积分. 在高斯勒让德求积的情况下,问题是选择要在其上积分的区间 [0,B]。虽然函数 f 从 r=10 到 r=20 损失了 4 到 5 个数量级(示例),但 B 的选择对计算结果有很大影响......当我比较结果时,我得到一个“几乎精确”的计算(使用 matlab 但计算时间非常长),我看到实际上这仅对 q 的小值有效(大约为 5,当我必须处理大至 150 的值时) . Gauss-Laguerre 求积并没有给出更好的结果,可能是因为被积函数的振荡部分。

然后,我尝试使用例程 D01ASF (D01ASF link)为一些给定的 q 值计算傅立叶变换。它是一个“一维求积、自适应、半无限区间、权函数cos(ωx)或sin(ωx)”,正是我所需要的。如果我输入 10E-5 的绝对误差容限,对于高达 80 或 100 的 q,结果非常令人信服。问题是:我需要更大的 q,并且傅里叶变换 F(q) 在这样的 q 处以 ~ 10E-6 的幅度振荡。将容差降低到 10E-5 已经需要一些时间,甚至会使整个事情从子程序输出一些错误消息,所以我不知道 10E-6 是否可行。

因此,我目前想知道尝试用 FFT 计算这个傅立叶变换是否不是一个好主意?我面临的问题是我不知道如何用 FFT 计算径向波函数(而且我什至不知道如何正确使用 FFT,因为变换的定义甚至不一样(指数符号和论点)并且我以前从未使用过它)。

你有想法吗?:)

编辑 2:我尝试了 FFT(使用 NAG 库中的例程C06FAF)。对于一些较大的 q 值,它工作得很好。我面临的问题是总是有一些恒定的标准化因素需要考虑。我不明白为什么。这个归一化因子随着网格中使用的点数 N 变化。它具有幂律的:归一化因子 F = N^(-0.5) x exp(9.9) 近似(见图数字,其中黑线是“精确”傅里叶变换,绿色、品红色、蓝色、红色和黄色线是针对不同 N 值计算的 FFT)

EDIT3:我发现因子是 A*N^(-0.5) 其中 A 是积分网格的长度

4

0 回答 0