欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算方法-乘幂法求主特征值-C实现

程序员文章站 2022-07-05 18:02:16
...

我们先复习下乘幂法:
乘幂法主要是用来求矩阵的主特征值(按模最大的特征值)及相应的特征向量.
给定n阶实矩阵A,设其有n个线性无关的特征向量x1,x2,…,xn,相应的特征值λ1,λ2…,λn 满足
|λ1|>|λ2|≥|λ3|…≥|λn|
由特征值定义A·xi = λi·xi
任取一n维非零列向量u0,则u0一定可表示为x1,x2,…,xn的线性组合,即有u0 = a1x1 + a2x2 + a3x3 + … + anxn,两边左乘Ak,记uk=Aku0,有
uk=a1λ1kx1+a2λ2kx2+…+anλnkxn=
计算方法-乘幂法求主特征值-C实现
计算方法-乘幂法求主特征值-C实现

由此,我们可以用程序实现求主特征值和相应的特征向量,核心算法在**Matrix::iter()**中

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MaxSize 100
#define MaxVal 11


class Matrix{
    int size;
    double epsilon;
    int range;
    int Mat[MaxSize][MaxSize];
    double u[MaxSize][2];

public:
    Matrix(int s){
        epsilon = 0.0001;
        size = s;
        range = 10;

        //初始化随机数种子
        srand(time(NULL));
        for(int i=0;i<s;i++){
            u[i][0] = 1;
            u[i][1] = 1;
            for(int j=0;j<s;j++){
                Mat[i][j] = rand()%MaxVal;
                printf("%d ",Mat[i][j]);
            }
            printf("\n");
        }
    }

    double Iter(){
        bool t = 0;
        double res[2];
        while(true){
            t = !t;
            for(int i=0;i<size;i++){
                //清除旧的迭代结果,以消除误差
                u[i][t] = 0;
                for(int j=0;j<size;j++){
                    //记录新的迭代结果
                    u[i][t] += u[j][!t]*Mat[i][j];
                }
            }
            res[t] = u[0][t]/u[0][!t];

            if(res[1]-res[0]<epsilon && res[0]-res[1] < epsilon) break;
        }
        double minVal = 1e100;
        for(int i=0;i<size;i++){
            if(u[i][t]<minVal) minVal = u[i][t];
        }
        for(int i=0;i<size;i++){
            u[i][t]/=minVal;
        }
        minVal = 1e100;
        for(int i=0;i<size;i++){
            if(u[i][!t]<minVal) minVal = u[i][!t];
        }
        for(int i=0;i<size;i++){
            u[i][!t]/=minVal;
        }
        printf("特征向量:");
        for(int i=0;i<size;i++) printf("%f ",u[i][t]);
        return res[t];
    }
};

int main(){
    Matrix m(10);
    printf("主特征值:%f",m.Iter());
}


相关标签: 计算方法 算法