Serwis Edukacyjny
Nauczycieli I-LO

w Tarnowie
obrazek

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

W naszym serwisie jest nowszy artykuł o obliczaniu pierwiastków funkcji: "Metody numeryczne".

Ulepszona metoda eliminacji Gaussa-Crouta

SPIS TREŚCI
Podrozdziały

Algorytm

Podstawowy algorytm rozwiązywania układu równań liniowych metodą eliminacji Gaussa może w pewnych przypadkach zawieść pomimo istnienia rozwiązania. Otóż w metodzie tej wykonywane jest dzielenie przez element macierzy współczynników \(AB\) leżący na jej diagonali. Element ten może wynosić \(0\). W takim przypadku obliczenia zostaną wstrzymane.

Przykład:

Jeśli wprowadzisz poniższe dane do formularza javascript działającego wg algorytmu eliminacji Gaussa, to otrzymasz informację, iż rozwiązanie układu równań się nie powiodło (sprawdź to koniecznie!):

Przykładowe dane
4
0 2 3 4 49
1 0 3 4 45
1 2 0 4 36
1 2 3 0 23

Natomiast wprowadzenie tych samych danych do formularza javascript działającego wg wzorów Cramera daje wynik:

\[
\begin{array}{l}
\left\{
\begin{array}{l}
0x_1 + 2x_2 + 3x_3 + 4x_4 = 49 \\
1x_1 + 0x_2 + 3x_3 + 4x_4 = 45 \\
1x_1 + 2x_2 + 0x_3 + 4x_4 = 36 \\
1x_1 + 2x_2 + 3x_3 + 0x_4 = 23
\end{array}
\right. \\
\\
x_1 = 2 \\
x_2 = 3 \\
x_3 = 5 \\
x_4 = 7
\end{array}
\]

Rozwiązaniem tego problemu jest zmodyfikowany algorytm zwany eliminacją Gaussa-Crouta lub eliminacją z częściowym wyborem elementu podstawowego. Elementem podstawowym nazywamy element macierzy, za pomocą którego dokonujemy eliminacji zmiennej z dalszych równań. W algorytmie Gaussa elementami podstawowymi są elementy leżące na diagonali macierzy – \(a_{i,i}\). W metodzie zmodyfikowanej Gaussa-Crouta elementem podstawowym będzie element \(a_{i,j}\), który posiada największy moduł ze wszystkich współczynników w \({i{-}\text{tym}}\) wierszu.

Aby uniknąć konieczności przestawiania kolumn, zastosujemy podobne rozwiązanie jak w algorytmie wyliczania wyznacznika macierzy - wektor kolumn. W wektorze tym umieścimy numery kolejnych kolumn. Do kolumn macierzy będziemy się odwoływać pośrednio poprzez zawartość wektora kolumn. Jeśli w wektorze kolumn przestawione zostaną numery kolumn macierzy, to będzie to równoznaczne z przestawieniem tych kolumn. Również niewiadome będą wyliczane wg zawartości tego wektora.

Podsumujmy:

  1. Do kolumn macierzy \(AB\) odwołujemy się poprzez wektor kolumn – \(WK.\)
  2. Element podstawowy wybieramy jako element o największym module w wierszu.
  3. Po wybraniu elementu podstawowego zamieniamy w wektorze kolumn \(WK\) jego numer z numerem na pozycji \({i{-}\text{tej}}\). Dzięki tej operacji wybrany element znajdzie się na diagonali macierzy \(AB.\)
  4. Dokonujemy eliminacji wg algorytmu Gaussa
  5. Niewiadome wyznaczamy w tablicy \(X\) wg kolumn umieszczonych w wektorze \(WK.\) Dzięki temu zachowamy spójność numeracji niewiadomych z wprowadzonymi do macierzy \(AB\) przestawieniami kolumn.

do podrozdziału  do strony 

Opis algorytmu

Algorytm eliminacji zmiennych

Dane wejściowe

\(n\) – ilość niewiadomych oraz układów równań; \({n\in\mathbb{N}}\), \({n < 9}\)
\(AB\) – tablica \({n\times(n+1)}\) elementowa zawierająca współczynniki
\(a_{i,j}\) oraz wyrazy wolne \(b_i\); \({a_{i,j},b_i\in\mathbb{R};}\) \({i,j\in\mathbb{N},}\) \({i,j = 1,2,\dots,n.}\)
Macierz \(AB\) zdefiniowana została w poprzednim rozdziale.
\(WK\) – wektor kolumn zawierający \({n + 1}\) elementów równych
kolejnym numerom kolumn macierzy \(AB.\)

Dane wyjściowe

true – tablicę \(AB\) współczynników zredukowano
do macierzy trójkątnej. Wektor \(WK\) zawiera
numerację kolumn w macierzy \(AB.\)
false – operacja eliminacji nie powiodła się

Zmienne pomocnicze i funkcje

\(i,j,k\) –  zmienne sterujące pętli iteracyjnych; \({i,j,k\in\mathbb{N}.}\)
\(m\)
 
–
 
 mnożnik, przez który będą mnożone
współczynniki odejmowanych równań; \({m\in\mathbb{R}.}\)
\(\varepsilon\)
 
–
 
określa dokładność porównania z zerem.
\(\varepsilon = 0{,}0000000001\)

Lista kroków

Funkcja GCEliminujX(\({n, AB[\;], WK[\;]}\))
    K01: Dla \({i = 1,2,\dots,n - 1:}\)
    wykonuj kroki K02...K08
  K02:     \(k\leftarrow i\)
  K03:     Dla  \({j = i + 1, i + 2,\dots,n:}\)
        jeżeli \({|AB[i,WK[k]]| < |AB[i,WK[j]]|,}\)
        to \(k\leftarrow j\)
  K04:     \(WK[k]\leftrightarrow WK[i]\)
  K05:     Jeśli \({|AB[i,WK[i]]| < \varepsilon,}\)
    to zwróć false
    i zakończ
  K06:     Dla \({j = i+1, i+2,\dots, n:}\)
        wykonuj kroki K07... K08
K07:         \({m\leftarrow-\dfrac{AB[j,WK[i]]}{AB[i,WK[i]]}}\)
K08:         Dla \({k = i+1, i+2,\dots, n+1:}\)
            wykonuj:
   
        \({AB[j,WK[k]]\leftarrow AB[j,WK[k]] + m\cdot AB[i,WK[k]]}\)
    K09: Zwróć true
i zakończ

Schemat blokowy

obrazek

Nowy algorytm eliminacji niewiadomych jest zmodyfikowanym algorytmem eliminacji Gaussa. Dodane elementy zaznaczone zostały na schemacie blokowym kolorem żółtym. Elementy zmodyfikowane zaznaczono kolorem zielonym.

Na początku pętli nr 1 dodano fragment wyznaczający w wierszu \({i{-}\text{tym}}\) macierzy \(AB\) element maksymalny co do modułu. Gwarantuje nam to, iż nie będzie nigdy wykonywane dzielenie przez \(0\) - o ile wszystkie współczynniki nie wynoszą \(0\) - w tym przypadku układu równań nie da się rozwiązać.

Zwróć uwagę, iż do kolumn macierzy \(AB\) odwołujemy się poprzez wektor kolumn \(WK.\) Dzięki temu rozwiązaniu kolejność kolumn macierzy \(AB\) może być dowolnie zmieniana.

Po wyznaczeniu elementu podstawowego w wektorze kolumn \(WK\) zamieniamy miejscami kolumnę \({i{-}\text{tą}}\) z kolumną \({k{-}\text{tą.}}\) W ten sposób element podstawowy znajdzie się w kolumnie o numerze \(WK[i].\)

Następnie sprawdzamy, czy element podstawowy wpada w otoczenie zera o promieniu epsilon. Jeśli tak, to zakładamy, iż jest on równy \(0\) i kończymy algorytm z błędem.

W przeciwnym razie eliminujemy z pozostałych wierszy elementy w kolumnie \(WK[i].\) Zwróć uwagę, iż elementy te nie są zerowane, gdyż nie będą one już brały udziału w obliczeniach, stąd ich zawartość jest dla reszty algorytmu obojętna. Ważna natomiast jest zmiana pozostałych współczynników macierzy \(AB.\)

Gdy pętla nr 1 zakończy działanie, macierz \(AB\) jest zredukowana do macierzy trójkątnej. Algorytm kończy działanie z sukcesem. W wektorze kolumn \(WK\) zapisane są przestawione numery kolumn macierzy \(AB.\) Informacja ta będzie potrzebna w drugiej części algorytmu przy obliczaniu wartości kolejnych zmiennych.

Algorytm obliczania niewiadomych

Dane wejściowe

\(n\)
 
–
 
ilość niewiadomych oraz układów
równań. \({n\in\mathbb{N}, n < 9}\)
\(X\)

 
–

 
tablica \(n\) elementowa liczb rzeczywistych,
w której algorytm umieści obliczone
niewiadome.
\(AB\)

 
–

 
tablica \(n\times(n+1)\) elementowa zawierająca
współczynniki \(a_{i,j}\) oraz wyrazy wolne \(b_i\);
\({a_{i,j},b_i\in\mathbb{R}; \;i,j\in\mathbb{N}, \;i,j = 1,2,\dots,n}\)
\(WK\)

 
–

 
wektor kolumn zawierający \({n + 1}\)
elementów równych kolejnym numerom
kolumn macierzy \(AB.\)

Dane wyjściowe

true – tablica \(n\) elementowa niewiadomych
zawiera rozwiązania układu równań
false – operacja wyznaczania niewiadomych
nie powiodła się

Zmienne pomocnicze i funkcje

\(i,j\)
 
–
 
zmienne sterujące pętli iteracyjnych;
\({i,j\in\mathbb{N}}\)
\(s\)

 
–

 
używane do zliczania sumy iloczynów
niewiadomych przez ich współczynniki;
\({s\in\mathbb{R}}\)
\(\varepsilon\)
 
–
 
określa dokładność porównania
z zerem; \({\varepsilon = 0{,}0000000001}\)

Lista kroków

Funkcja GCObliczX(\({n, X[\;], AB[\;], WK[\;]}\))
    K01: Dla \({i = n, n-1,\dots,1:}\)
wykonuj kroki K02...K05
  K02:     Jeśli \({|AB[i,WK[i]]| < \varepsilon,}\)
    to zwróć false
    i zakończ
  K03:     \({s\leftarrow AB[i,n+1]}\)
  K04:     Dla \({j = n, n-1,\dots, i + 1:}\)
    wykonuj:
   
    \({s\leftarrow s - AB[i,WK[j]]\cdot X[WK[j]]}\)
  K05: \({X[WK[i]]\leftarrow-\dfrac{\phantom{[}s\phantom{]}}{AB[i,WK[i]]}}\)
    K06: Zwróć true
i zakończ

Schemat blokowy

obrazek

Algorytm obliczania niewiadomych jest dokładnie taki sam jak algorytm podany w poprzednim rozdziale. Modyfikacja polega na zmianie sposobu odwoływania się do kolumn macierzy \(AB\) oraz do wyrazów tablicy \(X,\) w której wyliczone zostaną niewiadome. Teraz wykonywane jest to poprzez wektor kolumn \(WK.\)

Zmiany w stosunku do oryginalnego algorytmu zaznaczono na schemacie blokowym kolorem zielonym.

Po zakończeniu działania algorytmu w tablicy \(X\) znajdują się wartości kolejnych zmiennych pierwotnego układu równań. Elementy tej tablicy są ułożone już we właściwej kolejności i możemy je bezpośrednio przetwarzać.

Zwróć uwagę na operację:

\(s\leftarrow AB[i,n+1]\)

Ostatnia, \({(n+1){-}\text{sza}}\) kolumna macierzy \(AB\) nigdy nie jest przestawiana. Zawiera ona wyrazy wolne \(b_i\) układu równań. Zatem odwołanie do tej kolumny może być bezpośrednie – bez korzystania z pośrednictwa wektora kolumn \(WK.\)


do podrozdziału  do strony 

Programy

Z uwagi na uciążliwość wprowadzania danych z klawiatury programy odczytują dane z pliku in.txt i zapisują wyniki do pliku out.txt. Pliki znajdują się w bieżącym katalogu. Plik in.txt powinien posiadać następującą strukturę:

W pierwszym wierszu liczba od 1 do 100 (jeśli chcesz obliczać układy równań o większej liczbie niewiadomych, to musisz odpowiednio zmodyfikować program) określająca ilość równań, czyli \(n\). Jednakże uważaj – zapotrzebowanie na pamięć wzrasta z kwadratem liczby elementów. Również czas obliczeń jest proporcjonalny do sześcianu z \(n.\)

W następnych \(n\) wierszach powinny być umieszczone współczynniki. Jeden wiersz określa współczynniki jednego równania. Kolejne współczynniki powinny być od siebie oddzielone przynajmniej jedną spacją. Pierwsze \(n\) współczynników odnosi się do współczynników przy kolejnych niewiadomych. Ostatni \({(n+1){-}\text{szy}}\) współczynnik określa wyraz wolny \(b_i\). Programy uruchomiono z plikiem in.txt o następującej zawartości:

Przykładowe dane
5
2 -2  2 -7  6 -4
7 -3 -2  7  2 11
2  2 -1  1  4  9
9  8 -2  2 -2 21
4  8 -3  3 -1 16
Plik określa układ
5 równań liniowych:
\[
\left\{
\begin{array}{l}
2x_1 - 2x_2 + 2x_3 + 7x_4 + 6x_5 = -4 \\
7x_1 - 3x_2 - 2x_3 + 7x_4 + 2x_5 = \;11 \\
2x_1 + 2x_2 - \phantom{2}x_3 + \phantom{2}x_4 + 4x_5 = \phantom{-}9 \\
9x_1 + 8x_2 - 2x_3 + 2x_4 - 2x_5 = \;21 \\
4x_1 + 8x_2 - 3x_3 + 3x_4 - \phantom{2}x_5 = \;16
\end{array}
\right.
\]
C++
// Program rozwiązuje układ
// równań liniowych
// o n niewiadomych
// za pomocą metody eliminacji
// Gaussa-Crouta.
//----------------------------
//   (C)2006 mgr J.Wałaszek

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cmath>
#include <cstdlib>

using namespace std;

// dokładność porównania z zerem
const double EPS = 0.0000000001;
// maksymalna ilość równań w układzie
const int    MAXEQ = 100;

// Funkcja dokonująca eliminacji
// niewiadomych. Jeśli operacja
// się powiedzie, zwraca true.
// Inaczej zwraca false.
bool GCEliminujX(int n,
                 double AB[][MAXEQ+1],
                 int WK[])
{
  int    i,j,k;
  double m;

  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;
    swap(WK[k],WK[i]);
    if(fabs(AB[i][WK[i]]) < EPS)
      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]];
    }
  }
  return true;
}

