Kaynağa Gözat

WIP

tags/v2.0
Christos Choutouridis 2 gün önce
ebeveyn
işleme
65fd57a70f
21 değiştirilmiş dosya ile 147 ekleme ve 100 silme
  1. BIN
      Work2/report/Work2_report.pdf
  2. +66
    -40
      Work2/report/Work2_report.tex
  3. +7
    -1
      Work2/scripts/GivenEnv.m
  4. +2
    -2
      Work2/scripts/Script_1_Plots.m
  5. +37
    -27
      Work2/scripts/Script_2_Steepest_descent.m
  6. +0
    -1
      Work2/scripts/Script_3_Newton.m
  7. +0
    -1
      Work2/scripts/Script_4_LevMar.m
  8. BIN
      Work2/scripts/figures/FunctionContour.png
  9. BIN
      Work2/scripts/figures/FunctionPlot.png
  10. BIN
      Work2/scripts/figures/StDes_Iter_o_gamma_2.png
  11. BIN
      Work2/scripts/figures/StDes_fixed_2.png
  12. +0
    -1
      Work2/scripts/gamma_armijo.m
  13. +1
    -1
      Work2/scripts/gamma_fixed.m
  14. +0
    -1
      Work2/scripts/gamma_minimized.m
  15. +0
    -1
      Work2/scripts/method_lev_mar.m
  16. +0
    -1
      Work2/scripts/method_newton.m
  17. +0
    -1
      Work2/scripts/method_steepest_descent.m
  18. +4
    -1
      Work2/scripts/plot3dFun.m
  19. +4
    -1
      Work2/scripts/plotContour.m
  20. +13
    -10
      Work2/scripts/plotItersOverGamma.m
  21. +13
    -10
      Work2/scripts/plotPointsOverContour.m

BIN
Work2/report/Work2_report.pdf Dosyayı Görüntüle


+ 66
- 40
Work2/report/Work2_report.tex Dosyayı Görüntüle

@@ -34,6 +34,10 @@
\usepackage{tabularx}
\usepackage{array}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsmath}

\usepackage{float}

\begin{document}

@@ -59,21 +63,26 @@
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Work2}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
\end{itemize}


\section{Προγραμματιστική προσέγγιση}
Για τον προγραμματισμό και εκτέλεση των μεθόδων της παρούσας εργασίας έγινε χρήση της MATLAB.
Στον κατάλογο \textbf{scripts}, περιέχονται όλες οι μέθοδοι και οι τεχνικές υπολογισμού βημάτων με τη μορφή συναρτήσεων καθώς και scripts που τις καλούν.
Για κάθε μία μέθοδο (ένα θέμα της εργασίας), υπάρχει το αντίστοιχο script που περιέχει τους υπολογισμούς, τις κλήσεις των μεθόδων και τη δημιουργία των διαγραμμάτων.
Για το πρώτο θέμα το αρχείο Script\_1\_Plots.m για το δεύτερο το Script\_2\_Steepest\_descent.m και ούτω καθεξής.
Στην παρούσα εργασία η υλοποίηση του κώδικα ακολουθεί την τεχνική της προηγούμενης εργασίας και “ομαδοποιεί” αρκετές λειτουργίες.
Πιο συγκεκριμένα.

\subsection{Πολυμορφική κλήση μεθόδων}
\subsection{Κλήση μεθόδων επιλογής βήματος $\gamma_k$}
\label{subsec:polymorphic-calls}
...
Δεδομένου ότι οι μέθοδοι θα πρέπει να καλεστούν και εκτελεστούν με παραπάνω από μία τεχνική επιλογής βήματος $\gamma_k$, δημιουργήσαμε εσωτερικά της κάθε μεθόδου ένα κοινό interface για τις μεθόδους επιλογής βήματος.
Αυτό έχει τη μορφή: \textit{\textbf{gamma\_<method>(f, grad\_f, x0)}}, όπου το \textbf{f} είναι η αντικειμενική συνάρτηση, \textbf{grad\_f} η συνάρτηση κλίσης και \textbf{x0} το σημείο ενδιαφέροντος.
Για την κάθε μία από αυτές δημιουργήσαμε ξεχωριστή συνάρτηση που υλοποιεί το παραπάνω interface.
Μία για σταθερό βήμα, μία για επιλογή βήματος που ελαχιστοποιεί την $f(x_k + \gamma_k d_k)$ και μία με τη μέθοδο Armijo.
Για την επιλογή και κλήση των μεθόδων επιλογής βήματος εισαγάγαμε μία νέα παράμετρο string που χρησιμοποιείται ως enumerator και με βάση αυτή γίνεται η τελική επιλογή.
Έτσι για παράδειγμα η κλήση \textit{method\_newtown(f, gradf, [0, 0], 0.001, 1000, 'armijo')} υλοποιεί τη μέθοδο newton χρησιμοποιώντας τη μέθοδο Armijo για επιλογή βήματος ενώ η \textit{method\_newtown(f, gradf, [0, 0], 0.001, 1000, 'minimized')}, χρησιμοποιεί βήμα που ελαχιστοποιεί την $f(x_k + \gamma_k d_k)$.

