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