// Funkcja oblicza kolejne
// niewiadome x z macierzy AB
// przetworzonej przez funkcję
// Eliminuj_X(). Jeśli operacja
// się powiedzie, zwraca true.
// Inaczej zwraca false.
bool GCObliczX(int n,
               double X[],
               double AB[][MAXEQ+1],
               int WK[])
{
  int    i,j;
  double s;

  for(i = n - 1; i >= 0; i--)
  {
    if(fabs(AB[i][WK[i]]) < EPS)
      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]];
  }
  return true;
}

//---------------
// Program główny
//---------------

int main()
{
  ifstream fin;
  ofstream fout;
  int i,j,n,WK[MAXEQ+1];
  double AB[MAXEQ][MAXEQ+1], X[MAXEQ];

  cout << setprecision(5)
       << fixed
       << "  Uklad rownan liniowych\n"
       << "   metoda Gaussa-Crouta\n"
          "  ----------------------\n"
          "(C)2006 mgr Jerzy Walaszek\n\n";

  // Dane dla programu odczytujemy
  // z pliku tekstowego o nazwie
  // in.txt, który musi się znajdować
  // w tym samym katalogu co program
  // Pierwszy wiersz pliku powinien
  // zawierać liczbę n. Następne
  // n kolejnych wierszy powinno
  // zawierać współczynniki ai dla
  // tego wiersza, a na końcu
  // współczynnik bi. Kolejne
  // współczynniki oddzielone są od
  // siebie przynajmniej jedną spacją.
  fin.open("in.txt");
  fin >> n;
  if(n <= MAXEQ)
  {
    for(i = 0; i < n; i++)
    {
      WK[i] = i;
      for(j = 0; j <= n; j++)
        fin >> AB[i][j];
    }
    WK[n] = n;
    fin.close();

    // Dokonujemy eliminacji oraz
    // obliczania niewiadomych x

    cout << "Wyniki:\n\n";

    if(GCEliminujX(n,AB,WK) &&
       GCObliczX(n,X,AB,WK))
    {
      fout.open("out.txt");
      for(i = 0; i < n; i++)
      {
        cout << "x"
             << i + 1
             << " = "
             << setw(12)
             << X[i] << endl;
        fout << X[i] << endl;
      }
      fout.close();
    }
    else
      cout << "Rozwiazanie ukladu "
              "rownan nie powiodlo "
              "sie\n";
  }
  else
  {
    fin.close();
    cout << "Zbyt wiele rownan!\n";
  }
  cout << endl;
  system("pause");
  return 0;
}
Pascal
// Program rozwiązuje układ
// równań liniowych
// o n niewiadomych
// za pomocą metody eliminacji
// Gaussa-Crouta.
//----------------------------
//   (C)2006 mgr J.Wałaszek

