\documentclass[12pt]{article}

\usepackage[T1]{fontenc} 
\usepackage[ngerman]{babel}
\usepackage{fullpage,amsmath,amsfonts}

\begin{document}

\title{Mathematisches Programmieren}
\author{Sommersemester 2022}
\date{29.06.2022, 06.07.2022, 13.07.2022 und 20.07.2022}
\maketitle

\begin{enumerate}
\item Untersuche die Zerlegung eines Bildes, das als Matrix mit
Grauwertstufen zur Verfügung steht, mit Hilfe der
Singulärwertzerlegung.
\begin{enumerate}
\item Testbilder stehen im "`Scikit Image"' zur Verfügung, z.B.
\begin{verbatim}
  from skimage import data
  I = data.camera()
\end{verbatim}
und können folgenderweise angezeigt werden:
\begin{verbatim}
  figure()
  imshow(I, cmap='binary_r')
  show()
\end{verbatim}
\item Zerlegen Sie das Bild in Singulärwerte und -vektoren (Funktion
\texttt{svd}).  Plotten Sie die Singulärwerte als Funktion ihres
Index.  Was stellen Sie fest?

\item Was passiert, wenn Sie nur die ersten $k$ Singulärwerte
behalten, alle weiteren Singulärwerte zu Null setzen?  Wie sieht das
rekonstruierte Bild aus, wenn $k$ klein bzw.\ groß ist?

\item Schauen Sie sich die verschiedenen "`Eigenbilder"' an, indem Sie
genau einen Singulärwert $1$ setzen, alle anderen auf $0$.  Wie
verändert sich die Struktur der "`Eigenbilder"' mit dem Index $k$?
\end{enumerate}

\item Konstruieren Sie, parallel zur Konstruktion des diskreten
Laplaceoperators im Aufgabenblatt~2, einen Unschärfefilter $A_1$, bei
dem ein Pixelwert mit seinen nächsten Nachbarn auf folgende Weise
gemittelt wird:
\[
  u^{\text{blur}}_{ij}
  = \tfrac12 \, u_{ij} + \tfrac18 \, u_{i,j+1} + \tfrac18 \, u_{i,j-1}
    + \tfrac18 \, u_{i+1,j} + \tfrac18 \, u_{i-1,j} \,.
\]
Die Bilddaten sollen dabei in einen langen eindimensionalen Vektor $x$
verwandelt werden (\texttt{ravel()} oder \texttt{flatten()}) und die
Wirkung des Unschärfeoperators als CSR-\emph{sparse matrix} codiert
werden.  Wenden Sie die Singulärwertzerlegung auf den
Unschärfeoperator an und stellen die Verteilung der Singulärwerte
grafisch dar.  Untersuchen Sie auch höhere Potenzen $A_m = A_1^m$ für
$m \approx 10$.

\item Wenden Sie den Unschärfefilter $A_m$ auf das Bild aus Aufgabe~1a
an, i.e, $b = A_mx$.  Was sehen Sie, wenn Sie $m$ verändern?

\item Rekonstruieren Sie das ursprüngliche Bild aus dem Datenvektor
$b$.  Was passiert, wenn Sie einen Zufallsvektor mit Mittelwert $0$
und sehr kleiner Varianz zu $b$ addieren, bevor Sie das System lösen?

\emph{Hinweis:} Für das volle Testbild mit $512 \times 512$ wird
\texttt{spsolve} zu langsam sein.  Verwenden Sie einen iterativen
Löser wie \texttt{cg} oder \texttt{gmres}.

\item Implementieren Sie die Tychonov-Regularisierung \emph{ohne
explizite Singulärwertzerlegung}.  Was passiert, wenn Sie den
Regularisierungsparameter $\alpha$ verändern?

\emph{Hinweis:} Um hier schnell zu experimentieren, verwenden Sie
einen Ausschnitt des Originalbildes, z.B.
\begin{verbatim}
  I = I[120:170,250:300]
\end{verbatim}

\item Implementieren Sie die Wahl des Regularisierungsparameters nach
dem Diskrepanzprinzip von Morozov.

\emph{Hinweis:} Verwenden Sie \texttt{brent} oder \texttt{ridder} zum
Lösen der nichtlinearen Gleichung und lösen Sie $\alpha = 10^\beta$
mit $\beta$ als unabhängiger Variable und stark reduzierter Toleranz
(z.B.\ \texttt{xtol=0.1}), um Rechenzeit zu sparen.


\end{enumerate}

Geben Sie ihren lauffähigen Code per Email in einem ZIP-Archiv
bis zum 29.07.2022 ab.  Schreiben Sie zu jeder Aufgabe einen kurzen
Kommentar, der die gestellte Frage explizit beantwortet.  Legen Sie
diese Antworten als einfach Textdatei oder Scan einer
handschriftlichen Ausarbeitung bei.

\end{document}