\subsection{Symbolic expression functions}
Μία ακόμη προγραμματιστική τεχνική που ακολουθήθηκε είναι η χρήση \textbf{symbolic expression} για την αναπαράσταση των διαφορετικών αντικειμενικών συναρτήσεων.
Ο λόγος που επιλέχθηκε είναι η \textbf{δυνατότητα εξαγωγής ενός symbolic expression που αναπαριστά την κλήση $\nabla f$ και τον Εσσιανό $\nabla^2f$ μιας συνάρτησης} από την MATLAB, κάνοντας χρήση των εντολών \textit{gradient()} και \textit{hessian()}.
Ο λόγος που επιλέχθηκε είναι η \textbf{δυνατότητα εξαγωγής ενός symbolic expression που αναπαριστά την κλίση $\nabla f$ και τον Εσσιανό $\nabla^2f$ μιας συνάρτησης} από την MATLAB, κάνοντας χρήση των εντολών \textit{gradient()} και \textit{hessian()}.
Αν αντίθετα χρησιμοποιούσαμε απλές συναρτήσεις, πολυώνυμα ή lambdas για την αναπαράσταση των αντικειμενικών συναρτήσεων, τότε για τον υπολογισμό της κλίσης και του Εσσιανού θα έπρεπε:
\begin{itemize}
\item Είτε να υπολογίζαμε αριθμητικά τις παραγώγους gradient και hessian μέσα στις μεθόδους, κάτι που θα εισήγαγε \textit{\textbf{αχρείαστο αριθμητικό σφάλμα}}.
@@ -81,11 +90,10 @@
\end{itemize}
Η αναπαράσταση όμως με χρήση symbolic expression είναι πιο “βαριά” όταν χρειάζεται να υπολογίσουμε την τιμή μιας συνάρτησης σε κάποιο σημείο (subs(expr, number)).
Αυτό είναι κάτι που χρειάζεται εκτενώς στον κώδικά μας.
Για το λόγο αυτό, ενώ η συνάρτηση δίνεται ως symbolic expression και μέσω αυτής υπολογίζονται αυτόματα η κλήση, ο Εσσιανός αλλά και οι “κανονικές” συναρτήσεις MATLAB που τις υλοποιούν.
Για το λόγο αυτό, ενώ η συνάρτηση δίνεται ως symbolic expression, μέσω αυτής υπολογίζονται αυτόματα η κλίση, ο Εσσιανός αλλά και οι “κανονικές” συναρτήσεις MATLAB που τις υλοποιούν.
Έτσι έχουμε την ακριβή αναπαράσταση της κλίσης και του Εσσιανού ως συναρτήσεις χωρίς να πληρώνουμε το κόστος της subs().

\section{Απεικόνιση της συνάρτησης}

Η συνάρτηση με την οποία ασχολούμαστε στην παρούσα εργασία είναι η:
\boldmath
\begin{equation}
@@ -93,53 +101,71 @@
\end{equation}
\label{eq:ObjectiveFunction}
\unboldmath
Στο παρακάτω σχήμα \ref{fig:plot3dFunction} φαίνεται η τρισδιάστατη απεικόνιση της συνάρτησης.
\InsertFigure{!h}{0.8}{fig:plot3dFunction}{../scripts/figures/FunctionPlot.png}{Γραφική παράσταση της f}

Στο παρακάτω σχήμα φαίνεται η τρισδιάστατη απεικόνιση της συνάρτησης.
\InsertFigure{0.8}{fig:plot3dFunction}{../scripts/figures/FunctionPlot.png}{Γραφική παράσταση της f}

