瀏覽代碼

WIP

tags/v2.0
Christos Choutouridis 4 月之前
父節點
當前提交
65fd57a70f
共有 21 個檔案被更改,包括 147 行新增100 行删除
  1. 二進制
      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. 二進制
      Work2/scripts/figures/FunctionContour.png
  9. 二進制
      Work2/scripts/figures/FunctionPlot.png
  10. 二進制
      Work2/scripts/figures/StDes_Iter_o_gamma_2.png
  11. 二進制
      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

二進制
Work2/report/Work2_report.pdf 查看文件


+ 66
- 40
Work2/report/Work2_report.tex 查看文件

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

\usepackage{float}


\begin{document} \begin{document}


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



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


\subsection{Πολυμορφική κλήση μεθόδων} \subsection{Κλήση μεθόδων επιλογής βήματος $\gamma_k$}
\label{subsec:polymorphic-calls} \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} \subsection{Symbolic expression functions}
Μία ακόμη προγραμματιστική τεχνική που ακολουθήθηκε είναι η χρήση \textbf{symbolic expression} για την αναπαράσταση των διαφορετικών αντικειμενικών συναρτήσεων. Μία ακόμη προγραμματιστική τεχνική που ακολουθήθηκε είναι η χρήση \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 για την αναπαράσταση των αντικειμενικών συναρτήσεων, τότε για τον υπολογισμό της κλίσης και του Εσσιανού θα έπρεπε: Αν αντίθετα χρησιμοποιούσαμε απλές συναρτήσεις, πολυώνυμα ή lambdas για την αναπαράσταση των αντικειμενικών συναρτήσεων, τότε για τον υπολογισμό της κλίσης και του Εσσιανού θα έπρεπε:
\begin{itemize} \begin{itemize}
\item Είτε να υπολογίζαμε αριθμητικά τις παραγώγους gradient και hessian μέσα στις μεθόδους, κάτι που θα εισήγαγε \textit{\textbf{αχρείαστο αριθμητικό σφάλμα}}. \item Είτε να υπολογίζαμε αριθμητικά τις παραγώγους gradient και hessian μέσα στις μεθόδους, κάτι που θα εισήγαγε \textit{\textbf{αχρείαστο αριθμητικό σφάλμα}}.
@@ -81,11 +90,10 @@
\end{itemize} \end{itemize}
Η αναπαράσταση όμως με χρήση symbolic expression είναι πιο “βαριά” όταν χρειάζεται να υπολογίσουμε την τιμή μιας συνάρτησης σε κάποιο σημείο (subs(expr, number)). Η αναπαράσταση όμως με χρήση symbolic expression είναι πιο “βαριά” όταν χρειάζεται να υπολογίσουμε την τιμή μιας συνάρτησης σε κάποιο σημείο (subs(expr, number)).
Αυτό είναι κάτι που χρειάζεται εκτενώς στον κώδικά μας. Αυτό είναι κάτι που χρειάζεται εκτενώς στον κώδικά μας.
Για το λόγο αυτό, ενώ η συνάρτηση δίνεται ως symbolic expression και μέσω αυτής υπολογίζονται αυτόματα η κλήση, ο Εσσιανός αλλά και οι “κανονικές” συναρτήσεις MATLAB που τις υλοποιούν. Για το λόγο αυτό, ενώ η συνάρτηση δίνεται ως symbolic expression, μέσω αυτής υπολογίζονται αυτόματα η κλίση, ο Εσσιανός αλλά και οι “κανονικές” συναρτήσεις MATLAB που τις υλοποιούν.
Έτσι έχουμε την ακριβή αναπαράσταση της κλίσης και του Εσσιανού ως συναρτήσεις χωρίς να πληρώνουμε το κόστος της subs(). Έτσι έχουμε την ακριβή αναπαράσταση της κλίσης και του Εσσιανού ως συναρτήσεις χωρίς να πληρώνουμε το κόστος της subs().


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

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


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

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

Έτσι, από το σχήμα \ref{fig:plotContour} φαίνεται ότι το ελάχιστο της f βρίσκεται στο αρνητικό ημιεπίπεδο των χ, κοντά στο $\psi = 0$


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


