瀏覽代碼

Basic functionality and first part of the report

master
Christos Choutouridis 5 小時之前
父節點
當前提交
c50bb6e03a
共有 16 個檔案被更改,包括 169 行新增132 行删除
  1. 二進制
      Work2/report/Work2_report.pdf
  2. +76
    -85
      Work2/report/Work2_report.tex
  3. +14
    -0
      Work2/scripts/Script_1_Plots.m
  4. +0
    -0
      Work2/scripts/Script_2_Steepest_descent.m
  5. +0
    -0
      Work2/scripts/Script_3_Newton.m
  6. +0
    -0
      Work2/scripts/Script_4_LevMar.m
  7. 二進制
      Work2/scripts/figures/FunctionContour.png
  8. 二進制
      Work2/scripts/figures/FunctionPlot.png
  9. +1
    -0
      Work2/scripts/figures/ReadME.md
  10. +1
    -1
      Work2/scripts/method_lev_mar.m
  11. +1
    -1
      Work2/scripts/method_newton.m
  12. +1
    -1
      Work2/scripts/method_steepest_descent.m
  13. +0
    -42
      Work2/scripts/plot3Dfun.m
  14. +34
    -0
      Work2/scripts/plot3dFun.m
  15. +33
    -0
      Work2/scripts/plotContour.m
  16. +8
    -2
      Work2/scripts/plotItersOverGamma.m

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


+ 76
- 85
Work2/report/Work2_report.tex 查看文件

@@ -33,6 +33,7 @@
\usepackage{enumitem}
\usepackage{tabularx}
\usepackage{array}
\usepackage{amssymb}

\begin{document}

@@ -45,126 +46,116 @@
\sloppy

\section{Εισαγωγή}
Η παρούσα εργασία αφορά ...
Η παρούσα εργασία αφορά το πρόβλημα της ελαχιστοποίησης μιας δοσμένης συνάρτησης πολλών μεταβλητών $f: \mathbb{R}^n \rightarrow \mathbb{R}$ χωρίς περιορισμούς.
Για το σκοπό αυτό κάνουμε χρήση τριών μεθόδων.
Της μεθόδου μέγιστης καθόδου (Steepest Descent), της μεθόδου Newton, και της Levenberg-Marquardt.
Ακόμα για κάθε μία από αυτές θα υλοποιήσουμε τρεις διαφορετικές τεχνικές υπολογισμού βήματος.

\section{Παραδοτέα}
Τα παραδοτέα της εργασίας αποτελούνται από:
\begin{itemize}
\item Την παρούσα αναφορά.
\item Τον κατάλογο \textbf{scripts/}, που περιέχει τον κώδικα της MATLAB.
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Work%202}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Work2}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
\end{itemize}


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