Από το σχήμα μπορούμε πολύ εύκολα να διακρίνουμε ότι η συνάρτηση έχει ένα ευκρινές μέγιστο και ένα ελάχιστο στο διάστημα $\chi, \psi \in [-3, 3]$.
Από το σχήμα μπορούμε πολύ εύκολα να διακρίνουμε ότι η συνάρτηση έχει ένα ευκρινές μέγιστο και ένα ελάχιστο στο διάστημα $x,y \in [-3, 3]$.
Για να πάρουμε μια καλύτερη αίσθηση για το που βρίσκονται αυτά τα τοπικά ακρότατα, παρακάτω παραθέτουμε ένα γράφημα με τις ισοβαρείς καμπύλες της $f$.
\InsertFigure{0.8}{fig:plotContour}{../scripts/figures/FunctionContour.png}{Ισοβαρείς της f}

Έτσι, από το σχήμα \ref{fig:plotContour} φαίνεται ότι το ελάχιστο της f βρίσκεται στο αρνητικό ημιεπίπεδο των χ, κοντά στο $\psi = 0$
\InsertFigure{H}{0.8}{fig:plotContour}{../scripts/figures/FunctionContour.png}{Ισοβαρείς της f}

Από το παραπάνω σχήμα \ref{fig:plotContour} φαίνεται ότι το ελάχιστο της f βρίσκεται στο αρνητικό ημιεπίπεδο των χ, κοντά στο $y = 0$
\par
Τα διαγράμματα για τη μέθοδο δημιουργούνται εκτελώντας το αρχείο \textbf{Script\_1\_Plots.m}

\section{Τεχνικές υπολογισμού βήματος}
Πριν προχωρήσουμε στα επόμενα θέματα της εργασίας και στην ανάλυση των μεθόδων υπολογισμού του ελάχιστου, θέλουμε να αναφερθούμε στις διαφορετικές τεχνικές επιλογής βήματος $\gamma_k$ και ειδικότερα για αυτή της ελαχιστοποίησης της $f(x_k + \gamma_k d_k)$ και την Armijo.

Πριν προχωρήσουμε στα επόμενα θέματα και στην ανάλυση των μεθόδων υπολογισμού του ελάχιστου, θέλουμε να αναφερθούμε στις διαφορετικές τεχνικές επιλογής βήματος $\gamma_k$.
\subsection{Ελαχιστοποίηση της $f(x_k + \gamma_k d_k)$}
Η μέθοδος αυτή αναζητά την τιμή $\gamma_k$ που ελαχιστοποιεί την τιμή της συνάρτησης κατά μήκος της κατεύθυνσης $d_k$.
Δηλαδή, λύνουμε το μονοδιάστατο πρόβλημα:
\boldmath
\[\displaystyle \min{\gamma_k} f(x_k + \gamma_k d_k) \]
Η κατεύθυνση $d_k$ μπορεί να είναι:
\begin{itemize}
\item Η αρνητική κλίση $-\nabla f(x_k)$ (Steepest Descent).
\item Η Newton direction $-{H_k}^{-1} \nabla f(x_k)$ (Newton και Levenberg-Marquardt).
\end{itemize}
\unboldmath
Πλεονεκτήματα της μεθόδου είναι η \textbf{ακρίβεια}, καθώς το βήμα $\gamma_k$ υπολογίζεται με βέλτιστο τρόπο για τη συγκεκριμένη κατεύθυνση και η \textbf{γρήγορη σύγκλιση}, ειδικά σε προβλήματα όπου η $f(x)$ είναι καμπυλωτή με $\gamma_k$ επακριβώς ορισμένο.
Στα μειονεκτήματα μπορούμε να αναφέρουμε το \textbf{υπολογιστικό κόστος}, καθώς ο υπολογισμός του $\gamma_k$ απαιτεί πολλαπλές αξιολογήσεις της $f(x)$.

