diff --git a/Work 1/report/Work1_report.pdf b/Work 1/report/Work1_report.pdf index 6286050..8137095 100644 Binary files a/Work 1/report/Work1_report.pdf and b/Work 1/report/Work1_report.pdf differ diff --git a/Work 1/report/Work1_report.tex b/Work 1/report/Work1_report.tex index 2d09d8f..899748d 100644 --- a/Work 1/report/Work1_report.tex +++ b/Work 1/report/Work1_report.tex @@ -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) ασαφής ελεγκτής τύπου Fuzzy–PI (Mamdani). +Στόχος είναι η ικανοποίηση προδιαγραφών μεταβατικής απόκρισης (υπερύψωση, χρόνος ανόδου/αποκατάστασης) και η σύγκριση της ικανότητας παρακολούθησης αναφορών. + +Για τον PI γίνεται διερεύνηση root–locus με σταθερό μηδενικό και επιλογή κέρδους βάσει κριτηρίου 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 με έναν ασαφή Fuzzy–PI για το δορυφορικό μοντέλο. +Ο PI, με $c=1$ και βέλτιστο $K$, ικανοποίησε τις προδιαγραφές και έδωσε γρήγορη άνοδο, αλλά με υπερύψωση κοντά στο όριο (10\%). +Ο Fuzzy–PI υλοποιήθηκε ως Mamdani με δύο εισόδους $(e,\dot e)$, έξοδο $\Delta u$, κανόνες 9$\times$9 και εξωτερική κλιμακοποίηση σε $[-1,1]$. +Ο συντονισμός των $K_{de},K_u$ έγινε με αναζήτηση και κριτήριο ITAE, καταλήγοντας σε πολύ μικρή υπερύψωση (1.2\%) και ήπια απόσβεση, με ελαφρώς αργότερο $T_r$/$T_s$. + +Πρακτικά, ο PI αποδείχτηκε απλός και αποτελεσματικός για γρήγορη απόκριση, αλλά πιο «επιθετικός». +Ο Fuzzy–PI απέδωσε πιο ομαλή συμπεριφορά και καλύτερη ευστάθεια στις αλλαγές αναφοράς: στα σενάρια πολλαπλών βημάτων και τραπεζοειδούς σήματος παρακολούθησε πιστά την $r(t)$ χωρίς μόνιμο σφάλμα, με περιορισμένες ταλαντώσεις και λογική προσπάθεια ελέγχου. +Έτσι, και οι δύο λύσεις ικανοποιούν τις προδιαγραφές, με τον Fuzzy–PI να υπερέχει σε ομαλότητα και «ευγένεια» της απόκρισης, ενσωματώνοντας αποτελεσματικά ευρετική γνώση μέσω των κανόνων. + \end{document} diff --git a/Work 1/report/img/LinearSystem.png b/Work 1/report/img/LinearSystem.png new file mode 100644 index 0000000..b405d64 Binary files /dev/null and b/Work 1/report/img/LinearSystem.png differ diff --git a/Work 1/report/img/MemberFunctions.png b/Work 1/report/img/MemberFunctions.png new file mode 100644 index 0000000..70413ca Binary files /dev/null and b/Work 1/report/img/MemberFunctions.png differ diff --git a/Work 1/source/.gitignore b/Work 1/source/.gitignore new file mode 100644 index 0000000..41aff6c --- /dev/null +++ b/Work 1/source/.gitignore @@ -0,0 +1,3 @@ +# Matlab auxiliary files +*.asv + diff --git a/Work 1/source/MultiStep Responce_FZ.png b/Work 1/source/MultiStep_Responce_FZ.png similarity index 99% rename from Work 1/source/MultiStep Responce_FZ.png rename to Work 1/source/MultiStep_Responce_FZ.png index 9869d05..f864fb3 100644 Binary files a/Work 1/source/MultiStep Responce_FZ.png and b/Work 1/source/MultiStep_Responce_FZ.png differ diff --git a/Work 1/source/Root Locus c1.png b/Work 1/source/Root_Locus_c1.png similarity index 100% rename from Work 1/source/Root Locus c1.png rename to Work 1/source/Root_Locus_c1.png diff --git a/Work 1/source/Step Responce_FZ.png b/Work 1/source/Step_Responce_FZ.png similarity index 99% rename from Work 1/source/Step Responce_FZ.png rename to Work 1/source/Step_Responce_FZ.png index 14cc1b9..26ae871 100644 Binary files a/Work 1/source/Step Responce_FZ.png and b/Work 1/source/Step_Responce_FZ.png differ diff --git a/Work 1/source/Step Responce c1_Kp5.79_Ki5.79.png b/Work 1/source/Step_Responce_c1_Kp5.79_Ki5.79.png similarity index 100% rename from Work 1/source/Step Responce c1_Kp5.79_Ki5.79.png rename to Work 1/source/Step_Responce_c1_Kp5.79_Ki5.79.png diff --git a/Work 1/source/Trapezoid Responce_FZ.png b/Work 1/source/Trapezoid_Responce_FZ.png similarity index 99% rename from Work 1/source/Trapezoid Responce_FZ.png rename to Work 1/source/Trapezoid_Responce_FZ.png index c765c15..317e8ef 100644 Binary files a/Work 1/source/Trapezoid Responce_FZ.png and b/Work 1/source/Trapezoid_Responce_FZ.png differ diff --git a/Work 1/source/satelite_PI.m b/Work 1/source/satelite_PI.m index 930a476..ea59b5f 100644 --- a/Work 1/source/satelite_PI.m +++ b/Work 1/source/satelite_PI.m @@ -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))); \ No newline at end of file +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))); \ No newline at end of file diff --git a/Work 1/source/scenario1_tune.m b/Work 1/source/scenario1_tuning.m similarity index 96% rename from Work 1/source/scenario1_tune.m rename to Work 1/source/scenario1_tuning.m index b29ac50..be2f730 100644 --- a/Work 1/source/scenario1_tune.m +++ b/Work 1/source/scenario1_tuning.m @@ -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); \ No newline at end of file +fprintf(' SS error : %.4g [t=tEnd s]\n', best.ess); \ No newline at end of file diff --git a/Work 1/source/scenario1a.m b/Work 1/source/scenario1a.m index 0a9540f..1b790e1 100644 --- a/Work 1/source/scenario1a.m +++ b/Work 1/source/scenario1a.m @@ -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')); diff --git a/Work 1/source/scenario2.m b/Work 1/source/scenario2.m index 5e4be1d..0ff43f3 100644 --- a/Work 1/source/scenario2.m +++ b/Work 1/source/scenario2.m @@ -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')); \ No newline at end of file +exportgraphics(f2, sprintf('Trapezoid_Responce_FZ.png'), 'Resolution', 300); +% exportgraphics(f2, sprintf('Trapezoid_Responce_FZ.pdf')); \ No newline at end of file