|
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 |
Mamy dany układ \(n\) równań liniowych z \(n\) niewiadomymi. Zapiszmy go następująco:
Następnie utwórzmy macierz \(A\) współczynników \(a_{i,j}\) tego układu równań oraz wektor kolumnowy \(B\) wyrazów \(b_i\):
Macierz \(A\) jest macierzą kwadratową o wymiarze \({n\times n}\). Niech \({W = det A}\). Jeśli wyznacznik \(W\) jest różny od \(0\) (pamiętajmy o błędach zaokrągleń - sprawdzamy, czy wyznacznik \(W\) leży w otoczeniu \(\varepsilon\) wartości \(0\)), to układ równań posiada rozwiązania. W przeciwnym razie układ równań jest sprzeczny lub liniowo zależny i nie posiada jednoznacznego rozwiązania.
Aby znaleźć wartości kolejnych niewiadomych, postępujemy następująco:
W macierzy \(A\) współczynników dla każdej niewiadomej \({x_i, i = 1, 2,\dots, n}\), zastępujemy \({i{-}\text{tą}}\) kolumnę wektorem kolumnowym \(B\). Następnie wyliczamy wyznacznik \(W_i\) tak zmodyfikowanej macierzy. Wartość kolejnych niewiadomych \({x_i, i = 1, 2,\dots, n}\), otrzymamy za pomocą poniższego wzoru:
Metoda ta nosi nazwę wzorów Cramera (ang. Cramer's Rule).
Przykład:
Rozwiążemy przy pomocy podanych powyżej wzorów Cramera układ 3 równań liniowych z trzema niewiadomymi \({x_1, x_2}\) i \(x_3\):
Najpierw tworzymy macierz \(A\) współczynników oraz wektor kolumnowy \(B\):
Wykorzystując regułę Sarrusa obliczamy wyznacznik główny \(W\):
Teraz dla niewiadomej \(x_1\) w macierzy \(A\) zastępujemy kolumnę nr \(1\) wektorem \(B\) i obliczamy jej wyznacznik \(W_1\):
Podobnie postępujemy dla pozostałych niewiadomych:
Podsumujmy otrzymane wyniki:
Zgodnie ze wzorami Cramera mamy:
Technicznie macierz \(A\) współczynników oraz wektor kolumnowy \(B\) będziemy przechowywać w jednej tablicy o \(n\) wierszach i \({n+1}\) kolumnach. Współczynniki przy niewiadomych umieścimy w kolumnach od \(1\) do \(n\), natomiast kolumnę \({n+1}\) zajmą wyrazy wolne \(b_i\). Do funkcji obliczającej wyznacznik będziemy przekazywali wektor kolumnowy, w którym po prostu na \({i{-}\text{tej}}\) kolumnie wpiszemy \({n+1}\), czyli numer kolumny z wektorem \(B\). Będzie to odpowiadało zastąpieniu danej kolumny współczynników wyrazami z kolumny \({n+1}\).
| \[{AB=\;}\] | 1 | 2 | 3 | ... | n-1 | n | n+1 | ||
| a1,1 | a1,2 | a1,3 | ... | a1,n-1 | a1,n | b1 | |||
| a2,1 | a2,2 | a2,3 | ... | a2,n-1 | a2,n | b2 | |||
| a3,1 | a3,2 | a3,3 | ... | a3,n-1 | a3,n | b3 | |||
| ... | ... | ... | ... | ... | ... | ... | |||
| an-1,1 | an-1,2 | an-1,3 | ... | an-1,n-1 | an-1,n | bn-1 | |||
| an,1 | an,2 | an,3 | ... | an,n-1 | an,n | bn |
| \(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}\) |
| \(X\) | – | tablica \(n\) elementowa zawierająca wartości kolejnych niewiadomych \(x_i\). \({x_i\in\mathbb{R},\\ i\in\mathbb{N}, \\ i = 1,2,\dots,n,}\) lub informacja, iż dany układ równań nie posiada jednoznacznego rozwiązania. |
| \({det(stopień,wiersz,wektorkolumn[\;],
macierz[\;])}\) funkcja wyliczająca odpowiedni wyznacznik |
| \(W\) | – | wyznacznikiem główny układu równań. |
| \(WK\) | – | wektor kolumn zawierający numery kolumn tablicy \(AB\). Wykorzystywany jest do podmiany kolumny z wyrazami wolnymi \(b_i\) w miejsce kolumny współczynników dla odpowiedniej zmiennej. |
| \(i\) | – | zmienna sterująca pętli; \({i\in\mathbb{N}}\) |
| \(\varepsilon\) |
– | określa dokładność porównania z zerem. \({\varepsilon = 0{,}0000000001}\) |
| K01: | Dla i =
1, 2, ..., n: wykonuj WK[i] ← i |
|
| K02: | W ← det(n, 1, WK[ ]) | |
| K03: | Jeśli \({|W| < \varepsilon}\) ,to pisz "Brak rozwiązania" i zakończ |
|
| K04: | Dla \({i =
1, 2,\dots, n:}\) wykonuj kroki K05...K07 |
|
| K05: | \({WK[i]\leftarrow n + 1}\) | |
| K06: | \({X[i]\leftarrow det(n,1,WK[\;], AB[\;])}\) | |
| K07: | \({WK[i]\leftarrow i}\) | |
| K08: | Zakończ |