%Σχόλια για τον Armijo Rule και τη μέθοδο ελαχιστοποίησης του γkγk​
%Armijo Rule
%
%Η Armijo Rule είναι μία μέθοδος για την επιλογή βήματος γkγk​ σε αλγόριθμους καθόδου (descent methods). Στόχος είναι να διασφαλιστεί ότι το βήμα που θα επιλεγεί μειώνει την αντικειμενική συνάρτηση σημαντικά, αλλά και να αποφευχθεί πολύ μικρό βήμα που οδηγεί σε αργή σύγκλιση. Ο κανόνας αυτός υλοποιείται ως εξής:
%
%Ξεκινάμε με μια αρχική τιμή για το γkγk​ (συνήθως γk=1γk​=1).
%Ελέγχουμε τη συνθήκη:
%f(xk−γk∇f(xk))≤f(xk)−σγk∥∇f(xk)∥2
%f(xk​−γk​∇f(xk​))≤f(xk​)−σγk​∥∇f(xk​)∥2 όπου σ∈(0,1)σ∈(0,1) είναι μια σταθερά (τυπικά κοντά στο 0.1).
%Αν η συνθήκη δεν ικανοποιείται, μειώνουμε το γkγk​ (π.χ., γk=β⋅γkγk​=β⋅γk​ με β∈(0,1)β∈(0,1)) και επαναλαμβάνουμε.
%
%Η Armijo Rule εγγυάται ότι το βήμα είναι "αρκετά καλό" για να μειώσει τη συνάρτηση, ενώ αποφεύγει την υπερβολική μείωση του γkγk​.
\subsection{Armijo rule}
Η Armijo rule είναι μια προσαρμοστική τεχνική που επιλέγει το $\gamma_k$ για να εξασφαλίσει επαρκή μείωση της συνάρτησης.
Η βασική ιδέα είναι ότι η συνάρτηση πρέπει να μειώνεται "αρκετά" σε κάθε βήμα, χωρίς να χρειάζεται να υπολογίζεται το ακριβές ελάχιστο.
Η συνθήκη του Armijo είναι:
\boldmath
\[ f(x_k + \gamma_k d_k) \leq f(x_k) + \sigma\gamma_k\nabla f(x_k)^Td_k\]
Όπου $\sigma \in (0,1)$ είναι μια σταθερά (τυπικά $\sigma = 0.1$) και $\gamma_k$ αρχικά να ορίζεται ως 1 και να μειώνεται προοδευτικά (π.χ., $\gamma_k = \beta \cdot \gamma_k$) έως ότου ικανοποιηθεί η συνθήκη.
\unboldmath
\par
Πλεονεκτήματα της μεθόδου είναι η \textbf{σταθερότητα}, καθώς αποτρέπει πολύ μεγάλα βήματα που μπορεί να αυξήσουν την τιμή της $f(x)$, αλλά και η \textbf{ανθεκτικότητα}, καθώς λειτουργεί καλά ακόμα και όταν η $f(x)$ δεν συμπεριφέρεται πολύ καλά.
Στα μειονεκτήματα μπορούμε να αναφέρουμε την \textbf{εξάρτησή της από τις παραμέτρους} \boldmath $\sigma$ και $\beta$\unboldmath, μια κακή επιλογή των οποίων μπορεί να οδηγήσει σε αργή σύγκλιση.

\section{Μέθοδος Μέγιστης Καθόδου - Steepest Descent}
Η πρώτη μέθοδος που χρησιμοποιούμε στην εργασία (Θέμα 2), είναι η μέθοδος μέγιστης καθόδου.
Είναι μια μέθοδος πρώτης τάξης που χρησιμοποιεί την κατεύθυνση της αρνητικής κλίσης $\nabla f(x,y)$ της $f$ ως κατεύθυνση καθόδου.
Η μέθοδος θεωρείται βασική και συχνά χρησιμοποιείται ως εισαγωγή στις μεθόδους βελτιστοποίησης.
\par
Η μέθοδος επιλέγει την κατεύθυνση $d_k = -\nabla f(x_k)$, η οποία είναι η κατεύθυνση της μέγιστης τοπικής μείωσης της συνάρτησης.
Στη συνέχεια, υπολογίζεται το βήμα $\gamma_k$​ για να βρεθεί το επόμενο σημείο $x_{k+1} = x_k + \gamma_k d_k$.
Για να χρησιμοποιήσουμε τη μέθοδο, η συνάρτηση $f$ \textbf{πρέπει να είναι συνεχής και διαφορίσιμη} και η κλίση $\nabla f$ να είναι υπολογίσιμη.
Επίσης για την εφαρμογή της μεθόδου το αρχικό σημείο θα πρέπει να \textbf{μην είναι ακρότατο} της $f$, δηλαδή \boldmath$\nabla f(x_0) \neq 0$\unboldmath.
\par
Όλοι οι υπολογισμοί και τα διαγράμματα για τη μέθοδο βρίσκονται στο αρχείο \textbf{Script\_2\_Steepest\_descent.m}

