Эффективная реализация алгоритма трехдиагональной матрицы


12

Я решаю физическую проблему, используя неявную числовую схему. Это приводит меня к решению линейного уравнения с трехдиагональной матрицей. Я закодировал этот алгоритм из Википедии. Интересно, есть ли эффективная библиотека, которая позволяет оптимизировать этот тип уравнения? Важным примечанием является то, что сама матрица изменяется только при изменении параметров системы, поэтому у меня была возможность предварительно рассчитать некоторые шаги алгоритма для получения хорошего бонуса производительности. Я использую C ++.


Насколько велика система, должна ли она быть параллельной?
aterrel

1
Размер зависит от требуемой точности (от сотен до десятков тысяч значений). Сейчас я пишу код на одноядерном компьютере, но можно получить доступ к университетскому суперкомпьютеру со многими доступными процессорами, поэтому поддержка параллелизма была бы хорошей.
Гмк

Ответы:


15

Возможно, вам следует начать с реализации LAPACK, например, gtsv , например, dgtsv . Если вам нужна версия с распределенной памятью, вы можете начать с pagtsv из ScaLAPACK.

РЕДАКТИРОВАТЬ: Поскольку ваша матрица меняется не очень часто, вы можете избежать избыточного факторинга трехдиагональной матрицы, разбив подпрограмму LAPACK? Gtsv на этап факторизации, gttrf и этап решения, gttrs. В ScaLAPACK существуют одноименные подпрограммы, которые служат той же цели.


Спасибо, похоже, что мне нужно. Я попробую сейчас запустить эту подпрограмму из моего кода.
Гмк

1
Поскольку вы вызываете его из C ++, обязательно объявите прототип внутри внешнего блока "C" {}. В зависимости от вашей системы вам может потребоваться добавить подчеркивание к имени процедуры.
Джек Полсон

2

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


1

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


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