【发布时间】:2020-05-13 14:51:32
【问题描述】:
我必须用数值计算高斯函数的二阶导数:
我已经在这里阅读了有关此主题的所有问题,但无法得出一个好的结果。我选择 NumPy 作为我的首选工具。
我们教授的指示:
- 使用步骤
dx = 1获取大小为N = 128的x数组。所以,-64, -63, ..., 62, 63。计算f(x) - 对
f(x)执行FFT 并接收转换后的数组f_m。 - 将
f_m乘以,其中 是虚数单位, 是导数和 - 执行逆 FFT 以接收导数。
- 在某些 FFT 实现中,您可能需要按
1/n进行扩展(但这是目前最小的问题)
现在这是我的代码,尽可能简单。
import numpy as np
# Set some parameters
n = 128
dx = 1
a = 0.001
# Create x, calculate f(x) and its FFT
x = np.arange(-n/2, n/2) * dx
psi = np.exp(-a * x * x)
f_m = np.fft.fft(psi)
# k_m creation according to professor (point 3. in my instruction)
k_m = np.arange(-n/2, n/2, dtype=float)
k_m[:int(n / 2)] = (2 * np.pi * k_m[:int(n / 2)]) / (n * dx)
k_m[int(n / 2):] = (2 * np.pi * (k_m[int(n / 2):] - n)) / (n * dx)
# Multiply f_m by (j * k_m)^q. For q=2, this is -k_m^2
f_m *= -k_m * k_m
# Inverse FFT on the result to get the second derivative and scale by 1 / n
f_m = np.fft.ifft(f_m) / n
我无法得到的一件事是结果仍然有虚部,所以有些事情是不对的。有人可以帮忙吗?
编辑:Cris Luengo 的回答有效。
【问题讨论】: