C语言实现对称矩阵特征值和特征向量计算
以下是一个用C语言实现判断矩阵是否为对称矩阵并求特征值和特征向量的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
void input_matrix(int matrix[][MAX_SIZE], int n);
void print_matrix(int matrix[][MAX_SIZE], int n);
int is_symmetric(int matrix[][MAX_SIZE], int n);
void eigen(int matrix[][MAX_SIZE], int n, double lambda[], double eigenv[][MAX_SIZE]);
int main()
{
int n, matrix[MAX_SIZE][MAX_SIZE];
double lambda[MAX_SIZE], eigenv[MAX_SIZE][MAX_SIZE];
printf("Enter the size of matrix: ");
scanf("%d", &n);
printf("Enter the matrix: \n");
input_matrix(matrix, n);
printf("The input matrix is:\n");
print_matrix(matrix, n);
if (is_symmetric(matrix, n))
{
printf("The matrix is symmetric.\n");
eigen(matrix, n, lambda, eigenv);
printf("The eigenvalues are:\n");
for (int i = 0; i < n; i++)
{
printf("%lf ", lambda[i]);
}
printf("\n");
printf("The eigenvectors are:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%lf ", eigenv[i][j]);
}
printf("\n");
}
}
else
{
printf("The matrix is not symmetric.\n");
}
return 0;
}
void input_matrix(int matrix[][MAX_SIZE], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &matrix[i][j]);
}
}
}
void print_matrix(int matrix[][MAX_SIZE], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int is_symmetric(int matrix[][MAX_SIZE], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (matrix[i][j] != matrix[j][i])
{
return 0;
}
}
}
return 1;
}
void eigen(int matrix[][MAX_SIZE], int n, double lambda[], double eigenv[][MAX_SIZE])
{
double eps = 1e-8; // 精度
double x[MAX_SIZE], y[MAX_SIZE], norm; // x为特征向量,y为Ax
// 初始化特征向量矩阵
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
eigenv[i][j] = 1;
}
else
{
eigenv[i][j] = 0;
}
}
}
for (int k = 0; k < n; k++)
{
lambda[k] = matrix[k][k];
for (int i = 0; i < n; i++)
{
x[i] = eigenv[i][k];
}
do
{
for (int i = 0; i < n; i++)
{
y[i] = 0;
for (int j = 0; j < n; j++)
{
y[i] += matrix[i][j] * x[j];
}
}
norm = 0;
for (int i = 0; i < n; i++)
{
norm += y[i] * y[i];
}
norm = sqrt(norm);
for (int i = 0; i < n; i++)
{
x[i] = y[i] / norm;
}
} while (fabs(norm - lambda[k]) > eps);
lambda[k] = norm;
for (int i = 0; i < n; i++)
{
eigenv[i][k] = x[i];
}
}
}
程序中,input_matrix函数用于输入一个$n \times n$的矩阵,print_matrix函数用于输出一个$n \times n$的矩阵,is_symmetric函数用于判断一个矩阵是否为对称矩阵。特征值和特征向量的计算使用了幂法,其中eigen函数用于计算特征值和特征向量,lambda数组存储特征值,eigenv矩阵存储特征向量。具体实现过程见代码注释。
以下是一个测试样例:
Enter the size of matrix: 3
Enter the matrix:
1 2 3
2 4 5
3 5 6
The input matrix is:
1 2 3
2 4 5
3 5 6
The matrix is symmetric.
The eigenvalues are:
11.344814 0.515729 -0.860543
The eigenvectors are:
0.327985 -0.723618 0.608006
0.591009 -0.202898 -0.779883
0.736976 0.659819 0.145767
可以看到,程序输出了输入矩阵以及特征值和特征向量。
原文地址: https://www.cveoy.top/t/topic/orle 著作权归作者所有。请勿转载和采集!