Ефективна реалізація алгоритму тридіагональної матриці


12

Я вирішую фізичну задачу за допомогою неявної числової схеми. Це призводить мене до розв’язування лінійного рівняння з тридіагональною матрицею. Я зашифрував цей алгоритм із Вікіпедії. Цікаво, чи існує ефективна бібліотека, яка дозволяє вирішити цей тип рівнянь оптимізованим способом. Важливе зауваження полягає в тому, що сама матриця змінюється лише тоді, коли змінюються системні параметри, тому я мав можливість заздалегідь прорахувати кілька кроків алгоритму для приємного бонусу за ефективність. Я використовую C ++.


Наскільки вона велика в системі, чи потрібна вона паралельна?
aterrel

1
Розмір залежить від необхідної точності (від ста до десятків тисяч значень). Зараз я кодую одноядерний комп'ютер, але можна отримати доступ до університетського суперкомп'ютера з багатьма доступними процесорами, тому підтримка паралелізму була б непоганою.
gmk

Відповіді:


15

Ви, мабуть, повинні почати з реалізації LAPACK,? Gtsv, наприклад, dgtsv . Якщо ви хочете версію з розподіленою пам'яттю, тоді ви можете почати з p? Gtsv ScaLAPACK.

EDIT: Оскільки ваша матриця не змінюється дуже часто, ви можете уникнути надмірного розподілу тридіагональної матриці, розбивши порядок LAPACK? Gtsv на етап факторизації, gttrf та етап вирішення? Gttrs. У ScaLAPACK аналогічно названі підпрограми існують з тією ж метою.


Дякую, схоже, що мені потрібно. Я зараз спробую запустити цю процедуру зі свого коду.
gmk

1
Оскільки ви телефонуєте з C ++, обов'язково оголосіть прототип всередині зовнішнього блоку "C" {}. Залежно від вашої системи, вам може знадобитися додати підкреслення до імені звичайного.
Джек Поульсон

2

Для розподілених паралельних систем : Я не пробував ScaLAPACK, який має паралельний тридіагональний вирішувач, для якого є приклади, доступні в Інтернеті . Я з певним успіхом спробував метод, запропонований Девідом Моултоном у публікації LANL . Кодування цього варіанту може бути більше, ніж ви хочете зробити, але, використовуючи LAPACK, це йде вперед.


1

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


Числові рецепти мають у цьому деякі помилки. Щодо джерела використання кодів, це не найкраще, хоча деякі вважають це класикою. Я був би здивований, якби ScaLAPACK не реалізував алгоритм, принаймні такий ефективний, як рекурсивне циклічне зменшення.
Джефф Оксберрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.