Кращий вибір рішення для великої розрідженої симетричної (але не позитивно визначеної) системи


10

Зараз я працюю над вирішенням дуже великих симетричних (але не позитивних певних) систем, породжених деякими певними алгоритмами. Ці матриці мають приємну розрідженість блоку, яку можна використовувати для паралельного вирішення. Але я не можу вирішити, чи слід використовувати прямий підхід (наприклад, мультифронтальний) або ітеративний (попередньо обумовлений GMRES або MINRES). Всі мої дослідження показують, що ітеративні розв’язувачі (навіть при досить швидкій конвергенції 7 внутрішніх ітерацій) не вдається перемогти оператора прямого \ \ в MATLAB. Але теоретично прямі методи, як передбачається, коштують дорожче. Як це відбувається? Чи є якийсь сучасний документ або папір для такого випадку? Чи можу я використовувати паралельні блоки в паралельних системах, використовуючи прямі методи так само ефективно, як гнучкі ітеративні розв'язувачі, такі як GMRES?


3
Я не думаю, що люди можуть насправді ефективно коментувати це, не знаючи більше деталей про вашу конкретну матрицю. Які розміри? Як виглядає модель зрідженості?
Costis

2
n

2
Це питання значно збігається з scicomp.stackexchange.com/q/81/276 ; ви можете знайти там корисну інформацію. Крім того, виходячи з цього питання, може бути корисним поговорити про спектр вашого оператора (або спектр вашого попередньо обумовленого оператора).
Джефф Оксберрі

Відповіді:


9

Рідкий прямий вирішувач MUMPS може працювати з симетричними невизначеними системами і є у вільному доступі ( http://graal.ens-lyon.fr/MUMPS/ ). Ян Дафф був одним з авторів MUMPS та MA57, тому алгоритми мають багато подібності.

MUMPS був розроблений для паралельних комп'ютерів з розподіленою пам'яттю, але він також добре працює на однопроцесорних машинах. Якщо ви пов'язуєте його з багатопотоковою бібліотекою BLAS, ви можете досягти розумних прискорень спільної пам'яті, багатоядерних процесорів.

Ви не сказали, наскільки велика "дуже велика", але MUMPS також має позапрофільну здатність вирішувати проблеми, коли матриця з фактом не вміститься у наявну пам'ять.


7

Загальна проблема, з якою страждають прямі розв'язувачі, - це явище заповнення, тобто обернення розрідженої матриці може бути щільним. Це призводить до величезних вимог до пам'яті, якщо структура матриці не "підходить".

Існують спроби вирішити ці проблеми, і функція MATLAB за замовчуванням luвикористовує декілька з них. Див. Http://www.mathworks.de/de/help/matlab/ref/lu.html для огляду перестановок, діагонального масштабування тощо. Те ж саме стосується і більш досконалих пакетів, таких як MUMPS ( http://graal.ens-lyon.fr/MUMPS/ ).

Взагалі, якщо ваша проблема досить велика, ви потрапите на цю межу пам'яті, і вам доведеться використовувати ітеративні (Криловські) методи.

Якщо ваша проблема симетрична і невизначена, очевидним вибором може стати MINRES. Однак зауважте, що GMRES і MINRES роблять те саме в точній арифметиці, якщо проблема симетрична, але GMRES, як правило, менше страждає від втрати ортогональності. Отже, деякі люди розглядають GMRES як "найкращу реалізацію MINRES".

У будь-якому випадку ви, ймовірно, отримаєте прибуток від попередньої кондиціонування вашої системи. Якщо ви не хочете витрачати час на пристосування попереднього кондиціонера, неповний попередній кондиціонер LU-факторизації (ІЛУ) вже може десь потрапити до вас.


2

Будь-який ітеративний вирішувач може перемогти прямі методи лише в тому випадку, якщо проблема досить велика (велика, залежить від кількох факторів, таких як необхідне зберігання, ефективність реалізації). А також будь-який метод крилов (наприклад, GMRES) хороший лише в тому випадку, якщо ви використовуєте відповідну попередню підготовку (на практиці). Якщо ви не використовуєте жодних попередніх умов, методи крилов взагалі не приносять користі. Я надто працюю з блоковими матрицями (вони надходять із додатків PDE) і зауважував, що блок попередньо обумовлених (перекриваючих добавок шварц) крилових розв'язувачів (або перезапущених GMRES або BiCG-Stab) у поєднанні з корекцією грубої сітки (або мультисетки) є масштабованими для цього тип матриць.


2

Оператор Matlab '\' відрізняється високою ефективністю завдяки висококласному програмуванню. Ви можете побачити деякі ідеї та те, як вони використали всі можливі скорочення у книзі Тімоті Девіса.

У матлабі можна використовувати гмрес, який добре розвинений і стабільний. Напевно, міна, яка теоретично повинна бути ідеальною для вашої справи, може бути не такою надійною (принаймні мій досвід говорить про це). Ви повинні отримати рівну або більш високу ефективність від matlab gmres, якщо

  1. Ваша система досить велика (принаймні кілька тисяч на кілька тисяч).
  2. Якщо ви використовуєте правильний тип параметрів (RESTART, MAXIT, X0). Немає чітких вказівок для цього. Скористайтеся своїм досвідом.
  3. Використовуйте хороший попередній кондиціонер. Ви можете використовувати ILU або навіть дешевше, блок Якобі. Це значно скоротить зусилля.
  4. НАЙБІЛОШЕ Matlab gmres ідеально побудований для цього. Це значно скоротить вартість.

Для ще більших систем використовуйте такий інструмент, як PETSc.


1

Якщо ваша матриця має розмір у середніх десятках тисяч або менше, використовуйте прямий метод, хоча для вічно доступних симетричних систем не існує багато вільно доступних прямих методів (насправді жоден, про який я знаю, не є відкритим кодом). Є MA57 від HSL, але це безкоштовно лише для академічного використання. Ви, звичайно, можете ігнорувати симетрію та використовувати UMFPACK .

Приблизно з низькими десятками сотень використання пам'яті прямого методу починає перевищувати те, що типовий настільний комп'ютер може розумно обробляти, тому, якщо у вас не є потужна спільна машина пам'яті, вам потрібно буде перейти до ітеративних методів. Для невизначених проблем ви можете спеціалізувати BiCG (двокон'югатний градієнт) для симетричних систем, хоча можлива поломка. Нещодавно вийшов MINRES-QLP для симетричних систем, що забезпечує більшу чисельну стабільність.

Два способи вимагають досить різних реалізацій, оскільки для прямих методів вам фактично потрібно сформувати матрицю, тоді як при ітеративному підході матрицю зазвичай явно не формуєте.

Існує ряд причин, чому один підхід може бути швидшим за інший, особливо як функція матричного виміру. Для сильно хворих кондиціонованих систем ітеративні методи можуть застоювати досить погано. Для не дуже рідких матриць прямі методи в кінцевому підсумку створюють багато заповнення, що значно сповільнює роботу. Крім того, прямі методи в Matlab дуже оптимізовані (він використовує UMFPACK або MA57 внутрішньо), тоді як ітераційні методи зазвичай кодуються безпосередньо в Matlab, і існує менше можливостей для використання рівня BLAS рівня 3, оскільки вузькими місцями є застосування matvecs і крапкових продуктів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.