Γενικές Πληροφορίες: Είναι μια μέθοδος πρώτης τάξης που χρησιμοποιεί την κατεύθυνση της αρνητικής κλίσης (gradient) της συνάρτησης f(x)f(x) ως κατεύθυνση καθόδου. Η μέθοδος θεωρείται βασική και συχνά χρησιμοποιείται ως εισαγωγή στις μεθόδους βελτιστοποίησης.
Περιγραφή: Η μέθοδος επιλέγει την κατεύθυνση dk=−∇f(xk)dk​=−∇f(xk​), η οποία είναι η κατεύθυνση της μέγιστης τοπικής μείωσης της συνάρτησης. Στη συνέχεια, υπολογίζεται το βήμα γkγk​ για να βρεθεί το επόμενο σημείο xk+1=xk+γkdkxk+1​=xk​+γk​dk​.
Απαιτήσεις: Η συνάρτηση f(x)f(x) πρέπει να είναι συνεχής και διαφορίσιμη. Η κλίση ∇f(x)∇f(x) πρέπει να είναι υπολογίσιμη.
Περιορισμοί:

Αργή σύγκλιση όταν η συνάρτηση έχει πολύ διαφορετικές κλίσεις σε διαφορετικές κατευθύνσεις (π.χ., σε επιμήκη κοιλάδα).
Δεν μπορεί να εκμεταλλευτεί τη δεύτερη τάξη πληροφοριών (Hessian).

Πλεονεκτήματα:
\subsection{Σημείο εκκίνησης (0,0)}
Για το σημείο (0, 0) η κλίση της $f$ είναι: $\nabla f(0,0) = \begin{bmatrix} 0 \\ 0 \end{bmatrix}$, με αποτέλεσμα η μέθοδος να μην μπορεί να εφαρμοστεί για κανένα τρόπο υπολογισμού βήματος.

Απλή στην υλοποίηση.
Λειτουργεί καλά για καλά κλιμακούμενες συναρτήσεις.
\subsection{Σημείο εκκίνησης (-1,1)}
Για το σημείο (-1, 1) η τιμή της $f$ είναι: $f(-1, 1) = -0.135335$ και η τιμή της κλίσης: $\nabla f(0,0) = \begin{bmatrix} 0.4060 \\ 0.2707 \end{bmatrix}$.
Επιλέγοντας ακρίβεια $\epsilon = 0.0001$, εκτελούμε την μέθοδο method\_steepest\_descent() και υπολογίζουμε τον αριθμό επαναλήψεων για διαφορετικές τιμές $\gamma_k$.
\InsertFigure{H}{0.8}{fig:point2ItersOverGamma}{../scripts/figures/StDes_Iter_o_gamma_2.png}{Αριθμός επαναήψεων για διαφορετικές τιμές $\gamma_k [Μέγιστη Κάθοδος]$}.

Μειονεκτήματα:
Στο παραπάνω σχήμα \ref{fig:point2ItersOverGamma} παρατηρούμε ότι για τιμές του $\gamma_k > 0.61$ η μέθοδος αποκλίνει.
Από την παραπάνω διαδικασία επίσης υπολογίζουμε το $\gamma_k = 0,46768$ για το οποίο η μέθοδος συγκλίνει με τα λιγότερα βήματα.
Στο παρακάτω σχήμα \ref{ref:StDes_fixed_2}

Αργή σε κυρτές συναρτήσεις με στενά ελάχιστα.
Δεν εγγυάται την ταχύτερη σύγκλιση.
\InsertFigure{H}{0.8}{StDes_fixed_2}{../scripts/figures/StDes_fixed_2.png}{Σύγκλιση της μεθόδου}.

\section{Μέθοδος Newton}



+ 7
- 1
Work2/scripts/GivenEnv.m Dosyayı Görüntüle

@@ -19,4 +19,10 @@ hessian_fun = matlabFunction(hessian_fexpr, 'Vars', [x, y]); % Hessian
global amijo_beta amijo_sigma
%fixed step size globals
global gamma_fixed_step
global gamma_fixed_step
global image_width,
global image_height;
image_width = 960;
image_height = 640;

