163 lines
6.6 KiB
TeX
163 lines
6.6 KiB
TeX
\documentclass[unicode,11pt,a4paper,oneside,numbers=endperiod,openany]{scrartcl}
|
|
|
|
\usepackage{graphicx}
|
|
\usepackage{subcaption}
|
|
\usepackage{amsmath}
|
|
\input{assignment.sty}
|
|
\usepackage{pgfplots}
|
|
\pgfplotsset{compat=newest}
|
|
\usetikzlibrary{plotmarks}
|
|
\usetikzlibrary{arrows.meta}
|
|
\usepgfplotslibrary{patchplots}
|
|
\usepackage{grffile}
|
|
\usepackage{amsmath}
|
|
\usepackage{subcaption}
|
|
\usepgfplotslibrary{external}
|
|
\tikzexternalize
|
|
|
|
\begin{document}
|
|
|
|
\setassignment
|
|
\setduedate{Wednesday, December 02, 2020, 11:59 PM}
|
|
|
|
\serieheader{Numerical Computing}{2020}{Student: Claudio Maggioni}{Discussed with: --}{Solution for Project 5}{}
|
|
\newline
|
|
|
|
\assignmentpolicy
|
|
|
|
The purpose of this assignment is to gain insight on the theoretical and
|
|
numerical properties of the Conjugate Gradient method. Here we use this method
|
|
in an image processing application with the goal of deblur an image given the
|
|
exact (noise-free) blurred image and the original transformation matrix. Note
|
|
that the ``noise-free" simplification is essential for us to solve this problem
|
|
in the scope of this assignment.
|
|
|
|
\section{General Questions [10 points]}
|
|
\subsection{What is the size of the matrix $A$?}
|
|
$A$ is an $n^2$ by $n^2$ matrix, where $n$ is the width and height in pixels
|
|
of the image to transform.
|
|
|
|
\subsection{How many diagonals bands does $A$ have?}
|
|
$A$ as $d^2$ diagonal bands, where $d$ is strictly an order of magnitude below
|
|
$n$.
|
|
|
|
\subsection{What is the length of the vectorized blur image $b$?}
|
|
$b$ is the row-vectorized form of the image pixel matrix, and thus has
|
|
dimensions 1 by $n^2$.
|
|
|
|
\section{Properties of A [10 points]}
|
|
\subsection{ If $A$ is not symmetric, how would this affect $\tilde{A}$?}
|
|
If $A$ were not symmetric, then $\tilde{A}$ would not be positive definite since
|
|
by definition $\tilde{A} = A A^T$, thus not satifying the assumptions taken when
|
|
solving the system.
|
|
|
|
\subsection{ Explain why solving $Ax = b$ for $x$ is equivalent to
|
|
minimizing $x^T A x - b^T x$ over $x$.}
|
|
|
|
First, we can say that:
|
|
|
|
\[f(x) = \frac12 x^T A x - b^T x = \frac12\langle Ax,x \rangle -
|
|
\langle b,x \rangle\]
|
|
|
|
Then by taking the derivative of $f(x)$ w.r.t. $x$ we have (assuming $A$ is
|
|
\textit{spd}, which it is):
|
|
|
|
\[f'(x) = \frac12 A^T x + \frac12Ax - b = Ax - b\]
|
|
|
|
which for $f'(x) = 0$ will be equivalent to solving $Ax = b$. By taking the
|
|
second derivative we have:
|
|
|
|
\[f''(x) = A > 0\]
|
|
|
|
since $A$ is positive definite. Therefore, we can say that the absolute minima
|
|
of $f(x)$ is the solution for $Ax = b$.
|
|
|
|
\section{Conjugate Gradient [40 points]}
|
|
\subsection{ Write a function for the conjugate gradient solver
|
|
\texttt{[x,rvec]=myCG(A,b,x0,max\_itr,tol)}, where \texttt{x}
|
|
and \texttt{rvec} are, respectively, the solution value and a
|
|
vector containing the residual at every iteration.}
|
|
|
|
The implementation can be found in file \texttt{myCG.m} in the source directory.
|
|
The test code for the function \texttt{myCG} can be found in the \texttt{test.m} file.
|
|
|
|
\subsection{ In order to validate your implementation, solve the system
|
|
defined by \texttt{A\_test.mat} and \texttt{b\_test.mat}. Plot
|
|
the convergence (residual vs iteration).}
|
|
|
|
The plot of the squared residual 2-norms over all iterations can be found in Figure
|
|
\ref{fig:plot1}.
|
|
|
|
\begin{figure}[h]
|
|
\centering
|
|
\resizebox{0.6\textwidth}{!}{\input{test_semilogy}}
|
|
\caption{Semilog plot of the plot of the squared residual 2-norms over all iterations}\label{fig:plot1}
|
|
\end{figure}
|
|
|
|
\subsection{ Plot the eigenvalues of \texttt{A\_test.mat} and comment on the
|
|
condition number and convergence rate.}
|
|
|
|
The eigenvalues of A can be found in figure
|
|
\ref{fig:plot2}. The condition number for matrix $A$ according to \texttt{rcond(...)} is $\approx 3.2720 \cdot 10^7$,
|
|
which is very low without sitting in the denormalized range (i.e. $< \text{eps}$) and thus very good for the Conjugate Gradient algorithm.
|
|
This well conditioning is also
|
|
reflected in the eigenvalue plot, which shows a not so
|
|
drastic increase of the first eigenvalues ordered in increasing order.
|
|
|
|
\begin{figure}[h]
|
|
\centering
|
|
\resizebox{0.6\textwidth}{!}{\input{A_eig}}
|
|
\caption{Semilog plot of the eigenvalues of A}\label{fig:plot2}
|
|
\end{figure}
|
|
|
|
\section{Debluring problem [40 points]}
|
|
\subsection{ Solve the debluring problem for the blurred image matrix
|
|
\texttt{B.mat} and transformation matrix \texttt{A.mat} using
|
|
your routine \texttt{myCG} and Matlab's preconditioned conjugate
|
|
gradient \texttt{pcg}. As a preconditioner, use \texttt{ichol}
|
|
to get the incomplete Cholesky factors and set routine type to
|
|
\texttt{nofill} with $\alpha=0.01$ for the diagonal shift (see
|
|
Matlab documentation). Solve the system with both solvers using
|
|
$max\_iter=200$ $tol= 10^{-6}$. Plot the convergence (residual
|
|
vs iteration) of each solver and display the original and final
|
|
deblurred image.}
|
|
|
|
My implementation is in the file \texttt{deblurring.m}. Plots for the original image, the deblurred image from
|
|
\texttt{myCG}, the deblurred image from \texttt{pcg}, and a semi-logarithmic plot on the y-axis of the residuals
|
|
from the two conjugate gradient functions over the iteration count can be found respectively in figure \ref{fig:orig},
|
|
\ref{fig:mycg}, \ref{fig:pcg}, and \ref{fig:rvec}.
|
|
|
|
As a terminating condition for the \texttt{myCG} implementation, I chose to check if the residual divided by the 2-norm of
|
|
$b$ is less than the given tolerance. This mimicks the behaviour of MATLAB's \texttt{pcg} to allow for a better comparison.
|
|
|
|
\begin{figure}[h]
|
|
\begin{subfigure}{0.33\textwidth}
|
|
\centering
|
|
\resizebox{0.8\textwidth}{!}{\input{img_orig}}
|
|
\caption{Original image grayscale matrix}\label{fig:orig}
|
|
\end{subfigure}
|
|
\begin{subfigure}{0.33\textwidth}
|
|
\centering
|
|
\resizebox{0.8\textwidth}{!}{\input{img_my}}
|
|
\caption{Deblurred image using \texttt{myCG}}\label{fig:mycg}
|
|
\end{subfigure}
|
|
\begin{subfigure}{0.33\textwidth}
|
|
\centering
|
|
\resizebox{0.8\textwidth}{!}{\input{img_rcg}}
|
|
\caption{Deblurred image using \texttt{rcg}}\label{fig:pcg}
|
|
\end{subfigure}
|
|
\caption{Blurred and deblurred images}
|
|
\end{figure}
|
|
\begin{figure}[h]
|
|
\centering
|
|
\resizebox{0.6\textwidth}{!}{\input{res_log}}
|
|
\caption{Residuals of \texttt{myCG} (in blue) and \texttt{rcg} (in orange) over iteration count (y axis is a log scale)}\label{fig:rvec}
|
|
\end{figure}
|
|
\subsection{ When would \texttt{pcg} be worth the added computational cost?
|
|
What about if you are debluring lots of images with the same
|
|
blur operator?}
|
|
|
|
The \textit{pcg} algorithm provided by MATLAB would be worth for many deblurring operations useing the same blur operator, since the cost of computing the incomplete cholesky decomposition (i.e. \texttt{ichol}) can be payed only once and thus amortized. \texttt{myCG} is better for few iterations thanks to not needing any seed that is expensive to compute.
|
|
|
|
|
|
\end{document}
|