固有値と固有ベクトルのためのヤコビアルゴリズム

目的

すべての固有値と固有ベクトルの実対称行列を探しています。

事前知識

実対称行列のための\(\)の対角行列、存在しなければならない\(D \)と直交行列\(U- \)を満たす\ [DがTAU U- ^ \ =] \(D \)対角要素される(\)\固有値、\(U- \)として列ベクトル\(\)の特徴ベクトルを。

定义\(N \)阶旋转矩阵\ [G(P、Q、\シータ)= \ {bmatrix} 1&&&&&\ cdots&&&&&始める0 \\&\ ddots&&&&&& &&&\\&&1&&&&&&&&\\&&&\ COS \シータ&&&& - \罪\シータ&&&\\&&&&1&&0&&&&\\ &&&&&\ ddots&&&&&\\&&&&0&&1&&&&\\&&&\罪\シータ&&&&\ \シータ&&&\\&&&&COS &&&&1&&\\&&&&&&&&&\ ddots&\\ 0&&&&&&&&0&1 \端{bmatrix} \] 単位行列に基づいている、変更\(A_ {PPは} A_ = \シータ、A_ {QP} = cosの{QQ} = \を- A_ {PQ} = \罪\シータ\

以下のための\(N- \)順序ベクトル\(\アルファ\)、\ (\アルファ\ CDOT G(P、Q、\シータ)\)の幾何学的意味は、である(\アルファ\)を\最初に\(P \ )次元の座標軸と\(Q \)角次元座標の軸に平行な面内で回転\(\シータ\) および回転金型の長さは変わりません。

アルゴリズム論

おそらくますます小さく上非対角要素を作製することにより、その回転変換を考え、そして最終的に対角行列に類似元の行列を得ます。

各行列見出さ\(A \)非対角要素の絶対値の最大値は、に設定されている\(PQ A_ {} \) そう\(U-G =(P、Q、\シータ)\) \ (\)は、に変換される\(U ^ TAUの\)

変換され、

原因によって\(B_ {P、Q} = 0 \) について解く\ [\シータ= \ FRAC { 1} {2} \逆正接\ FRAC {2a_ {PQ}} {A_ {QQ} -a_ {PPを}} \]特に\(A_ {QQ} =のA_ {PP} \) 場合\(\シータ= \ FRAC { \ PI} {4} \)

回転操作モードに注目すると、それぞれの行または列ベクトルの長さを、変化させない、すなわち行列\(A \) F-ノルムの\(|| A || _F = \ SQRT {\ sum_i \ sum_ja_ {IJ} } ^ 2 \)定数であり、計算することによって得ることができる\ [B_ {IP} ^ 2 + B_ {IQ} ^ 2 = A_ {IP} ^ 2 + A_ {IQは} ^ 2 \] を得ることができます正方形小さい、及び対角要素の正方形の既知の非対角要素は、増加するように、主対角要素上の正方形と非収束。

アルゴリズムのプロセス

(1)マトリックスう\(T = E \)を、即ち、初期行列

(2)検索\(\)のグループから選択された非対角要素の絶対値の最大値\(A_ {PQ} \)

(3)対応する角度見つけること\(\シータ\)を、マトリックスの構成\(U = G(P、 Q、\シータ)\)

(4)令\(A = U ^年、TU = T \)

(5)継続するまで(4)を介して(2)を繰り返す\(A_ {PQ} <\のイプシロン\) 、または反復回数が規定値を超えている、\(\)は、対角要素にほぼ等しい\ (\)固有値、\(T \)として列ベクトル\(\)固有ベクトル

コード

#include<bits/stdc++.h>
using namespace std;

const int N=1005;
const double eps=1e-5;
const int lim=100;

int n,id[N];
double key[N],mat[N][N],EigVal[N],EigVec[N][N],tmpEigVec[N][N];

bool cmpEigVal(int x,int y)
{
    return key[x]>key[y];
}

void Find_Eigen(int n,double (*a)[N],double *EigVal,double (*EigVec)[N])
{
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            EigVec[i][j]=0;
    for (int i=1;i<=n;i++) EigVec[i][i]=1.0;
    int count=0;
    while (1)
    {
        //统计迭代次数 
        count++;
        //找绝对值最大的元素 
        double mx_val=0;
        int row_id,col_id;
        for (int i=1;i<n;i++)
            for (int j=i+1;j<=n;j++)
                if (fabs(a[i][j])>mx_val) mx_val=fabs(a[i][j]),row_id=i,col_id=j;
        if (mx_val<eps||count>lim) break;
        //进行旋转变换 
        int p=row_id,q=col_id;
        double Apq=a[p][q],App=a[p][p],Aqq=a[q][q];
        double theta=0.5*atan2(-2.0*Apq,Aqq-App);
        double sint=sin(theta),cost=cos(theta); 
        double sin2t=sin(2.0*theta),cos2t=cos(2.0*theta);
        a[p][p]=App*cost*cost+Aqq*sint*sint+2.0*Apq*cost*sint;
        a[q][q]=App*sint*sint+Aqq*cost*cost-2.0*Apq*cost*sint;
        a[p][q]=a[q][p]=0.5*(Aqq-App)*sin2t+Apq*cos2t;
        for (int i=1;i<=n;i++)
            if (i!=p&&i!=q)
            {
                double u=a[p][i],v=a[q][i];
                a[p][i]=u*cost+v*sint;a[q][i]=v*cost-u*sint;
                u=a[i][p],v=a[i][q];
                a[i][p]=u*cost+v*sint;a[i][q]=v*cost-u*sint;
            }
        //计算特征向量 
        for (int i=1;i<=n;i++)
        {
            double u=EigVec[i][p],v=EigVec[i][q];
            EigVec[i][p]=u*cost+v*sint;EigVec[i][q]=v*cost-u*sint;
        }
    }
    //对特征值排序 
    for (int i=1;i<=n;i++) id[i]=i,key[i]=a[i][i];
    std::sort(id+1,id+n+1,cmpEigVal);
    for (int i=1;i<=n;i++)
    {
        EigVal[i]=a[id[i]][id[i]];
        for (int j=1;j<=n;j++)
            tmpEigVec[j][i]=EigVec[j][id[i]];
    }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            EigVec[i][j]=tmpEigVec[i][j];
    //特征向量为列向量 
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            scanf("%lf",&mat[i][j]);
    Find_Eigen(n,mat,EigVal,EigVec);
    printf("EigenValues = ");
    for (int i=1;i<=n;i++) printf("%lf ",EigVal[i]);
    printf("\nEigenVector =\n");
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            printf("%lf%c",EigVec[i][j],j==n?'\n':' ');
    return 0;
}

おすすめ

転載: www.cnblogs.com/beginend/p/11749230.html