在 Matlab 中使用 FFT 计算高阶导数

计算科学 matlab 傅里叶变换
2021-12-09 19:55:14

我正在尝试在 Matlab 中使用 FFT 计算函数的导数。我编写了以下函数来计算它:

function dfdx = derivative(x,psi_0,n)

 Nx = max(size(psi_0));
 k = 2*pi/(range(x))*[0:Nx/2-1 0 -Nx/2+1:-1];
 dfdx = ifft(((1i*k).^n).*fft(psi_0));

end

对于更高的导数(假设是次导数)它不起作用。更准确地说,次导数的情节没有意义。2020

知道是什么原因造成的,以及如何纠正?

1个回答

假设您,为简单起见,假设它是在整条实线上定义的单变量函数。如果它的傅里叶变换,那么fL2F(f)f^F(f)(ξ)=2πiξf^(ξ)

如果您正在计算第个导数,则迭代上面的过程会产生,表明高阶导数的计算变得病态。假设处的良条件函数,则导数表达式中的大系数意味着个导数的傅里叶变换的值显着扰动nF(f(n))(ξ)=(2πiξ)nf^(ξ)f^ξξnn

例如,如果,则常数前置因子的大小将是,或大约有了这么大的常数因子,如果您在浮点运算中获得有意义的结果,那将是令人惊讶的。您可以将这种方法与通过有限差分近似数值计算导数进行比较;在大多数情况下,用这种方法计算 20 次导数会产生垃圾。n=20(2π)201016

如果您使用任意精度算术,您可能会看到更准确的结果。随着的增加,您将需要更多位的输入精度才能获得精确到至少 8 位有效数字的输出(此截止值是任意的,但可能您需要许多准确的有效数字)。n