program mzfl5;

const
  // dokładność porównania z zerem
  EPS   = 0.0000000001;
  // maksymalna ilość równań w układzie
  MAXEQ = 100;

type
  xwektor = array[1..MAXEQ]
    of double;
  kwektor = array[1..MAXEQ + 1]
    of integer;
  macierz = array[1..MAXEQ,1..MAXEQ + 1]
    of double;

// Funkcja dokonująca eliminacji
// niewiadomych. Jeśli operacja
// się powiedzie, zwraca true.
// Inaczej zwraca false.
function Eliminuj_X(n : integer;
                    var AB : macierz;
                    var WK : kwektor)
                    : boolean;
var
  i,j,k,tmp : integer;
  m         : double;
begin
  for i := 1 to n - 1 do
  begin
    k := i;
    for j := i + 1 to n do
      if abs(AB[i,WK[k]]) <
         abs(AB[i,WK[j]]) then k := j;
    tmp := WK[k];
    WK[k] := WK[i];
    WK[i] := tmp;
    if abs(AB[i,WK[i]]) < EPS then
    begin
      Result := false;
      exit;
    end;
    for j := i + 1 to n do
    begin
      m := -AB[j,WK[i]] / AB[i,WK[i]];
      for k := i + 1 to n + 1 do
        AB[j,WK[k]] := AB[j,WK[k]] +
                       m * AB[i,WK[k]];
    end;
  end;
  Result := true;
