求3*3矩阵的特征值与特征向量c语言
时间: 2023-07-28 21:07:29 浏览: 95
求矩阵的特征值与特征向量
4星 · 用户满意度95%
好的,这里是一个求3*3矩阵特征值与特征向量的C语言程序:
```c
#include <stdio.h>
#include <math.h>
void eig(double A[][3], double eig_val[], double eig_vec[][3]) {
double eps = 1e-6;
int max_iter = 1000;
double x[3] = {1, 1, 1}; // 初始向量
double y[3]; // 特征向量
for (int i = 0; i < max_iter; i++) {
// 计算特征向量
for (int j = 0; j < 3; j++) {
y[j] = 0.0;
for (int k = 0; k < 3; k++) {
y[j] += A[j][k] * x[k];
}
}
// 计算特征值
double lambda = 0.0;
for (int j = 0; j < 3; j++) {
lambda += x[j] * y[j];
}
eig_val[i] = lambda;
// 归一化特征向量
double norm = 0.0;
for (int j = 0; j < 3; j++) {
norm += y[j] * y[j];
}
norm = sqrt(norm);
for (int j = 0; j < 3; j++) {
eig_vec[j][i] = y[j] / norm;
}
// 判断是否收敛
double err = 0.0;
for (int j = 0; j < 3; j++) {
double tmp = 0.0;
for (int k = 0; k < 3; k++) {
tmp += A[j][k] * y[k];
}
err += pow(tmp - lambda * y[j], 2);
}
if (sqrt(err) < eps) {
break;
}
// 更新初始向量
for (int j = 0; j < 3; j++) {
x[j] = y[j] / norm;
}
}
}
int main() {
double A[3][3] = {{1, 2, 3}, {2, 5, 2}, {3, 2, 0}};
double eig_val[3];
double eig_vec[3][3];
eig(A, eig_val, eig_vec);
printf("特征值:\n");
for (int i = 0; i < 3; i++) {
printf("%f\n", eig_val[i]);
}
printf("特征向量:\n");
for (int i = 0; i < 3; i++) {
printf("(%f, %f, %f)\n", eig_vec[0][i], eig_vec[1][i], eig_vec[2][i]);
}
return 0;
}
```
这个程序使用了幂法求解特征向量和特征值,其中 `eig()` 函数用于计算特征值和特征向量。程序中给出了一个3*3矩阵的例子,你可以根据需要修改矩阵的值。
阅读全文