|
Serwis Edukacyjny Nauczycieli 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
|
W naszym serwisie jest nowszy artykuł o obliczaniu pierwiastków funkcji: "Metody numeryczne".
| SPIS TREŚCI |
| Podrozdziały |
Podstawową wadą metody Cramera jest konieczność liczenia wyznaczników, co jest dosyć czasochłonne. Dużo lepszym rozwiązaniem jest metoda eliminacji Gaussa. Na początku postępujemy podobnie. Mamy dany układ \(n\) równań liniowych z \(n\) niewiadomymi:
Pierwszy etap algorytmu zwany jest etapem eliminacji zmiennych. Od \({i{-}\text{tego}}\) \({(i = 2,3,\dots,n)}\) równania odejmujemy równanie pierwsze pomnożone przez \({a_{i,1} : a_{1,1}:}\)
W efekcie otrzymujemy układ równań, w którym niewiadoma \(x_1\) dla równań nr \({\class{t}{2,3\dots,n}}\) jest wyeliminowana. Współczynniki \(a'\) i \(b'\) oznaczają współczynniki powstałe po wykonaniu odejmowania.
Teraz od \({i{-}\text{tego}}\) \({(i = 3,4,\dots,n)}\) równania odejmujemy równanie drugie pomnożone przez \({a'_{i,2} : a'_{2,2}}\). Wyeliminujemy niewiadomą \(x_2\) w równaniach poniżej równania nr \(\class{t}{2}\). Przez \(a''\) i \(b''\) oznaczyliśmy współczynniki powstałe po wykonaniu odejmowania:
Postępując dalej w ten sam sposób otrzymamy następujący układ równań:
Następuje etap zwany postępowaniem odwrotnym. Kolejne niewiadome wyliczamy ze wzoru rekurencyjnego:
Przykład:
Rozwiążmy podaną wyżej metodą eliminacji Gaussa następujący układ równań:
Rozpoczynamy etap eliminacji zmiennych:
Zwróć uwagę, iż z równań \(\class{t}{2}\), \(\class{t}{3}\) i \(\class{t}{4}\) zniknęła niewiadoma \(x_1\). Eliminujemy następne niewiadome:
Ostatnia eliminacja:
Rozpoczynamy postępowanie odwrotne. Idąc od końca wyznaczamy kolejnie niewiadome:
Mając wartość zmiennej \(x_4\) możemy obliczyć wartość \(x_3\) z równania nr \(\class{t}{3}\):
Obliczamy \(x_2\) z równania nr \(\class{t}{2}\), do którego podstawiamy wyliczone wartości \(x_4\) i \(x_3\):
Ostatnią niewiadomą \(x_1\) otrzymamy z równania nr \(\class{t}{1}\):
Podsumujmy:
|
Uwaga: |
Algorytm rozwiązywania układu równań liniowych metodą eliminacji Gaussa rozbijemy na dwie części:
| \(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. |
| true | – | tablicę współczynników \(AB\) zredukowano do macierzy trójkątnej |
| false | – | operacja eliminacji nie powiodła się |
| \(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}\) |
| Funkcja
EliminujX(\(n,
AB[\;]\)) |
|||
| K01: | Dla \({i =
1,2,\dots,n - 1:}\) wykonuj kroki K02...K05 |
||
| K02: | Jeśli \({|AB[i,i]| < \varepsilon,}\) to zwróć false i zakończ |
||
| K03: | Dla \({j
= i+1, i+2,\dots, n:}\) wykonuj kroki K04... K05 |
||
| K04: | \(m\leftarrow\dfrac{AB[j,i]}{AB[i,i]}\) | ||
| K05: | Dla
\({k = i+1, i+2,
\dots, n+1:}\) wykonuj: \({AB[j,k]\leftarrow AB[j,k] + m\cdot AB[i,k]}\) |
||
| K06: | Zwróć true i zakończ |
||