end;

// Funkcja oblicza kolejne
// niewiadome x z macierzy AB
// przetworzonej przez funkcję
// Eliminuj_X(). Jeśli operacja
// się powiedzie, zwraca true.
// Inaczej zwraca false.
function Oblicz_X(n : integer;
                  var X : xwektor;
                  var AB : macierz;
                  var WK : kwektor)
                  : boolean;
var
  i,j : integer;
  s   : double;
begin
  for i := n downto 1 do
  begin
    if abs(AB[i,WK[i]]) < EPS then
    begin
      Result := false;
      exit;
    end;
    s := AB[i,n + 1];
    for j := n downto i + 1 do
      s := s - AB[i,WK[j]] * X[WK[j]];
    X[WK[i]] := s / AB[i,WK[i]];
  end;
  Result := true;
end;

//---------------
// Program główny
//---------------

var
  f     : Text;
  i,j,n : integer;
  AB    : macierz;
  X     : xwektor;
  WK    : kwektor;

begin
  writeln('  Uklad rownan liniowych');
  writeln('   metoda Gaussa-Crouta');
  writeln('  ----------------------');
  writeln('(C)2006 mgr Jerzy Walaszek');
  writeln;

  // Dane dla programu odczytujemy
  // z pliku tekstowego o nazwie
  // in.txt, który musi się znajdować
  // w tym samym katalogu co program
  // Pierwszy wiersz pliku powinien
  // zawierać liczbę n. Następne
  // n kolejnych wierszy powinno
  // zawierać współczynniki ai dla
  // tego wiersza, a na końcu
  // współczynnik bi. Kolejne
  // współczynniki oddzielone są od
  // siebie przynajmniej jedną spacją.
  assignfile(f,'in.txt');
  reset(f);
  readln(f,n);
  if n <= MAXEQ then
  begin
    for i := 1 to n do
    begin
      WK[i] := i;
      for j := 1 to n + 1 do
        read(f,AB[i,j]);
    end;
    WK[n + 1] := n + 1;
    closefile(f);

    // Dokonujemy eliminacji oraz
    // obliczania niewiadomych x
    writeln('Wyniki:');
    writeln;
    if Eliminuj_X(n,AB,WK) and
       Oblicz_X(n,X,AB,WK) then
    begin
      assignfile(f,'out.txt');
      rewrite(f);
      for i := 1 to n do
      begin
        writeln('x',i,' = ',X[i]:12:5);
        writeln(f,X[i]);
      end;
      closefile(f);
    end
    else
    begin
      write('Rozwiazanie ukladu ');
      write('rownan nie powiodlo ');
      writeln('sie');
    end;
  end
  else
  begin
    writeln('Zbyt wiele rownan!');
    closefile(f);
  end;
  writeln;
  writeln('Nacisnij Enter...');
  readln;
