用c++写一个函数,输入任意阶实对称矩阵,用实对称矩阵的Jacobi算法求出它的全部特征值并输出。
时间: 2023-02-27 20:25:02 浏览: 54
以下是用 C 语言实现的求任意阶实对称矩阵的全部特征值的函数:
```
#include <math.h>
#include <stdio.h>
#define MAX_N 100
void Jacobi(int n, double a[][MAX_N], double *d, double v[][MAX_N]) {
int i, j, k;
double b[MAX_N], z[MAX_N];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
v[i][j] = (i == j) ? 1.0 : 0.0;
}
}
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
b[i] = a[i][i];
z[i] = 0.0;
}
for (j = k + 1; j < n; j++) {
double s = 0.0;
for (i = 0; i < n; i++) {
s += a[i][k] * a[i][j];
}
double t = (b[j] - b[k]) / (2 * a[k][j]);
double c, s;
if (t >= 0) {
t = 1.0 / (t + sqrt(1.0 + t * t));
} else {
t = -1.0 / (-t + sqrt(1.0 + t * t));
}
c = 1.0 / sqrt(1.0 + t * t);
s = t * c;
a[k][j] = 0.0;
for (i = 0; i < n; i++) {
double aik = c * a[i][k] - s * a[i][j];
double aij = s * a[i][k] + c * a[i][j];
a[i][k] = aik;
a[i][j] = aij;
}
for (i = 0; i < n; i++) {
double vik = c * v[i][k] - s * v[i][j];
double vij = s * v[i][k] + c * v[i][j];
v[i][k] = vik;
v[i][j] = vij;
}
}
}
for (i = 0; i < n; i++) {
d[i] = b[i];
}
}
int main(void) {
int n, i, j;
double a[MAX_N][MAX_N], d[MAX_N], v[MAX_N][MAX_N];
printf("Enter the dimension of the matrix: ");
scanf("%d", &n);
printf("Enter the elements of the matrix: ");
for (i = 0; i < n; i++)