線形代数線形代数
固有値・固有ベクトル; Eigen Value, Eigen Vector

概要
固有ベクトルはある行列によって写像されたとき、すべてのベクトル成分が定数倍されるようなベクトルのことをいう。またその定数倍率を固有値という。
ある行列\(A\)の固有値\(\lambda\)と固有ベクトル\(\boldsymbol{x}\)は以下の式で定義される。
\(\quad A \boldsymbol{x} = \lambda \boldsymbol{x} \quad \boldsymbol{x} \neq \boldsymbol{0} \)

固有値と固有ベクトルは一対となる値で、\(A\)が正則行列ならば\(A\)のサイズ数の組が存在する。

これらの値を求めるにはQR法と逆反復法を用いる。

固有値・固有ベクトルの性質
固有値・固有ベクトルは以下のような性質をもつ。ここで\(|A|\)は\(A\)の行列式、\( I \)は単位行列である。
\(\quad |\lambda I - A| = 0 \)

ソースコード

namespace Algebra {
    /// <summary>行列クラス</summary>
    public partial class Matrix {
        /// <summary>固有値計算</summary>
        /// <param name="precision_level">精度(収束ループを回す回数)</param>
        public double[] CalculateEigenValues(int precision_level = 16) {
            Matrix m = Copy(), q, r;
            for(int i = 0; i < precision_level; i++) {
                m.QRDecomposition(out q, out r);
                m = r * q;
            }

            return m.Diagonals;
        }

        /// <summary>固有値・固有ベクトル</summary>
        /// <param name="eigen_values">固有値</param>
        /// <param name="eigen_vectors">固有ベクトル</param>
        /// <param name="precision_level">精度(収束ループを回す回数)</param>
        public void CalculateEigenValueVectors(out double[] eigen_values, out Vector[] eigen_vectors, int precision_level = 16) {
            if(!IsSquare(this)) {
                throw new InvalidOperationException();
            }

            eigen_values = null;
            eigen_vectors = new Vector[Size];

            const int vector_converge_times = 3;

            double eigen_value;
            bool[] is_converged_vector = new bool[Size];
            Matrix m = Copy(), q, r, g;
            Vector x_init = Vector.Zero(Size), x;

            for(int i = 0; i < Size; i++) {
                eigen_vectors[i] = Vector.Invalid(Size);
                x_init[i] = 1;
            }
            x_init /= x_init.Norm;

            for(int i = 0; i < precision_level; i++) {
                m.QRDecomposition(out q, out r);
                m = r * q;

                eigen_values = m.Diagonals;

                bool is_all_converged = true;

                for(int j = 0; j < Size; j++) {
                    if(is_converged_vector[j]) {
                        continue;
                    }

                    is_all_converged = false;

                    eigen_value = eigen_values[j];
                    
                    g = (this - eigen_value * Identity(Size)).Inverse;
                    if(!IsValid(g)) {
                        is_converged_vector[j] = true;
                        break;
                    }

                    x = x_init;

                    for(int k = 0; k < vector_converge_times; k++) {
                        x = (g * x).Normal;
                    }

                    eigen_vectors[j] = x;
                }

                if(is_all_converged) {
                    break;
                }
            }
        }
    }
}

関連項目
行列
ガウスの消去法
LU分解
QR分解
行列式
トレース

ライブラリライブラリ
確率統計確率統計
線形代数線形代数
幾何学幾何学
最適化最適化
微分方程式微分方程式
画像処理画像処理
補間補間
機械学習機械学習
クラスタリングクラスタリング
パズルゲーム・パズル
未分類未分類