\subsection{Πολυμορφική κλήση μεθόδων}
\label{subsec:polymorphic-calls}
Εφόσον για κάθε θέμα ένα από τα ζητούμενα ήταν ο υπολογισμός και η απεικόνιση του αριθμού των κλήσεων των μεθόδων για διαφορετικές τιμές της παραμέτρου lambda, δημιουργήσαμε τη συνάρτηση \textbf{\emph{iterations\_over\_lambda()}} η οποία καλεί μια \textit{δοθείσα} μέθοδο για κάθε μία από τις αντικειμενικές συναρτήσεις και απεικονίζει τα αποτελέσματα.
Ομοίως, για κάθε θέμα, ζητούμενο ήταν η απεικόνιση της σύγκλισης των διαστημάτων σε κάθε επανάληψη.
Αντίστοιχα λοιπόν δημιουργήσαμε τη συνάρτηση \textbf{\emph{interval\_over\_iterations()}} η οποία ομοίως καλεί μια \textit{δοθείσα} μέθοδο για κάθε μία από τις αντικειμενικές συναρτήσεις.
Τέλος το κεντρικό script της εργασίας “Work1.m” καλεί σε βρόχο την κάθε μία από τις παραπάνω συναρτήσεις, για κάθε μία από τις μεθόδους, την οποία και περνάει ως όρισμα στη συνάρτηση.
\par
Οι παραπάνω συναρτήσεις λοιπόν, δέχονται τις μεθόδους ως ορίσματα και τις καλούν με αγνωστικιστικό τρόπο εσωτερικά.
Για το λόγο αυτό υλοποιήσαμε τις μεθόδους ώστε να έχουν \textbf{κοινό interface} ορισμάτων και επιστροφών, με αποτέλεσμα κάποιες μέθοδοι να έχουν ορίσματα που δεν χρησιμοποιούνται.
Το κέρδος όμως είναι ο πολυμορφικός τρόπος κλήσης των διαφορετικών μεθόδων, που απλοποιεί και μικραίνει τον κώδικα. \\
Έτσι όλες οι συναρτήσεις που υλοποιούν τις μεθόδους υπολογισμού ελαχίστου έχουν ως ορίσματα:
\begin{itemize}
\item \textbf{fun\_expr}: Η αναπαράσταση της αντικειμενικής συνάρτησης ως symbolic expression.
\item \textbf{alpha}: Η αρχή του διαστήματος αναζήτησης.
\item \textbf{beta}: Το τέλος του διαστήματος αναζήτησης.
\item \textbf{epsilon}: Η απόσταση από το μέσω του διαστήματος για τη μέθοδο της διχοτόμου και το μήκος του διαστήματος του τελικού βήματος για τη μέθοδο Fibonacci. \\
\textit{\underline{Σημείωση}}: Στις υπόλοιπες μεθόδους το όρισμα δεν χρησιμοποιείται.
\item \textbf{lambda}: Η ζητούμενη ακρίβεια.
\end{itemize}
Επίσεις όλες οι συναρτήσεις επιστρέφουν \textbf{[a, b, k, n]}:
\begin{itemize}
\item \textbf{a}: Το διάνυσμα με όλες τις τιμές που παίρνει η αρχή του διαστήματος αναζήτησης σε κάθε επανάληψη.
\item \textbf{b}: Το διάνυσμα με όλες τις τιμές που παίρνει το τέλος του διαστήματος αναζήτησης σε κάθε επανάληψη.
\item \textbf{k}: Ο αριθμός των επαναλήψεων μέχρι να τερματιστεί ο αλγόριθμος.
\item \textbf{n}: Ο αριθμός των κλήσεων της αντικειμενικής συνάρτησης.
\end{itemize}
...

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

\section{Μέθοδος ...}
\section{Απεικόνιση της συνάρτησης}

Η συνάρτηση με την οποία ασχολούμαστε στην παρούσα εργασία είναι η:
\boldmath
\begin{equation}
f(x,y) = x^5 \cdot e^{-x^2 - y^2}
\end{equation}
\label{eq:ObjectiveFunction}
\unboldmath

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

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

% Table with full width, centered content, and column width based on content
\noindent
\renewcommand{\arraystretch}{1.2}
\begin{tabularx}{\textwidth}{%
>{\raggedleft\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth}
}
Εύρος αναζήτησης & Μέθ. Διχοτόμου & Μέθ. Χρυσού τομέα & Μέθ. Fibonacci & Μέθ. Διχοτόμου με Παρ. \\
\hline
0.00210 & 17 & 17 & 18 & 12 \\
0.05105 & 8 & 11 & 11 & 8 \\
0.1 & 7 & 9 & 10 & 7
\end{tabularx} \\ [3ex]
Έτσι, από το σχήμα \ref{fig:plotContour} φαίνεται ότι το ελάχιστο της f βρίσκεται στο αρνητικό ημιεπίπεδο των χ, κοντά στο $\psi = 0$