end.
Basic
' Program rozwiązuje układ
' równań liniowych o n
' niewiadomych za pomocą
' metody eliminacji
' Gaussa-Crouta.
'-------------------------
' (C)2006 mgr J.Wałaszek

Declare Function _
          EliminujX(n As Integer, _
                    AB() As Double, _
                    WK() As Integer) _
                    As Integer
Declare Function _
          ObliczX(n As Integer, _
                  X() As Double, _
                  AB() As Double, _
                  WK() As Integer) _
                  As Integer

' dokładność porównania z zerem
Const EPS As double = 0.0000000001
' maksymalna ilość równań w układzie
Const MAXEQ As Integer = 100

'---------------
' Program główny
'---------------

Dim As Integer i, j, n, WK(MAXEQ)
Dim As Double AB(MAXEQ - 1, MAXEQ), _
              X(MAXEQ - 1)

Print "  Uklad rownan liniowych"
Print "   metoda Gaussa-Crouta"
Print "  ----------------------"
Print "'(C)2006 mgr Jerzy Walaszek"
Print
  
' Dane dla programu odczytujemy
' z pliku tekstowego o nazwie
' in.txt, który musi się znajdować
' w tym samym katalogu co program.
' Pierwszy wiersz pliku powinien
' zawierać liczbę n. Następne
' n kolejnych wierszy powinno
' zawierać współczynniki ai dla
' tego wiersza, a na końcu
' współczynnik bi. Kolejne
' współczynniki oddzielone są od
' siebie przynajmniej jedną spacją.

