Mathematicaによる固有値計算の高速化 ~ Eigenvalue calculation speed by Mathematica ~ 情報工学科 06A2055 平塚 翔太
スライド一覧 前回のあらすじ プログラムの高速化(9) プログラムの高速化(10) プログラムの高速化(11) 今後の課題 参考文献
前回のあらすじ 10進数 4^2 4^1 4^0 16 1 17 ・ 63 3 リスト化
三重対角行列の作成 固有値計算 緩和時間がわかる 非平衡から平衡へ変化するとき,変化に要する時間 -1 / λ
プログラムの高速化(9) 行列作成にDiagonalMatrix関数を用いる 一列ごとリストを作り,くっつける
上段 中段 -α -α-β/w-h[1] -α-2β/w-2h[2] -α-3β/w-3h[3] ・・・ -β/w-nh[n] -α -nβ/w -nh[n]
中段 下段
結果
このプログラムは1つしか行列を作成せず,かつhリスト2重リストなので関数化させる. 引数に設定する
速度結果 前回のようにelやwを大きくすると速くなるが,行列を大きくすると遅くなる・・・ n(行列の大きさ) (n×n行列) 作成プログラム (行列プログラムのみ) オリジナルプログラム (プログラム全体) 50 0.312秒 1.684秒 100 0.702秒 2.0436秒 500 9.4224秒 5.4132秒 700 16.2084秒 6.9888秒 1000 Error 9.9216秒
プログラムの高速化(10) Diagonal関数では遅いので SparseArray関数を用いて 三重対角行列を作成する. 三重対角行列を作成する. DiagonalとSparseArrayの構造を調べる
Diagonalのときと同じく,一列ずつ作成する 上段 中段
結果
さらに、 ①リストの作成部分と行列の作成を分ける. SparseArray内にリスト処理プログラムを置くと時間がかかると考えられる
②関数化せず, Table関数を用いてSparseArrayを処理させる. 一回一回呼び出して計算させると処理時間がかかると考えられる
速度結果② 前回より速くなったが,オリジナルとさほど変わらない・・・ n(行列の大きさ)(n×n行列) SparseArray(s) 50 0.327 0.843 1.576 100 0.483 1.342 2.043 250 0.904 2.980 3.338 500 1.826 5.600 5.631 750 2.761 8.377 8.389 1000 3.791 11.247 10.702
プログラムの高速化(11) 固有値計算 Eigenvalues関数 関数化し,行列のリストすべてを計算させる.
計算結果をリスト化 Max,Min関数で最小値と最大値を出力する. ・
今後の課題 さらに高速化させるよう現プログラムのボトルネックを中心に改良する.
参考文献 Mathematica Document Center カーネル内またはホームページ http://reference.wolfram.com/mathematica/guide/Mathematica.html
ご清聴ありがとうございました