\par
Ενώ ομοίως για τα ίδια δεδομένα για τον \textbf{αριθμό κλήσεων των αντικειμενικών συναρτήσεων} έχουμε: \\
\begin{tabularx}{\textwidth}{%
>{\raggedleft\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth} |
>{\centering\arraybackslash}m{0.175\textwidth}
}
Εύρος αναζήτησης & Μέθ. Διχοτόμου & Μέθ. Χρυσού τομέα & Μέθ. Fibonacci & Μέθ. Διχοτόμου με Παρ. \\
\hline
0.00210 & 32 & 18 & 19 & 11 \\
0.1 & 12 & 10 & 11 & 6
\end{tabularx} \\ [3ex]

\section{Τεχνικές υπολογισμού βήματος}

Πριν προχωρήσουμε στα επόμενα θέματα και στην ανάλυση των μεθόδων υπολογισμού του ελάχιστου, θέλουμε να αναφερθούμε στις διαφορετικές τεχνικές επιλογής βήματος $\gamma_k$.

%Σχόλια για τον 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​.

\section{Μέθοδος Μέγιστης Καθόδου - Steepest Descent}

Γενικές Πληροφορίες: Είναι μια μέθοδος πρώτης τάξης που χρησιμοποιεί την κατεύθυνση της αρνητικής κλίσης (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).

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

Απλή στην υλοποίηση.
Λειτουργεί καλά για καλά κλιμακούμενες συναρτήσεις.

Μειονεκτήματα:

Αργή σε κυρτές συναρτήσεις με στενά ελάχιστα.
Δεν εγγυάται την ταχύτερη σύγκλιση.

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

\section{Μέθοδος Levenberg-Marquardt}

\section{Σύγκριση των μεθόδων}
Εκτελώντας όλους του αλγόριθμους για τα ίδια δεδομένα, \textbf{για τον αριθμό επαναλήψεων} έχουμε: \\

\par
\underline{Παρατηρήσεις:}
\begin{itemize}
\item H \textbf{αποδοτικότερη} μέθοδος τόσο στον αριθμό των επαναλήψεων όσο και στον αριθμό κλήσεων της αντικειμενικής συνάρτησης είναι η \textbf{μέθοδος της διχοτόμου με χρήση παραγώγου}.
\item Αντίστοιχα η πιο \textbf{\emph{“αδύναμη”}} μέθοδος φαίνεται να είναι η μέθοδος της \textbf{διχοτόμου χωρίς τη χρήση παραγώγου}.
\item Οι μέθοδοι του χρυσού τομέα και Fibonacci παρουσιάζουν \textbf{παρόμοια} συμπεριφορά τόσο \textbf{όσων αφορά τον αριθμό των επαναλήψεων όσο και στον αριθμό των κλήσεων} της αντικειμενικής συνάρτησης και τοποθετούνται στη μέση όσον αφορά τις επιδόσεις τους.
\item Ένα ακόμη ενδιαφέρον στοιχείο είναι ότι ενώ οι δύο προαναφερθείσες μέθοδοι, θεωρητικά βελτιώνουν όχι μόνο τον αριθμό των κλήσεων των συναρτήσεων αλλά και τον αριθμό των επαναλήψεων.
Αυτό όμως δεν το βλέπουμε να επιβεβαιώνεται.
Βλέπουμε δηλαδή να βελτιώνεται \textbf{μόνο ο αριθμός κλήσεων} και όχι των επαναλήψεων.
Τουλάχιστον αυτό συμβαίνει για το μικρό διάστημα αναζήτησης της εργασίας.
\item Τέλος ενώ θεωρητικά η μέθοδος Fibonacci για μικρό αριθμό διάστημα αναζήτησης αναμένεται να έχει λιγότερες επαναλήψεις από την μέθοδο χρυσού τομέα, κάτι τέτοιο δεν φαίνεται να επιβεβαιώνεται.
\item ...
\end{itemize}
Φυσικά, για τις τελευταίες δύο “παρεκκλίσεις” υπάρχει πάντα η περίπτωση του προβλήματος στην υλοποίηση, την οποία δεν μπορούμε να αποκλείσουμε.


