|
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 |
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 dane4 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:
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:
| \(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.\) |
| 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ę |
| \(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 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 |
||

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.
| \(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.\) |
| true | – | tablica \(n\) elementowa niewiadomych zawiera rozwiązania układu równań |
| 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 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 |
||

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ę:
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.\)
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 |
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>
(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-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>
|
![]() |
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.