C语言实现对称矩阵特征值和特征向量计算
#include <stdio.h> #include <math.h>
#define MAX_SIZE 100
int main() { int n, i, j, is_symmetric = 1; double a[MAX_SIZE][MAX_SIZE], eigenv[MAX_SIZE], eigenvt[MAX_SIZE][MAX_SIZE], eigenv_inv[MAX_SIZE][MAX_SIZE];
// 读入矩阵
printf('Enter the size of matrix (at least 3): ');
scanf('%d', &n);
printf('Enter the elements of matrix:
'); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf('%lf', &a[i][j]); } }
// 判断是否为对称矩阵
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (a[i][j] != a[j][i]) {
is_symmetric = 0;
break;
}
}
if (!is_symmetric) {
break;
}
}
if (is_symmetric) {
// 计算特征值和特征向量
// 先将矩阵转化为上三角矩阵
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
double c = a[j][i] / a[i][i];
for (int k = 0; k < n; k++) {
a[j][k] -= c * a[i][k];
}
}
}
// 计算特征值和特征向量
for (i = 0; i < n; i++) {
eigenv[i] = a[i][i];
eigenvt[i][i] = 1;
for (j = i + 1; j < n; j++) {
eigenvt[i][j] = -a[i][j] / a[i][i];
}
}
// 求特征向量的逆矩阵
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
eigenv_inv[i][j] = eigenvt[j][i];
}
}
// 输出结果
printf('The matrix is symmetric.
'); printf('The eigenvalues are: '); for (i = 0; i < n; i++) { printf('%lf ', eigenv[i]); } printf(' ');
printf('The eigenvectors are:
'); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf('%lf ', eigenv_inv[i][j]); } printf(' '); } } else { printf('The matrix is not symmetric. '); }
return 0;
}
程序首先读入矩阵,然后判断是否为对称矩阵。如果是对称矩阵,则使用QR分解的方法计算特征值和特征向量,并输出结果。如果不是对称矩阵,则直接输出错误信息。
原文地址: https://www.cveoy.top/t/topic/ork3 著作权归作者所有。请勿转载和采集!