Open "in.txt" For Input As #1
Input #1, n
If n <= MAXEQ Then
   For i = 0 To n - 1
      WK(i) = i
      For j = 0 To n
        Input #1, AB(i, j)
      Next
   Next
   WK(n) = n
   Close #1

   ' Dokonujemy eliminacji oraz
   ' obliczania niewiadomych x

   Print "Wyniki:"
   Print

   If EliminujX(n, AB(), WK()) And _
      ObliczX(n, X(), AB(), WK()) Then
      Open "out.txt" For Output As #1

      ' Wypisujemy wyniki do okna
      ' konsoli oraz do pliku out.txt
      For i = 0 To n - 1
         Print _
           Using "x## = ######.#####"; _
           i + 1; X(i)
         Print #1, _
           Using "x## = ######.#####"; _
           i + 1; X(i)
      Next
      Close #1
   Else
      Print "Rozwiazanie ukladu rownan ";
      Print "nie powiodlo sie"
   End If
Else
   Print "Zbyt wiele rownan!"
   Close #1
End If
Print
Print "Nacisnij Enter..."
Sleep
End

' Funkcja dokonująca eliminacji
' niewiadomych. Jeśli operacja
' się powiedzie, zwraca true.
' Inaczej zwraca false.
Function EliminujX(n As Integer, _
                   AB() As Double, _
                   WK() As Integer) _
                   As Integer
  Dim As Integer i, j, k
  Dim m As Double

  For i = 0 To n - 2
    k = i
    For j = i + 1 To n - 1
      If Abs(AB(i, WK(k))) < _
         Abs(AB(i, WK(j))) Then k = j
    Next
    Swap WK(k), WK(i)
    If Abs(AB(i, WK(i))) < EPS Then _
      Return 0
    For j = i + 1 To n - 1
      m = -AB(j, WK(i)) / AB(i, WK(i))
      For k = i + 1 To n
        AB(j, WK(k)) += m * AB(i, WK(k))
      Next
    Next
  Next
  Return 1
End Function

' Funkcja oblicza kolejne
' niewiadome x z macierzy AB
' przetworzonej przez funkcję
' Eliminuj_X(). Jeśli operacja
' się powiedzie, zwraca true.
' Inaczej zwraca false.
Function ObliczX(n As Integer, _
                 X() As Double, _
                 AB() As Double, _
                 WK() As Integer) _
                 As Integer
  Dim As Integer i, j
  Dim s As Double

  For i = n - 1 To 0 Step -1
    If Abs(AB(i, WK(i))) < EPS Then _
      Return 0
    s = AB(i, n)
    For j = n - 1 To i + 1 Step -1
      s -= AB(i, WK(j)) * X(WK(j))
    Next
    X(WK(i)) = s / AB(i, WK(i))
  Next
  Return 1
End Function
Python (dodatek)
# Program rozwiązuje układ
# równań liniowych
# o n niewiadomych
# za pomocą metody eliminacji
# Gaussa-Crouta.
#----------------------------
#   (C)2006 mgr J.Wałaszek

# Dokładność porównania z zerem
EPS = 0.0000000001
# Maksymalna ilość równań w układzie
MAXEQ = 100

