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

我们先复习下乘幂法:
乘幂法主要是用来求矩阵的主特征值(按模最大的特征值)及相应的特征向量.
给定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=
在这里插入图片描述
在这里插入图片描述

由此,我们可以用程序实现求主特征值和相应的特征向量,核心算法在**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());
}


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值