効率的な三重対角行列アルゴリズムの実装


12

暗黙的な数値スキームを使用して物理的な問題を解決しています。これは、三重対角行列を持つ線形方程式を解くことにつながります。私はウィキペディアからこのアルゴリズムをコーディングしました。このタイプの方程式を最適化された方法で解くことができる効率的なライブラリがあるのだろうか。重要な注意点は、システムパラメーターが変更されたときにのみマトリックス自体が変更されることです。そのため、素晴らしいパフォーマンスボーナスを得るために、いくつかのアルゴリズムステップを事前に計算する機会がありました。C ++を使用しています。


システムの大きさはどれくらいですか、並列である必要がありますか?
aterrel

1
サイズは、必要な精度(数百から数万の値)に依存します。現在、私は1コアのコンピューターでコーディングしていますが、多くのcpusが利用可能な大学のスーパーコンピューターにアクセスできるので、並列処理のサポートがいいでしょう。
gmk

回答:


15

おそらく、例えば、gtsv?、LAPACKの実装を開始する必要がありますdgtsv。分散メモリバージョンが必要な場合は、ScaLAPACKのp?gtsvから始めることをお勧めします。

編集:マトリックスはあまり頻繁に変更されないため、LAPACKルーチン?gtsvを分解ステップ?gttrfとソルバーステージ?gttrsに分割することにより、三重対角マトリックスの冗長なファクタリングを回避できます。同じ目的を果たす同様の名前のルーチンがScaLAPACKに存在します。


ありがとう、私が必要なもののように見える。コードからこのルーチンを実行してみましょう。
gmk

1
C ++から呼び出すため、extern "C" {}ブロック内でプロトタイプを宣言してください。システムによっては、ルーチン名にアンダースコアを追加する必要がある場合があります。
ジャックポールソン

2

分散並列システムの場合:使用可能な例があるそのため私は、パラレル三重対角ソルバーを持っているのScaLAPACKを、試していませんがオンラインでLANLの出版物でDavid Moultonが提案した方法を試してみました。これをコーディングするのは、あなたがやりたいことよりも多いかもしれませんが、LAPACKを使用することで、簡単になります。


1

ここで975ページで興味深い再帰アルゴリズムを見つけました。有望に見えますが、より経験豊富な人がそれについて何と言っているのでしょうか。


数値レシピにはいくつかのエラーがあります。使用するコードのソースに関しては、最高のものではありませんが、一部はクラシックと考えています。ScaLAPACKが少なくとも再帰的巡回削減と同じくらい効率的なアルゴリズムを実装していなかったら、驚くでしょう。
ジェフオックスベリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.