\documentclass[10pt,a4paper,polish]{article}

%% Polonizacja
\usepackage[T1]{fontenc}
\usepackage[latin2]{inputenc}
\usepackage{polski}
\usepackage{indentfirst}

%% Wzorki matematyczne
\usepackage{amsmath,amsfonts}

%% Inne
\usepackage{varioref}


%% Twierdzenia
\newtheorem{thm}{Twierdzenie}[section]
\newtheorem{df}{Definicja}[section]

\DeclareMathOperator{\sign}{sign}

\numberwithin{equation}{subsection}

\newcommand*{\n}[1][n]{$#1$\nobreakdash-\hspace{0pt}}
\newcommand*{\abs}[1]{\ensuremath{\lvert #1 \rvert}}
\newcommand*{\vect}[1]{\ensuremath{\mathbf{#1}}}
\newcommand*{\matr}[1]{\ensuremath{\mathbf{#1}}}





\begin{document}

\newcounter{seria}
\setcounter{seria}{2}
% 1 - sortowanie
% 2 - układy równań
% 3 - układy równań: iteracyjnie
\newcommand*{\preparedby}{Jakub Narębski}
\input{naglowek2.tex}


\section{Rozwiązywanie układu równań liniowych.}
\label{sec:uklad-rownan-liniowych}


\subsection{Wstęp.}
\label{sec:wstep}

Układ równań liniowych wygląda następująco:
\begin{equation}
  \label{eq:uklad-rownan}
  \begin{aligned}
    a_{11} x_1 + a_{12} x_2 + a_{13} x_3 + \dots + a_{1n} x_n &= b_1 \\
    a_{21} x_1 + a_{22} x_2 + a_{23} x_3 + \dots + a_{2n} x_n &= b_2 \\
    a_{31} x_1 + a_{32} x_2 + a_{33} x_3 + \dots + a_{3n} x_n &= b_3 \\
    &\cdots \\
    a_{m1} x_1 + a_{m2} x_2 + a_{m3} x_3 + \dots + a_{mn} x_n &= b_m 
  \end{aligned}
\end{equation}
Mamy tutaj $n$ niewiadomych \(x_j, j = 1,2,\dots,n\) i $m$ równań
wiążących je ze sobą.  Współczynniki $a_{ij}$, gdzie \(i =
1,2,\dots,m\) zaś \(j = 1,2,\dots,n\) oraz prawe strony równań $b_i$, 
\(i = 1,2,\dots,m\), są znanymi liczbami.  

Będziemy zakładać, że $m = n$, czyli że liczba równań jest równa
liczbie niewiadomych.  Jeśli równania nie są liniowo zależne to
równanie~\eqref{eq:uklad-rownan} ma dokładnie jedno rozwiązanie.

Równanie~\eqref{eq:uklad-rownan} można zapisać w postaci macierzowej
jako
\begin{equation}
  \label{eq:rownanie-macierzowe}
  \matr{A} \cdot \vect{x} = \vect{b}.
\end{equation}
$\matr{A}$ jest tutaj macierzą $n \times n$ współczynników, zaś wektor
(kolumnowy) $\vect{b}$ jest wektorem wyrazów wolnych (prawych stron),
\begin{equation}
  \label{eq:macierze-rown-liniowego}
  \matr{A} = 
  \begin{bmatrix}
    a_{11} & a_{12} & \dots & a_{1n} \\
    a_{21} & a_{22} & \dots & a_{2n} \\
    \hdotsfor{4} \\
    a_{n1} & a_{n2} & \dots & a_{nn} 
  \end{bmatrix},
  \qquad
  \vect{b} =
  \begin{bmatrix}
    b_1   \\
    b_2   \\
    \dots \\
    b_n
  \end{bmatrix}
\end{equation}
Uwaga: później będziemy pomijać znak mnożenia macierzowego.


\subsection{Równanie z macierzą trójkątną górną.}
\label{sec:trojkatna-gorna}

Macierz $\matr{U} = (u_{ij})$ nazywamy \emph{trójkątną górną}, jeśli
wszystkie jej elementy poniżej głównej przekątnej są zerami, tj.
$u_{ij} = 0$ dla $j < i$.  Analogicznie macierz $\matr{L} = (l_{ij})$
nazywamy \emph{trójkątną dolną} jeśli $l_{ij} = 0$ dla $j > i$.

Rozwiązanie układów równań liniowych o~macierzach trójkątnych jest
proste.  Dla przykładu rozważmy układ o~macierzy trójkątnej górnej
$\matr{U}$
\begin{equation}
  \label{eq:trojkatna-gorna:rownanie}
  \begin{aligned}
    u_{11} x_1 + u_{12} x_2 + \dots + u_{1n} x_n &= b_1 \\
                 u_{22} x_2 + \dots + u_{2n} x_n &= b_2 \\
    &\cdots \\
                                      u_{nn} x_n &= b_n
  \end{aligned}
\end{equation}
Niewiadomą $x_n$ wyznaczmy z~ostatniego równania $x_n =
\dfrac{b_n}{u_{nn}}$.  Znając wartości $x_n, x_{n-1}, \dots, x_{i+1}$
z~\n[i]tego równania wyznaczamy
\begin{equation}
  \label{eq:trojkatna-gorna:rozwiazanie}
  x_i = \frac{1}{u_{ii}} \left[ b_i - \sum_{j=i+1}^n u_{ij} x_j \right].
\end{equation}


\subsection{Metoda eliminacji Gaussa.}
\label{sec:Gauss}

\emph{Metoda eliminacji Gaussa} polega na przekształceniu
rozwiązywanego układu równań $\matr{A} \vect{x} = \vect{b}$ do
równoważnego układu z~macierzą trójkatną górną (etap \emph{eliminacji
  zmiennych}), a~następnie rozwiązaniu otrzymanego równania powyższą
metodą.

Oznaczmy $\matr{A}^{(1)} = \matr{A}$, $\vect{b}^{(1)} = \vect{b}$, zaś
$\matr{A}^{(k)}$ i~$\vect{b}^{(k)}$ będzie oznaczać wynik \n[k]tego
kroku.  W~pierwszym kroku w~układzie równań $\matr{A}^{(1)} \vect{x} =
\vect{b}^{(1)}$ postaci
\begin{equation}
  \label{eq:Gauss:krok-1}
  \begin{aligned}
    a^{(1)}_{11} x_1 + a^{(1)}_{12} x_2 + \dots + a^{(1)}_{1n} x_n &= b^{(1)}_1 \\
    a^{(1)}_{21} x_1 + a^{(1)}_{22} x_2 + \dots + a^{(1)}_{2n} x_n &= b^{(1)}_2 \\
    &\cdots \\
    a^{(1)}_{n1} x_1 + a^{(1)}_{n2} x_2 + \dots + a^{(1)}_{mn} x_n &= b^{(1)}_n   
  \end{aligned}
\end{equation}
eliminujemy niewiadomą $x_1$ z~równań $2, 3,\dots, n$.  W~tym celu
pierwsze równanie pomnożone przez $l_{i1} \stackrel{\text{df}}{=}
a^{(1)}_{i1}/a^{(1)}_{11}$ należy odjąć od dalszych równań (od
\n[i]tego wiersza dla $i = 2, 3, \dots, n$).  Otrzymujemy układ równań
$\matr{A}^{(2)} \vect{x} = \vect{b}^{(2)}$ postaci
\begin{equation}
  \label{eq:Gauss:krok-2}
  \begin{aligned}
    a^{(2)}_{11} x_1 + a^{(2)}_{12} x_2 + \dots + a^{(2)}_{1n} x_n &= b^{(2)}_1 \\
                       a^{(2)}_{22} x_2 + \dots + a^{(2)}_{2n} x_n &= b^{(2)}_2 \\
    &\cdots \\
                       a^{(2)}_{n2} x_2 + \dots + a^{(2)}_{mn} x_n &= b^{(2)}_n   
  \end{aligned}
\end{equation}
Podobnie eliminujemy $x_2$ z~równań leżących w~wierszach $3, 4, \dots,
n$.  Po $n-1$ eliminacjach uzyskujemy trójkątny układ równań
$\matr{A}^{(n)} \vect{x} = \vect{b}^{(n)}$ postaci
\begin{equation}
  \label{eq:Gauss:krok-n}
  \begin{aligned}
    a^{(n)}_{11} x_1 + a^{(n)}_{12} x_2 + \dots + a^{(n)}_{1n} x_n &= b^{(n)}_1 \\
                       a^{(n)}_{22} x_2 + \dots + a^{(n)}_{2n} x_n &= b^{(n)}_2 \\
    &\cdots \\
                                                  a^{(n)}_{mn} x_n &= b^{(n)}_n   
  \end{aligned}
\end{equation}



\subsection{Rozkład $\matr{L}\matr{U}$.}
\label{sec:LU}

\subsubsection{Metoda Gaussa--Crouta.}
\label{sec:Gauss-Crout}

W~wielu przypadkach chcielibyśmy rozwiązywać równanie \(\matr{A}
\vect{x} = \vect{b}\) dla różnych wartości $\vect{b}$ (np. przy
znajdowaniu najmniejszej wartości własnej odwrotną metodą potęgową,
albo przy znajdowaniu odwrotności macierzy).  W~metodzie Gaussa
podczas redukcji do macierzy trójkątnej wykonywane obliczenia nie
zależą od wektora prawych stron.  Wystarczyło by zatem zapamiętać
w~jakiś sposób przekształcenia, którymi trzeba podziałać na wektor
$\vect{b}$. 

Zauważmy, że w~\n[k]tym kroku eliminacja $x_k$ z~wierszy $k+1, k+2,
\dots, n$ sprowadza się do przemnożenia obu stron układu przez macierz
$L^{(k)}$ różniącą się od macierzy jednostkowej \n[k]tą kolumną,
zawierającej począwszy od wiersza $k+1$ elementy $-l_{kj}$ dla $j =
k+1, k+2, \dots, n$.  Przykładowo, dla drugiego kroku dana jest ona
wzorem
\begin{equation}
  \label{eq:L^(k)}
  \matr{L}^{(2)} = 
  \begin{bmatrix}
    1 &         &   &        &   \\
    0 &  1      &   &        &   \\
    0 & -l_{32} & 1 &        &   \\
    \hdotsfor{3}    & \ddots &   \\
    0 & -l_{n2} & 0 & \cdots & 1 
  \end{bmatrix},
  \qquad l_{i2} = \frac{\strut a^{(2)}_{i2}}{a^{(2)}_{22}},
  \quad i = 3, 4, \dots, n
\end{equation}
Zatem 
\def\LLs{\matr{L}^{(n-1)} \matr{L}^{(n-2)} \dots \matr{L}^{(2)} \matr{L}^{(1)}}
\begin{math}
  \LLs \matr{A}^{(1)} = \matr{A}^{(n)},
\end{math}
zaś
\begin{math}
  \LLs \vect{b}^{(1)} = \vect{b}^{(n)}.
\end{math}
Macierze $\matr{L}^{(k)}$ są nieosobliwe, możemy więc zapisać
\begin{equation}
  \label{eq:LU:Gauss}
  \matr{A}^{(1)} =  
  \bigl(\matr{L}^{(n-1)}\bigr)^{-1} 
  \bigl(\matr{L}^{(n-2)}\bigr)^{-1} \dots 
  \bigl(\matr{L}^{(2)}\bigr)^{-1}   
  \bigl(\matr{L}^{(1)}\bigr)^{-1}   \matr{A}^{(n)} 
  \stackrel{\text{ozn}}{=}
  \matr{L} \matr{A}^{(n)},
\end{equation}
gdzie przez $\matr{L}$ oznaczyliśmy iloczyn macierzy
$\bigl(\matr{L}^{(k)}\bigr)^{-1}$.  Łatwo obliczyć, że
\begin{equation}
  \label{eq:L:Gauss}
  \matr{L} =
  \begin{bmatrix}
    1      &        &        &        &   \\
    l_{21} & 1      &        &        &   \\
    l_{22} & l_{32} & 1      &        &   \\
    \hdotsfor{3}             & \ddots &   \\
    l_{n1} & l_{n2} & l_{n3} & \cdots & 1 
  \end{bmatrix}
\end{equation}

Jeśli macierz $\matr{A}^{(n)}$ (końcową macierz w~kroku redukcji algorytmu
Gaussa) oznaczymy symbolem $\matr{U}$, to rozkład macierzy $\matr{A}$
na iloczyn można zapisać następująco
\begin{equation}
  \label{eq:LU}
  \matr{A} = \matr{L} \matr{U},
\end{equation}
gdzie $\matr{L}$ jest macierzą trójkątną dolną z~jedynkami na
diagonali, a~$\matr{U}$ --- macierzą trójkątną górną.

Mając rozkład macierzy zadany wzorem~\eqref{eq:LU} można w~łatwy
sposób znaleźć rozwiązanie równania $\matr{A}\vect{x} = \vect{b}$
rozwiązując dwa równania z~macierzą trójkątną:
\begin{equation}
  \label{eq:LU:rozwiazanie-ukladu}
  \matr{L} \vect{y} = \vect{b}, \qquad
  \matr{U} \vect{x} = \vect{y}
\end{equation}


\subsubsection{Metoda Doolittle'a.}
\label{sec:Doolittle}

Rozkład $\matr{L} \matr{U}$ można uzyskać nie tylko metodą eliminacji
Gaussa, ale także traktując równość $\matr{A} = \matr{L} \matr{U}$
jako układ $n^2$ równań z~$n^2$ niewiadomymi: współczynnikami macierzy
$\matr{L}$ i~$\matr{U}$:
\begin{multline}
  \label{eq:LU-Doolittle}
  \begin{bmatrix}
    1      & 0      & 0      & \cdots & 0 \\
    l_{21} & 1      & 0      & \cdots & 0 \\
    l_{22} & l_{32} & 1      & \cdots & 0 \\
    \hdotsfor{5}    \\
    l_{n1} & l_{n2} & l_{n3} & \cdots & 1 
  \end{bmatrix}
  \cdot
  \begin{bmatrix}
    u_{11} & u_{12} & u_{13} & \cdots & u_{1n} \\
    0      & u_{22} & u_{23} & \cdots & u_{2n} \\
    0      & 0      & u_{33} & \cdots & u_{3n} \\
    \hdotsfor{5}    \\
    0      & 0      & 0      & \cdots & u_{nn}
  \end{bmatrix}
  = \\
  =
  \begin{bmatrix}
    a_{11} & a_{12} & a_{13} & \dots & a_{1n} \\
    a_{21} & a_{22} & a_{23} & \dots & a_{2n} \\
    a_{31} & a_{32} & a_{33} & \dots & a_{3n} \\
    \hdotsfor{5} \\
    a_{n1} & a_{n2} & a_{n3} & \dots & a_{nn} 
  \end{bmatrix}  
\end{multline}

Równania te wygodnie jest rozwiązywać na przemian wierszami
i~kolumnami.  Elementy $l_{ij}$ ($i > j$) i~$u_{ij}$ ($i \leq j$)
obliczamy następująco: dla $i = 1, 2, \dots, n$ obliczamy kolejno
\begin{subequations}
  \label{eq:Doolittle}
  \begin{align}
    \label{eq:Doolittle:u}
    u_{ij} &= a_{ij} - \sum_{k = 1}^{i - 1} l_{ik} u_{kj}, 
    &&\text{dla\ } j = i, i+1, \dots, n \\
    \label{eq:Doolittle:l}
    l_{ji} &= \frac{1}{u_{ii}} \left( a_{ji} - \sum_{k = 1}^{i - 1} l_{jk} u_{ki}\right), 
    &&\text{dla\ } j = i+1, i+2, \dots, n 
  \end{align}
\end{subequations}

Przedstawiona metoda obliczania rozkładu $\matr{L}\matr{U}$ nosi nazwę
\emph{metody Doolittle'a} (w~niektórej literaturze \emph{metody
  Crouta}).  Stosując podwójną precyzję do obliczania $u_{ij}$
i~$l_{ij}$ możemy zwiększyć dokładność obliczeń bez dodatkowego
obciążania pamięci maszyny.



\subsubsection{Pełny i częściowy wybór elementu podstawowego.}
\label{sec:pivoting}

Zarówno metoda Gaussa jak i~metoda Doolittle'a w~powyższej postaci nie
są niezawodne.  Zawodzą, gdy na przekątnej pojawi się $0$, nawet gdy
układ ma rozwiązanie.  Rozwiązaniem jest przestawienie wierszy (co
odpowiada zamianie równań miejscami, a~więc przestawieniu elementów
$\vect{b}$) lub zarówno wierszy jak i~kolumn (przestawienie kolumn
odpowiada za przenumerowanie zmiennych, czyli $\vect{x}$).  W~celu
zapewnienia numerycznej poprawności (małego błędu) jako element przez
który dzielimy (element na przekątnej; zwany \emph{elementem
  podstawowym} lub \emph{elementem głównym}) wybieramy element
największy co do modułu.  Zarówno w~metodzie Gaussa jak i~w~metodzie
Doolittle'a \emph{element podstawowy} wybieramy z~tej części macierzy
której jeszcze nie używaliśmy.

W~metodzie \emph{częściowego wyboru elementu podstawowego} w~\n[k]tym
kroku znajdujemy wśród elementów przez który dzielilibyśmy biorąc jako
następny wiersz wiersz~\n[i]ty (w~metodzie Gaussa $a^{(k)}_{ik}$,
w~metodzie Doolittle'a
\begin{math}
  \label{eq:Doolittle:elem-glowny}
  d_k \stackrel{\text{ozn}}{=} 
  u_{ki} = a_{ki} - \displaystyle\sum_{j = 1}^{i - 1} l_{kj} u_{ji}
\end{math}
$(i = k, k+1, \dots, n)$) element największy co do modułu --- dla
ustalenia uwagi niech będzie nim element w~wierszu $i_k$--tym ---
a~następnie przestawiamy wiersze \n[k]ty z~$i_k$--tym.  W~metodzie
\emph{pełnego wybory elementu podstawowego} maksymalny element
wyszukiwany jest w~całej przekształcanej części macierzy, a~następnie
zamienia się zarówno wiersze jak i~kolumny.

Przy implementacji metody z~częściowym wyborem elementu podstawowego
do celów pamiętania dokonanych przestawień wierszy wprowadzamy
dodatkowy wektor wskaźników przestawienia wierszy $\vect{p}$,
zawierający na początku kolejne indeksy $\vect{b}$, czyli $1, 2,
\dots, n$.  Przy przestawianiu wierszy macierzy przestawiamy też jego
elementy.  Przy rozwiązywaniu układu po obliczeniu jego rozkładu na
$\matr{L}\matr{U}$ jako wektor prawych stron bierzemy wektor
$[b_{p_i}]_{i=1}^{n}$.

W~metodzie Doolittle'a warto wprowadzić także pomocniczy wektor
$\vect{d}$ do którego wpisujemy wielkości które będą elementami
podstawowymi (patrz równanie~\vpageref[powyżej]{eq:Doolittle:elem-glowny}). 

Stosując metodę z~wyborem elementu podstawowego nie otrzymujemy
rozkładu $\matr{L}\matr{U}$ macierzy $\matr{A}$ tylko rozkład macierzy
$\matr{A}$ z~przestawionymi wierszami.  Można to zapisać jako
$\matr{A} = \matr{P}\matr{L}\matr{U}$, gdzie $\matr{P}$ jest macierzą
permutacji.  Rozwiązujemy uklad równań
\begin{equation}
  \label{eq:PLU}
  \matr{A}\,\vect{x} = \matr{P}\matr{L}\matr{U}\,\vect{x} = \vect{b}
  \iff
  \matr{L}\matr{U}\,\vect{x} = \vect{b}^{\ast},
\end{equation}
gdzie $\vect{b}^{\ast} = [b_{p_i}]_{i=1}^{n}$.


\subsection{Wyznaczanie macierzy odwrotnej.  \\
  Obliczanie wyznacznika macierzy.}
\label{sec:zastosowania}

Macierz $\matr{A}^{-1}$ odwrotna do macierzy $\matr{A}$ spełnia
równanie
\begin{equation}
  \label{eq:odwrotna}
  \matr{A} \matr{A}^{-1} = \matr{I},
\end{equation}
gdzie $\matr{I}$ jest macierzą jednostkową.  Jeśli istnieje macierz
odwrotna, to spełnia ona także $\matr{A}^{-1} \matr{A} = \matr{I}$.
Znając rozkład $\vect{L}\vect{U}$ macierzy (ogólnie: potrafiąc
rozwiązywać układ równań z~tą macierzą z~różnymi wyrazami wolnymi)
można łatwo znaleźć macierz odwrotną, traktując
równanie~\eqref{eq:odwrotna} jako $n$ układów równań liniowych
z~wektorami prawych stron będących kolejnymi elementami naturalnej
bazy.  \emph{Uwaga:} rozwiązywanie układu równań przy pomocy macierzy
odwrotnej obarczone jest większym błędem numerycznym niż skorzystanie
z~rozkładu $\matr{L}\matr{U}$!

Wyznacznik macierzy $\matr{A}$ łatwo jest wyznaczyć z~jej rozkładu,
korzystając z~faktu, że wyznacznik iloczynu jest iloczynem
wyznaczników.  Wyznacznik macierzy trójkątnej jest zaś równy
iloczynowi jej elementów diagonalnych.  Mamy zatem
\begin{equation}
  \label{eq:det}
  \det \matr{A}  = \det(\matr{P} \matr{L}\matr{U}) =
  (-1)^{\#p} \prod_{i=1}^n u_{ii},
\end{equation}
gdzie $\#p$ jest ilością przestawień wierszy dokonanych podczas
obliczania rozkładu $\matr{L}\matr{U}$, gdyż $\det(\matr{P}) =
(-1)^{\#p}$, $\det(\matr{L}) = \prod_{i=1}^n l_{ii} = 1$, zaś
$\det(\matr{U}) = \prod_{i=1}^n u_{ii}$.


\section{Zadanie domowe.}
\label{sec:zadanie-domowe}

Napisać funkcję dokonującą rozkładu $\matr{L}\matr{U}$ macierzy
$\matr{A}$ z~częściowym wyborem elementu podstawowego oraz funkcję
rozwiązująca układ równań $\matr{A}\vect{x} = \vect{b}$ na podstawie
rozkładu $\matr{L}\matr{U}$ obliczanego przez poprzednią funkcję.

Funkcja licząca rozkład $\matr{L}\matr{U}$ powinna zapisywać rozkład
,,w~miejscu'' (spakowany w~postaci jednej macierzy) tzn. w~postaci
\begin{equation*}
  \begin{bmatrix}
    u_{11} & u_{12} & u_{13} & \dots & u_{1n} \\
    l_{21} & u_{22} & u_{23} & \dots & u_{2n} \\
    l_{31} & l_{32} & u_{33} & \dots & u_{3n} \\
    \hdotsfor{5} \\
    l_{n1} & l_{n2} & l_{n3} & \dots & u_{nn} 
  \end{bmatrix}      
\end{equation*}
Funkcja może nadpisywać macierz $\matr{A}$.  Macierz w~której będzie
zapisany rozkład $\matr{L}\matr{U}$ oraz wektor $\vect{p}$ permutacji
wierszy powinny być przekazywane jako parametry.  Jeśli funkcja
potrzebuje dodatkowych wektorów roboczych mogą być one również
przekazywane jako parametry.  Funkcja powinna zwracać 0 jeśli rozkład
$\matr{L}\matr{U}$ udało się wykonać; powinna zwracać $k$ jeśli
w~\n[k]tym kroku nie udało się znaleźć niezerowego elementu
podstawowego.

Należy sprawdzić, czy wynik jest rzeczywiście rozkładem
$\matr{L}\matr{U}$ macierzy $\matr{A}$ o~odpowiednio przestawionych
wierszach, ewentualnie z~jaką dokładnością.

Funkcja rozwiązująca układ równań $\matr{A}\vect{x} = \vect{b}$ na
podstawie wyników obliczonych przez poprzednią funkcję powinna jako
argumenty przyjmować rozkład $\matr{L}\matr{U}$ w~postaci jednej
macierzy, wektor $\vect{p}$ permutacji wierszy oraz wektor $\vect{b}$
prawej strony.  Funkcja może nadpisywać wektor $\vect{b}$.  Obliczany
wektor $\vect{x}$ może być zapisywany w~jednym z~parametrów, może też
nadpisywać $\vect{b}$.  Funkcja powinna zwracać 0 jeśli udało się
znaleźć rozwiązanie, $k$ jeśli w~\n[k]tym kroku element przez który
dzielilibyśmy jest równy 0.

Należy sprawdzić, czy otrzymany wynik spełnia zadane równanie (układ
równań liniowych), ewentualnie z~jaką dokładnością.

Sposób przekazywania macierzy do funkcji pozostawia się piszącemu
program.  Może to być przekazywanie macierzy o~stałym rozmiarze,
przekazywanie macierzy o~stałej ilości kolumn (stałej długości
wierszy) i~przekazywanie ilości wierszy (która jest także ilością
wykorzystywanych kolumn) jako parametru, przekazywanie macierzy jako
tablicy wskaźników na wiersze i~przekazywanie jej rozmiaru jak
i~przekazywanie macierzy w~postaci spłaszczonej i~przekazywanie ilości
wierszy (i~kolumn).  Nie należy korzystać ze zmiennych globalnych do
przekazywania parametrów!



%%% 
\input{podpis.tex}

\end{document}
