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

締切り済みの質問

5×5行列、固有値、固有ベクトル

5つの値を入力し、それぞれの相対比を求めて行列にして、固有値と固有ベクトルを求めたいのですが、分からないので教えて下さい。下のプログラムは固有値を求めるものです。これは過去の質問にあったプログラムを少し変えてみたのですが、値が出てこないのでどうすればうまく出てくるのか教えて下さい。それと、固有ベクトルを求めるプログラムも教えて下さい。宜しくお願いします。
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int i, j, k, l;
double max,theta,x,y,a[5][5],b[5];
printf("値1: ");
scanf("%d",&b[0]);
printf("値2: ");
scanf("%d",&b[1]);
printf("値3: ");
scanf("%d",&b[2]);
printf("値4: ");
scanf("%d",&b[3]);
printf("値5: ");
scanf("%d",&b[4]);
printf("行列\n");

for(j=0;j<5;j++){
for(k=0;k<5;k++){
a[j][k]=b[k]/b[j];
printf("%1.3f ",a[j][k]);
}
printf("\n");
}

while(1){
max=0;
for(i=0;i<5;i++){
for(j=0;j<5;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<5;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<5;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;
}
}

printf("固有値\n");
for (i=0;i<5;i++){
printf("%1.3f\n",a[i][i]);
}
return 0;
}

投稿日時 - 2004-12-15 03:37:31

QNo.1127657

すぐに回答ほしいです

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

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

回答(2)

ANo.2

とりあえず、scanf("%d",&b[0]);はscanf("%lf",&b[0]);にしましょう。
ヤコビ法をやりたいのであれば、
http://mukun_mmg.at.infoseek.co.jp/mmg/bncpp/al054.html
が参考になるかと。

投稿日時 - 2004-12-15 15:59:05

お礼

回答有難うございます。
初歩のとこから間違えてました。
参考になりました。

投稿日時 - 2004-12-15 21:53:33

ANo.1

while(1){
max=0;
//MAXの初期値がル-プ内で0に初期化している
.
.
.
if (i!=j && max<fabs(a[i][j])){
max=fabs(a[i][j]);
//この条件においてmaxよりfabs(a[i][j])が大きければmaxにfabs(a[i][j])を代入し最大値を更新する。



}

if (max<1.0e-6)
break;
// maxが1.0e-6より小さければループを抜ける。



// maxの初期化がループ内で行われて、fabs(a[i][j])が1.0e-6を超えてしまうとループを抜けることはありません。(maxは大きくなるばかりですので)ループの度にmaxが0になっているので同じ処理を繰り返しています。

maxを初期化する位置を変更するか、ループを抜ける条件式の位置の変更が必要です。

または、入力データを制限する必要があると思います。

まずこの辺のアルゴリズムの検討をしてください。

投稿日時 - 2004-12-15 15:39:48

お礼

回答有難うございます。よく分かりました。
もう一度考えて作ってみます。

投稿日時 - 2004-12-15 22:01:02

あなたにオススメの質問