\section{Συμπεράσματα}
Οι μέθοδοι της παρούσας εργασίας αποτελούν βασικές τεχνικές για την εύρεση του τοπικού ελαχίστου μιας κυρτής συνάρτησης σε ένα δοσμένο διάστημα.
Κάθε μέθοδος έχει τα δικά της πλεονεκτήματα και περιορισμούς.
Η μέθοδος διχοτόμου είναι απλή και σταθερή, αλλά απαιτεί έναν ικανοποιητικό αριθμό επαναλήψεων.
Η μέθοδος χρυσού τομέα είναι πιο αποδοτική όσον αφορά τη σύγκλιση με λιγότερες κλήσεις στη συνάρτηση, αλλά εξαρτάται από τον ακριβή υπολογισμό των σημείων του διαστήματος.
Η μέθοδος Fibonacci έχει σταθερή και προβλέψιμη αριθμητική συμπεριφορά, όμως η ταχύτητα σύγκλισης είναι σχετικά χαμηλότερη σε σχέση με άλλες.
Η μέθοδος διχοτόμου με παράγωγο, προσφέρει γραμμική σύγκλιση, παρέχοντας τη δυνατότητα γρηγορότερης αναγνώρισης του ελαχίστου, αν και εξαρτάται από την ύπαρξη της παραγώγου και απαιτεί έναν αξιόπιστο υπολογισμό αυτής.
Συνολικά, η επιλογή της κατάλληλης μεθόδου εξαρτάται από τη συγκεκριμένη εφαρμογή, την ακρίβεια και τις υπολογιστικές δυνατότητες, καθώς και την εγγύτητα της συνάρτησης στην κυρτότητα.
Οι μέθοδοι της παρούσας εργασίας αποτελούν βασικές τεχνικές για την εύρεση του τοπικού ελαχίστου ...

\end{document}

+ 14
- 0
Work2/scripts/Script_1_Plots.m 查看文件

@@ -0,0 +1,14 @@
% Define environment (functions, gradients etc...)
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
% points in the x-y plane
%

% 3d plot the function
plot3dFun(fun, [-3, 3], [-3, 3], 100, title_fun, "figures/FunctionPlot.png");

% Plot isobaric lines
plotContour(fun, [-3, 3], [-3, 3], 100, title_fun, "figures/FunctionContour.png");

Work2/scripts/Steepest_descent_script.m → Work2/scripts/Script_2_Steepest_descent.m 查看文件


Work2/scripts/Newton_script.m → Work2/scripts/Script_3_Newton.m 查看文件


Work2/scripts/LevMar_script.m → Work2/scripts/Script_4_LevMar.m 查看文件


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

Before After
Width: 2969  |  Height: 2957  |  Size: 91 KiB

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

Before After
Width: 2969  |  Height: 2957  |  Size: 401 KiB

+ 1
- 0
Work2/scripts/figures/ReadME.md 查看文件

@@ -0,0 +1 @@
File to keep directory

Work2/scripts/lev_mar.m → Work2/scripts/method_lev_mar.m 查看文件

@@ -1,4 +1,4 @@
function [x_vals, f_vals, k] = lev_mar(f, grad_f, hessian_f, m, x0, tol, max_iter, mode)
function [x_vals, f_vals, k] = method_lev_mar(f, grad_f, hessian_f, m, x0, tol, max_iter, mode)
% f: Objective function
% grad_f: Gradient of the function
% hessian_f: Hessian of the function

Work2/scripts/newton.m → Work2/scripts/method_newton.m 查看文件

@@ -1,4 +1,4 @@
function [x_vals, f_vals, k] = newton(f, grad_f, hessian_f, x0, tol, max_iter, mode)
function [x_vals, f_vals, k] = method_newton(f, grad_f, hessian_f, x0, tol, max_iter, mode)
% f: Objective function
% grad_f: Gradient of the function
% hessian_f: Hessian of the function

Work2/scripts/steepest_descent.m → Work2/scripts/method_steepest_descent.m 查看文件