Algorytm rozpoczynamy od ustawienia wektora kolumn \({WK[\;]}\) w pętli nr 1.
Następnie obliczamy wyznacznik macierzy współczynników \(a_{i,j}\). Wartość wyznacznika zapamiętujemy w zmiennej \(W\).
Jeśli wyznacznik główny \(W\) wpada w otoczenie zera o promieniu \(\varepsilon\), to układ równań nie posiada jednoznacznego rozwiązania. Wypisujemy odpowiednią informację i kończymy algorytm.
W przeciwnym razie rozwiązanie istnieje. W pętli nr 2 podmieniamy kolejno \({i{-}\text{tą}}\) kolumnę macierzy współczynników \(a_{i,j}\) przez wektor wyrazów wolnych \(b_i\). Podmiana polega na wpisaniu na pozycji \({i{-}\text{tej}}\) numeru kolumny wyrazów \(b_i\), który wynosi \({n+1}\). Po tej operacji wywołujemy funkcję obliczającą wyznacznik, jej rezultat dzielimy przez wyznacznik główny \(W\) i wynik wprowadzamy na pozycję \({i{-}\text{tą}}\) do tablicy niewiadomych \({X[\;]}\). W wektorze kolumn \({WK[\;]}\) przywracamy z powrotem podmienioną wcześniej \({i{-}\text{tą}}\) kolumnę.
Po zakończeniu pętli nr 2 w tablicy \({X[\;]}\) umieszczone są kolejne wartości niewiadomych \(x_i\) rozwiązanego układu równań. Możemy je dowolnie wykorzystać. Algorytm kończymy.
Prezentowane poniżej przykładowe programy odczytują dane z pliku in.txt i zapisują wyniki do pliku out.txt. Przyjęliśmy to rozwiązanie z uwagi na dużą liczbę danych, które muszą być dostarczone do programu - klawiatura nie byłaby zbyt wygodna. Pliki znajdują się w bieżącym katalogu. Plik in.txt powinien posiadać następującą strukturę:
W pierwszym wierszu liczba od \(1\) do \(8\) (ważne, gdyż z uwagi na czasochłonność obliczeń ograniczyłem maksymalny rozmiar macierzy do przechowania maksymalnie \(8\) równań) określająca ilość równań, czyli \(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:
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:
| 2x1 | - | 2x2 | + | 2x3 | - | 7x4 | + | 6x5 | = | -4 |
| 7x1 | - | 3x2 | - | 2x3 | + | 7x4 | + | 2x5 | = | 11 |
| 2x1 | + | 2x2 | - | x3 | + | x4 | + | 4x5 | = | 9 |
| 9x1 | + | 8x2 | - | 2x3 | + | 2x4 | - | 2x5 | = | 21 |
| 4x1 | + | 8x2 | - | 3x3 | + | 3x4 | - | x5 | = | 16 |
C++// Program rozwiązuje układ
// równań liniowych o n
// niewiadomych za pomocą
// metody wyznacznikowej
// Cramera. n <= 8
//-------------------------
// (C)2006 mgr J.Wałaszek
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cmath>
#include <cstdlib>
using namespace std;
// Rekurencyjna funkcja
// obliczania wyznacznika
//-----------------------
long double det(int stopien,
int wiersz,
int wk[],
double A[][9])
{
int i,j,k,m;
// wektor kolumn
// dla podmacierzy
int kolumny[8];
long double suma;
if(stopien == 1)
return A[wiersz][wk[0]];
else
{
suma = 0;
m = 1;
for(i = 0; i < stopien; i++)
{
k = 0;
for(j = 0; j < stopien - 1; j++)
{
if(k == i) k++;
kolumny[j] = wk[k++];
}
suma += m * A[wiersz][wk[i]] *
det(stopien - 1,
wiersz + 1,
kolumny,
A);
m = -m;
}
return suma;
}
}
//---------------
// Program główny
//---------------
int main()
{
// dokładność porównania z zerem
const double EPS = 0.0000000001;
ifstream fin; // Plik wejściowy
ofstream fout; // Plik wyjściowy
int i,j,n,WK[8];
double AB[8][9],X[8];
long double W;
cout << setprecision(2)
<< fixed;
cout << " Uklad rownan liniowych\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 <= 8)
{
for(i = 0; i < n; i++)
for(j = 0; j <= n; j++)
fin >> AB[i][j];
fin.close();
// Wyświetlamy wczytany układ
// równań w oknie konsoli
for(i = 0; i < n; i++)
for(j = 0; j <= n; j++)
{
if(!j)
cout << setw(5) << AB[i][j];
else if(j == n)
cout << "= "
<< setw(5) << AB[i][j]
<< endl;
else
{
if(AB[i][j] > 0)
cout << "+"
<< setw(5) << AB[i][j];
else
cout << "-"
<< setw(5)
<< fabs(AB[i][j]);
}
if(j < n)
cout << "*x" << j + 1 << " ";
}
cout << "\n\nWyniki:\n\n";
// Otwieramy plik wyników out.txt
fout.open("out.txt");
// Obliczamy wyznacznik główny
for(i = 0; i < n; i++)
WK[i] = i;
W = det(n,0,WK,AB);
if(fabs(W) < EPS)
cout << "Brak rozwiazania\n";
else
{
// Obliczamy kolejne
// wyznaczniki Wi
for(i = 0; i < n; i++)
{
// podmieniamy kolumnę
// współczynnikami bi
WK[i] = n;
X[i] = det(n,0,WK,AB) / W;
// przywracamy kolumnę
// współczynników ai
WK[i] = i;
}
// Wypisujemy wyniki
// do okna konsoli oraz
// do pliku out.txt
for(i = 0; i < n; i++)
{
cout << "x"
<< i + 1
<< " = "
<< setw(10)
<< X[i]
<< endl;
fout << X[i] << endl;
}
fout.close();
}
}
else
{
fin.close();
cout << "Zbyt wiele rownan!\n";
}
cout << endl << endl;
system("pause");
return 0;
}
|
Pascal// Program rozwiązuje układ
// równań liniowych o n
// niewiadomych za pomocą
// metody wyznacznikowej
// Cramera. n <= 8
//-------------------------
// (C)2006 mgr J.Wałaszek
program mzfl4;
{$APPTYPE CONSOLE}
const
// dokładność porównania z zerem
EPS = 0.0000000001;
type
kwektor = array[1..8] of integer;
macierz = array[1..8,1..9] of double;
// Rekurencyjna funkcja
// obliczania wyznacznika
//-----------------------
function det(stopien, wiersz : integer;
var wk : kwektor;
var A : macierz) : extended;
var
i,j,k,m : integer;
// wektor kolumn dla podmacierzy
kolumny : kwektor;
begin
if stopien = 1 then
Result := A[wiersz,wk[1]]
else
begin
Result := 0; m := 1;
for i := 1 to stopien do
begin
k := 1;
for j := 1 to stopien - 1 do
begin
if k = i then inc(k);
kolumny[j] := wk[k];
inc(k);
end;
Result := Result + m *
A[wiersz,wk[i]] *
det(stopien - 1,
wiersz +1 ,
kolumny,
A);
m := -m;
end;
end;
end;
//---------------
// Program główny
//---------------
var
f : Text;
i,j,n : integer;
AB : macierz;
W : extended;
X : array[1..8] of double;
WK : kwektor;
begin
writeln(' Uklad rownan liniowych');
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 <= 8 then
begin
for i := 1 to n do
for j := 1 to n + 1 do
read(f,AB[i,j]);
closefile(f);
// Wyświetlamy wczytany układ
// równań w oknie konsoli
for i := 1 to n do
for j := 1 to n + 1 do
begin
if j = 1 then
write(AB[i,j]:5:2)
else if j = n + 1 then
writeln('= ',AB[i,j]:5:2)
else
begin
if AB[i,j] > 0 then
write('+',AB[i,j]:5:2)
else
write('-',abs(AB[i,j]):5:2);
end;
if j <= n then write('*x',j,' ');
end;
writeln;
writeln('Wyniki:');
writeln;
// Otwieramy plik wyników out.txt
assignfile(f,'out.txt');
rewrite(f);
// Obliczamy wyznacznik główny
for i := 1 to n do
WK[i] := i;
W := det(n,1,WK,AB);
if abs(W) < EPS then
writeln('Brak rozwiazania')
else
begin
// Obliczamy kolejne
// wyznaczniki Wi
for i := 1 to n do
begin
// Podmieniamy kolumnę
// współczynnikami bi
WK[i] := n + 1;
X[i] := det(n,1,WK,AB) / W;
// przywracamy kolumnę
// współczynników ai
WK[i] := i
end;
// Wypisujemy wyniki do okna
// konsoli oraz do pliku out.txt
for i := 1 to n do
begin
writeln('x',i,' = ',X[i]:10:5);
writeln(f,X[i]);
end;
end;
end
else writeln('Za wiele rownan!');
closefile(f);
writeln;
writeln('Nacisnij Enter...');
readln;
end.
|
Basic' Program rozwiązuje układ równań
' liniowych o n niewiadomych za
' pomocą metody wyznacznikowej
' Cramera. n <= 8
'--------------------------------
' (C)2006 mgr J.Wałaszek I LO
Declare Function det(stopien As Integer, _
wiersz As Integer, _
wk() As Integer, _
A() As Double) _
As Double
' dokładność porównania z zerem
Const EPS As Double = 0.0000000001
'---------------
' Program główny
'---------------
Dim As Integer i,j,n,WK(7)
Dim As Double AB(7,8),X(7),W
Print " Uklad rownan liniowych"
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 <= 8 Then
For i = 0 To n - 1
For j = 0 To n
Input #1, AB(i,j)
Next
Next
' Wyświetlamy wczytany układ
' równań w oknie konsoli
For i = 0 To n - 1
For j = 0 To n
If j = 0 Then
Print Using "##.##";AB(i,j);
Elseif j = n Then
Print Using " = ##.##";AB(i,j)
Else
Print Using " +##.##";AB(i,j);
End If
If j < n Then Print Using "*X#";j+1;
Next
Next
Print
Print "Wyniki:"
Print
' Otwieramy plik wyników out.txt
Open "out.txt" For Output As #2
' Obliczamy wyznacznik główny
For i = 0 To n-1
WK(i) = i
Next
W = det(n,0,WK(),AB())
If Abs(W) < EPS Then
Print #2,"Brak rozwiazania"
Print "Brak rozwiazania"
Else
' Obliczamy kolejne wyznaczniki Wi
For i = 0 To n - 1
' Podmieniamy kolumnę
' współczynnikami bi
WK(i) = n
X(i) = det(n,0,WK(),AB()) / W
' Przywracamy kolumnę
' współczynników ai
WK(i) = i
Next
' Wypisujemy wyniki do okna
' konsoli oraz do pliku out.txt
For i = 0 To n - 1
Print #2,Using _
"x# = ####.#####";i;X(i)
Print Using _
"x# = ####.#####";i;X(i)
Next
Close #2
End If
Else
Print "Za wiele rownan!"
End If
Close #1
Print
Print "Koniec. Nacisnij klawisz Enter..."
Sleep
End
' Rekurencyjna funkcja
' obliczania wyznacznika
'-----------------------
Function det(stopien As Integer, _
wiersz As Integer, _
wk() As Integer, _
A() As Double) _
As Double
Dim As Integer i, j, k, m
' wektor kolumn dla podmacierzy
Dim kolumny(7) As Integer
Dim suma As Double
If stopien = 1 Then
Return A(wiersz, wk(0))
Else
suma = 0 : m = 1
For i = 0 To stopien - 1
k = 0
For j = 0 To stopien - 2
If k = i Then k += 1
kolumny(j) = wk(k)
k += 1
Next
suma += m * _
A(wiersz, wk(i)) * _
det(stopien - 1, _
wiersz + 1, _
kolumny(), A())
m = -m
Next
Return suma
End If
End Function
|
Python
(dodatek)# Program rozwiązuje układ równań
# liniowych o n niewiadomych za
# pomocą metody wyznacznikowej
# Cramera. n <= 8
#--------------------------------
# (C)2026 mgr J.Wałaszek I LO
# Stała dokładności
EPS = 0.0000000001
# Rekurencyjna funkcja obliczania
# wyznacznika
def det(stopien, wiersz, wk, a):
if stopien == 1:
return a[wiersz][wk[0]]
else:
suma,m = 0.0, 1
for i in range(stopien):
# Tworzymy wektor kolumn
# dla podmacierzy
kolumny = []
for j in range(stopien):
if j != i:
kolumny.append(wk[j])
suma += m * a[wiersz][wk[i]] * \
det(stopien - 1,
wiersz + 1,
kolumny, a)
m = -m
return suma
#---------------
# Program główny
#---------------
print(" Układ równań liniowych")
print(" Metoda Cramera")
print(" ----------------------")
print("(C)2026 mgr Jerzy Wałaszek")
print()
# Inicjalizacja struktur
ab = [[0.0 for _ in range(9)]
for _ in range(8)]
x = [0.0 for _ in range(8)]
wk = [0 for _ in range(8)]
# 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
n = int(dane[it])
if n <= 8:
# Wczytywanie danych
for i in range(n):
for j in range(n + 1):
it += 1
ab[i][j] = float(dane[it])
# Wyświetlanie układu
for i in range(n):
linia = ""
for j in range(n + 1):
if j == 0:
linia += f"{ab[i][j]:5.2f}"
elif j == n:
linia += f" = {ab[i][j]:5.2f}"
else:
if ab[i][j] < 0:
linia += f" -{-ab[i][j]:5.2f}"
else:
linia += f" +{ab[i][j]:5.2f}"
if j < n:
linia += f"*X{j+1}"
print(linia)
print("\nWyniki:\n")
# Obliczanie wyznacznika głównego
for i in range(n): wk[i] = i
w = det(n, 0, wk[:n], ab)
with open("out.txt", "w",
encoding="utf-8") as f2:
if abs(w) < EPS:
komunikat = "Brak rozwiązania"
print(komunikat)
f2.write(komunikat + "\n")
else:
# Obliczanie kolejnych
# wyznaczników metodą Cramera
for i in range(n):
wk[i] = n
x[i] = det(n, 0, wk[:n], ab) / w
wk[i] = i
# Wypisywanie wyników
for i in range(n):
wynik = f"X{i+1} = {x[i]:10.5f}"
print(wynik)
f2.write(wynik + "\n")
else:
print("Za wiele równań!")
input("\nNaciśnij Enter...")
|
| Wynik: |
Układ równań liniowych
Metoda Cramera
----------------------
(C)2026 mgr Jerzy Wałaszek
2.00*X1 - 2.00*X2 + 2.00*X3 - 7.00*X4 + 6.00*X5 = -4.00
7.00*X1 - 3.00*X2 - 2.00*X3 + 7.00*X4 + 2.00*X5 = 11.00
2.00*X1 + 2.00*X2 - 1.00*X3 + 1.00*X4 + 4.00*X5 = 9.00
9.00*X1 + 8.00*X2 - 2.00*X3 + 2.00*X4 - 2.00*X5 = 21.00
4.00*X1 + 8.00*X2 - 3.00*X3 + 3.00*X4 - 1.00*X5 = 16.00
Wyniki:
X1 = 1.00000
X2 = 2.00000
X3 = 3.00000
X4 = 2.00000
X5 = 1.00000
Naciśnij Enter...
|
Program w JavaScript pobiera dane z okna tekstowego. Spowodowane jest to tym, iż w JavaScript dostęp do plików komputera użytkownika jest ograniczony - przecież nie chciałbyś, aby jakaś strona WWW buszowała po dysku twardym twojego komputera - byłby to raj dla hackerów.
Dane dla układu równań możesz wkleić poprzez schowek do okna tekstowego formularza.
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ń<br>
metodą Cramera</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 wyznacznikowej
// Cramera. n <= 8
//----------------------------------
// (C)2006 mgr J.Wałaszek
// I LO w Tarnowie
// Rekurencyjna funkcja
// obliczania wyznacznika
//-----------------------
function det(stopien, wiersz, wk, A)
{
var i,j,k,m
// wektor kolumn dla podmacierzy
var kolumny = new Array(8)
var suma
if(stopien == 1)
return A[wiersz][wk[0]]
else
{
suma = 0
m = 1
for(i = 0; i < stopien; i++)
{
k = 0
for(j = 0; j < stopien - 1; j++)
{
if(k == i) k++
kolumny[j] = wk[k++]
}
suma += m * A[wiersz][wk[i]] *
det(stopien - 1,
wiersz + 1,
kolumny,
A)
m = -m
}
return suma
}
}
//---------------
// Program główny
//---------------
function main()
{
// dokładność porównania z zerem
var EPS = 0.0000000001;
var MAXEQ = 8
var i,j,k,n,W,t,s,z;
var WK = new Array(8)
var AB = new Array(8)
var X = new Array(8)
// 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)
{
// Wyświetlamy układ równań
t = "<table border='0' " +
"cellpadding='4' " +
"style='border-collapse: " +
"collapse'>" +
"<tr><td nowrap>"
for(i = 0; i < n; i++)
{
for(j = 0; j <= n; j++)
{
if(!j)
t += AB[i][j]
else if (j == n)
t += " = " + AB[i][j]
else
t += (AB[i][j] < 0) ?
" - " + Math.abs(AB[i][j]):
" + " + AB[i][j]
if(j < n)
t += "x<sub>" +
(j + 1) + "</sub>"
}
t += "<br>"
}
t += "</td></tr><tr><td nowrap>"
// Obliczamy wyznacznik główny
for(i = 0; i < n; i++) WK[i] = i
W = det(n, 0, WK, AB)
if(Math.abs(W) < EPS)
t += "<font color=red><b>" +
"Brak rozwiazania" +
"</b></font>"
else
{
// Obliczamy kolejne
// wyznaczniki Wi
for(i = 0; i < n; i++)
{
// podmieniamy kolumnę
// współczynnikami bi
WK[i] = n;
X[i] = det(n, 0, WK, AB) / W
// przywracamy kolumnę
// współczynników ai
WK[i] = i;
}
// Wypisujemy wyniki
for(i = 0; i < n; i++)
t += "x<sub>" +
(i + 1) + "</sub> = " +
X[i] + "<br>"
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.