Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Metoda eliminacji Gaussa

Ostatnio zmodyfikowano 2010-06-30 16:14
Autor Wiadomość
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
C/C++
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++ ) { // outer loop on rows
        pvt = a[ i ][ i ]; // get pivot value
        if( !abs( pvt ) ) {
            for( j = i + 1; j < n; j++ ) {
                if(( pvt = abs( a[ j ][ i ] ) ) != 0.0 ) break;
               
            }
            if( !abs( pvt ) )
                 return 1; // nowhere to run!
           
            t = a[ j ]; // swap matrix rows...
            a[ j ] = a[ i ];
            a[ i ] = t;
            tmp = b[ j ]; // ...and result vector
            b[ j ] = b[ i ];
            b[ i ] = tmp;
        }
        for( k = i + 1; k < n; k++ ) { // (virtual) eliminate column
            tmp = a[ k ][ i ] / pvt;
            for( j = i + 1; j < n; j++ ) {
                a[ k ][ j ] -= tmp * a[ i ][ j ];
            }
            b[ k ] -= tmp * b[ i ];
        }
    }
    // Do back substitution
    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:
C/C++
/* This version preserves the matrix 'a' and the vector 'b'. */

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;
   
    // Initialize return value for successful execution.
    retval = 0;
   
    // Create and initialize working storage
    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 ];
    }
   
    // Main loop
    for( i = 0; i < n; i++ ) { // outer loop on rows
        pvt = aa[ i ][ i ]; // get pivot value
        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; // pull the plug!
            }
            t = aa[ j ]; // swap matrix rows...
            aa[ j ] = aa[ i ];
            aa[ i ] = t;
            tmp = bb[ j ]; // ...and result vector
            bb[ j ] = bb[ i ];
            bb[ i ] = tmp;
        }
        for( k = i + 1; k < n; k++ ) { // (virtual) eliminate column
            tmp = aa[ k ][ i ] / pvt;
            for( j = i + 1; j < n; j++ ) {
                aa[ k ][ j ] -= tmp * aa[ i ][ j ];
            }
            bb[ k ] -= tmp * bb[ i ];
        }
    }
    // Do back substitution
    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;
}
P-18409
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:
C/C++
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:
C/C++
cged( A, B, Z, n );
i to wszystko, pamiętaj o zwolnieniu pamięci - tak jak w Twojej drugiej funkcji jest zwalniana tymczasowa tablica aa.
P-18429
elradziu
Temat założony przez niniejszego użytkownika
» 2010-06-30 11:15:54
Napisałem takie cos:
C/C++
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
P-18432
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:
C/C++
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 );

P-18433
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...
P-18438
« 1 »
  Strona 1 z 1