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".

Metoda Cramera

SPIS TREŚCI
Podrozdziały

Algorytm

Mamy dany układ \(n\) równań liniowych z \(n\) niewiadomymi. Zapiszmy go następująco:

\[
\left\{
\begin{array}{lccclcccl}
a_{1,1}x_1 & +a_{1,2}x_2 & +a_{1,3}x_3 & +\dots & +a_{1,n-1}x_{n-1} & +a_{1,n}x_n & = b_1 \\
a_{2,1}x_1 & +a_{2,2}x_2 & +a_{2,3}x_3 & +\dots & +a_{2,n-1}x_{n-1} & +a_{2,n}x_n & = b_2 \\
a_{3,1}x_1 & +a_{3,2}x_2 & +a_{3,3}x_3 & +\dots & +a_{3,n-1}x_{n-1} & +a_{3,n}x_n & = b_3 \\
\dots & +\dots & +\dots & +\dots & +\dots & +\dots & = \dots \\
a_{n-1,1}x_1 & +a_{n-1,2}x_2 & +a_{n-1,3}x_3 & +\dots & +a_{n-1,n-1}x_{n-1} & +a_{n-1,n}x_n & = b_{n-1} \\
a_{n,1}x_1 & +a_{n,2}x_2 & +a_{n,3}x_3 & +\dots & +a_{n,n-1}x_{n-1} & +a_{n,n}x_n & = b_n
\end{array}
\right.
\]

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\):

\[
A = \begin{bmatrix}
a_{1,1} & a_{1,2} & a_{1,3} & \dots & a_{1,n-1} & a_{1,n} \\
a_{2,1} & a_{2,2} & a_{2,3} & \dots & a_{2,n-1} & a_{2,n} \\
a_{3,1} & a_{3,2} & a_{3,3} & \dots & a_{3,n-1} & a_{3,n} \\
\dots & \dots & \dots & \dots & \dots & \dots \\
a_{n-1,1} & a_{n-1,2} & a_{n-1,3} & \dots & a_{n-1,n-1} & a_{n-1,n} \\
a_{n,1} & a_{n,2} & a_{n,3} & \dots & a_{n,n-1} & a_{n,n}
\end{bmatrix}
\quad
B = \begin{bmatrix}
b_1 \\
b_2 \\
b_3 \\
\dots \\
b_{n-1} \\
b_n
\end{bmatrix}
\]

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:

\[
x_i=\dfrac{W_i}{W}
\]

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\):

