Matlab中3D数组的偏导数

计算科学 matlab 有限差分 谱法
2021-12-09 09:04:51

我有兴趣在 Matlab 中获取 3 维数组的一些偏导数 - 比如说近似于我需要近似诸如等的东西。我已经为其中一些导数建立了有限差分矩阵,但最终这将是缓慢且不准确的(我'最终希望对甚至数组进行操作)。 A(i,j,k)f(xi,yj,zk)xyfyzf25635123

有没有人对使用 FFT 计算这些部分有很好的建议?我尝试了以下幼稚的事情,但它似乎不起作用:

N=128;
L=2*pi;

x=L/N*(-N/2:N/2-1);y=x;z=x;
[X,Y,Z]=meshgrid(x,y,z); 
f=sin(X).*sin(Y).*sin(Z);  % A 2-pi periodic function to test
fp_exact=cos(X).*sin(Y).*sin(Z); % Its exact x-partial

ik=1i*(2*pi/L)*[0:nx/2-1 0 -nx/2+1:-1]; % The spectral differentiation vector

fhat=fftn(Z);  % Compute the 3-D FFT 

C=mat2cell(fhat,nx,ones(1,nx),ones(1,nx));  % So I can act on each column 
result=cellfun(@(x) x.*ik',C,'UniformOutput',false);  % Multiply each column of Z by ik
fprimehat=cell2mat(result);  % Convert back to 3D array
fprime=ifftn(fprimehat);  % IFFT

上面的代码似乎没有希望了——我想我错过了一些重要的东西,而且还没有真正考虑到这一点。使用上面的 ik 定义,我可以计算一维光谱导数

fprime=ifft(ik.*fft(f));

提前感谢您的任何提示。

1个回答

用 FFT 计算导数比必要的要复杂得多。如果你只是使用一阶有限差分商,那么你可以近似和其他导数类似。这可以通过对所有进行循环来完成,其成本与元素数量成正比,而使用 FFT 的方法肯定更昂贵。xA(i,j,k)A(i+i,j,k)A(i,j,k)Δxi,j,k