HW1: Assignment 1 report added

This commit is contained in:
Christos Choutouridis 2025-10-23 04:10:00 +03:00
parent 33a1cc69bd
commit de85e9cf10
14 changed files with 175 additions and 16 deletions

Binary file not shown.

View File

@ -47,7 +47,7 @@
%\CoAuthorAEM{1234}
%\CoAuthorMail{xxx@ece.auth.gr}
\DocTitle{Εργασία στα Ασαφή Συστήματα}
\DocTitle{Εργασία 1}
\DocSubTitle{Έλεγχος γωνίας προσανατολισμού δορυφόρου με ασαφείς ελεγκτές}
\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
@ -63,6 +63,9 @@
\usepackage{float}
\usepackage{minted}
\usepackage{xcolor} %
\usepackage{amsmath, amssymb, amsfonts}
\usepackage{diagbox}
%\usepackage{tabular}
\setminted[cpp]{
fontsize=\small,
@ -74,7 +77,7 @@
gobble=0
}
\newcommand{\repo}{https://git.hoo2.net/hoo2/PDS/src/branch/master/homework_3}
\newcommand{\repo}{https://git.hoo2.net/hoo2/FuzzySystems/src/branch/master/Work\%201}
\begin{document}
@ -84,15 +87,168 @@
\section{Εισαγωγή}
Η παρούσα εργασία αποτελεί
Στην εργασία αυτή εξετάζεται ο έλεγχος του συστήματος
$G_p(s)=\frac{10}{(s+1)(s+9)}$
με δύο προσεγγίσεις: (i) κλασικός PI και (ii) ασαφής ελεγκτής τύπου FuzzyPI (Mamdani).
Στόχος είναι η ικανοποίηση προδιαγραφών μεταβατικής απόκρισης (υπερύψωση, χρόνος ανόδου/αποκατάστασης) και η σύγκριση της ικανότητας παρακολούθησης αναφορών.
Για τον PI γίνεται διερεύνηση rootlocus με σταθερό μηδενικό και επιλογή κέρδους βάσει κριτηρίου ITAE.
Για τον Fuzzy-PI γίνεται προσδιορισμός κανόνων εμπειρικά.
Η αξιολόγηση περιλαμβάνει απόκριση βήματος και δύο σενάρια αναφοράς (πολυ-βηματικό και τραπεζοειδές).
\subsection{Παραδοτέα}
Τα παραδοτέα της εργασίας αποτελούνται από:
\begin{itemize}
\item Την παρούσα αναφορά.
\item Το \href{\hwThree}{σύνδεσμο με το αποθετήριο} που περιέχει τον κώδικα για την παραγωγή των εκτελέσιμων και της αναφοράς.
\item Τον κατάλογο \textbf{source}, με τον κώδικα της matlab.
\item Το \href{\repo}{σύνδεσμο με το αποθετήριο} που περιέχει τον κώδικα της matlab καθώς και αυτόν της αναφοράς.
\end{itemize}
\section{Σχεδίαση Γραμμικού Ελεγκτή}
Αρχικά υλοποιήσαμε ένα γραμμικό ελεγκτή PI
\[
G_c(s) = K_p + \frac{K_i}{s} = K_p \frac{s+c}{s}
\],
όπου $c=\frac{K_i}{K_p}$.
Στο σχήμα \ref{fig:linear_system} φαίνεται ο βρόχος ελέγχου που υλοποιήθηκε.
\InsertFigure{!h}{0.8}{fig:linear_system}{img/LinearSystem.png}{Γραμμικός ελεγκτής.}
Για το συγκεκριμένο σύστημα οι προδιαγραφές σχεδίασης μας δίνονται:
\begin{itemize}
\item Υπερύψωση σε βηματική είσοδο, μικρότερη από 10\%.
\item Χρόνος ανόδου μικρότερος από $1.2sec$.
\end{itemize}
Από την εκφώνηση της εργασίες μας ζητείται να φέρουμε το σύστημα ανοιχτού βρόχου στη μορφή $\frac{K(s+c)}{(s+1)(s+9)}$ και τοποθετήσουμε το μηδενικό του PI στο $c=1$.
Αν και αυτό είναι περιοριστικό για μια βέλτιστη σχεδίαση, για την παρούσα εργασία επιλέξαμε να αναζητήσουμε το κέρδος Κ με brute force.
Για κριτήριο επιλογής πέρα από την απλή ικανοποίηση των προδιαγραφών, επιλέξαμε την χρήση μιας συνάρτησης κόστους ΙΤΑΕ: $\int t |e(t)| dt$.
Ο κώδικας για την αναζήτηση βρίσκεται στο αρχείο \textit{satelite\_PI.m}.
Στο σχήμα \ref{fig:lin_system} φαίνεται ο γεωμετρικός τόπος των ριζών για την βέλτιστη επιλογή κέρδους Κ καθώς και η βηματική απόκριση του συστήματος.
\begin{figure}[!ht]
\captionsetup{
format=plain, labelfont={bf,up}, textfont={it,up},
justification=centering,singlelinecheck=false
}
\includegraphics[width=0.48\textwidth]{../source/Root_Locus_c1.png}
\hspace{1em}
\includegraphics[width=0.48\textwidth]{../source/Step_Responce_c1_Kp5.79_Ki5.79.png}
\caption{Σχεδίαση και απόκριση γραμμικού ελεγκτή.}
\label{fig:lin_system}
\end{figure}
\section{Σχεδίαση Ασαφούς Ελεγκτή (FLC)}
Για τη σχεδίαση του ασαφούς ελεγκτή υλοποιήσαμε τις παρακάτω βασικές συναρτήσεις.
\begin{itemize}
\item \textit{mkFIS()}: Όπου δηλώσαμε το fuzzy controller καθώς και της συναρτήσεις συμμετοχής και τους κανόνες.
Ο ελεγκτής μας δέχεται 2 εισόδους, το σφάλμα και την πρώτη χρονική του παράγωγο ($e, \dot{e}$) και επιστρέφει την πρώτη παράγωγο του σήματος ελέγχου $\dot{u}$.
Οι συναρτήσεις συμμετοχής δηλώθηκαν με βάση το σχήμα \ref{fig:member_functions}.
\InsertFigure{!ht}{0.7}{fig:member_functions}{img/MemberFunctions.png}{Συναρτήσεις συμμετοχής.}
Η βάση κανόνων σχεδιάστηκε εμπειρικά.
Αν και δεν μπορούμε να αναγάγουμε τους εαυτούς μας σε ειδικούς, για την παρούσα εργασία δεν είχαμε άλλη επιλογή.
Η λογική που χρησιμοποιήσαμε βασίζεται στην παρατήριση πως, όταν το σφάλμα και η μεταβολή του σφάλματος έχουν αντίθετο πρόσημο, τότε το σύστημα τείνει προς ισορροπία.
Επομένως, δεν αλλάζουνε το σήμα ελέγχου $\dot{u}$.
Αυτό δημιουργεί μια διαγώνιο με τη λεκτική τιμή "ZR", όπως φαίνεται στον πίνακα \ref{tab:ruleTable}.
Επιπροσθέτως, όταν το σφάλμα αυξάνεται και είναι ήδη θετικό, ή μειώνεται και είναι ήδη αρνητικό, τότε εντείνουμε την έξοδο με θετικές και αρνητικές τιμές αντίστοιχα.
\begin{table}[!ht]
\centering
\small
\setlength{\tabcolsep}{6pt}
\small
\renewcommand{\arraystretch}{1.15}
\begin{tabular}{c|ccccccccc}
\diagbox{$\dot{e}$}{$e$}
& NV & NL & NM & NS & ZR & PS & PM & PL & PV \\ \hline
NV & NV & NV & NV & NV & NV & NL & NM & NS & ZR \\ % e = NV
NL & NV & NV & NV & NV & NL & NM & NS & ZR & PS \\ % e = NL
NM & NV & NV & NV & NL & NM & NS & ZR & PS & PM \\ % e = NM
NS & NV & NV & NL & NM & NS & ZR & PS & PM & PL \\ % e = NS
ZR & NV & NL & NM & NS & ZR & PS & PM & PL & PV \\ % e = ZR
PS & NL & NM & NS & ZR & PS & PM & PL & PV & PV \\ % e = PS
PM & NM & NS & ZR & PS & PM & PL & PV & PV & PV \\ % e = PM
PL & NS & ZR & PS & PM & PL & PV & PV & PV & PV \\ % e = PL
PV & ZR & PS & PM & PL & PV & PV & PV & PV & PV % e = PV
\end{tabular}
\caption{Βάση κανόνων (9$\times$9) για $e$ και $\dot{e}$ με έξοδο $ \dot{u}$.}
\label{tab:ruleTable}
\end{table}
\item \textit{satFZ\_PI()}: Σε αυτή τη συνάρτηση υλοποιήσαμε την τοπολογία όπου τα βάρη $K_e, K_{de}, \alpha, K_{du}$ επιδρούν, τόσο στην κανονικοποίηση των σημάτων πριν και μετά τον ελεγκτή, όσο και στο tuning.
Η συνάρτηση αυτή δέχεται ως είσοδο το σφάλμα $e$ και επιστρέφει το σήμα ελέγχου $u$, όπως ακριβώς κάνει και ο αντίστοιχος ελεγκτής $Gc$.
Εδώ όμως δημιουργούμε εσωτερικά τα σήματα $e, \dot{e}$ για τον ασαφή ελεγκτή μας καθώς και αναδημιουργούμε το σήμα $u$ από τις διαφορές $\Delta u$.
Καθώς η διαδικασία είναι διακριτή, η συνάρτηση αυτή πρέπει να καλείται περιοδικά για όσο διάστημα θέλουμε να προσομοιώσουμε το σύστημα.
Για το tuning, χρησιμοποιήσαμε πάλι brute force μέθοδο και αναζητήσαμε όλα τα ζευγάρια $K_{de}, K_{du}$ που κανονικοποιούν την διαφορά του σφάλματος εισόδου και την διαφορά του σήματος εξόδου αντίστοιχα, ώστε να επιτύχουμε την καλύτερη δυνατή απόκριση.
Ως μετρική χρησιμοποιήσαμε πάλι την μετρική ITAE.
\end{itemize}
\section{Σενάριο 1}
\subsection{Σχεδίαση και Απόκριση του ελεγκτή}
Για την σχεδίαση του ελεγκτή, και με βάση αυτά που είπαμε παραπάνω, χρειάζεται απλά να τρέξουμε το \textit{scenario1\_tuning.m} το οποίο μας δίνει:
\begin{verbatim}
Best match: Kde=0.29, Kdu=0.33
Step response:
RiseTime : 0.3217 s
SettlingTime : 0.9389 s
Overshoot : 1.16%
Peak : 1.012
PeakTime : 1.13 s
SS error : 2.471e-05 [t=5 s]
\end{verbatim}
Με το script \textit{scenatio1a.m} εκτελούμε μια προσομοίωση για 5 sec και παίρνουμε τη βηματική απόκριση που φαίνεται στο σχήμα \ref{fig:step_fuzzy}.
\InsertFigure{!ht}{0.7}{fig:step_fuzzy}{../source/Step_Responce_FZ.png}{Βηματική απόκριση για $K_{de}=0.29$ και $K_{du}=0.33$.}
\subsection{Λειτουργία βάσης του ελεγκτή}
Στο σχήμα \ref{fig:rule_graph} "ίσως" φαίνεται η διέγερση των κανόνων σε είσοδο: $e=NM$ και $\dot{e}=ZR$.
\InsertFigure{!ht}{0.95}{fig:rule_graph}{../source/Rule_graphics.png}{Διέγερση των κανόνων του ελεγκτή για $e=0.41$ και $\dot{e}=0.03$.}
Για το σκοπό αυτό μπορούμε να εκτελέσουμε το script \textit{scenarion1bc.m} και έπειτα να εισάγουμε τις τιμές για τα $e$ και $\dot{e}$.
Για το παράδειγμα του σχήματος \ref{fig:rule_graph}, έχουμε χρησιμοποιήσει $e=0.41, \dot{e}=0.03$.
\subsection{Λειτουργία βάσης του ελεγκτή}
Στο σχήμα \ref{fig:fcl_surface} φαίνεται μια τρισδιάστατη απεικόνιση της επιφάνειας εξόδου του ασαφούς συστήματος.
Μπορούμε να παρατηρήσουμε πως η διαισθητική μας επιλογή οδηγούν με μία επιφάνεια που κλιμακώνεται ομαλά σε όλο τον χώρο των εισόδων.
\InsertFigure{!ht}{0.7}{fig:fcl_surface}{../source/FLC surface.png}{Απεικόνιση εισόδων - εξόδων του ασαφούς ελεγκτή.}
\section{Σενάριο 2}
Στο σενάριο 2, εξετάζουμε τη συμπεριφορά του ελεγκτή μας σε διαφορετικές εισόδους.
Μια με περισσότερα του ενός βήματα και μία με κλιμακούμενη είσοδο.
Στο σχήμα \ref{fig:scenario_2} φαίνονται οι αποκρίσεις των εξόδων του συστήματος, σε σχέση με τις εισόδους, οι οποίες παράγονται από το script \textit{scenario2.m}.
Να σημειώσουμε εδώ, πως ο ελεγκτής χρησιμοποιήθηκε με τις ίδιες τιμές που υπολογίσαμε για το πλάτος της βηματικής εισόδου και οι είσοδοι και έξοδοι για το σενάριο προσαρμόστηκαν ώστε να καλύψουν όλο το πλάτος των εισόδου και εξόδων του σεναρίου.
\begin{figure}[!ht]
\captionsetup{
format=plain, labelfont={bf,up}, textfont={it,up},
justification=centering,singlelinecheck=false
}
\includegraphics[width=0.48\textwidth]{../source/MultiStep_Responce_FZ.png}
\hspace{1em}
\includegraphics[width=0.48\textwidth]{../source/Trapezoid_Responce_FZ.png}
\caption{Απόκριση ελεγκτή σε βηματική και κλιμακούμενη είσοδο.}
\label{fig:scenario_2}
\end{figure}
Παρατηρούμε ότι ο ελεγκτής έχει πολύ καλή συμπεριφορά.
Και στις δύο περιπτώσεις καταφέρνει και παρακολουθεί την είσοδο ελέγχου χωρίς πρόβλημα.
Ειδικά στην κλιμακούμενη είσοδο, που έχει μικρότερο slew rate.
\section {Συμπεράσματα}
Στην εργασία συγκρίναμε έναν κλασικό PI με έναν ασαφή FuzzyPI για το δορυφορικό μοντέλο.
Ο PI, με $c=1$ και βέλτιστο $K$, ικανοποίησε τις προδιαγραφές και έδωσε γρήγορη άνοδο, αλλά με υπερύψωση κοντά στο όριο (10\%).
Ο FuzzyPI υλοποιήθηκε ως Mamdani με δύο εισόδους $(e,\dot e)$, έξοδο $\Delta u$, κανόνες 9$\times$9 και εξωτερική κλιμακοποίηση σε $[-1,1]$.
Ο συντονισμός των $K_{de},K_u$ έγινε με αναζήτηση και κριτήριο ITAE, καταλήγοντας σε πολύ μικρή υπερύψωση (1.2\%) και ήπια απόσβεση, με ελαφρώς αργότερο $T_r$/$T_s$.
Πρακτικά, ο PI αποδείχτηκε απλός και αποτελεσματικός για γρήγορη απόκριση, αλλά πιο «επιθετικός».
Ο FuzzyPI απέδωσε πιο ομαλή συμπεριφορά και καλύτερη ευστάθεια στις αλλαγές αναφοράς: στα σενάρια πολλαπλών βημάτων και τραπεζοειδούς σήματος παρακολούθησε πιστά την $r(t)$ χωρίς μόνιμο σφάλμα, με περιορισμένες ταλαντώσεις και λογική προσπάθεια ελέγχου.
Έτσι, και οι δύο λύσεις ικανοποιούν τις προδιαγραφές, με τον FuzzyPI να υπερέχει σε ομαλότητα και «ευγένεια» της απόκρισης, ενσωματώνοντας αποτελεσματικά ευρετική γνώση μέσω των κανόνων.
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

3
Work 1/source/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Matlab auxiliary files
*.asv

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

View File

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

View File

@ -137,8 +137,8 @@ annotation(f1, 'textbox', [0.75 0.05 0.4 0.3], ...
drawnow;
% save figure
exportgraphics(f1, sprintf('Root Locus c%.3g.png', c), 'Resolution', 300);
% exportgraphics(f1, sprintf('Root Locus c%.3g.pdf', c));
exportgraphics(f1, sprintf('Root_Locus_c%.3g.png', c), 'Resolution', 300);
% exportgraphics(f1, sprintf('Root_Locus_c%.3g.pdf', c));
f2 = figure( ...
@ -167,5 +167,5 @@ annotation(f2, 'textbox', [0.7 0.05 0.4 0.25], ...
% save figure
exportgraphics(f2, sprintf('Step Responce c%.3g_Kp%.3g_Ki%.3g.png', c, Kp(best.K), Ki(best.K, c)), 'Resolution', 300);
% exportgraphics(f2, sprintf('Step Responce c%.3g_Kp%.3g_Ki%.3g.pdf', c, Kp(best.K), Ki(best.K, c)));
exportgraphics(f2, sprintf('Step_Responce_c%.3g_Kp%.3g_Ki%.3g.png', c, Kp(best.K), Ki(best.K, c)), 'Resolution', 300);
% exportgraphics(f2, sprintf('Step_Responce_c%.3g_Kp%.3g_Ki%.3g.pdf', c, Kp(best.K), Ki(best.K, c)));

View File

@ -1,4 +1,4 @@
%% Satellite - Scenario 1 tune FZ-PI
%% Satellite - Scenario 1 tuning FZ-PI
%
% Assignment 1 in Fuzzy systems
%
@ -87,4 +87,4 @@ fprintf(' SettlingTime : %.4g s\n', best.info.SettlingTime);
fprintf(' Overshoot : %.2f%%\n', best.info.Overshoot);
fprintf(' Peak : %.4g\n', best.info.Peak);
fprintf(' PeakTime : %.4g s\n', best.info.PeakTime);
fprintf(' SS error : %.4g s\n', best.ess);
fprintf(' SS error : %.4g [t=tEnd s]\n', best.ess);

View File

@ -76,7 +76,7 @@ infoStep = sprintf(['RiseTime : %.4g s\n' ...
'Peak : %.4g (at %.4g s)\n' ...
'SS error : %.3f'], ...
info.RiseTime, info.SettlingTime, info.Overshoot, ...
info.Peak, info.PeakTime, E(end));
info.Peak, info.PeakTime, E(end))
annotation(f1, 'textbox', [0.7 0.05 0.4 0.25], ...
'String', infoStep, 'Interpreter','tex', ...
@ -85,6 +85,6 @@ annotation(f1, 'textbox', [0.7 0.05 0.4 0.25], ...
% save figure
exportgraphics(f1, sprintf('Step Responce_FZ.png'), 'Resolution', 300);
exportgraphics(f1, sprintf('Step_Responce_FZ.png'), 'Resolution', 300);
% exportgraphics(f1, sprintf('Step Responce_FZ.pdf'));

View File

@ -75,8 +75,8 @@ title('Scenario 2A: multi-step (60->20->40)');
legend('r','y','Location','best');
% save figure
exportgraphics(f1, sprintf('MultiStep Responce_FZ.png'), 'Resolution', 300);
% exportgraphics(f1, sprintf('Step Responce_FZ.pdf'));
exportgraphics(f1, sprintf('MultiStep_Responce_FZ.png'), 'Resolution', 300);
% exportgraphics(f1, sprintf('MultiStep_Responce_FZ.pdf'));
% 2b
@ -123,5 +123,5 @@ title('Scenario 2B: trapezoid (0->60, hold, 60->0)');
legend('r','y','Location','best');
% save figure
exportgraphics(f2, sprintf('Trapezoid Responce_FZ.png'), 'Resolution', 300);
% exportgraphics(f2, sprintf('Step Responce_FZ.pdf'));
exportgraphics(f2, sprintf('Trapezoid_Responce_FZ.png'), 'Resolution', 300);
% exportgraphics(f2, sprintf('Trapezoid_Responce_FZ.pdf'));