みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

行列について誰か確認してください。

下記問題について自分なりに解答してみたのですが、イマイチあっているのか分かりません。どなたかご査収願います。

問題
『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;
}

投稿日時 - 2003-12-03 16:31:18

QNo.721356

困ってます

質問者が選んだベストアンサー

別の方法で固有値を出しましたのでご比較下さい。同じなら大丈夫でしょう。

0.0145822518038919
0.0581163651478958
0.129967514629171
0.229087948693580
0.354032268212688
0.502978503657798
0.673754683518410
0.863870506537689
1.07055365591246
1.29079022591493
1.52136867142488
1.75892663948936
2.00000000000000
2.24107336051065
2.47863132857512
2.70920977408507
2.92944634408754
3.13612949346231
3.32624531648159
3.49702149634220
3.64596773178731
3.77091205130642
3.87003248537083
3.94188363485210
3.98541774819611

投稿日時 - 2003-12-03 19:40:13

お礼

同じ値となりました。
回答頂き有り難うございました。
大変参考になりました。

投稿日時 - 2003-12-04 22:36:28

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問