Algorytm eliminacji niewiadomych zrealizowany został w formie funkcji zwracającej wartość logiczną true, gdy eliminacja została wykonana poprawnie lub false w przypadku błędu.
Pętla nr 1 przebiega przez kolejne wiersze macierzy \(AB\) współczynników od wiersza nr \(1\) do \({n - 1}\) (przedostatniego). Wewnątrz pętli najpierw sprawdzamy, czy będzie można dzielić przez wyraz \({AB[i,i]}\), który leży na przekątnej macierzy. Jeśli będzie to niemożliwe, to zwracamy wartość logiczną false i kończymy algorytm.
W przeciwnym razie rozpoczynamy pętlę nr 2, która odpowiednio odejmie wiersz \({i{-}\text{ty}}\) od pozostałych wierszy macierzy. Wewnątrz tej pętli obliczamy mnożnik \(m\), przez który będą mnożone kolejne wyrazy wiersza \({i{-}\text{tego}}\).
Odejmowanie wyrazów wiersza \({i{-}\text{tego}}\) od wyrazów wiersza \({j{-}\text{tego}}\) wykonuje pętla nr 3. Odejmowane wyrazy są mnożone przez mnożnik \(m\) (faktycznie wykonujemy tutaj dodawanie, lecz zwróć uwagę na wzór mnożnika - iloraz jest wzięty ze znakiem minus).
Działanie odejmowania jest zoptymalizowane – modyfikowane są tylko te wyrazy macierzy \(AB\), które w dalszej części algorytmu będą uczestniczyły w obliczeniach. Zatem w rzeczywistości w macierzy \(AB\) współczynniki przy eliminowanych niewiadomych nie są zerowane, lecz nie ma to większego znaczenia, gdyż wyrazy te nie uczestniczą w obliczeniach wartości niewiadomych – liczy się zmiana pozostałych wyrazów macierzy!
Gdy wszystkie pętle wykonają się do końca, algorytm zakończy się z wynikiem pozytywnym.
Operacja eliminacji niewiadomych zawiera trzy zagnieżdżone w sobie pętle, zatem ma klasę złożoności obliczeniowej równą \(O(n^3)\).
| \(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}\) |
| true: | – | tablica niewiadomych \(X\) zawiera rozwiązania |
| false | – | operacja wyznaczania niewiadomych nie powiodła się |
| \(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}\) |
| Funkcja
ObliczX(\({n,
X[\;],
AB[\;]}\)) |
|||
| K01: | Dla \({i =
n, n-1,\dots,1:}\) wykonuj kroki K02...K05 |
||
| K02: | jeśli \({|AB[i,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,j]\cdot X[j]}\) |
||
| K05: |
\( X[i]\leftarrow -\dfrac{s}{AB[i,i]}\phantom{\dfrac{A[}{A[}} \) |
||
| K06: | Zwróć true i zakończ | ||

Algorytm wyznaczania niewiadomych układu równań bazuje na wcześniejszym algorytmie eliminacji, który przygotowuje w odpowiedni sposób macierz współczynników.
Wyznaczanie niewiadomych rozpoczynamy od ostatniej niewiadomej \(x_n\). Zadanie to realizuje pętla nr 1, która przebiega wartości w kierunku odwrotnym - od \(n\) do \(1\). Przy każdym obiegu wyznaczana jest kolejna niewiadoma.
Wyliczanie \(x_i\) wymaga dzielenia przez współczynnik \(a_{i,i}\) stojący przy tej niewiadomej. Jeśli wpada on w otoczenie \(\varepsilon\) zera, to algorytm kończymy z wynikiem negatywnym.
Niewiadomą \(x_i\) zawsze wyliczamy z równania:
gdzie niewiadome \({x_{i+1},\dots, x_n}\) zostały wyznaczone w poprzednich obiegach pętli nr 1. W zmiennej \(s\) obliczamy wartość:
Zadanie to realizuje pętla nr 2. Po wyznaczeniu wartości \(s\) możemy wyliczyć niewiadomą \(x_i\) dzieląc \(s\) przez współczynnik \(a_{i,i}\).
Gdy pętla nr 1 zakończy działanie w tablicy \(X\) mamy obliczone kolejne niewiadome zadanego układu równań. Algorytm kończymy.
Ponieważ w algorytmie występują dwie zagnieżdżone pętle, to jego klasa złożoności obliczeniowej wynosi \({O(n^2)}\).
Pełny algorytm wykorzystuje podane wyżej dwa algorytmy częściowe w następujący sposób:
| K01: | Czytaj \(n\) oraz współczynniki do tablicy \(AB\) |
| K02: | Jeśli EliminujX(\(n,AB[\;]\)) = false, to idź do kroku K05 |
| K03: | Jeśli ObliczX(\(n,X[\;],AB[\;]\)) = false, to idź do kroku K05 |
| K04: | Pisz \(X[\;]\) i zakończ |
| K05: | Pisz "Rozwiązanie układu równań nie powiodło się" |
| K06: | Zakończ |
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 dane5 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:
C++// Program rozwiązuje układ
// równań liniowych o n
// niewiadomych za pomocą
// metody eliminacji Gaussa
//-------------------------
// (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 EliminujX(int n,
double AB[][MAXEQ+1])
{
int i,j,k;
double m;
for(i = 0; i < n - 1; i++)
{
if(fabs(AB[i][i]) < EPS)
return false;
for(j = i + 1; j < n; j++)
{
m = -AB[j][i] / AB[i][i];
for(k = i + 1; k <= n; k++)
AB[j][k] += m * AB[i][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 ObliczX(int n,
double X[],
double AB[][MAXEQ+1])
{
int i,j;
double s;
for(i = n - 1; i >= 0; i--)
{
if(fabs(AB[i][i]) < EPS)
return false;
s = AB[i][n];
for(j = n - 1; j > i; j--)
s -= AB[i][j] * X[j];
X[i] = s / AB[i][i];
}
return true;
}
//---------------
// Program główny
//---------------
int main()
{
ifstream fin;
ofstream fout;
int i,j,n;
double AB[MAXEQ][MAXEQ+1],
X[MAXEQ];
cout << setprecision(5)
<< fixed;
cout << " Uklad rownan liniowych\n"
" metoda eliminacji Gaussa\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++)
for(j = 0; j <= n; j++)
fin >> AB[i][j];
fin.close();
// Dokonujemy eliminacji oraz
// obliczania niewiadomych x
cout << "Wyniki:\n\n";
if(EliminujX(n,AB) &&
ObliczX(n,X,AB))
{
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
//-------------------------
// (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;
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 EliminujX(n : integer;
var AB : macierz)
: boolean;
var
i,j,k : integer;
m : double;
begin
for i := 1 to n - 1 do
begin
if abs(AB[i,i]) < EPS then
begin
Result := false; exit;
end;
for j := i + 1 to n do
begin
m := -AB[j,i] / AB[i,i];
for k := i + 1 to n + 1 do
AB[j,k] := AB[j,k] +
m * AB[i,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 ObliczX(n : integer;
var X : xwektor;
var AB : macierz)
: boolean;
var
i,j : integer;
s : double;
begin
for i := n downto 1 do
begin
if abs(AB[i,i]) < EPS then
begin
Result := false; exit;
end;
s := AB[i,n + 1];
for j := n downto i + 1 do
s := s - AB[i,j] * X[j];
X[i] := s / AB[i,i];
end;
Result := true;
end;
//---------------
// Program główny
//---------------
var
f : Text;
i,j,n : integer;
AB : macierz;
X : xwektor;
begin
writeln(' Uklad rownan liniowych');
writeln(' Metoda eliminacji Gaussa');
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
for j := 1 to n + 1 do
read(f,AB[i,j]);
closefile(f);
// Dokonujemy eliminacji oraz
// obliczania niewiadomych x
writeln('Wyniki:');
writeln;
if EliminujX(n,AB) and
ObliczX(n,X,AB) 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 writeln('Rozwiazanie ukladu ',
'rownan nie powiodlo ',
'sie');
end
else
begin
writeln('Zbyt wiele rownan!');
closefile(f);
end;
writeln;
writeln('Nacisnij klawisz Enter...');
readln;
end.
|
Basic' Program rozwiązuje układ
' równań liniowych o n
' niewiadomych za pomocą
' metody eliminacji Gaussa
'-------------------------
' (C)2006 mgr J.Wałaszek
Declare Function _
EliminujX(n As Integer, _
AB() As Double) _
As Integer
Declare Function _
ObliczX(n As Integer, _
X() As Double, _
AB() As Double) _
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
Dim As double AB(MAXEQ - 1, MAXEQ), _
X(MAXEQ - 1)
Print " Uklad rownan liniowych"
Print " Metoda eliminacji Gaussa"
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
For j = 0 To n
Input #1, AB(i, j)
Next
Next
Close #1
' Dokonujemy eliminacji oraz
' obliczania niewiadomych x
Print
Print "Wyniki:"
Print
If EliminujX(n, AB()) And _
ObliczX(n, X(), AB()) 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 "X";i + 1;
Print Using " = ######.#####"; X(i)
Print #1,Using "######.#####"; X(i)
Next
Close #1
Else
Print "Rozwiazanie ukladu ";
Print "rownan 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) _
As Integer
Dim As Integer i, j, k
Dim m As Double
For i = 0 To n - 2
If Abs(AB(i, i)) < EPS Then Return 0
For j = i + 1 To n - 1
m = -AB(j, i) / AB(i, i)
For k = i + 1 To n
AB(j, k) += m * AB(i, 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) _
As Integer
Dim As Integer i, j
Dim s As Double
For i = n - 1 To 0 Step -1
If Abs(AB(i, i)) < EPS Then Return 0
s = AB(i, n)
For j = n - 1 To i + 1 Step -1
s -= AB(i, j) * X(j)
Next
X(i) = s / AB(i, i)
Next
Return 1
End Function
|
Python
(dodatek)# Program rozwiązuje układ
# równań liniowych o n
# niewiadomych za pomocą
# metody eliminacji Gaussa
#-------------------------
# (C)2026 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):
for i in range(n - 1):
if abs(ab[i][i]) < EPS:
return False
for j in range(i + 1, n):
m = -ab[j][i] / ab[i][i]
for k in range(i + 1, n + 1):
ab[j][k] += m * ab[i][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):
for i in reversed(range(n)):
if abs(ab[i][i]) < EPS:
return False
s = ab[i][n]
for j in reversed(range(i + 1, n)):
s -= ab[i][j] * x[j]
x[i] = s / ab[i][i]
return True
#---------------
# Program główny
#---------------
print(" Układ równań liniowych")
print(" Metoda eliminacji Gaussa")
print(" ------------------------")
print("(C)2026 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ą.
with open("in.txt", "r",
encoding="utf-8") as f1:
dane = f1.read().split() # tworzymy listę
it = 0 # numeruje kolejne elementy listy
n = int(dane[it])
if n <= MAXEQ:
# Inicjalizacja macierzy AB zerami
ab = [[0.0 for _ in range(n + 1)]
for _ in range(n)]
for i in range(n):
for j in range(n + 1):
it += 1 # następny element
ab[i][j] = float(dane[it])
print("\nWyniki:\n")
x = [0.0] * n
if eliminujx(n, ab) and \
obliczx(n, x, ab):
with open("out.txt", "w",
encoding="utf-8") as f2:
for i in range(n):
f = f"{x[i]:12.5f}"
print(f"X{i+1} = {f}")
f2.write(f"{f}\n")
else:
print("\nRozwiązanie układu",
"równań nie powiodło się")
else:
print("\nZbyt wiele równań!")
print()
input("Naciśnij Enter...")
|
| Wynik: |
Układ równań liniowych Metoda eliminacji Gaussa ------------------------ (C)2026 mgr Jerzy Walaszek Wyniki: X1 = 1.00000 X2 = 2.00000 X3 = 3.00000 X4 = 2.00000 X5 = 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</b>
</big><br>
<br>
(C)2026
mgr Jerzy Wałaszek
I LO w Tarnowie
<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.
//------------------------------------
// (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 EliminujX(n, AB)
{
var i,j,k,m
for(i = 0; i < n - 1; i++)
{
if(Math.abs(AB[i][i]) < EPS)
return false
for(j = i + 1; j < n; j++)
{
m = -AB[j][i] / AB[i][i]
for(k = i + 1; k <= n; k++)
AB[j][k] += m * AB[i][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 ObliczX(n, X, AB)
{
var i,j,s
for(i = n - 1; i >= 0; i--)
{
if(Math.abs(AB[i][i]) < EPS)
return false
s = AB[i][n]
for(j = n - 1; j > i; j--)
s -= AB[i][j] * X[j]
X[i] = s / AB[i][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)
// 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)
for(j = 0; j <= n; j++)
z = z && !isNaN(AB[i][j] =
parseFloat(s[k++]))
}
if(z)
{
// Dokonujemy eliminacji oraz
// obliczania niewiadomych x
t = "<table border='0' " +
"cellpadding='4'" +
"style='border-collapse: " +
"collapse'><tr><td nowrap>"
if(EliminujX(n,AB) &&
ObliczX(n,X,AB))
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> |
![]() |
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.
W soboty i niedziele reklamy są wyłączane w całym serwisie.
Informacje dodatkowe.