\section{Τεχνικές υπολογισμού βήματος} \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​ \subsection{Armijo rule}
%Armijo Rule Η Armijo rule είναι μια προσαρμοστική τεχνική που επιλέγει το $\gamma_k$ για να εξασφαλίσει επαρκή μείωση της συνάρτησης.
% Η βασική ιδέα είναι ότι η συνάρτηση πρέπει να μειώνεται "αρκετά" σε κάθε βήμα, χωρίς να χρειάζεται να υπολογίζεται το ακριβές ελάχιστο.
%Η Armijo Rule είναι μία μέθοδος για την επιλογή βήματος γkγk​ σε αλγόριθμους καθόδου (descent methods). Στόχος είναι να διασφαλιστεί ότι το βήμα που θα επιλεγεί μειώνει την αντικειμενική συνάρτηση σημαντικά, αλλά και να αποφευχθεί πολύ μικρό βήμα που οδηγεί σε αργή σύγκλιση. Ο κανόνας αυτός υλοποιείται ως εξής: Η συνθήκη του Armijo είναι:
% \boldmath
%Ξεκινάμε με μια αρχική τιμή για το γkγk​ (συνήθως γk=1γk​=1). \[ 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$) έως ότου ικανοποιηθεί η συνθήκη.
%f(xk−γk∇f(xk))≤f(xk)−σγk∥∇f(xk)∥2 \unboldmath
%f(xk​−γk​∇f(xk​))≤f(xk​)−σγk​∥∇f(xk​)∥2 όπου σ∈(0,1)σ∈(0,1) είναι μια σταθερά (τυπικά κοντά στο 0.1). \par
%Αν η συνθήκη δεν ικανοποιείται, μειώνουμε το γkγk​ (π.χ., γk=β⋅γkγk​=β⋅γk​ με β∈(0,1)β∈(0,1)) και επαναλαμβάνουμε. Πλεονεκτήματα της μεθόδου είναι η \textbf{σταθερότητα}, καθώς αποτρέπει πολύ μεγάλα βήματα που μπορεί να αυξήσουν την τιμή της $f(x)$, αλλά και η \textbf{ανθεκτικότητα}, καθώς λειτουργεί καλά ακόμα και όταν η $f(x)$ δεν συμπεριφέρεται πολύ καλά.
% Στα μειονεκτήματα μπορούμε να αναφέρουμε την \textbf{εξάρτησή της από τις παραμέτρους} \boldmath $\sigma$ και $\beta$\unboldmath, μια κακή επιλογή των οποίων μπορεί να οδηγήσει σε αργή σύγκλιση.
%Η Armijo Rule εγγυάται ότι το βήμα είναι "αρκετά καλό" για να μειώσει τη συνάρτηση, ενώ αποφεύγει την υπερβολική μείωση του γkγk​.


\section{Μέθοδος Μέγιστης Καθόδου - Steepest Descent} \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) ως κατεύθυνση καθόδου. Η μέθοδος θεωρείται βασική και συχνά χρησιμοποιείται ως εισαγωγή στις μεθόδους βελτιστοποίησης. \subsection{Σημείο εκκίνησης (0,0)}
Περιγραφή: Η μέθοδος επιλέγει την κατεύθυνση dk=−∇f(xk)dk​=−∇f(xk​), η οποία είναι η κατεύθυνση της μέγιστης τοπικής μείωσης της συνάρτησης. Στη συνέχεια, υπολογίζεται το βήμα γkγk​ για να βρεθεί το επόμενο σημείο xk+1=xk+γkdkxk+1​=xk​+γk​dk​. Για το σημείο (0, 0) η κλίση της $f$ είναι: $\nabla f(0,0) = \begin{bmatrix} 0 \\ 0 \end{bmatrix}$, με αποτέλεσμα η μέθοδος να μην μπορεί να εφαρμοστεί για κανένα τρόπο υπολογισμού βήματος.
Απαιτήσεις: Η συνάρτηση f(x)f(x) πρέπει να είναι συνεχής και διαφορίσιμη. Η κλίση ∇f(x)∇f(x) πρέπει να είναι υπολογίσιμη.
Περιορισμοί:

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

Πλεονεκτήματα:


Απλή στην υλοποίηση. \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} \section{Μέθοδος Newton}




+ 7
- 1
Work2/scripts/GivenEnv.m 查看文件

@@ -19,4 +19,10 @@ hessian_fun = matlabFunction(hessian_fexpr, 'Vars', [x, y]); % Hessian
global amijo_beta amijo_sigma global amijo_beta amijo_sigma
%fixed step size globals %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 查看文件

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


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




+ 37
- 27
Work2/scripts/Script_2_Steepest_descent.m 查看文件

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


