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