+ 2
- 2
Work2/scripts/Script_1_Plots.m Dosyayı Görüntüle

@@ -2,8 +2,8 @@
GivenEnv

%
% We plot the function in the domain of x in [-3, 3] and y in [-3, 3].
% We also plot the contour in order to get a senso of the min and maximum
% We plot the function in the domain of x,y in [-3, 3].
% We also plot the contour in order to get a sense of the min and maximum
% points in the x-y plane
%



+ 37
- 27
Work2/scripts/Script_2_Steepest_descent.m Dosyayı Görüntüle

@@ -10,43 +10,53 @@ amijo_beta = 0.5; % Armijo reduction factor
amijo_sigma = 0.1; % Armijo condition constant

% Point x0 = (0, 0)
% x0 = [0, 0];
point = 1;
x0 = [0, 0];
f = fun(x0(1), x0(2));
gf = grad_fun(x0(1), x0(2));
hf = hessian_fun(x0(1), x0(2));
fprintf('Initial point (%d, %d), f = %f, grad = [%f;%f], hessian = [%f %f ; %f %f]. Can not use method\n\n', x0, f, gf, hf);

% Points x0 = (-1, 1), (1, -1)
%x0s = [-1, 1 ; 1, -1]; % Initial points

% Point x0 = (-1, 1)
point = 2;
x0 = [-1, 1];
point_str = "[" + x0(1) + ", " + x0(2) + "]";

f = fun(-1, 1);
gf = grad_fun(x0(1), x0(2));
hf = hessian_fun(x0(1), x0(2));
fprintf('Initial point (%d, %d), f = %f, grad = [%f;%f], hessian = [%f %f ; %f %f]. Can use method\n', x0, f, gf, hf);

% Find the best fixed gamma
k = zeros(100, 1);
j = 1;
n = linspace(0.1, 1.5, 100);
for g = n
gamma_fixed_step = g;
[~, ~, k(j)] = method_steepest_descent(fun, grad_fun, x0, tol, max_iter, 'fixed');
j = j + 1;
end
plotItersOverGamma(n, k, "Iteration for different $\gamma$ values", "figures/StDes_Iter_o_gamma_" + point + ".png");

[~, j] = min(k);
gamma_fixed_step = n(j);

% Point x0 = (0, 0)
x0s = [-1, 1 ; 1, -1]; % Initial points
for i = 1:size(x0s, 1)
x0 = x0s(i, :);
point_str = "[" + x0(1) + ", " + x0(2) + "]";

% Find the best fixed gamma
k = zeros(100, 1);
j = 1;
n = linspace(0.1, 1.5, 100);
for g = n
gamma_fixed_step = g;
[~, ~, k(j)] = steepest_descent(fun, grad_fun, x0, tol, max_iter, 'fixed');
j = j + 1;
end
plotIterationsOverGamma(n, k, "Iteration for different $\gamma$ values", "StDes_Iter_o_gamma_" + i + ".png");

[~, j] = min(k);
gamma_fixed_step = n(j);

[x_fixed, f_fixed, kk] = steepest_descent(fun, grad_fun, x0, tol, max_iter, 'fixed');
fprintf('Fixed step: Initial point (%f, %f), steps:%d, Final (x,y)=(%f, %f), f(x,y)=%f\n', x0, kk, x_fixed(end, :), f_fixed(end));
plotPointsOverContour(x_fixed, fun, [-2, 2], [-2, 2], 100, point_str + ": Steepest descent $\gamma$ = " + gamma_fixed_step, "StDes_fixed_" + i + ".png");
[x_fixed, f_fixed, kk] = method_steepest_descent(fun, grad_fun, x0, tol, max_iter, 'fixed');
fprintf('Fixed step: Initial point (%f, %f), steps:%d, Final (x,y)=(%f, %f), f(x,y)=%f\n', x0, kk, x_fixed(end, :), f_fixed(end));
plotPointsOverContour(x_fixed, fun, [-2, 0], [-2, 2], 100, point_str + ": Steepest descent $\gamma$ = " + gamma_fixed_step, "figures/StDes_fixed_" + point + ".png");


