【问题标题】:How to compute the iteration matrix for nth NLBGS iteration如何计算第 n 次 NLBGS 迭代的迭代矩阵
【发布时间】:2020-05-02 12:14:51
【问题描述】:

我想知道是否有直接的方法可以在 OpenMDAO 中计算第 n 次线性块高斯塞德尔迭代的迭代矩阵?

谢谢

【问题讨论】:

  • 你的意思是问LinearBlockGaussSeidel方法吗?该算法的非线性版本没有迭代矩阵。
  • 是的,我的意思是线性方法

标签: python-3.x openmdao


【解决方案1】:

如果我理解正确,您指的是高斯赛德尔算法的矩阵形式,其中您取 Ax=b,并将 A 分解为对角线 (D)、下 (L) 和上 (U) 部分,然后使用这些部分来计算下一次迭代。 具体来说,您计算 [D-L]^-1。我相信这就是您所说的“迭代矩阵”(我不熟悉这个术语,但基于 algorithm 我很乐意做出有根据的猜测)。

算法的这种表述是有用的,也是一种实现它的简单方法,但 OpenMDAO 采用了不同的方法。 OpenMDAO 中实现的 LBGS 算法设置为以无矩阵方式工作。这意味着它只与线性运算符方法solve_linearapply_linear 交互,并且根本不会显式组装 A 矩阵。因此,没有机会将 A 拆分为 D、L、U。

根据您构建模型的方式,您需要的 A 矩阵可能存在也可能根本不存在,因为 OpenMDAO 能够在完全无矩阵的上下文中工作。但是,如果所有您的组件都使用compute_partialslinearize 方法来提供偏导数,那么A 矩阵所需的数据确实存在于内存中。

您将不得不对其进行深入研究,具有讽刺意味的是,了解如何做到这一点的最佳位置是在 direct solver 中,这实际上需要形成矩阵来计算分解.

此外,在该代码中,您将看到 a function 可以迭代调用线性运算符来构造密集矩阵,即使底层组件不直接提供其部分。请注意,这种组装矩阵的方法非常慢,不建议用于正常操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多