% Point x0 = (0, 0) % 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) [x_fixed, f_fixed, kk] = method_steepest_descent(fun, grad_fun, x0, tol, max_iter, 'fixed');
x0s = [-1, 1 ; 1, -1]; % Initial points 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));
for i = 1:size(x0s, 1) plotPointsOverContour(x_fixed, fun, [-2, 0], [-2, 2], 100, point_str + ": Steepest descent $\gamma$ = " + gamma_fixed_step, "figures/StDes_fixed_" + point + ".png");
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");




% Minimized f % 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)); 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"); 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 % 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)); 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"); 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 查看文件

@@ -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)); 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"); plotPointsOverContour(x_armijo, fun, [-2, 2], [-3, 3], 100, point_str + ": Newton Armijo method", "Newton_armijo_" + i + ".png");
end end


+ 0
- 1
Work2/scripts/Script_4_LevMar.m 查看文件

@@ -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)); 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"); plotPointsOverContour(x_armijo, fun, [-2, 2], [-3, 3], 100, point_str + ": LevMar Armijo method", "LevMar_armijo_" + i + ".png");
end end


二進制
Work2/scripts/figures/FunctionContour.png 查看文件

Before After
Width: 2969  |  Height: 2957  |  Size: 91 KiB Width: 2880  |  Height: 1920  |  Size: 73 KiB

二進制
Work2/scripts/figures/FunctionPlot.png 查看文件

Before After
Width: 2969  |  Height: 2957  |  Size: 401 KiB Width: 2880  |  Height: 1920  |  Size: 255 KiB

二進制
Work2/scripts/figures/StDes_Iter_o_gamma_2.png 查看文件

Before After
Width: 2880  |  Height: 1920  |  Size: 54 KiB

二進制
Work2/scripts/figures/StDes_fixed_2.png 查看文件

Before After
Width: 2904  |  Height: 1929  |  Size: 95 KiB

+ 0
- 1
Work2/scripts/gamma_armijo.m 查看文件

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


end end


+ 1
- 1
Work2/scripts/gamma_fixed.m 查看文件

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


end end

+ 0
- 1
Work2/scripts/gamma_minimized.m 查看文件

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


+ 0
- 1
Work2/scripts/method_lev_mar.m 查看文件

@@ -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 f_vals = [f_vals; f_next]; % Store function values
end end
end end


+ 0
- 1
Work2/scripts/method_newton.m 查看文件

@@ -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 f_vals = [f_vals; f_next]; % Store function values
end end
end end


+ 0
- 1
Work2/scripts/method_steepest_descent.m 查看文件

@@ -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 f_vals = [f_vals; f_next]; % Store function values
end end
end end


+ 4
- 1
Work2/scripts/plot3dFun.m 查看文件

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


global image_width,
global image_height;

% Generate a grid for x and y % Generate a grid for x and y
x_space = linspace(x_lim(1), x_lim(2), size); x_space = linspace(x_lim(1), x_lim(2), size);
y_space = linspace(y_lim(1), y_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 % 3D plot
figure('Name', 'f(x,y)', 'NumberTitle', 'off'); 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); surf(X, Y, Z);
% Customize the plot % Customize the plot


+ 4
- 1
Work2/scripts/plotContour.m 查看文件

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


global image_width,
global image_height;

% Generate a grid for x and y % Generate a grid for x and y
x_space = linspace(x_lim(1), x_lim(2), size); x_space = linspace(x_lim(1), x_lim(2), size);
y_space = linspace(y_lim(1), y_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 % Contour
figure('Name', 'Contours of f(x,y)', 'NumberTitle', 'off'); 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); contour(X, Y, Z);
% Customize the plot % Customize the plot


+ 13
- 10
Work2/scripts/plotItersOverGamma.m 查看文件

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


figure('Name', 'Iterations_over_gamma', 'NumberTitle', 'off'); 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); plot(gamma, iterations, '*r', 'LineWidth', 2);


% Customize the plot % Customize the plot


+ 13
- 10
Work2/scripts/plotPointsOverContour.m 查看文件

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


% Generate a grid for x and y % Generate a grid for x and y
x_space = linspace(x_lim(1), x_lim(2), size); 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 % 2D plot
figure('Name', '(x,y)', 'NumberTitle', 'off'); 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'); plot(points(:, 1), points(:, 2), '-or');
hold on hold on
contour(X, Y, Z); contour(X, Y, Z);


||||||
x
 
000:0
Loading…
取消
儲存