|
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
|
Należy znaleźć rozwiązanie układu równań liniowych postaci:
a1,1×x1+a1,2×x2+…+a1,n×xn = b1 a2,1×x1+a2,2×x2+…+a2,n×xn = b2 … an,1×x1+an,2×x2+…+an,n×xn = bn |
wykorzystując metodę eliminacji Gaussa
Układ równań liniowych
a1,1×x1+a1,2×x2+…+a1,n×xn = b1 a2,1×x1+a2,2×x2+…+a2,n×xn = b2 … an,1×x1+an,2×x2+…+an,n×xn = bn
możemy zapisać w postaci macierzowej jako:
|
×
|
|
= |
|
lub w skrócie:
A×X = B
gdzie:
W pierwszym kroku dopisujemy
A|B = |
|
W kolejnych krokach rozpoczynamy przekształcanie rozszerzonej
|
= |
||||||||||||||||||||||||||
|
Zwróć uwagę, iż po tej operacji elementy pierwszej kolumny leżące
A' =
|
|
Pierwszy wiersz jest taki sam jak w macierzy rozszerzonej, natomiast
pozostałe wiersze są już inne. Teraz redukujemy do zera elementy w drugiej
kolumnie leżące
|
= |
a1,1 |
a1,2 |
a1,3 |
…
|
a1,n |
b1 |
||
0 |
a'2,2 |
a'2,3 |
… |
a'2,n |
b'2 |
||
0 |
0 |
a'3,3-a'3,2:a'2,2·a'2,3 |
… |
a'3,n-a'3,2:a'2,2·a'2,n |
b'3-a'3,2:a'2,2·b'2 |
||
0 |
0 |
… |
… |
… |
… |
||
0 |
0 |
a'n,3-a'n,2:a'2,2·a'2,3 |
… |
a'n,n-a'n,2:a'2,2·a'2,n |
b'n-a'n,2:a'2,2·b'2 |
W efekcie elementy drugiej kolumny leżące
A' =
|
|
Operację kontynuujemy dla kolejnych podmacierzy, aż otrzymamy macierz trójkątną:
A"' =
|
|
Macierz ta odpowiada przekształconemu układowi równań liniowych:
|
|
|
= |
|
Kolejne
xn =
|
b"'n |
a"'n,n |
xi =
|
b"i-a"i,n×xn-…-a"1,j+1×xi+1 |
, i = n-1, n-2, …, 1 |
a"i,i |
Powyższa metoda nosi nazwę metody eliminacji Gaussa (ang. Gauss elimination method).
Przykład:
Rozwiążmy podaną wyżej metodą eliminacji Gaussa następujący układ równań:
4x1–2x2+4x3–2x4 = 8 3x1+1x2+4x3+2x4 = 7 2x1+4x2+2x3+1x4 = 10 2x1–2x2+4x3+2x4 = 2
Rozpoczynamy etap eliminacji zmiennych:
– od równania 2 odejmujemy stronami równanie 1 przemnożone przez 3/4 = 0,75 – od równania 3 odejmujemy stronami równanie 1 przemnożone przez 2/4 = 0,50 – od równania 4 odejmujemy stronami równanie 1 przemnożone przez 2/4 = 0,50.
4x1–2x2+4x3–2x4 = 8 3x1+ x2+4x3+2x4–0,75×(4x1–2x2+4x3–2x4) = 7-0,75×8 2x1+4x2+2x3+ x4–0,5 ×(4x1–2x2+4x3–2x4) = 10–0,5 ×8 2x1–2x2+4x3+2x4–0,5 ×(4x1–2x2+4x3–2x4) = 2–0,5 ×8 4x1–2x2+4x3–2x4 = 8 3x1+ x2+4x3+2x4 – 3x1+1,5x2–3x3+1,5x4 = 1 2x1+4x2+2x3+ x4 – 2x1+ x2–2x3+ x4 = 6 2x1–2x2+4x3+2x4 – 2x1+ x2–2x3+ x4 = –2 4x1–2x2+4x3– 2x2 = 8 3x1–3x1+ x2+1,5x2+4x3–3x3+2x4+1,5x4 = 1 2x1–2x1+4x2+ x2+2x3–2x3+ x4+ x4 = 6 2x1–2x1–2x2+ x2+4x3–2x3+2x4+ x4 = –2 4,0x1–2,0x2+4,0x3–2,0x4= 8 2,5x2+ x3+3,5x4= 1 5,0x2+ 2,0x4= 6 –x2+2,0x3+3,0x4= –2
Zwróć uwagę, iż z równań
– od równania 3 odejmujemy stronami równanie 2 przemnożone przez 5/2,5 = 2,0 – od równania 4 odejmujemy stronami równanie 2 przemnożone przez –1/2,5 = –0,4.
4x1–2x2+4x3– 2x4 = 8 2,5x2+ x3+3,5x4 = 1 5x2+ 2x4 – 2×(2,5x2+x3+3,5x4) = 6–2,0 –x2+2x3+ 3x4+0,4×(2,5x2+x3+3,5x4) = –2+0,4 4x1–2x2+4x3– 2x4 = 8 2,5x2+ x3+3,5x4 = 1 5x2+ 2x4–x2 –2x3– 7x4 = 4,0 –x2+2x3+ 3x4+x2+0,4x3+1,4x4 = –1,6 4x1–2x2+4x3– 2x4 = 8 2,5x2+ x3+3,5x4 = 1 5x2–5x2–2x3+ 2x4–7,0x4 = 4.0 –x2 +x2+2x3+0,4x3+3x4+1,4x4 = –1,6 4,0x1–2,0x2+4,0x3–2,0x4 = 8,0 2,5x2+1,0x3+3,5x4 = 1,0 2,0x3–5,0x4 = 4,0 2,4x3+4,4x4 = –1,6
Ostatnia eliminacja:
– od równania 4 odejmujemy stronami równanie 3 przemnożone przez 2,4/–2 = –1,2:
4x1–2x2+4x3– 2x4 = 8 2,5x2+ x3+3,5x4 = 1 –2x3– 5x4 = 4 2,4x3+4,4x4+1,2·(–2x3–5x4) = –1,6+1,2×4 4x1–2x2+4x3– 2x4 = 8 2,5x2+ x3+3,5x4 = 1 –2x3– 5x4 = 4 2,4x3+4,4x4 – 2,4x3–6x4 = 3,2 4x1–2x2+4x3– 2x4 = 8 2,5x2+ x3+3,5x4 = 1 –2x3– 5x4 = 4 2,4x3–2,4x3 + 4,4x4–6x4 = 3,2 4,0x1–2,0x2+4,0x3–2,0x4 = 8,0 2,5x2+1,0x3+3,5x4 = 1,0 –2,0x3–5,0x4 = 4,0 –1,6x4 = 3,2
Rozpoczynamy postępowanie odwrotne. Idąc od końca wyznaczamy kolejnie niewiadome:
x4
|
= |
3,2 |
=
|
-2
|
–1,6 |
Mając x4 możemy obliczyć x3 z równania nr 3:
x3
|
= |
4+5x4
|
= |
4+5×(–2) |
= |
4–10 |
= |
–6 |
=
|
3
|
–2 |
–2 |
–2 |
–2 |
Obliczamy x2 z równania nr 2:
x2
|
= |
1–3,5x4–x3 |
=
|
1–3,5×(–2)–3 |
= |
1+7–3 |
=
|
5 |
=
|
2
|
2,5 |
2,5 |
2,5 |
2,5 |
I ostatnią niewiadomą x1 otrzymamy z równania nr 1:
x1
|
= |
8+2x4–4x3+2x2 |
=
|
8+2×(–2)–4×3+2×2 |
= |
8–4–12+4 |
=
|
–4 |
=
|
–1
|
4 |
4 |
4 |
4 |
i ostatecznie możemy zapisać rozwiązanie:
x1 = –1 x2 = 2 x3 = 3 x4 = –2
K01: r ← false ; zakładamy porażkę K02: ε ← 10–12 ; określamy dokładność porównania z zerem K03: Dla i = 1, 2, …, n–1: wykonuj kroki K04..K07 K04: Dla j = i+1, i+2, …, n: wykonuj kroki K05…K07 K05: Jeśli |AB[i, i]| < ε, ; jeśli dzielnik równy zero, kończymy to zakończ K06: m ← -AB[j, i]:AB[i, i] ; obliczamy mnożnik K07: Dla k = i+1, i+2, …, n+1: ; dodajemy wiersz i-ty pomnożony przez m wykonuj: AB[j, k] ← B[j, k]+m×AB[i, k] K08: Dla i = n, n–1, …, 1: ; etap wyliczania niewiadomych wykonuj kroki K09…K12 K09: s ← AB[i, n+1] ; do s trafia współczynnik bi K10: Dla j = n, n–1, …, i+1: ; od bi odejmujemy kolejne iloczyny aij×xj wykonuj: s ← s–AB{i, j]×X[j] K11: Jeśli |AB[i, i]| < ε, ; nie można dzielić!!! to zakończ K12: X[i] ← s/AB[i, i] ; obliczamy niewiadomą K13: r ← true ; zaznaczmy sukces K14: Zakończ
|
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Dane dla
Pierwsza liczba określa liczbę
Następne n×(n +1)
liczb określa zawartość
Równanie:
4x1–2x2+4x3–2x4 = 8 3x1+ x2+4x3+2x4 = 7 2x1+4x2+2x3+ x4 = 10 2x1–2x2+4x3+2x4 = 2
|
Dane przykładowe (przekopiuj do schowka i wklej do okna konsoli):
4 4 -2 4 -2 8 3 1 4 2 7 2 4 2 1 10 2 -2 4 2 2 |
Pascal// Eliminacja Gaussa
// Data: 15.02.2010
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------
program gauss;
type
NReal = array of double; // typ tablic wierszy
MReal = array of NReal; // typ tablicy wskaźników
const
eps = 1e-12; // stała przybliżenia zera
// Funkcja realizuje algorytm eliminacji Gaussa
//---------------------------------------------
function gauss(n : integer;
var AB : MReal;
var X : NReal)
: boolean;
var
i, j, k : integer;
m, s : double;
begin
// eliminacja współczynników
for i := 0 to n-2 do
begin
for j := i+1 to n-1 do
begin
if abs(AB[i][i]) < eps then
exit(false);
m := -AB[j][i]/AB[i][i];
for k := i+1 to n do
AB[j][k] := AB[j][k]+m*AB[i][k];
end;
end;
// wyliczanie niewiadomych
for i := n-1 downto 0 do
begin
s := AB[i][n];
for j := n-1 downto i+1 do
s := s-AB[i][j]*X[j];
if abs(AB[i][i]) < eps then
exit(false);
X[i] := s/AB[i][i];
end;
gauss := true;
end;
// Program główny
//---------------
var
AB : MReal;
X : NReal;
n, i, j : integer;
begin
// odczytujemy liczbę niewiadomych
read(n);
// tworzymy macierze AB i X
SetLength(AB, n);
SetLength(X, n);
for i := 0 to n-1 do SetLength(AB[i], n+1);
// odczytujemy dane dla macierzy AB
for i := 0 to n-1 do
for j := 0 to n do
read(AB[i][j]);
writeln;
if gauss(n, AB, X) then
begin
for i := 0 to n-1 do
writeln('x', i+1, ' = ', X[i]:9:4);
end
else
writeln('DZIELNIK ZERO');
// usuwamy macierze z pamięci
for i := 0 to n-1 do
SetLength(AB[i], 0);
SetLength(AB, 0);
SetLength(X, 0);
end. |
// Eliminacja Gaussa
// Data: 15.02.2010
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
// stała przybliżenia zera
const double eps = 1e-12
// Funkcja realizuje algorytm
// eliminacji Gaussa
//---------------------------
bool gauss(int n,
double ** AB,
double * X)
{
int i, j, k;
double m, s;
// eliminacja współczynników
for(i = 0; i < n-1; i++)
{
for(j = i+1; j < n; j++)
{
if(fabs(AB[i][i]) < eps)
return false;
m = -AB[j][i]/AB[i][i];
for(k = i+1; k <= n; k++)
AB[j][k] += m*AB[i][k];
}
}
// wyliczanie niewiadomych
for(i = n-1; i >= 0; i--)
{
s = AB[i][n];
for(j = n-1; j >= i+1; j--)
s -= AB[i][j]*X[j];
if(fabs(AB[i][i]) < eps)
return false;
X[i] = s/AB[i][i];
}
return true;
}
// Program główny
//---------------
int main()
{
double **AB, *X;
int n, i, j;
cout << setprecision(4) << fixed;
// odczytujemy liczbę niewiadomych
cin >> n;
// tworzymy macierze AB i X
AB = new double * [n];
X = new double[n];
for(i = 0; i < n; i++)
AB[i] = new double[n+1];
// odczytujemy dane dla macierzy AB
for(i = 0; i < n; i++)
for(j = 0; j <= n; j++)
cin >> AB[i][j];
cout << endl;
if(gauss(n, AB, X))
{
for(i = 0; i < n; i++)
cout << "x" << i+1
<< " = " << setw(9) << X[i]
<< endl;
}
else
cout << "DZIELNIK ZERO\n";
// usuwamy macierze z pamięci
for(i = 0; i < n; i++)
delete [] AB[i];
delete [] AB;
delete [] X;
return 0;
} |
Basic' Eliminacja Gaussa
' Data: 15.02.2010
' (C)2020 mgr Jerzy Wałaszek
'-----------------------------
' stała przybliżenia zera
Const eps As Double = 1e-12
' Funkcja realizuje algorytm
' eliminacji Gaussa
'---------------------------
Function gauss(n As Integer, _
AB As Double Ptr Ptr, _
X As Double Ptr) _
As Integer
Dim As Integer i, j, k
Dim As Double m, s
' eliminacja współczynników
For i = 0 To n-2
For j = i+1 To n-1
If Abs(AB[i][i]) < eps Then _
Return 0
m = -AB[j][i]/AB[i][i]
For k = i+1 To n
AB[j][k] += m*AB[i][k]
Next
Next
Next
' wyliczanie niewiadomych
For i = n-1 To 0 Step -1
s = AB[i][n]
For j = n-1 To i+1 Step -1
s -= AB[i][j]*X[j]
Next
If Abs(AB[i][i]) < eps Then _
Return 0
X[i] = s/AB[i][i]
Next
gauss = 1
End Function
Dim AB As Double Ptr Ptr
Dim X As Double Ptr
Dim As Integer n, i, j
Open Cons For Input As #1
' odczytujemy liczbę niewiadomych
Input #1, n
' tworzymy macierze AB i X
AB = New Double Ptr[n]
X = New Double[n]
For i = 0 To n-1
AB[i] = New Double[n+1]
Next
' odczytujemy dane dla macierzy AB
For i = 0 To n-1
For j = 0 To n
Input #1, AB[i][j]
Next
Next
Close #1
Print
If gauss(n, AB, X) = 1 Then
For i = 0 To n-1
Print Using "x# = ####.####";i+1;X[i]
Next
Else
Print "DZIELNIK ZERO"
End If
' usuwamy macierze z pamięci
For i = 0 To n-1
Delete [] AB[i]
Next
Delete [] AB
Delete [] X
End |
Python
(dodatek)# Eliminacja Gaussa
# Data: 18.04.2024
# (C)2024 mgr Jerzy Wałaszek
#-----------------------------
EPS = 1e-12 # stała przybliżenia zera
# Funkcja realizuje algorytm
# eliminacji Gaussa
#---------------------------
def gauss(ab, x):
# eliminacja współczynników
n = len(x)
for i in range(n-1):
for j in range(i+1, n):
if abs(ab[i][i]) < EPS:
return False
m = -ab[j][i]/ab[i][i]
for k in range(i+1, n+1):
ab[j][k] += m*ab[i][k]
# wyliczanie niewiadomych
for i in reversed(range(n)):
s = ab[i][n]
for j in reversed(range(n)):
s -= ab[i][j]*x[j]
if abs(ab[i][i]) < EPS:
return False
x[i] = s/ab[i][i]
return True
# Program główny
#---------------
# odczytujemy liczbę niewiadomych
n = int(input())
# tworzymy macierze ab i x
ab = []
x = [0 for i in range(n)]
# odczytujemy dane dla macierzy ab
for i in range(n):
arr = input().split()
arr = [float(arr[j]) for j in range(n+1)]
ab.append(arr)
print()
if gauss(ab, x):
for i in range(n):
print("x%d = %9.4f" % (i+1, x[i]))
else:
print("DZIELNIK ZERO")
# usuwamy macierze z pamięci
ab = None
x = None
|
| Wynik: |
4 4 -2 4 -2 8 3 1 4 2 7 2 4 2 1 10 2 -2 4 2 2 x1 = -1.0000 x2 = 2.0000 x3 = 3.0000 x4 = -2.0000 |
![]() |
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.