[NA]Lab5:反幂法求矩阵特征根

来源:互联网 发布:软件编程培训机构 编辑:程序博客网 时间:2024/05/21 10:05

任务概述

给定一个n*n矩阵A以及A的某一个特征根的近似值p,从一个给定向量x⃗ (0)出发,求该特征根的高精度近似值,并且求出其对应的无穷范数下的单位特征向量。
函数接口定义:

int EigenV(int n, double a[][MAX_SIZE], double *lambda, double v[], double TOL, int MAXN);

其中n为矩阵a的维数,MAX_SIZE是程序定义的矩阵最大维数。lambda传入某一个特征值的近似值p,并且传回该特征值的高度近似值。v传入迭代初始向量x⃗ (0),返回无穷范数下的单位特征向量。TOL是精度上限,MAXN是迭代最大次数。函数返回值有三种情况:
1:如果成功完成求解
-1:如果p就是精确特征值
0:如果算法经过MAXN次迭代后还没有达到精度要求。
裁判程序:

#include <stdio.h>#define MAX_SIZE 10int EigenV(int n, double a[][MAX_SIZE], double *lambda, double v[], double TOL, int MAXN);int main(){    int n, MAXN, m, i, j, k;    double a[MAX_SIZE][MAX_SIZE], v[MAX_SIZE];    double lambda, TOL;    scanf("%d", &n);    for (i=0; i<n; i++)         for (j=0; j<n; j++)             scanf("%lf", &a[i][j]);    scanf("%lf %d", &TOL, &MAXN);    scanf("%d", &m);    for (i=0; i<m; i++) {        scanf("%lf", &lambda);        for (j=0; j<n; j++)            scanf("%lf", &v[j]);        switch (EigenV(n, a, &lambda, v, TOL, MAXN)) {            case -1:                 printf("%12.8f is an eigenvalue.\n", lambda );                break;            case 0:                printf("Maximum number of iterations exceeded.\n");                break;            case 1:                printf("%12.8f\n", lambda );                for (k=0; k<n; k++)                    printf("%12.8f ", v[k]);                printf("\n");                break;        }    }    return 0;}/* Your function will be put here */

样例输入1:

31 2 32 3 43 4 50.0000000001 10001-0.6 1 1 1

样例输出1:

-0.62347538  1.00000000   0.17206558  -0.65586885

样例输入2:

20 11 00.0000000001 1021.0 1 1100.0 1 0

样例输出2:

 1.00000000 is an eigenvalue.Maximum number of iterations exceeded.

算法思路

求解矩阵特征值的算法有很多,其中最原始的算法叫做幂法(Power Method)。幂法非常简单,用于求解矩阵的最大特征值和对应的特征向量:不妨假设n*n矩阵A的特征值满足条件|λ1|>|λ2|...|λn|0,并且对应n个线性无关的特征向量v1,...,vn。从任一非零初始向量x⃗ (0)出发,由

实现细节

心得体会