Eliminacja Gaussa z wyborem elementu głównego
Ostatnio zmodyfikowano 2016-03-12 20:23
Mamrot Temat założony przez niniejszego użytkownika |
Eliminacja Gaussa z wyborem elementu głównego » 2016-03-12 08:07:07 Napisałem swego czasu funkcję realizującą algorytm eliminacji Gaussa, z którą nie ma problemów: void GAUSS( int ILE, long double ** A, long double X[], long double Y[] ) { long double m; for( int i = 0; i < ILE; i++ ) { for( int j = i + 1; j < ILE; j++ ) { m = A[ j ][ i ] / A[ i ][ i ]; Y[ j ] = Y[ j ] - m * Y[ i ]; for( int k = 0; k < ILE; k++ ) { A[ j ][ k ] = A[ j ][ k ] - m * A[ i ][ k ]; } } } X[ ILE - 1 ] = Y[ ILE - 1 ] / A[ ILE - 1 ][ ILE - 1 ]; for( int i = ILE - 2; i >= 0; i-- ) { X[ i ] = Y[ i ]; for( int j = ILE - 1; j > i; j-- ) { X[ i ] = X[ i ] - A[ i ][ j ] * X[ j ]; } X[ i ] = X[ i ] / A[ i ][ i ]; } }
Zamarzyła mi się jednak wersja z wyborem elementu głównego void WYBGAUSS( int ILE, long double ** A, long double X[], long double Y[] ) { long double B; long double m; int w; long double AA[ ILE ]; long double Yi; for( int i = 0; i < ILE; i++ ) { B = A[ i ][ i ]; for( int j = i; j < ILE; j++ ) { if( fabs( A[ j ][ i ] ) > fabs( B ) ) { w = j; } } if( w == i ) { goto gauss; } for( int j = 0; j < ILE; j++ ) { AA[ j ] = A[ i ][ j ]; } for( int j = 0; j < ILE; j++ ) { A[ i ][ j ] = A[ w ][ j ]; } for( int j = 0; j < ILE; j++ ) { A[ w ][ j ] = AA[ j ]; } Yi = Y[ i ]; Y[ i ] = Y[ w ]; Y[ w ] = Yi; gauss: for( int j = i + 1; j < ILE; j++ ) { m = A[ j ][ i ] / A[ i ][ i ]; Y[ j ] = Y[ j ] - m * Y[ i ]; for( int k = 0; k < ILE; k++ ) { A[ j ][ k ] = A[ j ][ k ] - m * A[ i ][ k ]; } } } X[ ILE - 1 ] = Y[ ILE - 1 ] / A[ ILE - 1 ][ ILE - 1 ]; for( int i = ILE - 2; i >= 0; i-- ) { X[ i ] = Y[ i ]; for( int j = ILE - 1; j > i; j-- ) { X[ i ] = X[ i ] - A[ i ][ j ] * X[ j ]; } X[ i ] = X[ i ] / A[ i ][ i ]; } }
która to "wykrzacza się" (przypisuje "nan" do współczynników A). |
|
Mamrot Temat założony przez niniejszego użytkownika |
» 2016-03-12 20:23:49 Pobawiłem się jeszcze z tą funkcją i żeby było śmieszniej to na niedużych zestawach danych działa poprawnie. Kłopoty zaczynają się kiedy mam duże (ok. 1000) układy równań. |
|
« 1 » |