2015-09-06 11 views
5

Stavo usando l'eliminazione di Gauss-Jordan in C++ per risolvere un sistema di equazioni lineari. Il codice funziona correttamente. Stavo chiedendo perché le linee 1,2,3 in void gauss() non possono essere sostituite dalla riga 4 (ottenendo output non corretto dopo averlo fatto)?Eliminazione di Gauss-Jordan in C++

#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; 
} 

Nota: Il mio codice non prende in considerazione il problema della divisione, quando il perno è pari a zero (sto scegliendo l'elemento diagonale come il pivot ogni volta). Per l'esempio particolare che ho provato, tuttavia, questo caso non è stato riscontrato.

matrice aumentata è:

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

La matrice di uscita è:

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

e la soluzione è:

x1 = 2 

x2 = 3 

x3 = -1 

usando la linea 4, la matrice di uscita è:

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

e la soluzione è:

x1 = -0.75 

x2 = 8 

x3 = -1.5 
+1

Dov'è la dichiarazione di 'a'? È piuttosto essenziale lavorare con questo codice. –

+0

Oops sorry! Ho dimenticato di dirlo. È un array float che ho dichiarato nella classe (non mostrato) come float a [50] [50]; – ByteMan2021

+1

Avrai una risposta migliore e più veloce se includi tutto il codice pertinente in modo che il problema possa essere riprodotto. –

risposta

2

della linea da # 4 legge da a[j][i] molte volte, e la prima volta attraverso il ciclo interno, quando k == i, cambia a[j][i] a 0.0f, rompendo così la prossima n-i iterazioni.

Il riordino delle letture di una variabile con una scrittura nella stessa posizione non è sicuro.

+0

Ah, questo spiega perché il resto degli elementi è rimasto invariato nella forma a scaglioni di riga. Grazie mille! – ByteMan2021