繰り返し処理についての質問です
Posted: 2009年1月16日(金) 16:11
以前こちらの掲示板で質問させていただいたものです。いま学校の数値計算の課題でアーノルディ反復法を用いて行列Aの固有ベクトルを求めるという課題をやっています。簡単にいうと行列Aがありそれに対して初期ベクトルrをとります。そしてAとrに様々な変形を施しベクトルr1を作ります。今度はAとr1を用いて同じ変形を施しベクトルr2を作ると言う作業を繰り返しある条件を満たすと繰り返しを止めるというプログラムを作りたいと思ってます。
そこでdo文用いたプログラムを作成したのですが上手くいきません。具体的にいうと試しにdo文を二回まわして得られるた答えと一回だけまわして得たベクトルrをもう一度読み込ませて再び一回だけまわした(これで理論的には二回まわしたのと同じだと思われます)答えが異なってしまいます。ちなみに一回ずつまわすと正しい答えが得られます。
長々と書いてしまいましたが要はdo文を用いて一気に処理しようとすると値がおかしくなってしまうのですがどんな原因が考えられるでしょうか?というのが質問内容です。プログラム全体は200行以上あるので全部は載せられないのですが、憶測、推測的なことで構わないので何卒アドバイスよろしくお願いします。
一応プログラムの一部(do文の部分)も載せておきます。
そこでdo文用いたプログラムを作成したのですが上手くいきません。具体的にいうと試しにdo文を二回まわして得られるた答えと一回だけまわして得たベクトルrをもう一度読み込ませて再び一回だけまわした(これで理論的には二回まわしたのと同じだと思われます)答えが異なってしまいます。ちなみに一回ずつまわすと正しい答えが得られます。
長々と書いてしまいましたが要はdo文を用いて一気に処理しようとすると値がおかしくなってしまうのですがどんな原因が考えられるでしょうか?というのが質問内容です。プログラム全体は200行以上あるので全部は載せられないのですが、憶測、推測的なことで構わないので何卒アドバイスよろしくお願いします。
一応プログラムの一部(do文の部分)も載せておきます。
do{
for(i=1;i<=n;i++)
v[1]=r/sqrt(innerproduct(1,n,r,r));
printf("%f\n",sqrt(innerproduct(1,n,r,r)));
printf("v1=");
for(i=1;i<=n;i++)
printf("%f\t",v[1]);
printf("\n");
printf("\n");
printf("%d\n",2);
for(j=1;j<=k;j++)
{
mv(n,j,j,a,v,w);
for(i=1;i<=j;i++){
h[j]=naiseki(n,i,j,v,w);
for(l=1;l<=n;l++){
w[[/url][j]-=h[j]*v[[/url];}}
h[j+1][j]=sqrt(naiseki(n,j,j,w,w));
if(h[j+1][j]==0)
break;
for(l=1;l<=n;l++)v[[/url][j+1]=w[[/url][j]/h[j+1][j];
printf("v%d=",j+1);
for(l=1;l<=n;l++)
printf("%f\t",v[[/url][j+1]);
printf("\n");}
printf("w=\n");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)printf("%f\t",a[j]);
printf("\n");
}
for(i=1;i<=k+1;i++){
for(j=1;j<=k;j++)if(i>j+1)h[j]=0;
else if(i==j) h[j]=h[j]-1;}
printf("HNEW=\n");
for(i=1;i<=k+1;i++){
for(j=1;j<=k;j++)printf("%f\t",h[i][j]);
printf("\n");
}
====================================================================================================
中略 この部分で新しくベクトルrを作ります
=====================================================================================================
kaisu++;
if(kaisu==2)
break;
}while(tokuiti>=eps);