Я пытаюсь решить двумерное уравнение Пуассона с помощью конечных разностей. В процессе, я получаю разреженную матрицу только с переменными в каждом уравнении. Например, если переменные были U , то дискретизация даст:
Я знаю, что могу решить эту систему итеративным методом, но мне пришла в голову мысль, что если бы я упорядочил переменные надлежащим образом, я мог бы получить матрицу с полосами, которая могла бы быть решена прямым методом (т. Е. Исключение Гаусса w / o поворотный). Это возможно? Существуют ли стратегии для этого для других, возможно, менее структурированных разреженных систем?
Ответы:
Это хорошо изученная проблема в области разреженных прямых решателей. Я настоятельно рекомендую прочитать обзор Джозефа Лю о мультифронтальном методе , чтобы лучше понять, как переупорядочения и суперузлы влияют на заполнение и время решения.
Вложенное разбиение является чрезвычайно распространенным способом генерации переупорядочения и по существу состоит из рекурсивного разбиения графа. MeTiS является стандартом де-факто для разбиения графов, и вы можете прочитать о некоторых идеях, стоящих за ним здесь . Другим широко используемым пакетом является SCOTCH , и Chaco также важен, поскольку его авторы представили многоуровневое разбиение графа , что также является фундаментальной идеей MeTiS .
Джордж и Лю показали в своей классической книге , что 2d разреженных прямых решения требуют только работа и вывод ( п войти п ) память, в то время как 3d разреженных прямым требует вывод ( п 2 ) работа и О ( п 4O(n3/2) O(nlogn) O(n2) память.O(n4/3)
источник
Cuthill-McKee является стандартом де-факто для того, что вы хотите сделать. Если вы хотите поиграть с этим методом, есть простая в использовании реализация алгоритма (и его обратного) в библиотеке графов ускорения. (BGL), и документация содержит примеры, как его использовать.
источник
Говоря о мультифронтальных методах, Тим Дэвис , который работает над мультифронтальными методами для факторизации LU ( UMFPACK ), предлагает ряд процедур, которые будут переупорядочивать матрицы для минимизации заполнения. Вы можете найти их здесь как часть SuiteSparse . SuiteSparse использует MeTiS.
Еще одна вещь, на которую следует обратить внимание: в некоторых проблемах вы можете быть умными в отношении упорядочивания переменных, чтобы получить шаблоны с полосами или близко к полосам, что может избавить вас от проблем (и времени ЦП) при вызове этих алгоритмов. Тем не менее, это умное переупорядочение требует понимания с вашей стороны и далеко не такое общее, как алгоритмы переупорядочения на основе теории графов, о которых люди упоминали в своих ответах здесь.
источник
В прикладных математических кругах есть алгоритм ADI (Alternating Direction Implicit) и оператор Split в кругах физики, который в основном выполняет то, что вы описываете. Это итеративный метод, и он следует этой основной процедуре:
Повторите 1 и 2, пока ошибка не станет настолько маленькой, насколько вы хотите.
Я не знаю формальной сложности этого алгоритма, но я обнаружил, что он сходится за меньшее количество итераций, чем такие вещи, как Якоби и Гаусс-Зайдель, каждый раз, когда я его использовал.
источник