Если я вас правильно понимаю, вы имеете в виду матричную форму алгоритма Гаусса Зейделя, где вы берете Ax = b и разбиваете A на диагональную (D), нижнюю (L) и верхнюю (U) части. затем используйте эти части для вычисления следующей итерации. В частности, вы рассчитываете [DL] ^ - 1. Это, я полагаю, то, что вы называете «матрицей итераций» (я не знаком с этой терминологией, но на основе алгоритма мне удобно делать обоснованное предположение).
Эта формулировка алгоритма полезна для размышления и простого способа ее реализации, но OpenMDAO использует другой подход. Алгоритм LBGS, реализованный в OpenMDAO, настроен на работу без матрицы. Это означает, что он взаимодействует только с методами линейного оператора solve_linear
и apply_linear
и никогда не собирает явно матрицу A вообще. Следовательно, нет возможности разбить A на D, L, U.
В зависимости от того, как вы построили модель, вам может понадобиться или не быть матрица A, потому что OpenMDAO способен работать в полностью матричном свободном контексте. Однако, если все ваших компонентов используют методы compute_partials
или linearize
для предоставления частных производных, тогда данные, которые вам понадобятся для матрицы A, существуют в памяти.
Вам придется немного покопаться, и по иронии судьбы лучшее место, чтобы увидеть, как это сделать, находится в Direct Solver , который на самом деле требует Матрица должна быть сформирована для расчета факторизации.
Кроме того, в этом коде вы увидите функцию , которая может итеративно вызывать линейный оператор для построения плотной матрицы, даже если нижележащие компоненты не предоставляют свои партиалы напрямую. Обратите внимание, что этот подход для сборки матрицы чрезвычайно медленный и не рекомендуется для нормальной работы.