% Minimized f
[x_minimized, f_minimized, kk] = steepest_descent(fun, grad_fun, x0, tol, max_iter, 'minimized');
[x_minimized, f_minimized, kk] = method_steepest_descent(fun, grad_fun, x0, tol, max_iter, 'minimized');
fprintf('Minimized f(g): Initial point (%f, %f), steps:%d, Final (x,y)=(%f, %f), f(x,y)=%f\n', x0, kk, x_minimized(end, :), f_minimized(end));
plotPointsOverContour(x_minimized, fun, [-2, 2], [-2, 2], 100, point_str + ": Steepest descent minimized $f(x_k + \gamma_kd_k)$", "StDes_minimized_" + i + ".png");


% Armijo Rule
[x_armijo, f_armijo, kk] = steepest_descent(fun, grad_fun, x0, tol, max_iter, 'armijo');
[x_armijo, f_armijo, kk] = method_steepest_descent(fun, grad_fun, x0, tol, max_iter, 'armijo');
fprintf('Armijo step: Initial point (%f, %f), steps:%d, Final (x,y)=(%f, %f), f(x,y)=%f\n', x0, kk, x_armijo(end, :), f_armijo(end));
plotPointsOverContour(x_armijo, fun, [-2, 2], [-2, 2], 100, point_str + ": Steepest descent Armijo method", "StDes_armijo_" + i + ".png");
end


+ 0
- 1
Work2/scripts/Script_3_Newton.m Dosyayı Görüntüle

@@ -49,4 +49,3 @@ for i = 1:size(x0s, 1)
fprintf('Armijo step: Initial point (%f, %f), steps:%d, Final (x,y)=(%f, %f), f(x,y)=%f\n', x0, kk, x_armijo(end, :), f_armijo(end));
plotPointsOverContour(x_armijo, fun, [-2, 2], [-3, 3], 100, point_str + ": Newton Armijo method", "Newton_armijo_" + i + ".png");
end


+ 0
- 1
Work2/scripts/Script_4_LevMar.m Dosyayı Görüntüle

@@ -51,4 +51,3 @@ for i = 1:size(x0s, 1)
fprintf('Armijo step: Initial point (%f, %f), steps:%d, Final (x,y)=(%f, %f), f(x,y)=%f\n', x0, kk, x_armijo(end, :), f_armijo(end));
plotPointsOverContour(x_armijo, fun, [-2, 2], [-3, 3], 100, point_str + ": LevMar Armijo method", "LevMar_armijo_" + i + ".png");
end


BIN
Work2/scripts/figures/FunctionContour.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 2969  |  Yükseklik: 2957  |  Boyut: 91 KiB Genişlik: 2880  |  Yükseklik: 1920  |  Boyut: 73 KiB

BIN
Work2/scripts/figures/FunctionPlot.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 2969  |  Yükseklik: 2957  |  Boyut: 401 KiB Genişlik: 2880  |  Yükseklik: 1920  |  Boyut: 255 KiB

BIN
Work2/scripts/figures/StDes_Iter_o_gamma_2.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 2880  |  Yükseklik: 1920  |  Boyut: 54 KiB

BIN
Work2/scripts/figures/StDes_fixed_2.png Dosyayı Görüntüle

Önce Sonra
Genişlik: 2904  |  Yükseklik: 1929  |  Boyut: 95 KiB

+ 0
- 1
Work2/scripts/gamma_armijo.m Dosyayı Görüntüle

@@ -23,4 +23,3 @@ function [gamma] = gamma_armijo(f, grad_f, x0)
end

end


+ 1
- 1
Work2/scripts/gamma_fixed.m Dosyayı Görüntüle

@@ -9,4 +9,4 @@ function [gamma] = gamma_fixed(~, ~, ~)
% Perform line search
gamma = gamma_fixed_step;

end
end

+ 0
- 1
Work2/scripts/gamma_minimized.m Dosyayı Görüntüle

@@ -16,4 +16,3 @@ function [gamma] = gamma_minimized(f, grad_f, x0)
% ToDo: Check if we can use fmin_bisection_der
% from the previous assigment here!
end


+ 0
- 1
Work2/scripts/method_lev_mar.m Dosyayı Görüntüle

