※ ChatGPTを利用し、要約された質問です(原文:行列について誰か確認してください。)
Jacobi法を用いた行列の固有値の計算
このQ&Aのポイント
25行25列の行列の固有値をJacobi法で計算するプログラムを示す。
行列は対角要素が2、隣は-1、それ以外は0である。
非対角要素の絶対値の最大値が10^-6未満となるまで計算を繰り返す。
下記問題について自分なりに解答してみたのですが、イマイチあっているのか分かりません。どなたかご査収願います。
問題
『25行25列で、対角要素は全て2、その隣は-1、それ以外は全て0である行列の固有値を全てJacobi(ヤコビ)法で小数点以下6桁まで求め、その固有値と解法のプログラムを示せ。 ※収束基準は非対角要素の絶対値の最大値が10^-6未満となることとせよ。』
以下に上記問題についてのプログラムおよび固有値の計算結果を示します。
プログラミング言語=C言語
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define SIZE 25
int main(void)
{
double a[SIZE][SIZE];
int i, j, k, l;
double max;
double theta;
double x, y;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (i == j - 1 || i == j + 1)
a[i][j] = -1;
else if (i == j)
a[i][j] = 2;
else
a[i][j] = 0;
}
}
while (1) {
max = 0;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (i != j && max < fabs(a[i][j])) {
max = fabs(a[i][j]);
k = i;
l = j;
}
}
}
if (max < 1.0e-6)
break;
theta = (a[k][k] != a[l][l]) ?
atan2(-2 * a[k][l], a[k][k] - a[l][l]) / 2 : M_PI / 4;
for (i = 0; i < SIZE; i++) {
x = a[i][k];
y = a[i][l];
a[i][k] = cos(theta) * x - sin(theta) * y;
a[i][l] = sin(theta) * x + cos(theta) * y;
}
for (j = 0; j < SIZE; j++) {
x = a[k][j];
y = a[l][j];
a[k][j] = cos(theta) * x - sin(theta) * y;
a[l][j] = sin(theta) * x + cos(theta) * y;
}
}
for (i = 0; i < SIZE; i++) {
printf("%lf\n", a[i][i]);
}
return 0;
}
お礼
同じ値となりました。 回答頂き有り難うございました。 大変参考になりました。