【发布时间】:2020-05-02 12:14:51
【问题描述】:
我想知道是否有直接的方法可以在 OpenMDAO 中计算第 n 次线性块高斯塞德尔迭代的迭代矩阵?
谢谢
【问题讨论】:
-
你的意思是问LinearBlockGaussSeidel方法吗?该算法的非线性版本没有迭代矩阵。
-
是的,我的意思是线性方法
标签: python-3.x openmdao
我想知道是否有直接的方法可以在 OpenMDAO 中计算第 n 次线性块高斯塞德尔迭代的迭代矩阵?
谢谢
【问题讨论】:
标签: python-3.x openmdao
如果我理解正确,您指的是高斯赛德尔算法的矩阵形式,其中您取 Ax=b,并将 A 分解为对角线 (D)、下 (L) 和上 (U) 部分,然后使用这些部分来计算下一次迭代。 具体来说,您计算 [D-L]^-1。我相信这就是您所说的“迭代矩阵”(我不熟悉这个术语,但基于 algorithm 我很乐意做出有根据的猜测)。
算法的这种表述是有用的,也是一种实现它的简单方法,但 OpenMDAO 采用了不同的方法。 OpenMDAO 中实现的 LBGS 算法设置为以无矩阵方式工作。这意味着它只与线性运算符方法solve_linear 和apply_linear 交互,并且根本不会显式组装 A 矩阵。因此,没有机会将 A 拆分为 D、L、U。
根据您构建模型的方式,您需要的 A 矩阵可能存在也可能根本不存在,因为 OpenMDAO 能够在完全无矩阵的上下文中工作。但是,如果所有您的组件都使用compute_partials 或linearize 方法来提供偏导数,那么A 矩阵所需的数据确实存在于内存中。
您将不得不对其进行深入研究,具有讽刺意味的是,了解如何做到这一点的最佳位置是在 direct solver 中,这实际上需要形成矩阵来计算分解.
此外,在该代码中,您将看到 a function 可以迭代调用线性运算符来构造密集矩阵,即使底层组件不直接提供其部分。请注意,这种组装矩阵的方法非常慢,不建议用于正常操作。
【讨论】: