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 » |