# Funkcja dokonująca eliminacji
# niewiadomych. Jeśli operacja
# się powiedzie, zwraca True.
# Inaczej zwraca False.
def eliminujx(n, ab, wk):
    for i in range(n - 1):
        k = i
        for j in range(i + 1, n):
            if abs(ab[i][wk[k]]) < \
               abs(ab[i][wk[j]]):
                k = j
        
        wk[i], wk[k] = wk[k], wk[i]

        if abs(ab[i][wk[i]]) < EPS:
            return False

        for j in range(i + 1, n):
            m = -ab[j][wk[i]] / ab[i][wk[i]]
            for k in range(i + 1, n + 1):
                ab[j][wk[k]] += m * ab[i][wk[k]]
    return True

# Funkcja oblicza kolejne
# niewiadome x z macierzy AB
# przetworzonej przez funkcję
# Eliminuj_X(). Jeśli operacja
# się powiedzie, zwraca true.
# Inaczej zwraca false.
def obliczx(n, x, ab, wk):
    for i in reversed(range(n)):
        if abs(ab[i][wk[i]]) < EPS:
            return False
        s = ab[i][n]
        for j in range(i + 1, n):
            s -= ab[i][wk[j]] * x[wk[j]]
        x[wk[i]] = s / ab[i][wk[i]]
    return True

# ---------------
# Program główny
# ---------------

print("  Układ równań liniowych")
print("   Metoda Gaussa-Crouta")
print("  ----------------------")
print("(C)2026 mgr Jerzy Walaszek\n")

with open("in.txt", "r",
          encoding="utf-8") as f1:
    dane = f1.read().split()
    it = 0
    n = int(dane[it])
    if n <= MAXEQ:
        wk = list(range(n + 1))
        ab = [[0.0 for _ in range(n + 1)]
              for _ in range(n)]
        x = [0.0] * n

        for i in range(n):
            for j in range(n + 1):
                it += 1
                ab[i][j] = float(dane[it])

        print("Wyniki:\n")

        if eliminujx(n, ab, wk) and \
           obliczx(n, x, ab, wk):
            with open("out.txt", "w",
                      encoding="utf-8") as f2:
                for i in range(n):
                    wynik = f"X{i+1:2d} = {x[i]:12.5f}"
                    print(wynik)
                    f2.write(wynik + "\n")
        else:
            print("Rozwiązanie układu równań",
                  "nie powiodło się.")
    else:
        print("Zbyt wiele równań!")

print()
input("Naciśnij Enter...")
Wynik:
  Układ równań liniowych
   Metoda Gaussa-Crouta
  ----------------------
(C)2026 mgr Jerzy Walaszek

Wyniki:

X 1 =      1.00000
X 2 =      2.00000
X 3 =      3.00000
X 4 =      2.00000
X 5 =      1.00000

Naciśnij Enter...
JavaScript
<html>
  <head>
  </head>
  <body>
<div style="overflow-x: auto;"
     align="center">
  <table
  border="0"
  cellpadding="4"
  style="border-collapse:
         collapse">
    <tr>
      <td nowrap>
        <form
        name="frmbincode"
        style="text-align: center;
               background-color:
               #E7E7DA">
          <big><b>
          Demonstracja rozwiązywania<br>
          układu równań za pomocą<br>
          Eliminacji Gaussa-Crouta</b>
          </big><br>
          <br>
          &nbsp;&nbsp;
          (C)2026
          mgr Jerzy Wałaszek
          I LO w Tarnowie
          &nbsp;&nbsp;
          <hr>
          Tutaj wprowadź wiersze<br>
          ze współczynnikami<br>
          układu równań:<br>
          <br>
          <textarea
          rows="9"
          name="input"
          cols="50">
5
2 -2 2 -7 6 -4
7 -3 -2 7 2 11
2 2 -1 1 4 9
9 8 -2 2 -2 21
4 8 -3 3 -1 16
          </textarea>
          <hr>
          <input
          type="button"
          value="Licz"
          name="B1"
          onclick="main()">
          <hr>
          <b>Wyniki:</b>
          <div
          id="out"
          align="center">.</div>
        </form>
      </td>
    </tr>
  </table>
</div>

<script language=javascript>

// Program rozwiązuje układ
// równań liniowych o n niewiadomych
// za pomocą metody eliminacji
// Gaussa-Crouta.
//----------------------------------
// (C)2006 mgr J.Wałaszek
// I LO w Tarnowie

// dokładność porównania z zerem
var EPS   = 0.0000000001
// maksymalna ilość równań w układzie
var MAXEQ = 100

