1

次の問題があります。行列nxn(マルチ配列A [n] [n])とベクトルb [i]があり、これら2つの配列間で行から列への積を計算し、新しい配列を生成します。 c[i]。

コードの最初の部分は正しく機能します。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void){

    double A[4][4]={{0,0,1,0.5},{0.33,0,0,0},{0.33,0.5,0,0.5},{0.33,0.5,0,0}};
    double b[4]={0.25,0.25,0.25,0.25};
    double c[4]={0.,0.,0.,0.};
    int n,i,j;

    for(i=0;i<4;i++){
        for(j=0;j<4;j++){

            c[i] += A[i][j]*b[j];
        }
    }

    for(i=0;i<4;i++){
        printf("c[%d]=%lf\n",i,c[i]);  

    }
    printf("\n");
}

このようにして、次のような4次元のベクトルを取得します。

c[0]=0.375
c[1]=0.082
c[2]=0.332
c[3]=0.207

ここで問題となるのは、ベクトルb[i]のコンポーネントとベクトルc[i]のコンポーネントの差が最大0.001になるまで、プログラムを繰り返したいということです。反復を行うために、do / whileを作成しようと思いましたが、反復を行う方法がわかりません。私がやろうと思ったことを示します:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void){

    double A[4][4]={{0,0,1,0.5},{0.33,0,0,0},{0.33,0.5,0,0.5},{0.33,0.5,0,0}};
    double b[4]={0.25,0.25,0.25,0.25};
    double c[4]={0.,0.,0.,0.};
    int n,i,j;

    do{
        b[i]==c[i]; /* new add, but i don t know if it is the right place to put it..*/
        for(i=0;i<4;i++){
            for(j=0;j<4;j++){

                c[i] += A[i][j]*b[j];
            }    
        }   
    }while(abs(b[i]-c[i])<0.001); /*the condition into the while should be correct*/

    for(i=0;i<4;i++){
        printf("c[%d]=%lf\n",i,c[i]);  

    }
    printf("\n");
}

結果は次のようになります。

c[0]=0.38
c[1]=0.12
c[2]=0.29
c[3]=0.19

しかし、そうではありません...どうすればよいですか?

4

3 に答える 3

1

2番目のプログラムでは、を設定b[i] = c[i]しますが、c最初はゼロです。おそらく、反復が収束するまでb乗算する必要があります。Aまた、abs整数引数を取る関数を使用します。fabs代わりにdoubleを使用する必要があります。

ここで実装しているアルゴリズムは何ですか?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main ()
{
  double A[4][4]={{0,0,1,0.5},{(1.0/3.0),0,0,0},{(1.0/3.0),0.5,0,0.5},{(1.0/3.0),0.5,0,0}};
  double b[4]={0.25,0.25,0.25,0.25};
  double c[4]={0.0,0.0,0.0,0.0};
  int i, j, k;

  for(i=0; i<4; i++)
    for(j=0; j<4; j++)
      c[i] += A[i][j]*b[j];


  do
  {      
    k = 0;

    for(i=0; i<4; i++)
      b[i] = c[i], c[i] = 0;

    for(i=0; i<4; i++)
    {
      for(j=0; j<4; j++)
        c[i] += A[i][j]*b[j];

      if(fabs(b[i] - c[i]) < 0.001)
        k++;
    }
  }while(k < 4);

  for(i=0; i<4; i++)
      printf("c[%d] = %lf\n",i,c[i]);  

    return 0;
}
于 2012-12-18T11:37:31.443 に答える
1

プログラムは、 と の 2 つの成分がb0.001c未満になるとすぐに終了しますが、これを1 つのペアだけでなく、すべての成分に対して実行したいとします。

次のようなことをしたいかもしれません:

int k=0;
do {
     for(i=0;i<4;i++) {
       b[i] = c[i];
       for(j=0;j<4;j++) {
         c[i] += A[i][j]*b[j];
       }
       if(abs(b[i]-c[i])<0.001)
        k++;    
     }

} while(k<4); 

ただし、無限ループに陥らないように注意してください。他のチェックを実行することもできます。

于 2012-12-18T10:19:53.073 に答える
1
b[i]==c[i]; /* new add, but i don t know if it is the right place to put it..*/

タイプミスがあるようです。割り当てを意味する場合は、b[i]=c[i]代わりに使用する必要があります。

于 2012-12-18T10:07:04.523 に答える