繰り返し処理についての質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
徳竹

繰り返し処理についての質問です

#1

投稿記事 by 徳竹 » 16年前

以前こちらの掲示板で質問させていただいたものです。いま学校の数値計算の課題でアーノルディ反復法を用いて行列Aの固有ベクトルを求めるという課題をやっています。簡単にいうと行列Aがありそれに対して初期ベクトルrをとります。そしてAとrに様々な変形を施しベクトルr1を作ります。今度はAとr1を用いて同じ変形を施しベクトルr2を作ると言う作業を繰り返しある条件を満たすと繰り返しを止めるというプログラムを作りたいと思ってます。
 
そこで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);

Mist

Re:繰り返し処理についての質問です

#2

投稿記事 by Mist » 16年前

do~while間で使用する変数のうち、doより前の段階で値が設定されている変数は1回目の処理が終わった段階でdoに入る前の値に戻っていますか?
ベクトルの値は新しく作り直すことで元に戻っているかもれませんが、処理の過程で使用する変数が元の値に戻っていなかったりするのではないでしょうか?

ソースにコメントがなくて各変数の意味なども分からないので具体的にどこが間違っているかはわかりませんが。

non

Re:繰り返し処理についての質問です

#3

投稿記事 by non » 16年前

考えられることとして・・・
1 初期値が与えられていないのはnとkですから、この2つのどちらかが省略された部分で変更されている。
2 宣言した配列の範囲を超えた場所に書き込んでいる。
 例えば、
for(l=1;l<=n;l++){
	  w[[/url][j]-=h[j]*v[[/url];}

などで、double w[n][n];で宣言されていたとか

細かくデバッグしていくよりないですよね。

徳竹

Re:繰り返し処理についての質問です

#4

投稿記事 by 徳竹 » 16年前

回答ありがとうございます。上手くいきました。やはりおふたりが指摘した通り変数が途中で変更されていました。本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る