@@ -46,4 +46,3 @@ function [x_vals, f_vals, k] = method_lev_mar(f, grad_f, hessian_f, m, x0, tol,
f_vals = [f_vals; f_next]; % Store function values
end
end


+ 0
- 1
Work2/scripts/method_newton.m Dosyayı Görüntüle

@@ -45,4 +45,3 @@ function [x_vals, f_vals, k] = method_newton(f, grad_f, hessian_f, x0, tol, max_
f_vals = [f_vals; f_next]; % Store function values
end
end


+ 0
- 1
Work2/scripts/method_steepest_descent.m Dosyayı Görüntüle

@@ -41,4 +41,3 @@ function [x_vals, f_vals, k] = method_steepest_descent(f, grad_f, x0, tol, max_i
f_vals = [f_vals; f_next]; % Store function values
end
end


+ 4
- 1
Work2/scripts/plot3dFun.m Dosyayı Görüntüle

@@ -7,6 +7,9 @@ function plot3dFun(fun, x_lim, y_lim, size, plot_title, filename)
% plot_title: The latex title for the plot
%

global image_width,
global image_height;

% Generate a grid for x and y
x_space = linspace(x_lim(1), x_lim(2), size);
y_space = linspace(y_lim(1), y_lim(2), size);
@@ -17,7 +20,7 @@ function plot3dFun(fun, x_lim, y_lim, size, plot_title, filename)
% 3D plot
figure('Name', 'f(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
surf(X, Y, Z);
% Customize the plot


+ 4
- 1
Work2/scripts/plotContour.m Dosyayı Görüntüle

@@ -7,6 +7,9 @@ function plotContour(fun, x_lim, y_lim, size, plot_title, filename)
% plot_title: The latex title for the plot
%

global image_width,
global image_height;

% Generate a grid for x and y
x_space = linspace(x_lim(1), x_lim(2), size);
y_space = linspace(y_lim(1), y_lim(2), size);
@@ -17,7 +20,7 @@ function plotContour(fun, x_lim, y_lim, size, plot_title, filename)
% Contour
figure('Name', 'Contours of f(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
contour(X, Y, Z);
% Customize the plot


+ 13
- 10
Work2/scripts/plotItersOverGamma.m Dosyayı Görüntüle

@@ -1,16 +1,19 @@
function plotItersOverGamma(gamma, iterations, plot_title, filename)
% 3D plots a function
% fun: The points to plot
% contur_fun: The function for contour plot
% x_lim: The range for x axis. ex: [-2, 2]
% y_lim: The range for y axis. ex: [0, 2]
% size: The number of points for each axis
% plot_title: The latex title for the plot
% filename: The filename to save the plot (if exists)
%
% 3D plots a function
% fun: The points to plot
% contur_fun: The function for contour plot
% x_lim: The range for x axis. ex: [-2, 2]
% y_lim: The range for y axis. ex: [0, 2]
% size: The number of points for each axis
% plot_title: The latex title for the plot
% filename: The filename to save the plot (if exists)
%
global image_width,
global image_height;

figure('Name', 'Iterations_over_gamma', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
plot(gamma, iterations, '*r', 'LineWidth', 2);

% Customize the plot


+ 13
- 10
Work2/scripts/plotPointsOverContour.m Dosyayı Görüntüle

@@ -1,13 +1,16 @@
function plotPointsOverContour(points, contour_fun, x_lim, y_lim, size, plot_title, filename)
% 3D plots a function
% points: The points to plot
% contur_fun: The function for contour plot
% x_lim: The range for x axis. ex: [-2, 2]
% y_lim: The range for y axis. ex: [0, 2]
% size: The number of points for each axis
% plot_title: The latex title for the plot
% filename: The filename to save the plot (if exists)
%
% 3D plots a function
% points: The points to plot
% contur_fun: The function for contour plot
% x_lim: The range for x axis. ex: [-2, 2]
% y_lim: The range for y axis. ex: [0, 2]
% size: The number of points for each axis
% plot_title: The latex title for the plot
% filename: The filename to save the plot (if exists)
%
global image_width,
global image_height;

% Generate a grid for x and y
x_space = linspace(x_lim(1), x_lim(2), size);
@@ -19,7 +22,7 @@ function plotPointsOverContour(points, contour_fun, x_lim, y_lim, size, plot_tit
% 2D plot
figure('Name', '(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
plot(points(:, 1), points(:, 2), '-or');
hold on
contour(X, Y, Z);


Yükleniyor…
İptal
Kaydet