\[
\left\{
\begin{array}{lcccl}
3x_1 & +2x_2 & -3x_3 & = -2 \\
4x_1 & -3x_2 & +2x_3 & = \phantom{1}4 \\
8x_1 & +2x_2 & +2x_3 & = 18
\end{array}
\right.
\]

Najpierw tworzymy macierz \(A\) współczynników oraz wektor kolumnowy \(B\):

\[
A = \begin{bmatrix}
\hfill 3 & \hfill 2 & -3 \\
\hfill 4 & -3 & \hfill 2 \\
\hfill 8 & \hfill 2 & \hfill 2
\end{bmatrix}
\quad
B = \begin{bmatrix}
-2 \\
\hfill 4 \\
\hfill 18
\end{bmatrix}
\]

Wykorzystując regułę Sarrusa obliczamy wyznacznik główny \(W\):

\[
\begin{array}{l}
\begin{array}{rrrrr}
3 & 2 & -3 & {\class{t}{3}} & {\class{t}{2}} \\
4 & -3 & 2 & {\class{t}{4}} & {\class{t}{-3}} \\
8 & 2 & 2 & {\class{t}{8}} & {\class{t}{2}}
\end{array}
= 3 \cdot (-3) \cdot 2 + 2 \cdot 2 \cdot {\class{t}{8}} + (-3) \cdot {\class{t}{4}} \cdot {\class{t}{2}} - (-3) \cdot (-3) \cdot 8 - {\class{t}{3}} \cdot 2 \cdot 2 - {\class{t}{2}} \cdot {\class{t}{4}} \cdot 2 = -110 \\
\\
W = -110
\end{array}
\]

Teraz dla niewiadomej \(x_1\) w macierzy \(A\) zastępujemy kolumnę nr \(1\) wektorem \(B\) i obliczamy jej wyznacznik \(W_1\):

\[
\begin{array}{l}
A_1 = \left[\begin{array}{rrr}
{\class{n}{-2}} & 2 & -3 \\
{\class{n}{4}} & -3 &  2 \\
{\class{n}{18}} &  2 &  2
\end{array}\right]
\\
\\
\left[\begin{array}{rrrrr}
-2 & 2 & -3 & {\class{t}{-2}} & {\class{t}{2}} \\
4 & -3 & 2 & {\class{t}{4}} & {\class{t}{-3}} \\
18 & 2 & 2 & {\class{t}{18}} & {\class{t}{2}}
\end{array}\right] = (-2)\cdot(-3)\cdot2+2\cdot2\cdot{\class{t}{18}}+(-3)\cdot{\class{t}{4}}\cdot{\class{t}{2}}-(-3)\cdot(-3)\cdot18-{\class{t}{(-2)}}\cdot2\cdot2-{\class{t}{2}}\cdot{\class{t}{4}}\cdot 2 = -110 \\
\\
W_1 = -110
\end{array}
\]

Podobnie postępujemy dla pozostałych niewiadomych:

\[
\begin{array}{l}
A_2 = \left[\begin{array}{rrr}
3 & {\class{n}{-2}} & -3 \\
4 & {\class{n}{4}} & 2 \\
8 & {\class{n}{18}} & 2
\end{array}\right] \\
\left[\begin{array}{rrrrr}
3 & -2 & -3 & {\class{t}{\phantom{-}3}} & {\class{t}{-2}} \\
4 & 4 & 2 & {\class{t}{4}} & {\class{t}{4}} \\
8 & 18 & 2 & {\class{t}{8}} & {\class{t}{18}}
\end{array}\right]
= 3 \cdot 4 \cdot 2 + (-2) \cdot 2 \cdot {\class{t}{8}} + (-3) \cdot {\class{t}{4}} \cdot {\class{t}{18}} - (-3) \cdot 4 \cdot 8 - {\class{t}{3}} \cdot 2 \cdot 18 - {\class{t}{(-2)}} \cdot {\class{t}{4}} \cdot 2 = -220 \\
\\
W_2 = -220
\end{array}
\]
\[
\begin{array}{l}
A_3 = \left[\begin{array}{rrr}
3 & 2 & {\class{n}{-2}} \\
4 & -3 & {\class{n}{4}} \\
8 & \hfill 2 & {\class{n}{18}}
\end{array}\right] \\
\left[\begin{array}{rrrrr}
3 & 2 & -2 & {\class{t}{\phantom{-}3}} & {\class{t}{2}} \\
4 & -3 & 4 & {\class{t}{4}} & {\class{t}{-3}} \\
8 & 2 & 18 & {\class{t}{8}} & {\class{t}{2}}
\end{array}\right]
= 3 \cdot (-3) \cdot 18 + 2 \cdot 4 \cdot {\class{t}{8}} + (-2) \cdot {\class{t}{4}} \cdot {\class{t}{2}} - (-2) \cdot (-3) \cdot 8 - {\class{t}{3}} \cdot 4 \cdot 2 - {\class{t}{2}} \cdot {\class{t}{4}} \cdot 18 = -330 \\
\\
W_3 = -330
\end{array}
\]

Podsumujmy otrzymane wyniki:

\[
\begin{array}{l}
W\phantom{_1} = -110 \\
W_1 = -110 \\
W_2 = -220 \\
W_3 = -330
\end{array}
\]

Zgodnie ze wzorami Cramera mamy:

\[
\begin{array}{l}
x_1 = \dfrac{W_1}{W} = \dfrac{-110}{-110} = 1 \\
\\
x_2 = \dfrac{W_2}{W} = \dfrac{-220}{-110} = 2 \\
\\
x_3 = \dfrac{W_3}{W} = \dfrac{-330}{-110} = 3
\end{array}
\]

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

do podrozdziału  do strony 

Opis algorytmu

Specyfikacja problemu

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}\)

Dane wyjściowe

\(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.

Zmienne pomocnicze

\({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}\)

Lista kroków

  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

Schemat blokowy

obrazek

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.


do podrozdziału  do strony 

Programy

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>
          &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 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>
Demonstracja rozwiązywania
układu równań
metodą Cramera


   (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.