【问题标题】:Solve a linear system for FFT coefficients求解 FFT 系数的线性系统
【发布时间】:2017-06-23 09:40:54
【问题描述】:

如果我想在 (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 数组以使其成为方形,但这似乎很浪费。我一直无法想出解决非平方线性系统的方法。我对这样一个系统的想法很感兴趣,方程的数量必须等于变量的数量。有人处理过这个问题吗?

【问题讨论】:

  • “很容易看到如何修改 L 来处理非方形的那部分,...,但这似乎很浪费。” 为什么?这正是我会做的。
  • 另外,我没有看到任何真正的线性系统可以用 LAPACK 解决。你的方程中没有矩阵乘法。它们只是简单的独立代数方程,没有系统。这就是傅里叶变换的重点,以避免复杂的系统。
  • 这可能会在scicomp.stackexchange.com 上得到更好的答案。但它也可能会得到像 @VladimirF 已经制作的那样的 cmets。
  • @VladimirF 我描述的线性系统是为了求解我从 ftT(now) 写的方程,所以在 'Ax=B' 中,A 是 '(1-kappa i>dt*L/2)'。我想我不确定我是否理解“简单代数方程”和线性方程组之间的区别。反正我要么填要么退到c2c。
  • @HighPerformanceMark 我很乐意接受所有 VladimirF cmets.. 感谢您的链接。

标签: arrays matlab matrix fortran octave


【解决方案1】:

没有要解决的线性系统。对于拉普拉斯算子(与其他算子不同),傅里叶模式是特征向量。

因此傅里叶变换后的傅里叶模式是独立的,都是线性偏微分方程的解。

你的方程式:

(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)

是一个具有一个未知数编号ftT_now(i)的代数方程。等式中的所有其他项都只是数字。看不到矩阵。

因此,您只需找到与每个傅里叶模式 ftT(i) 对应的适当特征值 L(i) 并计算简单方程。


使用R2CC2C 都没有关系。具有特征值的表是方形的还是非方形的。目前还没有 LAPACK 的线性系统。

【讨论】:

  • 我明白你的意思,不幸的是,正如你所猜测的(再一次),还有另一个术语:雅可比积分。我真的在整合涡度方程。我按照我的方式提出问题,因为我想保持简单,把婴儿和洗完澡一起扔出去。别担心,我会去 c2c。
  • 但我认为这不会改变太多。但可能更容易开始。
  • 如果你的矩阵很稀疏,一定要寻找稀疏矩阵求解器,这很有可能。
  • “A”部分是 1 + 将变量转换为其拉普拉斯算子的数字数组,因此条目类似于 k2 和 l2,或总和;矩阵不是稀疏的,但它是高度可重复的,我想这没有帮助。
  • 您可以在 scicomp 询问,提供尽可能多的详细信息。有很多经验的人。但他们需要那些细节,比如矩阵的结构以及它的来源。
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 2018-01-17
  • 2020-04-03
  • 2019-01-15
  • 1970-01-01
  • 2022-07-06
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多