Laden Sie das Bild puppy.png mit PIL.Image.open
und
lassen Sie es sich mit plt.imshow
anzeigen. Das Bild ist
offenbar etwas verrauscht. Wir würden gerne ein schöneres Bild
rekonstruieren, was auf das folgende Optimierungsproblem
hinausläuft:
\[f(x) = \sum_{i,j}\left ( \sqrt{(x_{i,j} - y_{i,j})^2 +1} + \frac{1}{2} \sqrt{(x_{i,j} - x_{i+1,j})^2 + (x_{i,j} - x_{i,j+1})^2 +1} \right )\]
wobei y_ij
die gemessenen Bildpixel darstellen und
x_ij
die Bildpixel des verbesserten Bildes.
i=1, j=2
und i=0, j=2
. Das gleiche gilt in y -
Richtung.x=y
(kopieren Sie das
Eingangsbild am besten). Optimieren Sie für 200 Iterationen. Bestimmen
Sie die Schrittweite wieder mit Backtracking Line Search. Speichern Sie
die gewählte Schrittweite bei jeder Iteration und lassen Sie sich die
Schrittweiten über die Iterationen später anzeigen. Verfolgen Sie auch
die Konvergenz (also den Funktionswert über die Iterationen) und schauen
Sie, wie sich die Lösung x
in Form des Bildes über die
Iterationen verändert.Nun sollen Sie eines der komplexeren, von der
Scipy Optimize
Bibliothek zur Verfügung gestellten
Verfahren ausprobieren. Finden Sie dazu zunächst online heraus, wie Sie
die Funktion und ihren Gradienten übergeben können und welche Verfahren
die Bibliothek anbietet. Stöbern Sie ruhig eine Weile. Bedenken Sie,
dass wir es hier mit einem nichtlinearen Problem ohne Nebenbedingungen
zu tun haben.
epsilon = 0.02
als Toleranzf(x)
) mit Ihrem Verfahren aus Aufgabe 1.More info at: - Hinweis 1 - Hinweis 2 - Hinweis 3
Implementieren Sie dabei alle Stub-Methoden definiert in
part1.py
. Die Signaturen von diesen Methoden dürfen nicht
geändert werden, weil die Abgaben demnächst mit Hilfe von
automatisierten Tests evaluiert werden.
In dieser Übung sollen Sie ein Least-Squares Optimierungsproblem lösen, indem Sie eine eindiminsionale Kurve an die Datenpunkte anpassen.
Die Datenpunkte x_values
, h_values
finden
Sie in der Datei part2.py
. Visualizieren Sie diese mit
matplotlib
.
Die Zielfunktion hat die Form \(y=p_1e^{p_2x}\). Sie sollen das Gauss-Newton-Verfahren anwenden, um die optimalen Werte für die Parameter \(p_1\) und \(p_2\) zu finden.
In jeder Iteration ist ein lineares Gleichungssystem zu lösen. Dafür
können Sie die numpy.linalg.solve
Funktion verwenden.
[1, 1]
ist ein guter Startpunkt für diese Aufgabe. Brechen
Sie die Iterationen ab, sobald die Abbruchbedingung \(||x_{k+1}-x_k||_2^2<\epsilon\) mit \(\epsilon=10^{-4}\) erfüllt ist.