Lab02: WIP
3
.gitmodules
vendored
@ -4,3 +4,6 @@
|
|||||||
[submodule "Lab01/report/AUThReport"]
|
[submodule "Lab01/report/AUThReport"]
|
||||||
path = Lab01/report/AUThReport
|
path = Lab01/report/AUThReport
|
||||||
url = ssh://git@git.hoo2.net:222/hoo2/AUThReport.git
|
url = ssh://git@git.hoo2.net:222/hoo2/AUThReport.git
|
||||||
|
[submodule "Lab02/report/AUThReport"]
|
||||||
|
path = Lab02/report/AUThReport
|
||||||
|
url = ssh://git@git.hoo2.net:222/hoo2/AUThReport.git
|
||||||
|
BIN
Lab02/lab02___2025.pdf
Normal file
1
Lab02/report/AUThReport
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 74ec4b5f6c66382e5f1b6d2e6930897e4ed53ea6
|
BIN
Lab02/report/report.pdf
Normal file
397
Lab02/report/report.tex
Normal file
@ -0,0 +1,397 @@
|
|||||||
|
%
|
||||||
|
% !TEX TS-program = xelatex
|
||||||
|
% !TEX encoding = UTF-8 Unicode
|
||||||
|
% !TEX spellcheck = el-GR
|
||||||
|
%
|
||||||
|
% System Modeling Lab02 assignment report
|
||||||
|
%
|
||||||
|
% Requires compilation with XeLaTeX
|
||||||
|
%
|
||||||
|
% authors:
|
||||||
|
% Χρήστος Χουτουρίδης ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% Options:
|
||||||
|
%
|
||||||
|
% 1) mainlang=<language>
|
||||||
|
% Default: english
|
||||||
|
% Set the default language of the document which affects hyphenations,
|
||||||
|
% localization (section, dates, etc...)
|
||||||
|
%
|
||||||
|
% example: \documentclass[mainlang=greek]{AUThReport}
|
||||||
|
%
|
||||||
|
% 2) <language>
|
||||||
|
% Add hyphenation and typesetting support for other languages
|
||||||
|
% Currently supports: english, greek, german, frenc
|
||||||
|
%
|
||||||
|
% example: \documentclass[english, greek]{AUThReport}
|
||||||
|
%
|
||||||
|
% 3) short: Requests a shorter title for the document
|
||||||
|
% Default: no short
|
||||||
|
%
|
||||||
|
% example: \documentclass[short]{AUThReport}
|
||||||
|
%
|
||||||
|
\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport/AUThReport}
|
||||||
|
|
||||||
|
\CurrentDate{\today}
|
||||||
|
|
||||||
|
% Greek report document setup suggestions
|
||||||
|
%---------------------------------
|
||||||
|
% Document configuration
|
||||||
|
\AuthorName{Χρήστος Χουτουρίδης}
|
||||||
|
\AuthorAEM{8997}
|
||||||
|
\AuthorMail{cchoutou@ece.auth.gr}
|
||||||
|
|
||||||
|
%\CoAuthorName{CoAuthor Name}
|
||||||
|
%\CoAuthorAEM{AEM}
|
||||||
|
%\CoAuthorMail{CoAuthor Mail}
|
||||||
|
|
||||||
|
% \WorkGroup{Ομάδα Χ}
|
||||||
|
|
||||||
|
\DocTitle{Εργασία 2}
|
||||||
|
\DocSubTitle{Μέθοδοι Πραγματικού Χρόνου, Μέθοδος Κλίσης, Μέθοδος Lyapunov}
|
||||||
|
|
||||||
|
\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
|
||||||
|
\ClassName{Προσομοίωση και Μοντελοποίηση Δυναμικών Συστημάτων}
|
||||||
|
|
||||||
|
\InstructorName{Γ. Ροβιθάκης}
|
||||||
|
\InstructorMail{rovithak@auth.gr}
|
||||||
|
|
||||||
|
\CoInstructorName{Λ. Μπίκας}
|
||||||
|
\CoInstructorMail{lnmpikas@ece.auth.gr}
|
||||||
|
|
||||||
|
|
||||||
|
% Local package requirements
|
||||||
|
%---------------------------------
|
||||||
|
%\usepackage{tabularx}
|
||||||
|
%\usepackage{array}
|
||||||
|
%\usepackage{commath}
|
||||||
|
|
||||||
|
\usepackage{amsmath, amssymb, amsfonts}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{subcaption}
|
||||||
|
\usepackage{float}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% Request a title page or header
|
||||||
|
\InsertTitle
|
||||||
|
|
||||||
|
\section{Εισαγωγή}
|
||||||
|
|
||||||
|
Η παρούσα εργασία ασχολείται με την εκτίμηση αγνώστων παραμέτρων σε δυναμικά συστήματα μέσω μεθόδων πραγματικού χρόνου, δίνοντας έμφαση στη μέθοδο Lyapunov.
|
||||||
|
Στο πρώτο σκέλος, μελετάται ένα γραμμικό σύστημα μάζας-ελατηρίου-απόσβεσης και αναπτύσσονται δύο εκτιμητές — βασισμένοι στις μεθόδους gradient descent και Lyapunov — με στόχο την ταχεία και αξιόπιστη προσέγγιση των φυσικών παραμέτρων του συστήματος.
|
||||||
|
Εξετάζεται επίσης η επίδραση θορύβου στη μέτρηση της θέσης.
|
||||||
|
\par
|
||||||
|
Στο δεύτερο σκέλος, μελετάται ένα μη γραμμικό μοντέλο ρόλισης αεροσκάφους, όπου οι άγνωστες παράμετροι εμπλέκονται μη γραμμικά στις εξισώσεις κίνησης.
|
||||||
|
Η εκτίμηση συνδυάζεται με ελεγκτή παρακολούθησης τροχιάς, ο οποίος βασίζεται σε κανονικοποιημένα σφάλματα και λογαριθμική κορεσμένη ανάδραση.
|
||||||
|
Παρουσιάζεται η εκτίμηση των παραμέτρων, καθώς και η ανακατασκευή της εξόδου με βάση τις εκτιμώμενες τιμές.
|
||||||
|
Τέλος, μελετάται η ευαισθησία του εκτιμητή παρουσία εξωτερικών διαταραχών.
|
||||||
|
|
||||||
|
\subsection{Παραδοτέα}
|
||||||
|
Τα παραδοτέα της εργασίας αποτελούνται από:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Την παρούσα αναφορά.
|
||||||
|
\item Τον κατάλογο \textbf{scripts/}, που περιέχει τον κώδικα της MATLAB.
|
||||||
|
\item Το \href{https://git.hoo2.net/hoo2/SystemModling/src/branch/master/Lab02}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Θέμα 1}
|
||||||
|
|
||||||
|
\subsection{1α - Gradient Estimation}
|
||||||
|
|
||||||
|
Το σύστημα που μελετάται είναι το κλασικό σύστημα μάζας-ελατηρίου-απόσβεσης:
|
||||||
|
\[
|
||||||
|
m\ddot{x}(t) + b\dot{x}(t) + kx(t) = u(t)
|
||||||
|
\]
|
||||||
|
το οποίο αναδιατυπώνεται γραμμικά ως προς τις άγνωστες παραμέτρους:
|
||||||
|
\[
|
||||||
|
y(t) = u(t) = \theta^{\top} u(t), \quad \text{με } \theta = [m,\, b,\, k]^{\top},\ u(t) = [\ddot{x}(t),\, \dot{x}(t),\, x(t)]^{\top}
|
||||||
|
\]
|
||||||
|
Ο εκτιμητής gradient έχει τη μορφή:
|
||||||
|
\[
|
||||||
|
\dot{\hat{\theta}}(t) = \gamma \cdot u(t) \cdot \left(y(t) - \hat{\theta}^{\top}(t) u(t)\right)
|
||||||
|
\]
|
||||||
|
|
||||||
|
Η προσομοίωση του ``πραγματικού'' συστήματος υλοποιήθηκε μέσω της μεθόδου Runge–Kutta 4ης τάξης (RK4), ενώ οι παράγωγοι υπολογίστηκαν με διαφορικό σχήμα.
|
||||||
|
Το script επιτρέπει επιλογή μεταξύ normalized και unnormalized εκτιμητή και διαφορετικές τιμές $\gamma$.
|
||||||
|
|
||||||
|
\subsubsection{Σύγκριση Normalized vs Unnormalized}
|
||||||
|
|
||||||
|
Παρακάτω παρουσιάζονται τα αποτελέσματα για $\gamma = 0.66$ και $T=30$ sec, για τις δύο περιπτώσεις.
|
||||||
|
Οι εκτιμήσεις είναι διαφορετικές, κυρίως στις παραμέτρους $m$ και $b$ — γεγονός που υποδηλώνει πως η χρήση normalization επηρεάζει όχι μόνο τη δυναμική, αλλά και το σημείο σύγκλισης.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\begin{subfigure}[t]{0.48\textwidth}
|
||||||
|
\includegraphics[width=\linewidth]{../scripts/output/Prob1a_estimation_constant_gamma0.660_Unnormalized_30s.png}
|
||||||
|
\caption{Constant input, unnormalized}
|
||||||
|
\end{subfigure}
|
||||||
|
\hfill
|
||||||
|
\begin{subfigure}[t]{0.48\textwidth}
|
||||||
|
\includegraphics[width=\linewidth]{../scripts/output/Prob1a_estimation_constant_gamma0.660_Normalized_30s.png}
|
||||||
|
\caption{Constant input, normalized}
|
||||||
|
\end{subfigure}
|
||||||
|
|
||||||
|
\vspace{0.5cm}
|
||||||
|
|
||||||
|
\begin{subfigure}[t]{0.48\textwidth}
|
||||||
|
\includegraphics[width=\linewidth]{../scripts/output/Prob1a_estimation_sine_gamma0.660_Unnormalized_30s.png}
|
||||||
|
\caption{Sine input, unnormalized}
|
||||||
|
\end{subfigure}
|
||||||
|
\hfill
|
||||||
|
\begin{subfigure}[t]{0.48\textwidth}
|
||||||
|
\includegraphics[width=\linewidth]{../scripts/output/Prob1a_estimation_sine_gamma0.660_Normalized_30s.png}
|
||||||
|
\caption{Sine input, normalized}
|
||||||
|
\end{subfigure}
|
||||||
|
\caption{Σύγκριση εκτίμησης παραμέτρων με και χωρίς normalization, για $\gamma = 0.66$ και $T=30$ sec.}
|
||||||
|
\label{gradient_1a}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Από το σχήμα \ref{gradient_1a} παρατηρούμε ότι το σύστημα απαιτεί σημαντικό χρονικό διάστημα για να συγκλίνει σε σταθερές τιμές.
|
||||||
|
Ειδικά για μικρές τιμές του $\gamma$, η σύγκλιση είναι πιο αργή αλλά ομαλότερη, η τιμή του οποίου επιλέχθηκε με δοκιμαστικές εκτελέσεις.
|
||||||
|
Παρόλα αυτά το σύστημα παρουσίαζε μεγάλες ταλαντώσεις.
|
||||||
|
Για το λόγο αυτό επιλέχθηκε να γίνει κανονικοποίηση στη μέθοδο κλίσης (normalized gradient update).
|
||||||
|
Η χρήση κανονικοποίησης βελτιώνει σημαντικά τη σταθερότητα του εκτιμητή και οδηγεί σε εκτιμήσεις με μικρότερη διακύμανση, ιδιαίτερα για τις παραμέτρους $m$ και $b$.
|
||||||
|
Ωστόσο, ακόμη και με κανονικοποίηση, το σφάλμα εκτίμησης παραμένει, γεγονός που πιθανόν οφείλεται είτε στην αριθμητική προσέγγιση των παραγώγων είτε στο ότι η είσοδος δεν διεγείρει επαρκώς όλες τις δυναμικές του συστήματος.
|
||||||
|
\par
|
||||||
|
Η πρώτη εκτέλεση (για $T=30s$ και $\gamma=0.66$) ανέδειξε αυτές τις διαφορές: χωρίς normalization παρατηρήθηκαν εντονότερες αποκλίσεις, ενώ με normalization η σύγκλιση ήταν πιο σταθερή, ειδικά για την παράμετρο $b$.
|
||||||
|
|
||||||
|
\subsubsection{Διερεύνηση επίδρασης της παραμέτρου $\gamma$}
|
||||||
|
|
||||||
|
Προκειμένου να κατανοήσουμε καλύτερα την επίδραση του $\gamma$, εκτελέσαμε το script με τιμές $\gamma = 0.33,\ 0.50,\ 0.66$ και normalized update.
|
||||||
|
Ο πίνακας που ακολουθεί παρουσιάζει τις τελικές τιμές εκτίμησης για κάθε περίπτωση:
|
||||||
|
|
||||||
|
\begin{table}[H]
|
||||||
|
\centering
|
||||||
|
\caption{Τελικές εκτιμήσεις παραμέτρων για διαφορετικές τιμές $\gamma$ (με normalized update)}
|
||||||
|
\label{tab:gamma_comparison}
|
||||||
|
\begin{tabular}{r c c c c}
|
||||||
|
\textbf{Σήμα} & \textbf{$\gamma$} & $\hat{m}$ & $\hat{b}$ & $\hat{k}$ \\
|
||||||
|
\hline
|
||||||
|
σταθερό & 0.33 & 0.9963 & 0.6650 & \textbf{0.7143} \\
|
||||||
|
σταθερό & 0.50 & 0.9726 & 0.5558 & \textbf{0.7119} \\
|
||||||
|
σταθερό & 0.66 & 0.9475 & 0.4795 & \textbf{0.7107} \\
|
||||||
|
ημιτονοειδές & 0.33 & 1.1492 & \textbf{0.2452} & 0.5622 \\
|
||||||
|
ημιτονοειδές & 0.50 & 1.1033 & \textbf{0.2326} & 0.5097 \\
|
||||||
|
ημιτονοειδές & 0.66 & 1.0672 & \textbf{0.2350} & 0.4735 \\
|
||||||
|
\hline
|
||||||
|
Πραγματικές & -- & 1.315 & 0.225 & 0.725 \\
|
||||||
|
\end{tabular}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\subsubsection{Παρατήρηση επιλεκτικής εκτίμησης ανάλογα με το είδος εισόδου}
|
||||||
|
|
||||||
|
Από τη σύγκριση των αποτελεσμάτων προκύπτει ότι η εκτίμηση της $k$ προσεγγίζεται επιτυχώς κυρίως όταν το σύστημα διεγείρεται με σταθερό σήμα.
|
||||||
|
Αυτό είναι λογικό, καθώς σε σταθερή είσοδο κυριαρχεί η στατική απόκριση του συστήματος, στην οποία η $k$ (σταθερά ελατηρίου) έχει άμεση επίδραση.
|
||||||
|
\par
|
||||||
|
Αντίθετα, σε ημιτονοειδές σήμα, οι παραγώγοι της ταχύτητας και της επιτάχυνσης ποικίλουν έντονα και επαναληπτικά, ενισχύοντας τη συμβολή των $m$ και $b$ στη δυναμική του σήματος.
|
||||||
|
Παρατηρούμε ότι σε αυτές τις περιπτώσεις η εκτίμηση της $b$ είναι σαφώς βελτιωμένη.
|
||||||
|
\par
|
||||||
|
Η διαφοροποίηση αυτή υποδεικνύει ότι η επιμονή διέγερσης (persistence of excitation) που απαιτείται για την εκτίμηση όλων των παραμέτρων δεν ικανοποιείται εξίσου από κάθε τύπο εισόδου.
|
||||||
|
Για να επιτευχθεί συνολική παρατηρησιμότητα, ενδεχομένως να απαιτείται πιο σύνθετο ή ακόμα και στοχαστικό σήμα εισόδου (π.χ. sum-of-sines ή PRBS).
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{1β – Εκτίμηση παραμέτρων με μέθοδο Lyapunov}
|
||||||
|
|
||||||
|
Η μέθοδος Lyapunov προσφέρει μία πιο θεωρητικά τεκμηριωμένη προσέγγιση για την εκτίμηση αγνώστων παραμέτρων, καθώς βασίζεται στον σχεδιασμό κατάλληλης συνάρτησης Lyapunov που εγγυάται τη σύγκλιση των σφαλμάτων εκτίμησης.
|
||||||
|
Η εκτίμηση των παραμέτρων βασίστηκε στην ελαχιστοποίηση του τετραγωνικού σφάλματος μεταξύ της πραγματικής εισόδου $u(t)$ και της εκτιμώμενης εξόδου του μοντέλου:
|
||||||
|
\[
|
||||||
|
\hat{y}(t) = \hat{\theta}^\top \phi(t)
|
||||||
|
\]
|
||||||
|
όπου:
|
||||||
|
\[
|
||||||
|
y(t) = u(t), \quad \phi(t) = [\ddot{x}(t),\ \dot{x}(t),\ x(t)]^\top
|
||||||
|
\]
|
||||||
|
|
||||||
|
Η συνάρτηση κόστους ορίζεται ως:
|
||||||
|
\[
|
||||||
|
K(\hat{\theta}) = \frac{1}{2} (y(t) - \hat{y}(t))^2 = \frac{1}{2} e^2(t)
|
||||||
|
\]
|
||||||
|
και η προσαρμογή των παραμέτρων γίνεται με βάση τον κανόνα gradient descent:
|
||||||
|
\[
|
||||||
|
\dot{\hat{\theta}} = -\gamma \cdot \nabla K(\hat{\theta}) = \gamma \cdot e(t) \cdot \phi(t)
|
||||||
|
\]
|
||||||
|
|
||||||
|
Αυτή η μορφή δεν απαιτεί ξεχωριστό βοηθητικό δυναμικό μοντέλο ή υπολογισμό σφαλμάτων κατάστασης, αλλά στηρίζεται αποκλειστικά σε παρατηρήσιμα σήματα και προβλέψιμη γραμμική εξίσωση ως προς τις παραμέτρους.
|
||||||
|
Η μέθοδος αυτή παρουσιάζει καλύτερη σταθερότητα σε σχέση με τη μέθοδο gradient, ειδικά όταν η είσοδος δεν πληροί πλήρως τη συνθήκη επιμονής διέγερσης.
|
||||||
|
Επιπλέον, η εισαγωγή της παραμέτρου $\gamma$ επιτρέπει τον έλεγχο της ταχύτητας προσαρμογής, χωρίς να απαιτείται normalization.
|
||||||
|
|
||||||
|
\subsubsection{Υλοποίηση Εκτιμητή}
|
||||||
|
|
||||||
|
Ο εκτιμητής Lyapunov υλοποιήθηκε με βάση το παραπάνω θεωρητικό μοντέλο.
|
||||||
|
Επιπλέον, ανακατασκευάστηκε η έξοδος του συστήματος $x(t)$ με βάση τις εκτιμώμενες παραμέτρους, ώστε να συγκριθεί η πραγματική έξοδος με την εκτιμώμενη $\hat{x}(t)$ και να υπολογιστεί το σφάλμα $e_x(t) = x(t) - \hat{x}(t)$.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\begin{subfigure}[t]{0.48\textwidth}
|
||||||
|
\includegraphics[width=\linewidth]{../scripts/output/Prob1b_lyapunov_gamma0.660_40s.png}
|
||||||
|
\caption{Εκτίμηση παραμέτρων με τη μέθοδο Lyapunov}
|
||||||
|
\end{subfigure}
|
||||||
|
\hfill
|
||||||
|
\begin{subfigure}[t]{0.48\textwidth}
|
||||||
|
\includegraphics[width=\linewidth]{../scripts/output/Prob1b_extrastates_gamma0.660_40s.png}
|
||||||
|
\caption{Αντίδραση συστήματος και σφάλμα εκτίμησης θέσης}
|
||||||
|
\end{subfigure}
|
||||||
|
\caption{Συγκριτική παρουσίαση εκτίμησης παραμέτρων και εξόδου (για $\gamma=0.66$, $T=40s$)}
|
||||||
|
\label{lyapunov_1b}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Όπως φαίνεται και από το σχήμα \ref{lyapunov_1b} η μέθοδος Lyapunov οδήγησε σε σταθερή και σχετικά ακριβή εκτίμηση των παραμέτρων του συστήματος.
|
||||||
|
Η τελική εκτίμηση των παραμέτρων μετά από $40s$ ήταν:
|
||||||
|
\[
|
||||||
|
\hat{m} = 0.8428,\quad \hat{b} = 0.2201,\quad \hat{k} = 0.2620
|
||||||
|
\]
|
||||||
|
Παρατηρείται ότι οι εκτίμηση για το $b$ συγκλίνει σε τιμές κοντά στις πραγματικές, ενώ η εκτιμήσεις του $m$ και $k$ αποκλίνουν σημαντικά, ομοίως με τη μέθοδο gradient estimation.
|
||||||
|
\par
|
||||||
|
Η ανακατασκευή της εξόδου $\hat{x}(t)$ παρόλα αυτά, με βάση το εκτιμώμενο μοντέλο παρουσίασε πολύ καλή συμφωνία με την πραγματική $x(t)$, με το σφάλμα θέσης $e_x(t)$ να παραμένει κάτω από $0.6$ καθ' όλη τη διάρκεια της προσομοίωσης.
|
||||||
|
Αυτό ενισχύει την αξιοπιστία της εκτίμησης και αποδεικνύει την αποτελεσματικότητα της μεθόδου σε σταθερές συνθήκες.
|
||||||
|
|
||||||
|
\subsection{1γ – Επίδραση διαταραχής στη μέτρηση x(t)}
|
||||||
|
|
||||||
|
Για τη μελέτη της ευαισθησίας της μεθόδου Lyapunov στην παρουσία θορύβου, προστέθηκε στο σήμα της θέσης $x(t)$ μια ημιτονοειδής διαταραχή της μορφής:
|
||||||
|
\[
|
||||||
|
\eta(t) = \eta_0 \cdot \sin(2\pi f_0 t)
|
||||||
|
\]
|
||||||
|
με πλάτος $\eta_0 = 0.1$ και συχνότητα $f_0 = 0.5\,\text{Hz}$.
|
||||||
|
|
||||||
|
Ο εκτιμητής παραμένει ίδιος με αυτόν του Θέματος 1β.
|
||||||
|
Η εκτίμηση έγινε δύο φορές: μία με καθαρό σήμα $x(t)$ και μία με διαταραχή $x(t) + \eta(t)$, ενώ οι παράγωγοι $\dot{x}(t)$ και $\ddot{x}(t)$ υπολογίστηκαν από το καθαρό σήμα ώστε να αποφευχθεί υπερβολική αριθμητική αστάθεια.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{../scripts/output/Prob1c_disturbance_eta0.10.png}
|
||||||
|
\caption{Σύγκριση εκτιμήσεων με και χωρίς διαταραχή ($\eta_0 = 0.1$)}
|
||||||
|
\label{fig:disturbance}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Από το σχήμα \ref{fig:disturbance} παρατηρούμε ότι η προσθήκη περιορισμένης διαταραχής στη μέτρηση της θέσης επηρεάζει ελάχιστα την εκτίμηση.
|
||||||
|
Οι τελικές τιμές των παραμέτρων συγκλίνουν σχεδόν ταυτόσημα με την καθαρή περίπτωση:
|
||||||
|
\[
|
||||||
|
\hat{m} = 0.8432, \quad \hat{b} = 0.2195, \quad \hat{k} = 0.2590
|
||||||
|
\]
|
||||||
|
|
||||||
|
Η μικρή επίδραση οφείλεται στο γεγονός ότι η διαταραχή:
|
||||||
|
\begin{itemize}
|
||||||
|
\item είναι ομαλή και περιοδική (χαμηλή συχνότητα),
|
||||||
|
\item φιλτράρεται έμμεσα μέσα από το μοντέλο,
|
||||||
|
\item δεν επηρεάζει τις παραγώγους που χρησιμοποιούνται στον εκτιμητή.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Συνεπώς, ο εκτιμητής Lyapunov παρουσιάζει ικανοποιητική ανοσία σε ήπια διαταραχή, γεγονός που ενισχύει τη χρησιμότητά του σε ρεαλιστικά σενάρια μέτρησης.
|
||||||
|
|
||||||
|
\section{Θέμα 2}
|
||||||
|
|
||||||
|
Το σύστημα που εξετάζεται είναι ένα δυναμικό μη γραμμικό σύστημα δεύτερης τάξης που περιγράφει τη ροπή κύλισης (roll motion) ενός αεροσκάφους:
|
||||||
|
\[
|
||||||
|
\ddot{r}(t) = -a_1 \dot{r}(t) - a_2 \sin(r(t)) + a_3 \dot{r}^2 \sin(2r(t)) + b u(t) + d(t)
|
||||||
|
\]
|
||||||
|
Όπου:
|
||||||
|
\begin{itemize}
|
||||||
|
\item $r(t)$ είναι η γωνία roll,
|
||||||
|
\item $u(t)$ είναι η είσοδος (σήμα ελέγχου),
|
||||||
|
\item $d(t)$ είναι εξωτερική διαταραχή,
|
||||||
|
\item $a_1, a_2, a_3, b$ είναι άγνωστες σταθερές παραμέτρων.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Η δομή του συστήματος επιβάλλει την κατασκευή εκτιμητή παραμέτρων σε πραγματικό χρόνο.
|
||||||
|
Το βασικό βήμα είναι η αναγραφή της εξίσωσης σε μορφή γραμμική ως προς τις άγνωστες παραμέτρους:
|
||||||
|
\[
|
||||||
|
\ddot{r}(t) = \theta^\top \phi(t)
|
||||||
|
\quad \text{με } \theta = [a_1,\, a_2,\, a_3,\, b]^\top,\quad
|
||||||
|
\phi(t) = [-\dot{r}(t),\, -\sin(r(t)),\, \dot{r}^2(t)\sin(2r(t)),\, u(t)]^\top
|
||||||
|
\]
|
||||||
|
Η είσοδος $u(t)$ πρέπει να σχεδιαστεί κατάλληλα ώστε το σύστημα να ακολουθεί τη ζητούμενη τροχιά ακόμη και παρουσία άγνωστων παραμέτρων.
|
||||||
|
Για τον σκοπό αυτό, προτείνεται η χρήση ενός ελεγκτή ανάδρασης που βασίζεται σε κανονικοποιημένα σφάλματα και σε μια smooth συνάρτηση κορεσμού της μορφής:
|
||||||
|
\[
|
||||||
|
T(z) = \ln\left(\frac{1 + z}{1 - z}\right)
|
||||||
|
\]
|
||||||
|
Η συνάρτηση $T(z)$ χρησιμοποιείται για να περιορίσει την έξοδο του ελεγκτή όταν τα σφάλματα γίνονται μεγάλα, αποτρέποντας απότομες ή μη ρεαλιστικές εντολές ελέγχου.
|
||||||
|
Τα σφάλματα κανονικοποιούνται με χρονικά μεταβαλλόμενα ή σταθερά φράγματα, ώστε να εξασφαλίζεται η σταθερότητα και η συμβατότητα με φυσικούς περιορισμούς του συστήματος.
|
||||||
|
|
||||||
|
Ο ελεγκτής βασίζεται σε δύο επίπεδα ανάδρασης.
|
||||||
|
Πρώτα, υπολογίζεται ένα setpoint ταχύτητας:
|
||||||
|
\[
|
||||||
|
z_1(t) = \frac{r(t) - r_d(t)}{\phi(t)}, \quad \alpha(t) = -k_1 T(z_1(t))
|
||||||
|
\]
|
||||||
|
όπου $r_d(t)$ είναι η επιθυμητή τροχιά και $\phi(t)$ ένα χρονικά φθίνον φράγμα σφάλματος.
|
||||||
|
|
||||||
|
Στη συνέχεια, υπολογίζεται η τελική είσοδος ελέγχου:
|
||||||
|
\[
|
||||||
|
z_2(t) = \frac{\dot{r}(t) - \alpha(t)}{\rho}, \quad u(t) = -k_2 T(z_2(t))
|
||||||
|
\]
|
||||||
|
με σταθερό φράγμα $\rho$ και ενισχυτικό κέρδος $k_2$.
|
||||||
|
Το σχήμα αυτό επιτρέπει υψηλή ακρίβεια παρακολούθησης (καθώς $\phi_\infty \downarrow$) και ταυτόχρονα περιορίζει τις μεταβατικές ταλαντώσεις μέσω της δομής κορεσμού.
|
||||||
|
|
||||||
|
Η μελέτη επεκτείνεται και σε περιπτώσεις με εξωτερικές διαταραχές $d(t)$, όπου αξιολογείται η ευρωστία του εκτιμητή και του ελεγκτή.
|
||||||
|
|
||||||
|
\subsection{2α – Εκτίμηση παραμέτρων σε μη γραμμικό σύστημα roll χωρίς διαταραχές}
|
||||||
|
|
||||||
|
Εξετάζουμε ένα μη γραμμικό σύστημα δεύτερης τάξης που μοντελοποιεί τη ροπή κύλισης (roll) αεροσκάφους, του οποίου η τροχιά αναφοράς ακολουθεί την προδιαγραφή:
|
||||||
|
\[
|
||||||
|
r_d(t) =
|
||||||
|
\begin{cases}
|
||||||
|
0, & 0 \leq t < 10 \\
|
||||||
|
\frac{\pi}{10}, & 10 \leq t < 20 \\
|
||||||
|
0, & t \geq 20
|
||||||
|
\end{cases}
|
||||||
|
\]
|
||||||
|
|
||||||
|
Για την παρακολούθηση τροχιάς χρησιμοποιείται ελεγκτής ανάδρασης που περιγράφηκε παραπάνω
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{../scripts/output/Problem2a_estimation.png}
|
||||||
|
\caption{Εκτίμηση παραμέτρων και παρακολούθηση τροχιάς για το Θέμα 2α (χωρίς διαταραχή)}
|
||||||
|
\label{fig:2a}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Από το σχήμα \ref{fig:2a} φαίνεται ότι η σύγκλιση των παραμέτρων είναι ομαλή και σχετικά ακριβής:
|
||||||
|
\[
|
||||||
|
\hat{a}_1 = 1.4970,\quad \hat{a}_2 = 1.0015,\quad \hat{a}_3 = 0.7439,\quad \hat{b} = 2.0051
|
||||||
|
\]
|
||||||
|
με τις πραγματικές τιμές να είναι $a_1 = 2.0$, $a_2 = 1.0$, $a_3 = 0.5$, $b = 2.0$.
|
||||||
|
Παρατηρούμε ότι οι παράμετροι $a_2$ και $b$ εκτιμώνται με υψηλή ακρίβεια, ενώ οι $a_1$ και $a_3$ εκτιμούνται με χαμηλή ακρίβεια.
|
||||||
|
\par
|
||||||
|
Η παρακολούθηση της επιθυμητής τροχιάς παρόλα αυτά είναι επιτυχής, με το $r(t)$ να ακολουθεί το $r_d(t)$ εντός των ορίων που ορίζει το φράγμα $\phi(t)$ καθ’ όλη τη διάρκεια της προσομοίωσης.
|
||||||
|
|
||||||
|
\subsection{2β – Εκτίμηση παραμέτρων και ανακατασκευή κατάστασης με μετρήσιμα r(t), ṙ(t), u(t)}
|
||||||
|
|
||||||
|
Σε αυτό το Θέμα εξετάζεται η περίπτωση κατά την οποία είναι μετρήσιμα τα σήματα $r(t)$, $\dot{r}(t)$ και $u(t)$, και ζητείται η εκτίμηση των αγνώστων παραμέτρων του συστήματος καθώς και η ανακατασκευή της γωνίας roll $r(t)$ μέσω της εκτιμημένης δυναμικής.
|
||||||
|
|
||||||
|
Το σύστημα που προσομοιώνεται παραμένει:
|
||||||
|
\[
|
||||||
|
\ddot{r}(t) = -a_1 \dot{r}(t) - a_2 \sin(r(t)) + a_3 \dot{r}^2 \sin(2r(t)) + b u(t)
|
||||||
|
\]
|
||||||
|
|
||||||
|
Οι παράμετροι εκτιμώνται χρησιμοποιώντας τη μορφή:
|
||||||
|
\[
|
||||||
|
\hat{\theta}(k+1) = \hat{\theta}(k) + \gamma \cdot e(t) \cdot \phi(t)
|
||||||
|
\quad \text{όπου } \phi(t) = [-\dot{r}, -\sin(r), \dot{r}^2\sin(2r), u(t)]^\top
|
||||||
|
\]
|
||||||
|
|
||||||
|
Η έξοδος του συστήματος $r(t)$ ανακατασκευάζεται από την εκτιμώμενη επιτάχυνση:
|
||||||
|
\[
|
||||||
|
\hat{\ddot{r}}(t) = \hat{\theta}^\top \phi(\hat{r}(t), \hat{\dot{r}}(t), u(t)).
|
||||||
|
\]
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.9\textwidth]{../scripts/output/Problem2b_estimation.png}
|
||||||
|
\caption{Εκτίμηση παραμέτρων και ανακατασκευή κατάστασης για το Θέμα 2β}
|
||||||
|
\label{fig:2b}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Η εκτίμηση παραμέτρων συγκλίνει σε πολύ καλές τιμές:
|
||||||
|
\[
|
||||||
|
\hat{a}_1 = 1.4970,\quad \hat{a}_2 = 1.0015,\quad \hat{a}_3 = 0.7439,\quad \hat{b} = 2.0051
|
||||||
|
\]
|
||||||
|
Όπως φαίνεται στο σχήμα \ref{fig:2b}, ενώ η ανακατασκευή της κατάστασης $r(t)$ είναι εύστοχη, με σφάλμα $e_r(t)$ να διατηρείται κάτω από $0.05\,\text{rad}$.
|
||||||
|
Η ελαφριά χρονική υστέρηση και υποεκτίμηση σε ορισμένα διαστήματα οφείλονται στο ότι η ανακατασκευή γίνεται με βάση εκτιμώμενες παραμέτρους και αρχικές μηδενικές συνθήκες.
|
||||||
|
Συνολικά, η μέθοδος Lyapunov αποδείχθηκε κατάλληλη για ταυτόχρονη εκτίμηση και παρακολούθηση σε πραγματικό χρόνο με αξιόπιστα αποτελέσματα.
|
||||||
|
|
||||||
|
|
||||||
|
\end{document}
|
121
Lab02/scripts/Problem1a.m
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
% Gradient estimation for mass-spring-damper system (Exercise 1a)
|
||||||
|
|
||||||
|
% True system parameters
|
||||||
|
m_true = 1.315;
|
||||||
|
b_true = 0.225;
|
||||||
|
k_true = 0.725;
|
||||||
|
|
||||||
|
% Simulation parameters
|
||||||
|
Ts = 0.001;
|
||||||
|
T_total = 30;
|
||||||
|
t = 0:Ts:T_total;
|
||||||
|
N = length(t);
|
||||||
|
|
||||||
|
% Gamma setup
|
||||||
|
gamma = 0.33;
|
||||||
|
use_normalization = true; % Set to false to disable normalization
|
||||||
|
|
||||||
|
fprintf('Using gamma = %.4f\n', gamma);
|
||||||
|
if use_normalization
|
||||||
|
fprintf('Using normalized gradient update.\n');
|
||||||
|
else
|
||||||
|
fprintf('Using unnormalized gradient update.\n');
|
||||||
|
end
|
||||||
|
|
||||||
|
% Define both input cases
|
||||||
|
input_cases = {...
|
||||||
|
struct('name', 'constant', 'u', 2.5 * ones(1, N)), ...
|
||||||
|
struct('name', 'sine', 'u', 2.5 * sin(t)) ...
|
||||||
|
};
|
||||||
|
|
||||||
|
fprintf('True m: %.4f, b: %.4f, k: %.4f\n', m_true, b_true, k_true);
|
||||||
|
|
||||||
|
for case_idx = 1:length(input_cases)
|
||||||
|
input_case = input_cases{case_idx};
|
||||||
|
u = input_case.u;
|
||||||
|
|
||||||
|
% Preallocate state variables
|
||||||
|
x = zeros(1, N);
|
||||||
|
dx = zeros(1, N);
|
||||||
|
ddx = zeros(1, N);
|
||||||
|
|
||||||
|
% Initial conditions
|
||||||
|
x(1) = 0;
|
||||||
|
dx(1) = 0;
|
||||||
|
|
||||||
|
% Simulate true system using RK4
|
||||||
|
for k = 1:N-1
|
||||||
|
f = @(x_, dx_, u_) (1/m_true) * (u_ - b_true * dx_ - k_true * x_);
|
||||||
|
k1 = f(x(k), dx(k), u(k));
|
||||||
|
k2 = f(x(k) + Ts/2 * dx(k), dx(k) + Ts/2 * k1, u(k));
|
||||||
|
k3 = f(x(k) + Ts/2 * dx(k), dx(k) + Ts/2 * k2, u(k));
|
||||||
|
k4 = f(x(k) + Ts * dx(k), dx(k) + Ts * k3, u(k));
|
||||||
|
ddx(k) = k1; % store first derivative (for later reuse)
|
||||||
|
dx(k+1) = dx(k) + Ts/6 * (k1 + 2*k2 + 2*k3 + k4);
|
||||||
|
x(k+1) = x(k) + Ts * dx(k);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Approximate acceleration using finite differences
|
||||||
|
ddx(1:end-1) = diff(dx) / Ts;
|
||||||
|
ddx(end) = ddx(end-1); % replicate last value
|
||||||
|
|
||||||
|
% Gradient estimation setup
|
||||||
|
theta_hat = zeros(3, N); % rows: [m; b; k]
|
||||||
|
theta_hat(:, 1) = [1; 1; 1]; % initial guesses
|
||||||
|
|
||||||
|
% Run gradient estimator
|
||||||
|
for k = 1:N-1
|
||||||
|
u_vec = [ddx(k); dx(k); x(k)];
|
||||||
|
y = u(k);
|
||||||
|
y_hat = theta_hat(:, k)' * u_vec;
|
||||||
|
e = y - y_hat;
|
||||||
|
if use_normalization
|
||||||
|
norm_factor = 1 + norm(u_vec)^2;
|
||||||
|
theta_hat(:, k+1) = theta_hat(:, k) + Ts * gamma * (e / norm_factor) * u_vec;
|
||||||
|
else
|
||||||
|
theta_hat(:, k+1) = theta_hat(:, k) + Ts * gamma * e * u_vec;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Print final estimated values to console
|
||||||
|
fprintf('\nFinal estimates for input: %s\n', input_case.name);
|
||||||
|
fprintf('Estimated m: %.4f, b: %.4f, k: %.4f\n', theta_hat(1,end), theta_hat(2,end), theta_hat(3,end));
|
||||||
|
|
||||||
|
% Plot estimated parameters
|
||||||
|
figure('Name', ['Estimated Parameters - ' input_case.name], 'Position', [100, 100, 1280, 860]);
|
||||||
|
normalization_text = ternary(use_normalization, 'Normalized', 'Unnormalized');
|
||||||
|
sgtitle(sprintf('Input: %s | Gamma = %.3f | %s', input_case.name, gamma, normalization_text), 'FontWeight', 'bold');
|
||||||
|
|
||||||
|
subplot(3,1,1);
|
||||||
|
plot(t, theta_hat(1,:), 'b', 'LineWidth', 1.5);
|
||||||
|
ylabel('$$\hat{m}(t)$$ [kg]', 'Interpreter', 'latex');
|
||||||
|
grid on;
|
||||||
|
title('Εκτίμηση μάζας');
|
||||||
|
|
||||||
|
subplot(3,1,2);
|
||||||
|
plot(t, theta_hat(2,:), 'r', 'LineWidth', 1.5);
|
||||||
|
ylabel('$$\hat{b}(t)$$ [Ns/m]', 'Interpreter', 'latex');
|
||||||
|
grid on;
|
||||||
|
title('Εκτίμηση απόσβεσης');
|
||||||
|
|
||||||
|
subplot(3,1,3);
|
||||||
|
plot(t, theta_hat(3,:), 'k', 'LineWidth', 1.5);
|
||||||
|
ylabel('$$\hat{k}(t)$$ [N/m]', 'Interpreter', 'latex');
|
||||||
|
xlabel('t [sec]');
|
||||||
|
grid on;
|
||||||
|
title('Εκτίμηση ελαστικότητας');
|
||||||
|
|
||||||
|
% Save figure
|
||||||
|
if ~exist('output', 'dir')
|
||||||
|
mkdir('output');
|
||||||
|
end
|
||||||
|
saveas(gcf, sprintf('output/Prob1a_estimation_%s_gamma%.3f_%s_%ds.png', input_case.name, gamma, normalization_text, T_total));
|
||||||
|
end
|
||||||
|
|
||||||
|
function out = ternary(cond, val_true, val_false)
|
||||||
|
if cond
|
||||||
|
out = val_true;
|
||||||
|
else
|
||||||
|
out = val_false;
|
||||||
|
end
|
||||||
|
end
|
116
Lab02/scripts/Problem1b.m
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
%
|
||||||
|
% Problem 1b: Lyapunov-based Parameter Estimation
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
% True system parameters
|
||||||
|
m_true = 1.315;
|
||||||
|
b_true = 0.225;
|
||||||
|
k_true = 0.725;
|
||||||
|
|
||||||
|
% Simulation parameters
|
||||||
|
Ts = 0.001;
|
||||||
|
T_total = 40;
|
||||||
|
t = 0:Ts:T_total;
|
||||||
|
N = length(t);
|
||||||
|
|
||||||
|
% Gamma setup
|
||||||
|
gamma = 0.66;
|
||||||
|
fprintf('Using gamma = %.4f (Lyapunov Based Estimation)\n', gamma);
|
||||||
|
|
||||||
|
% Define sine input only (as per problem statement)
|
||||||
|
u = 2.5 * sin(t);
|
||||||
|
|
||||||
|
% Simulate the true system
|
||||||
|
x = zeros(1, N);
|
||||||
|
dx = zeros(1, N);
|
||||||
|
ddx = zeros(1, N);
|
||||||
|
x(1) = 0; dx(1) = 0;
|
||||||
|
for k = 1:N-1
|
||||||
|
f = @(x_, dx_, u_) (1/m_true) * (u_ - b_true * dx_ - k_true * x_);
|
||||||
|
k1 = f(x(k), dx(k), u(k));
|
||||||
|
k2 = f(x(k) + Ts/2 * dx(k), dx(k) + Ts/2 * k1, u(k));
|
||||||
|
k3 = f(x(k) + Ts/2 * dx(k), dx(k) + Ts/2 * k2, u(k));
|
||||||
|
k4 = f(x(k) + Ts * dx(k), dx(k) + Ts * k3, u(k));
|
||||||
|
ddx(k) = k1;
|
||||||
|
dx(k+1) = dx(k) + Ts/6 * (k1 + 2*k2 + 2*k3 + k4);
|
||||||
|
x(k+1) = x(k) + Ts * dx(k);
|
||||||
|
end
|
||||||
|
ddx(1:end-1) = diff(dx) / Ts;
|
||||||
|
ddx(end) = ddx(end-1);
|
||||||
|
|
||||||
|
% Estimation using Lyapunov structure
|
||||||
|
phi_all = [ddx; dx; x]; % shape: [3 x N]
|
||||||
|
theta_hat = zeros(3, N);
|
||||||
|
theta_hat(:, 1) = [1; 1; 1];
|
||||||
|
|
||||||
|
for k = 1:N-1
|
||||||
|
phi = phi_all(:,k);
|
||||||
|
y = u(k);
|
||||||
|
y_hat = theta_hat(:,k)' * phi;
|
||||||
|
e = y - y_hat;
|
||||||
|
theta_hat(:,k+1) = theta_hat(:,k) + Ts * gamma * e * phi;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Final estimates
|
||||||
|
fprintf('\nFinal estimates:\n');
|
||||||
|
fprintf('Estimated m: %.4f, b: %.4f, k: %.4f\n', theta_hat(1,end), theta_hat(2,end), theta_hat(3,end));
|
||||||
|
|
||||||
|
% Plot results
|
||||||
|
figure('Name', 'Lyapunov Estimation (notes form)', 'Position', [100, 100, 1280, 860]);
|
||||||
|
sgtitle(sprintf('Input: sine | Gamma = %.3f | Lyapunov', gamma), 'FontWeight', 'bold');
|
||||||
|
|
||||||
|
subplot(3,1,1);
|
||||||
|
plot(t, theta_hat(1,:), 'b', 'LineWidth', 1.5);
|
||||||
|
ylabel('$$\hat{m}(t)$$ [kg]', 'Interpreter', 'latex');
|
||||||
|
grid on; title('Εκτίμηση μάζας');
|
||||||
|
|
||||||
|
subplot(3,1,2);
|
||||||
|
plot(t, theta_hat(2,:), 'r', 'LineWidth', 1.5);
|
||||||
|
ylabel('$$\hat{b}(t)$$ [Ns/m]', 'Interpreter', 'latex');
|
||||||
|
grid on; title('Εκτίμηση απόσβεσης');
|
||||||
|
|
||||||
|
subplot(3,1,3);
|
||||||
|
plot(t, theta_hat(3,:), 'k', 'LineWidth', 1.5);
|
||||||
|
ylabel('$$\hat{k}(t)$$ [N/m]', 'Interpreter', 'latex');
|
||||||
|
xlabel('t [sec]');
|
||||||
|
grid on; title('Εκτίμηση ελαστικότητας');
|
||||||
|
|
||||||
|
if ~exist('output', 'dir')
|
||||||
|
mkdir('output');
|
||||||
|
end
|
||||||
|
saveas(gcf, sprintf('output/Prob1b_lyapunov_gamma%.3f_%ds.png', gamma, T_total));
|
||||||
|
|
||||||
|
% Reconstruct estimated output x_hat(t)
|
||||||
|
x_hat = zeros(1, N);
|
||||||
|
dx_hat = zeros(1, N);
|
||||||
|
dx_hat(1) = 0;
|
||||||
|
for k = 1:N-1
|
||||||
|
m_hat = theta_hat(1,k);
|
||||||
|
b_hat = theta_hat(2,k);
|
||||||
|
k_hat = theta_hat(3,k);
|
||||||
|
ddx_hat = (u(k) - b_hat * dx_hat(k) - k_hat * x_hat(k)) / m_hat;
|
||||||
|
dx_hat(k+1) = dx_hat(k) + Ts * ddx_hat;
|
||||||
|
x_hat(k+1) = x_hat(k) + Ts * dx_hat(k);
|
||||||
|
end
|
||||||
|
e_x = x - x_hat;
|
||||||
|
|
||||||
|
% Plot extra figure with x, x_hat and e_x
|
||||||
|
figure('Name', 'System Response vs Estimation', 'Position', [100, 100, 1280, 860]);
|
||||||
|
sgtitle(sprintf('System Response and Error | Gamma = %.3f', gamma), 'FontWeight', 'bold');
|
||||||
|
|
||||||
|
subplot(2,1,1);
|
||||||
|
plot(t, x, 'b', t, x_hat, '--r', 'LineWidth', 1.5);
|
||||||
|
legend('x(t)', 'x_{hat}(t)', 'Location', 'Best');
|
||||||
|
ylabel('Θέση [m]');
|
||||||
|
grid on; title('Αντίδραση Συστήματος και Εκτίμηση');
|
||||||
|
|
||||||
|
subplot(2,1,2);
|
||||||
|
plot(t, e_x, 'k', 'LineWidth', 1.5);
|
||||||
|
ylabel('e_x(t)');
|
||||||
|
grid on; title('Σφάλμα θέσης: x(t) - x_{hat}(t)');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
saveas(gcf, sprintf('output/Prob1b_extrastates_gamma%.3f_%ds.png', gamma, T_total));
|
||||||
|
|
102
Lab02/scripts/Problem1c.m
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
%
|
||||||
|
% Problem 1c: Effect of bounded sinusoidal disturbance on measurement x(t)
|
||||||
|
%
|
||||||
|
|
||||||
|
% True system parameters
|
||||||
|
m_true = 1.315;
|
||||||
|
b_true = 0.225;
|
||||||
|
k_true = 0.725;
|
||||||
|
|
||||||
|
% Simulation parameters
|
||||||
|
Ts = 0.001;
|
||||||
|
T_total = 40;
|
||||||
|
t_full = 0:Ts:T_total;
|
||||||
|
|
||||||
|
% Generate full input signal
|
||||||
|
u_full = 2.5 * sin(t_full);
|
||||||
|
|
||||||
|
% Simulate the true system
|
||||||
|
x = zeros(1, length(t_full));
|
||||||
|
dx = zeros(1, length(t_full));
|
||||||
|
ddx = zeros(1, length(t_full));
|
||||||
|
x(1) = 0; dx(1) = 0;
|
||||||
|
for k = 1:length(t_full)-1
|
||||||
|
f = @(x_, dx_, u_) (1/m_true) * (u_ - b_true * dx_ - k_true * x_);
|
||||||
|
k1 = f(x(k), dx(k), u_full(k));
|
||||||
|
k2 = f(x(k) + Ts/2 * dx(k), dx(k) + Ts/2 * k1, u_full(k));
|
||||||
|
k3 = f(x(k) + Ts/2 * dx(k), dx(k) + Ts/2 * k2, u_full(k));
|
||||||
|
k4 = f(x(k) + Ts * dx(k), dx(k) + Ts * k3, u_full(k));
|
||||||
|
ddx(k) = k1;
|
||||||
|
dx(k+1) = dx(k) + Ts/6 * (k1 + 2*k2 + 2*k3 + k4);
|
||||||
|
x(k+1) = x(k) + Ts * dx(k);
|
||||||
|
end
|
||||||
|
ddx(1:end-1) = diff(dx) / Ts;
|
||||||
|
ddx(end) = ddx(end-1);
|
||||||
|
|
||||||
|
% Initial estimation (clean) using Lyapunov
|
||||||
|
T_total = 40;
|
||||||
|
index_limit = round(T_total / Ts);
|
||||||
|
t = t_full(1:index_limit);
|
||||||
|
N = length(t);
|
||||||
|
u = u_full(1:index_limit);
|
||||||
|
x = x(1:index_limit);
|
||||||
|
dx = dx(1:index_limit);
|
||||||
|
ddx = ddx(1:index_limit);
|
||||||
|
|
||||||
|
phi_all = [ddx; dx; x];
|
||||||
|
theta_hat = zeros(3, N);
|
||||||
|
theta_hat(:, 1) = [1; 1; 1];
|
||||||
|
gamma = 0.66;
|
||||||
|
for k = 1:N-1
|
||||||
|
phi = phi_all(:,k);
|
||||||
|
y = u(k);
|
||||||
|
y_hat = theta_hat(:,k)' * phi;
|
||||||
|
e = y - y_hat;
|
||||||
|
theta_hat(:,k+1) = theta_hat(:,k) + Ts * gamma * e * phi;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Disturbance settings
|
||||||
|
eta0 = 0.1;
|
||||||
|
f0 = 0.5;
|
||||||
|
eta = eta0 * sin(2 * pi * f0 * t);
|
||||||
|
x_noisy = x + eta;
|
||||||
|
|
||||||
|
% Use clean derivatives, noisy position
|
||||||
|
phi_all_noise = [ddx; dx; x_noisy];
|
||||||
|
theta_hat_noise = zeros(3, N);
|
||||||
|
theta_hat_noise(:, 1) = [1; 1; 1];
|
||||||
|
|
||||||
|
for k = 1:N-1
|
||||||
|
phi = phi_all_noise(:,k);
|
||||||
|
y = u(k);
|
||||||
|
y_hat = theta_hat_noise(:,k)' * phi;
|
||||||
|
e = y - y_hat;
|
||||||
|
theta_hat_noise(:,k+1) = theta_hat_noise(:,k) + Ts * gamma * e * phi;
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('\n1c: Final estimates with disturbance:\n');
|
||||||
|
fprintf('Estimated m: %.4f, b: %.4f, k: %.4f\n', ...
|
||||||
|
theta_hat_noise(1,end), theta_hat_noise(2,end), theta_hat_noise(3,end));
|
||||||
|
|
||||||
|
figure('Name', '1c - Parameter Estimation with Disturbance', 'Position', [100, 100, 1280, 860]);
|
||||||
|
sgtitle(sprintf('Lyapunov Estimation with Disturbance | η_0 = %.2f', eta0));
|
||||||
|
|
||||||
|
subplot(3,1,1);
|
||||||
|
plot(t, theta_hat(1,:), 'b', t, theta_hat_noise(1,:), '--b', 'LineWidth', 1.2);
|
||||||
|
ylabel('m(t)'); grid on; title('Μάζα');
|
||||||
|
legend('Clear', 'With noise');
|
||||||
|
|
||||||
|
subplot(3,1,2);
|
||||||
|
plot(t, theta_hat(2,:), 'r', t, theta_hat_noise(2,:), '--r', 'LineWidth', 1.2);
|
||||||
|
ylabel('b(t)'); grid on; title('Απόσβεση');
|
||||||
|
legend('Clear', 'With noise');
|
||||||
|
|
||||||
|
subplot(3,1,3);
|
||||||
|
plot(t, theta_hat(3,:), 'k', t, theta_hat_noise(3,:), '--k', 'LineWidth', 1.2);
|
||||||
|
ylabel('k(t)'); xlabel('t [s]'); grid on; title('Ελαστικότητα');
|
||||||
|
legend('Clear', 'With noise');
|
||||||
|
|
||||||
|
if ~exist('output', 'dir')
|
||||||
|
mkdir('output');
|
||||||
|
end
|
||||||
|
saveas(gcf, sprintf('output/Prob1c_disturbance_eta%.2f.png', eta0));
|
93
Lab02/scripts/Problem2a.m
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
%
|
||||||
|
% Problem 2a: Nonlinear system roll model parameter estimation without disturbance
|
||||||
|
%
|
||||||
|
|
||||||
|
% True system parameters
|
||||||
|
a1 = 2.0;
|
||||||
|
a2 = 1.0;
|
||||||
|
a3 = 0.5;
|
||||||
|
b = 2.0;
|
||||||
|
|
||||||
|
% Simulation setup
|
||||||
|
Ts = 0.001;
|
||||||
|
T_total = 30;
|
||||||
|
t = 0:Ts:T_total;
|
||||||
|
N = length(t);
|
||||||
|
|
||||||
|
% Reference trajectory: step profile
|
||||||
|
r_d = zeros(1, N);
|
||||||
|
r_d(t >= 10 & t < 20) = pi/10;
|
||||||
|
|
||||||
|
% Smooth bound phi(t)
|
||||||
|
phi0 = 1.5;
|
||||||
|
phi_inf = 0.05;
|
||||||
|
lambda = 0.5;
|
||||||
|
phi = (phi0 - phi_inf) * exp(-lambda * t) + phi_inf;
|
||||||
|
|
||||||
|
% Control parameters
|
||||||
|
k1 = 1.0;
|
||||||
|
k2 = 1.0;
|
||||||
|
rho = 1.0;
|
||||||
|
|
||||||
|
% Initial conditions
|
||||||
|
r = zeros(1, N);
|
||||||
|
dr = zeros(1, N);
|
||||||
|
ddr = zeros(1, N);
|
||||||
|
|
||||||
|
% Parameter estimation setup
|
||||||
|
theta_hat = zeros(4, N);
|
||||||
|
theta_hat(:,1) = [1; 1; 1; 1];
|
||||||
|
gamma = 0.66;
|
||||||
|
|
||||||
|
% Output storage for control input and errors
|
||||||
|
alpha = zeros(1, N);
|
||||||
|
u = zeros(1, N);
|
||||||
|
|
||||||
|
for k = 1:N-1
|
||||||
|
% Compute normalized errors
|
||||||
|
z1 = (r(k) - r_d(k)) / phi(k);
|
||||||
|
z1 = max(min(z1, 0.999), -0.999);
|
||||||
|
alpha(k) = -k1 * log((1 + z1) / (1 - z1));
|
||||||
|
|
||||||
|
z2 = (dr(k) - alpha(k)) / rho;
|
||||||
|
z2 = max(min(z2, 0.999), -0.999);
|
||||||
|
u(k) = -k2 * log((1 + z2) / (1 - z2));
|
||||||
|
|
||||||
|
% True system dynamics
|
||||||
|
phi_true = [-dr(k); -sin(r(k)); dr(k)^2 * sin(2*r(k)); u(k)];
|
||||||
|
ddr(k) = a1 * phi_true(1) + a2 * phi_true(2) + a3 * phi_true(3) + b * phi_true(4);
|
||||||
|
|
||||||
|
% Integrate dynamics
|
||||||
|
dr(k+1) = dr(k) + Ts * ddr(k);
|
||||||
|
r(k+1) = r(k) + Ts * dr(k);
|
||||||
|
|
||||||
|
% Estimation
|
||||||
|
phi_est = phi_true; % same form
|
||||||
|
y = ddr(k);
|
||||||
|
y_hat = theta_hat(:,k)' * phi_est;
|
||||||
|
e = y - y_hat;
|
||||||
|
theta_hat(:,k+1) = theta_hat(:,k) + Ts * gamma * e * phi_est;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Final estimates
|
||||||
|
fprintf('\n2a: Final estimated parameters:\n');
|
||||||
|
fprintf('a1: %.4f, a2: %.4f, a3: %.4f, b: %.4f\n', theta_hat(1,end), theta_hat(2,end), theta_hat(3,end), theta_hat(4,end));
|
||||||
|
|
||||||
|
% Plot parameter estimates
|
||||||
|
figure('Name', 'Problem 2a - Parameter Estimation', 'Position', [100, 100, 1280, 860]);
|
||||||
|
sgtitle('Nonlinear Roll System - Parameter Estimation');
|
||||||
|
|
||||||
|
subplot(2,1,1);
|
||||||
|
plot(t, theta_hat', 'LineWidth', 1.4);
|
||||||
|
legend('a_1', 'a_2', 'a_3', 'b');
|
||||||
|
ylabel('\theta estimates'); grid on; title('Εκτιμήσεις παραμέτρων');
|
||||||
|
|
||||||
|
subplot(2,1,2);
|
||||||
|
plot(t, r, 'b', t, r_d, '--r', 'LineWidth', 1.4);
|
||||||
|
legend('r(t)', 'r_d(t)');
|
||||||
|
ylabel('Roll angle [rad]'); xlabel('Time [s]'); grid on; title('Παρακολούθηση τροχιάς');
|
||||||
|
|
||||||
|
if ~exist('output', 'dir')
|
||||||
|
mkdir('output');
|
||||||
|
end
|
||||||
|
saveas(gcf, 'output/Problem2a_estimation.png');
|
103
Lab02/scripts/Problem2b.m
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
%
|
||||||
|
% Problem 2b: Estimation of unknown parameters using Lyapunov (r, dr, u measurable)
|
||||||
|
%
|
||||||
|
|
||||||
|
% True system parameters
|
||||||
|
a1 = 2.0;
|
||||||
|
a2 = 1.0;
|
||||||
|
a3 = 0.5;
|
||||||
|
b = 2.0;
|
||||||
|
|
||||||
|
% Simulation setup
|
||||||
|
Ts = 0.001;
|
||||||
|
T_total = 30;
|
||||||
|
t = 0:Ts:T_total;
|
||||||
|
N = length(t);
|
||||||
|
|
||||||
|
% Reference trajectory
|
||||||
|
r_d = zeros(1, N);
|
||||||
|
r_d(t >= 10 & t < 20) = pi/10;
|
||||||
|
|
||||||
|
% Smooth bound phi(t)
|
||||||
|
phi0 = 1.5;
|
||||||
|
phi_inf = 0.05;
|
||||||
|
lambda = 0.5;
|
||||||
|
phi = (phi0 - phi_inf) * exp(-lambda * t) + phi_inf;
|
||||||
|
|
||||||
|
% Control parameters
|
||||||
|
k1 = 1.0;
|
||||||
|
k2 = 1.0;
|
||||||
|
rho = 1.0;
|
||||||
|
|
||||||
|
% Initial conditions
|
||||||
|
r = zeros(1, N);
|
||||||
|
dr = zeros(1, N);
|
||||||
|
ddr = zeros(1, N);
|
||||||
|
|
||||||
|
% Estimated trajectory reconstruction
|
||||||
|
r_hat = zeros(1, N);
|
||||||
|
dr_hat = zeros(1, N);
|
||||||
|
dr_hat(1) = 0; r_hat(1) = 0;
|
||||||
|
|
||||||
|
% Parameter estimation setup
|
||||||
|
theta_hat = zeros(4, N);
|
||||||
|
theta_hat(:,1) = [1; 1; 1; 1];
|
||||||
|
gamma = 0.66;
|
||||||
|
|
||||||
|
alpha = zeros(1, N);
|
||||||
|
u = zeros(1, N);
|
||||||
|
|
||||||
|
for k = 1:N-1
|
||||||
|
% Control law
|
||||||
|
z1 = (r(k) - r_d(k)) / phi(k);
|
||||||
|
z1 = max(min(z1, 0.999), -0.999);
|
||||||
|
alpha(k) = -k1 * log((1 + z1) / (1 - z1));
|
||||||
|
|
||||||
|
z2 = (dr(k) - alpha(k)) / rho;
|
||||||
|
z2 = max(min(z2, 0.999), -0.999);
|
||||||
|
u(k) = -k2 * log((1 + z2) / (1 - z2));
|
||||||
|
|
||||||
|
% System dynamics
|
||||||
|
phi_vec = [-dr(k); -sin(r(k)); dr(k)^2 * sin(2*r(k)); u(k)];
|
||||||
|
ddr(k) = a1 * phi_vec(1) + a2 * phi_vec(2) + a3 * phi_vec(3) + b * phi_vec(4);
|
||||||
|
dr(k+1) = dr(k) + Ts * ddr(k);
|
||||||
|
r(k+1) = r(k) + Ts * dr(k);
|
||||||
|
|
||||||
|
% Parameter estimation
|
||||||
|
y = ddr(k);
|
||||||
|
y_hat = theta_hat(:,k)' * phi_vec;
|
||||||
|
e = y - y_hat;
|
||||||
|
theta_hat(:,k+1) = theta_hat(:,k) + Ts * gamma * e * phi_vec;
|
||||||
|
|
||||||
|
% Reconstruct r_hat from estimated theta
|
||||||
|
phi_hat = [-dr_hat(k); -sin(r_hat(k)); dr_hat(k)^2 * sin(2 * r_hat(k)); u(k)];
|
||||||
|
dd_r_hat = theta_hat(:,k)' * phi_hat;
|
||||||
|
dr_hat(k+1) = dr_hat(k) + Ts * dd_r_hat;
|
||||||
|
r_hat(k+1) = r_hat(k) + Ts * dr_hat(k);
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('\n2b: Final estimated parameters:\n');
|
||||||
|
fprintf('a1: %.4f, a2: %.4f, a3: %.4f, b: %.4f\n', theta_hat(1,end), theta_hat(2,end), theta_hat(3,end), theta_hat(4,end));
|
||||||
|
|
||||||
|
% Plot
|
||||||
|
figure('Name', 'Problem 2b - Estimation with State Comparison', 'Position', [100, 100, 1280, 860]);
|
||||||
|
sgtitle('Problem 2b - Parameter Estimation and State Reconstruction');
|
||||||
|
|
||||||
|
subplot(3,1,1);
|
||||||
|
plot(t, theta_hat', 'LineWidth', 1.4);
|
||||||
|
legend('a_1', 'a_2', 'a_3', 'b');
|
||||||
|
ylabel('\theta estimates'); grid on; title('Εκτιμήσεις παραμέτρων');
|
||||||
|
|
||||||
|
subplot(3,1,2);
|
||||||
|
plot(t, r, 'b', t, r_hat, '--r', 'LineWidth', 1.4);
|
||||||
|
legend('r(t)', 'r_{hat}(t)');
|
||||||
|
ylabel('Roll angle [rad]'); title('Πραγματικό vs εκτιμώμενο r(t)'); grid on;
|
||||||
|
|
||||||
|
subplot(3,1,3);
|
||||||
|
plot(t, r - r_hat, 'k', 'LineWidth', 1.4);
|
||||||
|
ylabel('e_r(t)'); xlabel('Time [s]'); title('Σφάλμα θέσης: r(t) - r̂(t)'); grid on;
|
||||||
|
|
||||||
|
if ~exist('output', 'dir')
|
||||||
|
mkdir('output');
|
||||||
|
end
|
||||||
|
saveas(gcf, 'output/Problem2b_estimation.png');
|
0
Lab02/scripts/Problem2c.m
Normal file
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 81 KiB |
BIN
Lab02/scripts/output/Prob1b_extrastates_gamma0.660_40s.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
Lab02/scripts/output/Prob1b_lyapunov_gamma0.660_40s.png
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
Lab02/scripts/output/Prob1c_disturbance_eta0.10.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
Lab02/scripts/output/Problem2a_estimation.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
Lab02/scripts/output/Problem2b_estimation.png
Normal file
After Width: | Height: | Size: 85 KiB |