私のプロジェクトでは、タイムステップごとに2つの3重対角行列を解く必要があるため、それらに対して優れたソルバーを使用することが重要です。私は独自の実装を行いましたが、ウィキペディアに記載されている古典的な方法で実装しました。その後、代わりにLapackを使用してみましたが、驚いたことに遅くなりました!
さて、Lapackの内部では、LU分解による解法を実行しているように見えますが、なぜそうなるよりも複雑ではないのでしょうか。
さらに、nr.comの「Numerical Recipes」の本で、システムを再帰的に小さな三重対角問題に分割するアルゴリズムを見つけました。それは有望に見えた。他にグッズはありますか?
更新:問題のサイズは約1000x1000です。私はGotoBLASを使用しましたが、Lapack 3.1.1ライブラリも提供します。問題は対称的ではありません。私は一般的な三重対角行列にLapackルーチンを使用しました。
2
このために使用したLAPACKルーチンを指定する必要があります。dgtsvは部分的なピボットを実行しますが、コードがこれを実行しない場合があることに注意してください。また、どのLAPACK実装でテストしたか、どの問題サイズでベンチマークしたかについてもお知らせください。また、問題は対称的な正定ですか?
—
Jed Brown
質問の定式化にいくつかの情報を追加しました。
—
tiam
あなたのアプリケーションは有限体積法と関係がありますか?
—
インクエスト
それは有限の違いですが、この見方では多かれ少なかれ同じだと思います。
—
tiam