@@ -1,4 +1,4 @@
function [x_vals, f_vals, k] = steepest_descent(f, grad_f, x0, tol, max_iter, mode)
function [x_vals, f_vals, k] = method_steepest_descent(f, grad_f, x0, tol, max_iter, mode)
% f: Objective function
% grad_f: Gradient of the function
% x0: Initial point [x0, y0]

+ 0
- 42
Work2/scripts/plot3Dfun.m 查看文件

@@ -1,42 +0,0 @@
function plot3Dfun(fun, x_lim, y_lim, size, plot_title)
% 3D plots a function
% fun: The function to 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
%

% 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);
[X, Y] = meshgrid(x_space, y_space);
% Evaluate the function on the grid
Z = fun(X, Y);
% 3D plot
figure('Name', 'f(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
surf(X, Y, Z);
% Customize the plot
xlabel('x'); % Label for x-axis
ylabel('y'); % Label for y-axis
zlabel('f(x, y)'); % Label for z-axis
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
colorbar;

% save the figure
print(gcf, 'FunctionPlot.png', '-dpng', '-r300');
% Contours
figure('Name', 'Contours of f(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 1280, 1280]); % Set the figure size
contour(X, Y, Z);
xlabel('x'); % Label for x-axis
ylabel('y'); % Label for y-axis
title(plot_title, 'Interpreter', 'latex', 'FontSize', 20); % Title of the plot
colorbar;
print(gcf, 'ContoursPlot.png', '-dpng', '-r300');
end

+ 34
- 0
Work2/scripts/plot3dFun.m 查看文件

@@ -0,0 +1,34 @@
function plot3dFun(fun, x_lim, y_lim, size, plot_title, filename)
% 3D plots a function
% fun: The function to 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
%

% 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);
[X, Y] = meshgrid(x_space, y_space);
% Evaluate the function on the grid
Z = fun(X, Y);
% 3D plot
figure('Name', 'f(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
surf(X, Y, Z);
% Customize the plot
xlabel('x'); % Label for x-axis
ylabel('y'); % Label for y-axis
zlabel('f(x, y)'); % Label for z-axis
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
colorbar;

% save the figure
if strcmp(filename, '') == 0
print(gcf, filename, '-dpng', '-r300');
end
end

+ 33
- 0
Work2/scripts/plotContour.m 查看文件

@@ -0,0 +1,33 @@
function plotContour(fun, x_lim, y_lim, size, plot_title, filename)
% plot the contour of a function
% fun: The function to 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
%

% 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);
[X, Y] = meshgrid(x_space, y_space);
% Evaluate the function on the grid
Z = fun(X, Y);
% Contour
figure('Name', 'Contours of f(x,y)', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
contour(X, Y, Z);
% Customize the plot
xlabel('x'); % Label for x-axis
ylabel('y'); % Label for y-axis
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
colorbar;

% save the figure
if strcmp(filename, '') == 0
print(gcf, filename, '-dpng', '-r300');
end
end

Work2/scripts/plotIterationsOverGamma.m → Work2/scripts/plotItersOverGamma.m 查看文件

@@ -1,4 +1,4 @@
function plotIterationsOverGamma(gamma, iterations, plot_title, filename)
function plotItersOverGamma(gamma, iterations, plot_title, filename)
% 3D plots a function
% fun: The points to plot
% contur_fun: The function for contour plot
@@ -12,8 +12,14 @@ function plotIterationsOverGamma(gamma, iterations, plot_title, filename)
figure('Name', 'Iterations_over_gamma', 'NumberTitle', 'off');
set(gcf, 'Position', [100, 100, 960, 960]); % Set the figure size
plot(gamma, iterations, '*r', 'LineWidth', 2);

% Customize the plot
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
xlabel('\gamma') ;
ylabel('Iterations');
print(gcf, filename, '-dpng', '-r300');

% save the figure
if strcmp(filename, '') == 0
print(gcf, filename, '-dpng', '-r300');
end
end

Loading…
取消
儲存