幂法求矩阵的特征值及特征向量c++
时间: 2023-06-21 21:15:04 浏览: 97
以下是一个使用幂法求矩阵特征值和特征向量的C++代码示例:
```c++
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
// 定义矩阵类型
typedef vector<vector<double>> matrix;
// 用于计算矩阵向量乘积
vector<double> matrixVectorProduct(matrix A, vector<double> x) {
int n = A.size();
vector<double> y(n, 0);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
y[i] += A[i][j] * x[j];
}
}
return y;
}
// 用于计算向量的模长
double getNorm(vector<double> x) {
double norm = 0;
for (int i = 0; i < x.size(); i++) {
norm += x[i] * x[i];
}
return sqrt(norm);
}
// 用于计算矩阵的特征值和特征向量
void powerMethod(matrix A, double& eigenvalue, vector<double>& eigenvector, int maxIter = 1000, double tol = 1e-6) {
int n = A.size();
vector<double> x(n, 1);
double lambda = 0, lambda_old = 0;
vector<double> v(n, 0);
int iter = 0;
while (iter < maxIter) {
v = matrixVectorProduct(A, x);
lambda = v[0] / x[0];
for (int i = 1; i < n; i++) {
if (abs(v[i] / x[i] - lambda) > tol) {
lambda = 0;
break;
}
}
if (lambda != 0) {
eigenvector = x;
eigenvalue = lambda;
break;
}
x = v;
double norm = getNorm(x);
for (int i = 0; i < n; i++) {
x[i] /= norm;
}
lambda_old = lambda;
iter++;
}
}
// 测试
int main() {
matrix A = {{2, -1, 0}, {-1, 2, -1}, {0, -1, 2}};
double eigenvalue;
vector<double> eigenvector;
powerMethod(A, eigenvalue, eigenvector);
cout << "Eigenvalue: " << eigenvalue << endl;
cout << "Eigenvector: ";
for (int i = 0; i < eigenvector.size(); i++) {
cout << eigenvector[i] << " ";
}
cout << endl;
return 0;
}
```
在上述代码中,`matrix` 类型是一个二维向量,用于存储矩阵。`matrixVectorProduct` 函数用于计算矩阵和向量的乘积。`getNorm` 函数用于计算向量的模长。`powerMethod` 函数是幂法的具体实现,其中 `maxIter` 和 `tol` 分别表示最大迭代次数和迭代收敛精度。程序最后对一个测试矩阵进行了求解并输出了结果。