Как вычислить матрицу итерации для n-й итерации NLBGS - PullRequest
1 голос
/ 02 мая 2020

Мне было интересно, существует ли прямой способ вычисления итерационной матрицы для n-й итерации линейного блочного блока Гаусса в OpenMDAO?

спасибо

1 Ответ

0 голосов
/ 04 мая 2020

Если я вас правильно понимаю, вы имеете в виду матричную форму алгоритма Гаусса Зейделя, где вы берете 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 , который на самом деле требует Матрица должна быть сформирована для расчета факторизации.

Кроме того, в этом коде вы увидите функцию , которая может итеративно вызывать линейный оператор для построения плотной матрицы, даже если нижележащие компоненты не предоставляют свои партиалы напрямую. Обратите внимание, что этот подход для сборки матрицы чрезвычайно медленный и не рекомендуется для нормальной работы.

...