\documentclass[]{article}
\usepackage[T1]{fontenc}
\usepackage{polski}
\usepackage[utf8]{inputenc}
\usepackage[margin=1.25in]{geometry}
\usepackage{alltt}
\usepackage{titling}
\usepackage{pdfpages}
\usepackage{float}
\usepackage{amsmath}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{amstext}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{xspace}
\usepackage{enumerate}
\usepackage{lmodern}
\usepackage{amsfonts}
\usepackage{mathtools}
\usepackage{alphalph}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage{wrapfig}
\usepackage[polish]{babel}
\usepackage{siunitx}
\usepackage{subcaption}
\usepackage{csvsimple} % kurwa

\pgfplotsset{compat=1.15}
\usepgfplotslibrary{groupplots}

\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}

\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning}
\usetikzlibrary{shapes.geometric, arrows, intersections}

\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}

% opening
\title{Rozwiązywanie Układów Równań \\ \normalsize Projekt \#2 z \texttt{MN}}
\author{Kacper Donat}
\newenvironment{column}[1]{\noindent\begin{minipage}{#1\linewidth}}{\end{minipage}\vspace{.5\baselineskip}}

\floatname{algorithm}{Program}

\begin{document}
    \maketitle
    \section{Porównanie metod rozwiązywania układów równań}
    \begin{equation*}
        \underbrace{\begin{bmatrix}
            10 & -1 & -1 &  0 & \cdots & 0 \\
            -1 & 10 & -1 & -1 & \cdots & 0 \\
            -1 & -1 & 10 & -1 & \cdots & 0 \\
             0 & -1 & -1 & 10 & \cdots & 0 \\
            \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\
            0 & 0 & 0 & 0 & \cdots & 10
        \end{bmatrix}}_{M}
        \underbrace{\begin{bmatrix}
            -0.048\\
            -0.084 \\
            -0.12 \\
            -0.14 \\
            \vdots \\
            -0.12 \\
        \end{bmatrix}}_{x}
        =
        \underbrace{\begin{bmatrix}
            -0.28 \\
            -0.54 \\
            -0.75 \\
            -0.96 \\
            \vdots \\
            -0.97 \\
        \end{bmatrix}}_{b}
    \end{equation*}

    \begin{table}[H]
        \centering
        \begin{tabular}{l|rrr}
            & \textbf{Jacobi} & \textbf{Gauss} & \textbf{LU} \\ \hline
            \textbf{Czas $[\si{s}]$} & 0.085 & 0.062 & 0.58 \\
            \textbf{Iteracje}        & 29 & 19 & - \\
            \textbf{Residuum}        & $3.78 \cdot 10^{-10}$ & $8.21 \cdot 10^{-10}$ & $6.00 \cdot 10^{-16}$
        \end{tabular}
        \caption{Porównanie czasów oraz ilości iteracji dla pkt. \textbf{A} tj. dla $N = 981$}
    \end{table}

    Dla danych z podpunktu A, tj. dla $a_1 = 10$ wszystkie metody się zbiegają bez problemu. zadowalające wyniki
    najszybciej osiąga metoda Gaussa-Seidla, co nie jest zakoczeniem, dodatkowo metoda Gaussa potrzebuje około $33\%$
    iteracji mniej (patrz rys. \ref{fig:A:residuum}). Macierz $M$ wydaje się być dobrze uwarunkowaną macierzą dla obu
    metod iteracyjnych. Metoda LU natomiast daje najdokładniejszy wynik - jednak nie jest to wynik dokładny ponieważ
    obliczenia zmiennoprzecinkowe nie są dokładne. Dodatkowo, obliczanie metodą LU zajmuje około 10x więcej czasu.

    \begin{equation*}
        \underbrace{\begin{bmatrix}
            3 & -1 & -1 &  0 & \cdots & 0 \\
            -1 & 3 & -1 & -1 & \cdots & 0 \\
            -1 & -1 & 3 & -1 & \cdots & 0 \\
             0 & -1 & -1 & 3 & \cdots & 0 \\
            \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\
            0 & 0 & 0 & 0 & \cdots & 3
        \end{bmatrix}}_{M}
        \underbrace{\begin{bmatrix}
            -1.64 \\
            -2.18 \\
            -2.44 \\
            -1.92 \\
            \vdots \\
            2.26 \\
        \end{bmatrix}}_{x}
        =
        \underbrace{\begin{bmatrix}
            -0.28 \\
            -0.54 \\
            -0.75 \\
            -0.96 \\
            \vdots \\
            -0.97 \\
        \end{bmatrix}}_{b}
    \end{equation*}

    \begin{table}[H]
        \centering
        \begin{tabular}{l|rrr}
            & \textbf{Jacobi} & \textbf{Gauss} & \textbf{LU} \\ \hline
            \textbf{Czas $[\si{s}]$} & - & - & 0.79 \\
            \textbf{Iteracje}        & 100 $\times$ & 100 $\times$ & - \\
            \textbf{Residuum}        & $7.20 \cdot 10^{13}$ & $1.79 \cdot 10^{31}$ & $5.16 \cdot 10^{-13}$
        \end{tabular}
        \caption{Porównanie czasów oraz ilości iteracji dla pkt. \textbf{E} tj. dla $a1 = 3$}
    \end{table}

    Tak skonstruowana macierz $M$ nie jest dobrze uwarunkowana do rozwiązań iteracyjnych, żadna z metod iteracyjnych się
    nie zbiegła. Po 100 próbach wyraźnie widać, że metoda gaussa nie tylko szybciej się zbiega - ale w wypadku źle
    uwarunkowanej macierzy również szybciej się rozbiega (rys. \ref{fig:C:residuum}), o czym świadczy znacznie większy
    wektor residuum. Warto również zauważyć, że dla tego wypadku metoda LU również poradziła sobie zdecydowanie gorzej -
    osiągając wynik o 3 rzędy wielkości mniej dokładny (względem normy z residuum)

    Po analizie czasu dla różnych $N$, widać że metody Jacobiego oraz Gaussa-Seidla róznią się stosunkowo mało, jednak
    różnica między czasem metod iteracyjnych a LU jest znaczna i wynosi nawe 2 rzędy wielkości - rys. \ref{fig:E:time}

    \begin{figure}[H]
        \centering
        \begin{tikzpicture}
            \begin{semilogyaxis}[
                ylabel={norma z residuum}, axis x line = bottom,
                xlabel={iteracja}, axis y line = left,
                grid=both, width=.7\textwidth
            ]
                \addplot table [x=iter, y=residuum, col sep=comma] {../zadA_residuum_gauss.csv};
                \addlegendentry{Gauss-Seidel}
                \addplot table [x=iter, y=residuum, col sep=comma] {../zadA_residuum_jacobi.csv};
                \addlegendentry{Jacobi}
            \end{semilogyaxis}
        \end{tikzpicture}
        \caption{Zależność normy z residuum od iteracji dla zadania \textbf{A}}
        \label{fig:A:residuum}
    \end{figure}

    \begin{figure}[H] 
        \centering
        \begin{tikzpicture}
            \begin{semilogyaxis}[
                ylabel={norma z residuum}, axis x line = bottom,
                xlabel={iteracja}, axis y line = left,
                grid=both, width=.7\textwidth, no marks
            ]
                \addplot table [x=iter, y=residuum, col sep=comma] {../zadC_residuum_gauss.csv};
                \addlegendentry{Gauss-Seidel}
                \addplot table [x=iter, y=residuum, col sep=comma] {../zadC_residuum_jacobi.csv};
                \addlegendentry{Jacobi}
            \end{semilogyaxis}
        \end{tikzpicture}
        \caption{Zależność normy z residuum od iteracji dla zadania \textbf{C}}
        \label{fig:C:residuum}
    \end{figure}

    \begin{figure}[H] 
        \centering
        \begin{tikzpicture}
            \begin{semilogyaxis}[
                ylabel={czas [$\si{s}$]}, axis x line = bottom,
                xlabel={$N$}, axis y line = left,
                grid=both, width=.7\textwidth, 
                smooth
            ]
                \addplot table [x=n, y=lu, col sep=comma] {../zadE.csv};
                \addlegendentry{LU}
                \addplot table [x=n, y=gauss, col sep=comma] {../zadE.csv};
                \addlegendentry{Gauss-Seidel}
                \addplot table [x=n, y=jacobi, col sep=comma] {../zadE.csv};
                \addlegendentry{Jacobi}
            \end{semilogyaxis}
        \end{tikzpicture}
        \caption{Zależność czasu od wielkości N}
        \label{fig:E:time}
    \end{figure}
\end{document}