// Funkcja dokonująca eliminacji
// niewiadomych. Jeśli operacja
// się powiedzie, zwraca true.
// Inaczej zwraca false.
function GCEliminujX(n, AB, WK)
{
  var i,j,k,m,tmp

  for(i = 0; i < n - 1; i++)
  {
    for(k = i, j = i + 1; j < n; j++)
      if(Math.abs(AB[i][WK[k]]) <
         Math.abs(AB[i][WK[j]])) k = j
    tmp = WK[k]
    WK[k] = WK[i]
    WK[i] = tmp
    if(Math.abs(AB[i][WK[i]]) < EPS)
      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]]
    }
  }
  return true
}

// Funkcja oblicza kolejne
// niewiadome x z macierzy AB
// przetworzonej przez funkcję
// Eliminuj_X(). Jeśli operacja
// się powiedzie, zwraca true.
// Inaczej zwraca false.
function GCObliczX(n, X, AB, WK)
{
  var i,j,s

  for(i = n - 1; i >= 0; i--)
  {
    if(Math.abs(AB[i][WK[i]]) < EPS)
      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]]
  }
  return true;
}

//---------------
// Program główny
//---------------

function main()
{
  var i,j,n,s,t,z
  var AB = new Array(MAXEQ)
  var X  = new Array(MAXEQ)
  var WK = new Array(MAXEQ)

  // Dane dla programu odczytujemy
  // z pola tekstowego. Pierwszy
  // wiersz pola powinien zawierać
  // liczbę n. Następne n kolejnych
  // wierszy powinno zawierać
  // współczynniki ai dla tego
  // wiersza, a na końcu
  // współczynnik bi. Kolejne
  // współczynniki oddzielone
  // są od siebie przynajmniej
  // jedną spacją.
  t = "<font color=red>" +
      "<b>Złe dane</b></font>"
  s = document.frmbincode.input.value
  if(s.length > 0)
  {
    // Odczytujemy współczynniki
    // z pola tekstowego formularza
    while((j = s.indexOf('\n')) != -1)
      s = s.substring(0,j) + " " +
          s.substring(j + 1,s.length)
    while((j = s.indexOf('\r')) != -1)
      s = s.substring(0,j) + " " +
          s.substring(j + 1,s.length)
    while((j = s.indexOf('\t')) != -1)
      s = s.substring(0,j) + " " +
          s.substring(j + 1,s.length)
    while(s.length > 0 &&
         (s.charAt(0) == " "))
      s = s.substring(1,s.length)
    while(s.length > 0 &&
         (s.charAt(s.length-1) == " "))
      s = s.substring(0,s.length - 1)
    while(s.length > 0 &&
         ((j = s.indexOf("  ")) != -1))
      s = s.substring(0,j) +
          s.substring(j+1,s.length)
    s = s.split(' ')
    if(s.length > 0)
    {
      n = parseInt(s[0])
      if((!isNaN(n)) &&
        (s.length >= n * (n + 1) + 1) &&
        (n <= MAXEQ))
      {
        k = 1
        z = true
        for(i = 0; i < n; i++)
        {
          AB[i] = new Array(n + 1)
          WK[i] = i
          for(j = 0; j <= n; j++)
            z = z && !isNaN(AB[i][j] =
                parseFloat(s[k++]))
        }
        WK[n] = n
        if(z)
        {
          // Dokonujemy eliminacji oraz
          // obliczania niewiadomych x
          t = "<table border='0' " +
              "cellpadding='4' " +
              "style='border-collapse: " +
              "collapse'>" +
              "<tr><td nowrap>"

          if(GCEliminujX(n,AB,WK) &&
             GCObliczX(n,X,AB,WK))
            for(i = 0; i < n; i++)
              t += "x<sub>" +
                   (i + 1) + "</sub> = " +
                   X[i] + "<br>"
          else
            t += "<font color=red>" +
                 "<b>Rozwiązanie układu " +
                 "równań nie powiodło się" +
                 "</b></font>"
          t += "</td></tr></table>"
        }
      }
    }
  }
  document.getElementById("out").innerHTML = t
}
</script>
  </body>
</html>
Demonstracja rozwiązywania
układu równań za pomocą
Eliminacji Gaussa-Crouta


   (C)2026 mgr Jerzy Wałaszek I LO w Tarnowie   
Tutaj wprowadź wiersze
ze współczynnikami
układu równań:

      

Wyniki:
.

do podrozdziału  do strony 

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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
W soboty i niedziele reklamy są wyłączane w całym serwisie.
Informacje dodatkowe.