2015-09-06 17 views
5

私は、線形方程式の系を解くためにC++でGauss-Jordan消去法を使用していました。 コードは問題なく動作します。 void gauss()の1,2,3行目を4行目に置き換えることができない理由が不思議でしたか?C++のGauss-Jordan消去

#include <iostream> 
using namespace std; 
class Gauss 
{ 
    float a[50][50]; 
    int n; 
public: 
    void accept() 
    { 
     cout<<"Enter no. of variables: "; 
     cin>>n; 
     for(int i=0;i<n;i++) 
     { 
      for(int j=0;j<n+1;j++) 
      { 
       if(j==n) 
        cout<<"Constant no."<<i+1<<" = "; 
       else 
        cout<<"a["<<i+1<<"]["<<j+1<<"] = "; 
       cin>>a[i][j]; 
      } 
     } 
    } 
    void display() 
    { 
     for(int i=0;i<n;i++) 
     { 
      cout<<"\n"; 
      for(int j=0;j<n+1;j++) 
      { 
       if(j==n) 
        cout<<" "; 
       cout<<a[i][j]<<"\t"; 
      } 
     } 
    } 

    void gauss()//converting augmented matrix to row echelon form 
    { 
     float temp;//Line 1 
     for(int i=0;i<n;i++) 
     { 
      for(int j=i+1;j<n;j++) 
      { 
       temp=a[j][i]/a[i][i];//Line 2 
       for(int k=i;k<n+1;k++) 
       { 
         a[j][k]-=temp*a[i][k];//Line 3 
        //a[j][k]-=a[j][i]*a[i][k]/a[i][i];//Line 4 
       } 
      } 
     } 
    } 

    void EnterJordan()//converting to reduced row echelon form 
    { 
     float temp; 
     for(int i=n-1;i>=0;i--) 
     { 

      for(int j=i-1;j>=0;j--) 
      { 
       temp=a[j][i]/a[i][i]; 
       for(int k=n;k>=i;k--) 
       { 
        a[j][k]-=temp*a[i][k]; 
       } 
      } 
     } 

     float x[n]; 
     for(int i=0;i<n;i++)//making leading coefficients zero 
      x[i]=0; 
     for(int i=0;i<n;i++) 
     { 
      for(int j=0;j<n+1;j++) 
      { 
       if(x[i]==0&&j!=n) 
        x[i]=a[i][j]; 
       if(x[i]!=0) 
        a[i][j]/=x[i]; 
      } 
     } 
    } 
    void credits() 
    { 
     for(int i=0;i<n;i++) 
     { 
      cout<<"\nx"<<i+1<<" = "<<a[i][n]<<endl; 
     } 
    } 

}; 

int main() 
{ 
    Gauss obj; 
    obj.accept(); 
    cout<<"\n\nAugmented matrix: \n\n\n"; 
    obj.display(); 
    obj.gauss(); 
    cout<<"\n\nRow Echelon form: \n\n\n"; 
    obj.display(); 
    obj.EnterJordan(); 
    cout<<"\n\nReduced row echelon form:\n\n\n"; 
    obj.display(); 
    cout<<"\n\nSolution: \n\n\n"; 
    obj.credits(); 
    return 0; 
} 

注:ピボットがゼロであるとき、私のコードを考慮に分裂の問題にはなりません(私はピボット毎回のように対角要素を選択しています)。 しかしながら、私が試みた特定の例については、このような場合は遭遇しなかった。

拡大行列は、次のとおり

1 0 0 2 
0 1 0 3 
0 0 1 -1 

及び溶液は:

2 1 -1 8 
-3 -1 2 -11  
-2 1 2 -3 

出力行列は、出力行列は4行目使用

x1 = 2 

x2 = 3 

x3 = -1 

1 0 0 -0.75 
0 1 -0 8 
0 0 1 -1.5 

とソリューションです:k == iは、このように次のn-iを壊し、は0.0fにa[j][i]を変更したとき

x1 = -0.75 

x2 = 8 

x3 = -1.5 
+1

「a」の宣言はどこですか?このコードのいずれかを動作させることはむしろ重要です。 –

+0

申し訳ありませんそれに言及するのを忘れました。これは、クラス内で宣言されたfloat配列です(図示せず)。float a [50] [50]; – ByteMan2021

+1

問題を再現できるようにすべての関連コードを含めると、より迅速で迅速な対応が得られます。 –

答えて

2

あなたのライン#4は、a[j][i]から何回も読み込み、内側のループで初めて反復。

同じ場所への書き込みを伴う変数の読み込み順序を変更することは安全ではありません。

+0

ああ、これは、残りの要素が行の序列の中で変わっていない理由を説明しています。たくさんありがとう! – ByteMan2021