FrankMatrixDerivingEigenvalues - t-sakashita/rokko GitHub Wiki
Frank行列の固有値の導出
Frank行列の逆行列は、次のようになる。
1 -1 0 0 0 0 0 0 0 0
-1 2 -1 0 0 0 0 0 0 0
0 -1 2 -1 0 0 0 0 0 0
0 0 -1 2 -1 0 0 0 0 0
0 0 0 -1 2 -1 0 0 0 0
0 0 0 0 -1 2 -1 0 0 0
0 0 0 0 0 -1 2 -1 0 0
0 0 0 0 0 0 -1 2 -1 0
0 0 0 0 0 0 0 -1 2 -1
0 0 0 0 0 0 0 0 -1 2
Frank行列:
10 9 8 7 6 5 4 3 2 1
9 9 8 7 6 5 4 3 2 1
8 8 8 7 6 5 4 3 2 1
7 7 7 7 6 5 4 3 2 1
6 6 6 6 6 5 4 3 2 1
5 5 5 5 5 5 4 3 2 1
4 4 4 4 4 4 4 3 2 1
3 3 3 3 3 3 3 3 2 1
2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1
ラプラシアンの理論固有値
2 * (1 - cos(PI * (2 * k + 1) / (2 * dim + 1)));
MPI並列化
- public rokko::distributed_mfreeを継承したクラスlaplacian_opを定義
- MPIコミュニケータは、このコンストラクタに渡される。(または、デフォルトのMPI_COMM_WORLDが使用される。)
- そのクラスの中で、関数multiply(const double* x, double* y)を定義
- xは入力ベクトル
- yは出力ベクトル
- 任意のMPIプロセス数で動作可能。
- AnasaziとSLEPcの両方で動作可能。
https://github.com/t-sakashita/rokko/blob/develop/sample/sparse/laplacian_mfree_mpi.cpp
MPIでベクトルの分割:
- ベクトルの行を各プロセスに(できるだけ)均等に割り当てる。
- ベクトルサイズよりもMPIサイズの方が大きい場合、1つもベクトル成分が割り当てられないプロセスがある。
- num_local_rows: 各プロセスが持つ部分ベクトルのサイズ。または、行列の行数
- start_rows_: 各プロセスが持つ部分ベクトルの最初の添字
- end_rows_: 各プロセスが持つ部分ベクトルの最後の添字
- start_k_: 各プロセスが持つ部分ベクトルの最初の添字-1。
- end_k_: 各プロセスが持つ部分ベクトルの最後の添字-1。
MPI通信:
- 最初と最後のプロセス以外は、1つ前と1つ後のプロセスとベクトル成分1個の通信を行う。
- 最初のプロセスは、2番目のプロセスとベクトル成分1個の通信を行う。
- 最後のプロセスは、1つ前のプロセスとベクトル成分1個の通信を行う。
- start_kからend_kの計算には、通信が不要
今後の課題:ラプラシアン行列の理論固有値の求め方。
この行列の固有値は、以下である。
\left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
この導出方法は、以下の文献にある。 山本哲朗「行列解析ノート ~ 珠玉の定理と精選問題 ~」サイエンス社 p.52 例3