elradziu Temat założony przez niniejszego użytkownika  | 
Metoda eliminacji Gaussa » 2010-06-29 16:50:40 Witam znalazłem gdzieś w necie algo do eliminacji Gaussa dla liczb zespolonych Tylko nie wiem jak do funkcji przekazać tablice ze współczynnikami i wyrazami wolnymi kolejno macierz A i B int cged( complex < double > ** a, complex < double > * b, complex < double > * x, int n ) {     complex < double > tmp, pvt, * t;     int i, j, k, itmp;          for( i = 0; i < n; i++ ) {          pvt = a[ i ][ i ];          if( !abs( pvt ) ) {             for( j = i + 1; j < n; j++ ) {                 if(( pvt = abs( a[ j ][ i ] ) ) != 0.0 ) break;                              }             if( !abs( pvt ) )                  return 1;                           t = a[ j ];              a[ j ] = a[ i ];             a[ i ] = t;             tmp = b[ j ];              b[ j ] = b[ i ];             b[ i ] = tmp;         }         for( k = i + 1; k < n; k++ ) {              tmp = a[ k ][ i ] / pvt;             for( j = i + 1; j < n; j++ ) {                 a[ k ][ j ] -= tmp * a[ i ][ j ];             }             b[ k ] -= tmp * b[ i ];         }     }          for( i = n - 1; i >= 0; i-- ) {         x[ i ] = b[ i ];         for( j = n - 1; j > i; j-- ) {             x[ i ] -= a[ i ][ j ] * x[ j ];         }         x[ i ] /= a[ i ][ i ];     }     return 0; } Druga wersja: 
  int cged2( complex < double > ** a, complex < double > * b, complex < double > * x, int n ) {     complex < double > tmp, pvt, * t, ** aa, * bb;     int i, j, k, itmp, retval;               retval = 0;               aa = new complex < double > *[ n ];     bb = new complex < double >[ n ];     for( i = 0; i < n; i++ ) {         aa[ i ] = new complex < double >[ n ];         for( j = 0; j < n; j++ ) {             aa[ i ][ j ] = a[ i ][ j ];         }         bb[ i ] = b[ i ];     }               for( i = 0; i < n; i++ ) {          pvt = aa[ i ][ i ];          if( !abs( pvt ) ) {             for( j = i + 1; j < n; j++ ) {                 if(( pvt = abs( aa[ j ][ i ] ) ) != 0.0 ) break;                              }             if( !abs( pvt ) ) {                 retval = 1;                 goto _100;              }             t = aa[ j ];              aa[ j ] = aa[ i ];             aa[ i ] = t;             tmp = bb[ j ];              bb[ j ] = bb[ i ];             bb[ i ] = tmp;         }         for( k = i + 1; k < n; k++ ) {              tmp = aa[ k ][ i ] / pvt;             for( j = i + 1; j < n; j++ ) {                 aa[ k ][ j ] -= tmp * aa[ i ][ j ];             }             bb[ k ] -= tmp * bb[ i ];         }     }          for( i = n - 1; i >= 0; i-- ) {         x[ i ] = bb[ i ];         for( j = n - 1; j > i; j-- ) {             x[ i ] -= aa[ i ][ j ] * x[ j ];         }         x[ i ] /= aa[ i ][ i ];     }     _100:     for( i = 0; i < n; i++ ) {         delete[] aa[ i ];     }     delete[] aa;     delete[] bb;     return retval; }
  | 
 | 
VND  | 
» 2010-06-30 00:39:59 Przekazujesz tak jak jest w definicji funkcji, najpierw tablica dwuwymiarowa potem jednowymiarowa. Dwuwymiarowa musi być utworzona dynamicznie np tak: complex < double >** A; A = new complex < double >*[ rzad ]; while( rzad-- )      A[ rzad ] = new complex < double >[ kol ];
 
  rzad,kol to ilość rzędów i kolumn, w tym przypadku macierz jest chyba kwadratowa więc rzad=kol=n. wywołanie: i to wszystko, pamiętaj o zwolnieniu pamięci - tak jak w Twojej drugiej funkcji jest zwalniana tymczasowa tablica aa.  | 
 | 
elradziu Temat założony przez niniejszego użytkownika  | 
» 2010-06-30 11:15:54 Napisałem takie cos: int n = 2; complex < double >** A; A = new complex < double >*[ n ]; while( n-- ) A[ n ] = new complex < double >[ n ];
  complex < double >* B; B = new complex < double >[ n ]; complex < double >* X; X = new complex < double >[ n ]; A[ 0 ][ 0 ] =( 2, 0 ); A[ 0 ][ 1 ] =( 3, - 2 ); A[ 1 ][ 0 ] =( 1.0, 0 ); A[ 1 ][ 1 ] =( 2, - 1 ); B[ 0 ] =( 3, 0 ); B[ 1 ] =( 0, 1 );
  i program się wyłącza jeszcze przed wywołaniem funkcji  | 
 | 
VND  | 
» 2010-06-30 13:49:32 Nic dziwnego. Przy deklaracji B i X n jest już równe 0. A i jeszcze jeden błąd: nie możesz mieć tej samej zmiennej przy deklarowaniu kolumn w while, ponieważ po dekrementacji wielkość kolumn będzie się też zmniejszać. zrób tak: const int n = 2; int tmp = n;
  complex < double >** A; A = new complex < double >*[ n ]; while( tmp-- ) A[ tmp ] = new complex < double >[ n ];
  complex < double >* B; B = new complex < double >[ n ]; complex < double >* X; X = new complex < double >[ n ];
  A[ 0 ][ 0 ] = complex < double >( 2, 0 ); A[ 0 ][ 1 ] = complex < double >( 3, - 2 ); A[ 1 ][ 0 ] = complex < double >( 1, 0 ); A[ 1 ][ 1 ] = complex < double >( 2, - 1 ); B[ 0 ] = complex < double >( 3, 0 ); B[ 1 ] = complex < double >( 0, 1 );
   | 
 | 
elradziu Temat założony przez niniejszego użytkownika  | 
» 2010-06-30 16:14:26 Działa:)
  Dla kogoś kto być może będzie poszukiwał tego algo. on działa i liczy poprawnie...  | 
 | 
|  « 1 »  |