|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
| SPIS TREŚCI |
| Podrozdziały |
W podstawowym algorytmie eliminacji Gaussa wykonywane jest dzielenie przez element leżący na przekątnej głównej macierzy współczynników. Jeśli element ten jest równy 0, to dzielenie nie może zostać wykonane i algorytm musi zakończyć pracę z błędem.
Wprowadź do programu z poprzedniego rozdziału poniższe dane:
Układ posiada jednak rozwiązanie:
Rozwiązanie układu równań może istnieć pomimo porażki eliminacji Gaussa. Aby uniknąć tego typu sytuacji, postępujemy podobnie jak w algorytmie rozkładu LU z piwotowaniem. Zamiast dzielić przez element przekątnej, wyszukujemy w danym wierszu współczynnik największy, po czym przestawiamy kolumny macierzy, tak aby ten największy element znalazł się na przekątnej macierzy współczynników. Aby fizycznie nie przestawiać kolumn, zastosujemy wektor kolumnowy, poprzez który będziemy się odwoływać do elementów macierzy współczynników.
Taki zmodyfikowany algorytm nosi nazwę eliminacji Gaussa-Crouta.
Poniższy program jest przykładową realizacją algorytmu eliminacji Gaussa-Crouta. Jest to program z poprzedniego rozdziału, w którym dokonaliśmy zmian wymaganych przez nowy algorytm.
Dane do programu mają następującą budowę:
Pierwsza liczba określa liczbę równań i niewiadomych \(n\). Następne liczby określają współczynniki przy niewiadomych oraz wyrazy wolne. Należy wprowadzać je wierszami. Pierwsze \(n\) liczb w każdym wierszu to kolejne współczynniki przy niewiadomych. Po tych \(n\) współczynnikach należy wprowadzić wyraz wolny. Wierszy takich musi być \(n\).Układ równań:
|
Dane wejściowe:
4 0 2 3 4 49 1 0 3 4 45 1 2 0 4 36 1 2 3 0 23 |
C++// Eliminacja Gaussa-Crouta
// (C)2019 mgr Jerzy Wałaszek
// Metody numeryczne 0068
//---------------------------
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <cmath>
using namespace std;
const double EPS = 0.000000001;
// Funkcja rozwiązuje układ równań
// metodą eliminacji Gaussa-Crouta
// n - stopień macierzy
// AB - wskaźnik macierzy n x (n + 1)
// X - wskaźnik macierzy rozwiązań n x 1
// Jeśli układ został rozwiązany,
// to wynikiem jest true.
// Inaczej wynikiem jest false.
//--------------------------------------
bool GaussCrout(int n,
double ** AB,
double * X)
{
int i,j,k;
double m,s;
int * WK;
// Przygotowujemy wektor kolumnowy
WK = new int [n + 1];
for(i = 0; i <= n; i++)
WK[i] = i;
// Eliminacja
for(i = 0; i < n - 1; i++)
{
for(k = i, j = i + 1; j < n; j++)
if(fabs(AB[i][WK[k]]) <
fabs(AB[i][WK[j]]))
k = j;
if(k != i)
swap(WK[k],WK[i]);
if(fabs(AB[i][WK[i]]) < EPS)
{
delete [] WK;
return false;
}
for(j = i + 1; j < n; j++)
{
m = -AB[j][WK[i]] / AB[i][WK[i]];
for(k = i + 1; k <= n; k++)
AB[j][WK[k]] += m * AB[i][WK[k]];
}
}
// Obliczanie wartości niewiadomych
for(i = n - 1; i >= 0; i--)
{
if(fabs(AB[i][WK[i]])< EPS)
{
delete [] WK;
return false;
}
s = AB[i][n];
for(j = n - 1; j > i; j--)
s -= AB[i][WK[j]] * X[WK[j]];
X[WK[i]] = s / AB[i][WK[i]];
}
// Usuwamy wektor kolumnowy
delete [] WK;
return true;
}
// Program główny
//---------------
int main()
{
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
cout << setprecision(5)
<< fixed;
cout <<
"Rozwiązywanie układu równań "
"liniowych metodą eliminacji "
"Gaussa-Crouta\n"
"----------------------------"
"----------------------------"
"-------------\n\n"
"Wpisz dane wejściowe:\n\n";
// Liczba równań w układzie
int n;
cin >> n;
int i,j;
// Tworzymy dynamicznie
// potrzebne macierze
// Macierz współczynników
// przy niewiadomych x
// oraz wyrazów wolnych
double ** AB;
// Macierz niewiadomych
double * X ;
AB = new double * [n];
X = new double [n];
for(i = 0; i < n; i ++)
AB[i] = new double [n + 1];
// Odczytujemy dane
// układu równań
for(i = 0; i < n; i++)
for(j = 0; j <= n; j++)
cin >> AB[i][j];
cout << endl;
// Rozwiązujemy układ równań
if(GaussCrout(n,AB,X))
{
for(i = 0; i < n; i++)
cout << "x" << i << " = "
<< setw(12)<< X[i]
<< endl;
}
else
cout <<
"Błąd w trakcie obliczeń!!!\n";
cout << endl;
// Usuwamy tablice
// dynamiczne
for(i = 0; i < n; i++)
delete [] AB[i];
delete [] AB;
delete [] X;
system("pause");
return 0;
}
|
| Wynik |
| Rozwiązywanie układu równań liniowych
metodą eliminacji Gaussa-Crouta --------------------------------------------------------------------- Wpisz dane wejściowe: 4 0 2 3 4 49 1 0 3 4 45 1 2 0 4 36 1 2 3 0 23 x0 = 2.00000 x1 = 3.00000 x2 = 5.00000 x3 = 7.00000 |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.