如果我想在(2d)空间中使用FT在周期域中集成热方程,使用Crank-Nicolson我会写:
(1-kappa*dt*L/2)ftT(now)=(1+kappa*dt*L/2)ftT(last)
其中L是一个数字数组,可将解ftT缩放为拉普拉斯算子。 如果ftT数组是方形的,那么使用LAPACK很容易解决,因为它们在Matlab / Octave中。 然而,在r2c,c2r模式中使用FFTW,复杂的变换阵列不是方形的。很容易看到如何修改L来处理非方形的那部分,并且很清楚如何填充ftT数组以使其成为正方形,但这似乎很浪费。我无法想出解决非方形线性系统的方法。我认为,对于这样一个系统,方程的数量必须等于变量的数量。有没有人不得不处理这个问题?
答案 0 :(得分:2)
没有线性系统需要解决。对于拉普拉斯算子(与其他算子不同),傅里叶模式是特征向量。
因此在傅立叶变换后傅里叶模式是独立的,所有都是线性PDE的解。
你的等式:
(1-kappa*dt*L/2) ftT(now) =(1+kappa*dt*L/2) ftT(last)
如果L是非对角矩阵,则将是(可能复杂的)线性系统。例如,平流操作员就会发生这种情况。
但对拉普拉斯算子而言,它是一组简单的代数方程,L
是一个对角矩阵,你只能使用对角线项 - 特征值。
对于每个i = 1..n
:
(1-kappa*dt*L(i)/2) ftT_now(i) =(1+kappa*dt*L(i)/2) ftT_last(i)
是一个带有 ONE UNKNOWN 数字ftT_now(i)
的代数方程。等式中的所有其他项都只是数字。看不到任何矩阵。
因此,您只需找到与每个傅里叶模式L(i)
对应的适当特征值ftT(i)
,并计算简单方程。
使用R2C
还是C2C
并不重要。具有特征值的表是方形还是非方形。 LAPACK没有线性系统。