このページは、nAGライブラリのJupyterノートブックExampleの日本語翻訳版です。オリジナルのノートブックはインタラクティブに操作することができます。
線形システムの解法における行列構造の活用
nAGの従業員であるReid Atchesonは、彼の個人ブログの最近の投稿で、最速の数値線形代数ルーチンは通常何らかの行列構造を活用していると述べました。Reidは特にToeplitz行列について議論を続けました。Reidの投稿を読んで、専門的なソルバーを使用することでどれほどの違いが生まれるのか疑問に思いました。
私の講演の1つであるHigh Performance Computing: There’s plenty of Room at the Bottomで、Prabhuらの論文A survey of the practice of computational scienceを引用しています。彼らは「分野を超えて、研究の質に大きな変化をもたらすには1桁のパフォーマンス向上が必要とされている」と述べています。したがって、理想的には私が行う高速化は少なくとも10倍の改善をもたらすはずです。
これを探るために、現在ご覧いただいているJupyterノートブック内でnAG library for Pythonを使用しました。元のノートブックはnAGのPython Examples GitHubリポジトリの線形代数セクションで入手可能です。
Toeplitz行列の線形システムの解法 - 構造を活用する例
Toeplitz行列はさまざまな応用で発生し、その例のいくつかはhttp://jack.valmadre.net/notes/2015/03/28/symmetric-positive-toeplitz/で紹介されています。
ここでは、係数行列がToeplitz行列である線形システムを解きます。まず、基本的な構造を利用せず、汎用のdgesv関数へのnAGのインターフェースを使用します。
from naginterfaces.library.lapacklin import dgesv # A general solver
from naginterfaces.library.linsys import real_toeplitz_solve # A toeplitz solver
from pytictoc import TicToc
import numpy as np
import scipy.linalg
= TicToc()
timer
# 実数の、対称的な、正定値のテプリッツ行列を構築する
= 5000
matrix_size = np.arange(0, matrix_size)
t = np.exp(-np.abs(t)/10)
a # トープリッツ行列はその対角線によって定義されます。scipyを使用して対角線から完全な行列を構築できます
= scipy.linalg.toeplitz(a, a)
A # ランダムな右辺を構築する
2)
np.random.seed(= np.random.rand(matrix_size,1)
b
timer.tic()= dgesv(A, b)
asol, ipiv, x_nag_gen timer.toc()
Elapsed time is 2.079083 seconds.
同じ問題を解きますが、今度はreal_toeplitz_solve関数を使用します
# nAGのテプリッツソルバーは、bの次元がN,1ではなくNであることを要求します
# そこで、正しい次元で再構築します
2)
np.random.seed(= np.random.rand(matrix_size)
b
timer.tic()= real_toeplitz_solve(matrix_size, a, b, wantp=False)
x_nag_toe, p timer.toc()
Elapsed time is 0.023880 seconds.
# トーブリッツソルバーを使用することでどれだけ高速化されるか見てみましょう
5.39/0.035
153.99999999999997
Toeplitzソルバーを使用する方が100倍以上速いです。同じ答えが得られるか確認する必要がありますね? 厄介なことに、解行列の形状が異なっています!
# 一般的なソルバーからの解
x_nag_gen.shape
(5000, 1)
# トーブリッツソルバーからの解
x_nag_toe.shape
(5000,)
しかし、値は高い精度で一致しています
max(abs(x_nag_gen - np.reshape(x_nag_toe, (matrix_size, 1)))) np.
1.341149413747189e-13
nAGライブラリのPython向け他の線形ソルバー - さまざまな行列構造を利用
あなたのアプリケーションではToeplitzソルバーを利用できないかもしれませんが、nAGライブラリの他の特殊な線形ソルバーの1つを活用できる可能性があります。行列の数学的構造に加えて、他の特殊化にはパック格納や混合精度演算の使用が含まれます。同じ係数行列Aで複数の右辺を計算する必要がある場合、その状況に特化したソルバーもいくつかあります。以下は、利用可能なソルバーの一部とそのPythonドキュメントへのリンクです:
実数行列
- library.linsys.real_toeplitz_solve 実対称正定値Toeplitz線形方程式系の解法。
- library.lapacklin.dgbsv 実バンド線形方程式系の解を計算します。
- library.lapacklin.dsgesv 混合精度演算を使用して実数線形方程式系の解を計算します。
- library.lapacklin.dsysv 実対称線形方程式系の解を計算します。
- library.lapacklin.dspsv 実対称線形方程式系の解を計算します、パック格納。
- library.lapacklin.dpbsv 実対称正定値バンド線形方程式系の解を計算します。
- library.lapacklin.dposv 実対称正定値線形方程式系の解を計算します。
- library.lapacklin.dppsv 実対称正定値線形方程式系の解を計算します、パック格納。
- library.lapacklin.dsposv 混合精度演算を使用して実対称正定値線形方程式系の解を計算します。
- library.lapacklin.dptsv 実対称正定値三重対角線形方程式系の解を計算します。
- library.lapacklin.dtbtrs 実バンド三角線形方程式系の解法、複数の右辺。
- library.lapacklin.dtrtrs 実三角線形方程式系の解法、複数の右辺。
- library.lapacklin.dtptrs 実三角線形方程式系の解法、複数の右辺、パック格納。
- library.lapacklin.dgtsv 実三重対角線形方程式系の解を計算します。
複素行列
- library.lapacklin.zgbsv 複素帯行列の線形方程式系の解を計算します。
- library.lapacklin.zhesv 複素エルミート線形方程式系の解を計算します。
- library.lapacklin.zhpsv 複素エルミート線形方程式系の解を計算します。パック形式で格納。
- library.lapacklin.zpbsv 複素エルミート正定値帯行列の線形方程式系の解を計算します。
- library.lapacklin.zposv 複素エルミート正定値線形方程式系の解を計算します。
- library.lapacklin.zppsv 複素エルミート正定値線形方程式系の解を計算します。パック形式で格納。
- library.lapacklin.zcposv 混合精度演算を使用して複素エルミート正定値線形方程式系の解を計算します。
- library.lapacklin.zptsv 複素エルミート正定値三重対角線形方程式系の解を計算します。
- library.lapacklin.zgesv 複素線形方程式系の解を計算します。
- library.lapacklin.zcgesv 混合精度演算を使用して複素線形方程式系の解を計算します。
- library.lapacklin.zsysv 複素対称線形方程式系の解を計算します。
- library.lapacklin.zspsv 複素対称線形方程式系の解を計算します。パック形式で格納。
- ibrary.lapacklin.ztbtrs 複素帯三角線形方程式系の解を計算します。複数の右辺。
- library.lapacklin.ztrtrs 複素三角線形方程式系の解を計算します。複数の右辺。
- library.lapacklin.ztptrs 複素三角線形方程式系の解を計算します。複数の右辺、パック形式で格納。
- library.lapacklin.zgtsv 複素三重対角線形方程式系の解を計算します。