# neco-eigensolve -- 数学的詳細
この文書では neco-eigensolve の核にある一般化固有値問題、部分空間射影、LOBPCG、FEAST の数理だけを扱う。使い方や各設定項目は [README-ja.md](README-ja.md) を参照。
## 一般化固有値問題
対象は疎対称一般化固有値問題
$$
K\mathbf{x} = \lambda M\mathbf{x}
$$
である。構造解析では $K$ は剛性行列、$M$ は質量行列に対応することが多い。通常ほしいのは全固有対ではなく、
- 最小側の数個のモード
- ある固有値区間に含まれるモード
のような部分スペクトルである。
$M$ が対称正定値なら
$$
\langle \mathbf{x}, \mathbf{y} \rangle_M = \mathbf{x}^T M \mathbf{y}
$$
は内積を定める。固有ベクトルはこの $M$ 内積で直交化されるのが自然であり、実装もこの立場をとる。
近似固有対 $(\lambda,\mathbf{x})$ の誤差は残差
$$
\mathbf{r} = K\mathbf{x} - \lambda M\mathbf{x}
$$
で測る。残差が小さく、かつ複数モードが $M$ 直交であれば、近似は良いと判断できる。
## 部分空間射影と Rayleigh-Ritz
neco-eigensolve の主要手法はいずれも、まず有望な部分空間 $Q$ を作り、その上に問題を射影して小さい密行列の固有値問題へ落とす。
$$
Q^T K Q\, \mathbf{y} = \lambda\, Q^T M Q\, \mathbf{y}
$$
この縮約問題を解き、$\mathbf{x} = Q\mathbf{y}$ と戻せば元の空間での近似固有ベクトルが得られる。部分空間が真の固有空間をよく含んでいれば、縮約問題の解は元の問題の良い近似になる。
したがって核心は
- どうやって有効な部分空間を作るか
- その部分空間をどう $M$ 直交に保つか
の 2 点にある。
## LOBPCG
LOBPCG は最小固有値側のモードを求めるためのブロック反復法である。単一ベクトルの共役勾配法を固有値問題へ拡張したもので、複数モードをまとめて更新できる。
### Rayleigh 商
1 本のベクトルに対する Rayleigh 商
$$
\rho(\mathbf{x}) = \frac{\mathbf{x}^T K \mathbf{x}}{\mathbf{x}^T M \mathbf{x}}
$$
は、$\mathbf{x}$ が固有ベクトルなら対応固有値に一致する。LOBPCG はこれを複数列のブロック $X$ に対して改善していく。
### 探索空間
各反復では
$$
\mathcal{S} = \operatorname{span}\{X,\; W,\; P\}
$$
を探索空間に取る。
- $X$: 現在の近似固有ベクトル
- $W$: 前処理付き残差
- $P$: 前回の探索方向
残差は
$$
R = KX - MX\Lambda
$$
で与えられ、前処理行列 $T^{-1}$ を用いて $W \approx T^{-1}R$ を作る。ここで前処理の役割は、収束を遅くする成分を近似的に打ち消し、良い方向を強調することである。
この部分空間上で Rayleigh-Ritz 射影を行い、得られた最良近似で $X$ を更新する。`JacobiPreconditioner` は対角近似、`Ic0Preconditioner` は不完全コレスキー近似に対応し、どちらも「$K^{-1}$ を安く近似する」という同じ原理にある。
### DC 成分の除去
ラプラシアンや一部の FEM 系では、定数モードや剛体モードが零近傍に現れる。この成分が不要なら、探索空間をその成分に $M$ 直交な部分へ射影してから反復すると、欲しい非自明モードへ収束しやすい。
定数ベクトル $\mathbf{1}$ に対し、
$$
\mathbf{x} \leftarrow \mathbf{x}
- \frac{\mathbf{x}^T M \mathbf{1}}{\mathbf{1}^T M \mathbf{1}} \mathbf{1}
$$
とすれば DC 成分を除去できる。実装の deflation はこの考え方に沿う。
## FEAST
FEAST は固有値区間を直接指定し、その区間に属する固有空間だけを輪郭積分で抽出する方法である。最小側だけでなく中間スペクトルを狙えるのが特徴である。
### スペクトル射影
複素平面上で目標区間を囲む輪郭 $\Gamma$ をとると、
$$
Q = \frac{1}{2\pi i}\oint_\Gamma (zM - K)^{-1} M\, dz
$$
は、$\Gamma$ の内部にある固有値に対応する固有空間への射影になる。したがって任意の初期行列 $Y$ に対し $QY$ を作れば、目標区間の固有空間へ成分を濾し出せる。
実際には積分を数値求積で離散化して
$$
QY \approx \sum_{e=1}^{n_q} \omega_e (z_e M - K)^{-1} M Y
$$
と計算する。ここで必要になるのは、複数の複素シフト付き線形系
$$
(z_e M - K)\mathbf{u} = M\mathbf{v}
$$
を解くことである。現在の実装では、この段階を Krylov 系反復法と疎前処理で支える構成になっている。
得られた濾過部分空間に対して再び Rayleigh-Ritz を行えば、区間内の固有値と固有ベクトルが得られる。つまり FEAST も本質的には「良い部分空間を積分で作る方法」である。
## 収束と限界
両手法に共通して、結果の質は部分空間の質に依存する。
- LOBPCG では前処理の良し悪しが収束速度を左右する
- FEAST では部分空間次元と求積精度が固有対の取りこぼしに効く
- 固有値が密集していると、どちらも分離が難しくなる
- 零近傍モードの扱いは、問題の物理的意味に応じて deflation や区間設定で整理する必要がある
この文書では具体的な停止条件や各設定値の既定値には立ち入らない。そこは数学的本体よりも運用上の設定に近く、利用時の入口は [README-ja.md](README-ja.md) が適している。