HW1: Init commit with assignment 1 source
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Generic directories
|
||||||
|
Inbox/
|
||||||
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "Work 1/report/AUThReport"]
|
||||||
|
path = Work 1/report/AUThReport
|
||||||
|
url = ssh://git@git.hoo2.net:222/hoo2/AUThReport.git
|
||||||
BIN
Datasets.zip
Executable file
BIN
Work 1/15_Satellite.pdf
Executable file
6
Work 1/report/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# LaTeX auxiliary files
|
||||||
|
*.aux
|
||||||
|
*.log
|
||||||
|
*.out
|
||||||
|
*.synctex.gz
|
||||||
|
|
||||||
1
Work 1/report/AUThReport
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 74ec4b5f6c66382e5f1b6d2e6930897e4ed53ea6
|
||||||
BIN
Work 1/report/Work1_report.pdf
Normal file
98
Work 1/report/Work1_report.tex
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
%
|
||||||
|
% !TEX TS-program = xelatex
|
||||||
|
% !TEX encoding = UTF-8 Unicode
|
||||||
|
% !TEX spellcheck = el-GR
|
||||||
|
%
|
||||||
|
% AUTH report template
|
||||||
|
%
|
||||||
|
% Requires compilation with pdfLaTeX or 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
|
||||||
|
%---------------------------------
|
||||||
|
% \WorkGroup{Ομάδα Χ}
|
||||||
|
|
||||||
|
\AuthorName{Χρήστος Χουτουρίδης}
|
||||||
|
\AuthorAEM{8997}
|
||||||
|
\AuthorMail{cchoutou@ece.auth.gr}
|
||||||
|
|
||||||
|
%\CoAuthorName{Όνομα Επίθετο}
|
||||||
|
%\CoAuthorAEM{1234}
|
||||||
|
%\CoAuthorMail{xxx@ece.auth.gr}
|
||||||
|
|
||||||
|
\DocTitle{Εργασία στα Ασαφή Συστήματα}
|
||||||
|
\DocSubTitle{Έλεγχος γωνίας προσανατολισμού δορυφόρου με ασαφείς ελεγκτές}
|
||||||
|
|
||||||
|
\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
|
||||||
|
\ClassName{Ασαφή Συστήματα (Υπολογιστική Νοημοσύνη)}
|
||||||
|
|
||||||
|
\InstructorName{Θεοχάρης Ιωάννης}
|
||||||
|
\InstructorMail{theochar@ece.auth.gr}
|
||||||
|
|
||||||
|
\CoInstructorName{Χαδουλός Χρήστος}
|
||||||
|
\CoInstructorMail{christgc@auth.gr}
|
||||||
|
|
||||||
|
|
||||||
|
\usepackage{float}
|
||||||
|
\usepackage{minted}
|
||||||
|
\usepackage{xcolor} %
|
||||||
|
|
||||||
|
\setminted[cpp]{
|
||||||
|
fontsize=\small,
|
||||||
|
breaklines,
|
||||||
|
autogobble,
|
||||||
|
baselinestretch=1.1,
|
||||||
|
tabsize=2,
|
||||||
|
numbersep=8pt,
|
||||||
|
gobble=0
|
||||||
|
}
|
||||||
|
|
||||||
|
\newcommand{\repo}{https://git.hoo2.net/hoo2/PDS/src/branch/master/homework_3}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% Request a title page or header
|
||||||
|
\InsertTitle
|
||||||
|
%\InsertTitle[img/background.png][0.8\textwidth][2cm]
|
||||||
|
|
||||||
|
\section{Εισαγωγή}
|
||||||
|
|
||||||
|
Η παρούσα εργασία αποτελεί
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Παραδοτέα}
|
||||||
|
Τα παραδοτέα της εργασίας αποτελούνται από:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Την παρούσα αναφορά.
|
||||||
|
\item Το \href{\hwThree}{σύνδεσμο με το αποθετήριο} που περιέχει τον κώδικα για την παραγωγή των εκτελέσιμων και της αναφοράς.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
|
\end{document}
|
||||||
BIN
Work 1/source/FLC surface.png
Normal file
|
After Width: | Height: | Size: 400 KiB |
BIN
Work 1/source/MultiStep Responce_FZ.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
Work 1/source/Root Locus c1.png
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
Work 1/source/Rule_graphics.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
Work 1/source/Step Responce c1_Kp5.79_Ki5.79.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
Work 1/source/Step Responce_FZ.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
Work 1/source/Trapezoid Responce_FZ.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
66
Work 1/source/mkFIS.m
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
function fis = mkFIS()
|
||||||
|
%mkFIS makes FIS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% FIS control
|
||||||
|
% R2025 compatibility:
|
||||||
|
% - newfis->mamfis
|
||||||
|
% - defuzzMethod='cos' -> AggregationMethod="sum", DefuzzificationMethod="centroid"
|
||||||
|
fis = mamfis( ...
|
||||||
|
AndMethod="min", ...
|
||||||
|
OrMethod="max", ...
|
||||||
|
ImplicationMethod="min", ...
|
||||||
|
AggregationMethod="sum", ...
|
||||||
|
DefuzzificationMethod="centroid" );
|
||||||
|
|
||||||
|
|
||||||
|
% Member functions
|
||||||
|
mf.Names = ["NV"; "NL"; "NM"; "NS"; "ZR"; "PS"; "PM"; "PL"; "PV"];
|
||||||
|
mf.Edges = [ ...
|
||||||
|
[-1.25 -1 -0.75]; ... % NV
|
||||||
|
[-1 -0.75 -0.5 ]; ... % NL
|
||||||
|
[-0.75 -0.5 -0.25]; ... % NM
|
||||||
|
[-0.5 -0.25 0 ]; ... % NS
|
||||||
|
[-0.25 0 0.25]; ... % ZR
|
||||||
|
[ 0 0.25 0.5 ]; ... % PS
|
||||||
|
[ 0.25 0.5 0.75]; ... % PM
|
||||||
|
[ 0.5 0.75 1 ]; ... % PL
|
||||||
|
[ 0.75 1 1.25]; ... % PV
|
||||||
|
];
|
||||||
|
|
||||||
|
% Setup input/output
|
||||||
|
fis = addInput(fis, [-1 1], Name="e");
|
||||||
|
fis = addInput(fis, [-1 1], Name="de");
|
||||||
|
fis = addOutput(fis, [-1 1], Name="du");
|
||||||
|
for k=1:length(mf.Names)
|
||||||
|
fis = addMF(fis, "e", "trimf", mf.Edges(k, :), Name=mf.Names(k));
|
||||||
|
fis = addMF(fis, "de", "trimf", mf.Edges(k, :), Name=mf.Names(k));
|
||||||
|
fis = addMF(fis, "du", "trimf", mf.Edges(k, :), Name=mf.Names(k));
|
||||||
|
end
|
||||||
|
|
||||||
|
% Rules 9x9
|
||||||
|
|
||||||
|
% rows = e (NV..PV), cols = de (NV..PV)
|
||||||
|
ruleTable = [
|
||||||
|
% de: NV NL NM NS ZR PS PM PL PV
|
||||||
|
"NV","NV","NV","NV","NV","NL","NM","NS","ZR"; % e = NV
|
||||||
|
"NV","NV","NV","NV","NL","NM","NS","ZR","PS"; % e = NL
|
||||||
|
"NV","NV","NV","NL","NM","NS","ZR","PS","PM"; % e = NM
|
||||||
|
"NV","NV","NL","NM","NS","ZR","PS","PM","PL"; % e = NS
|
||||||
|
"NV","NL","NM","NS","ZR","PS","PM","PL","PV"; % e = ZR
|
||||||
|
"NL","NM","NS","ZR","PS","PM","PL","PV","PV"; % e = PS
|
||||||
|
"NM","NS","ZR","PS","PM","PL","PV","PV","PV"; % e = PM
|
||||||
|
"NS","ZR","PS","PM","PL","PV","PV","PV","PV"; % e = PL
|
||||||
|
"ZR","PS","PM","PL","PV","PV","PV","PV","PV" % e = PV
|
||||||
|
];
|
||||||
|
|
||||||
|
for i=1:length(mf.Names)
|
||||||
|
for j=1:length(mf.Names)
|
||||||
|
rule = "IF e IS "+mf.Names(i)+" AND de IS "+mf.Names(j)+" THEN du IS "+ruleTable(i,j);
|
||||||
|
fis = addRule(fis, rule);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
45
Work 1/source/satFZ_PI.m
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
function u = satFZ_PI(fis, e, Ke, Kde, Kdu, Ts)
|
||||||
|
%SATFZ_PI Calculate the output of the controller
|
||||||
|
% Must be called every Ts
|
||||||
|
%
|
||||||
|
% Output:
|
||||||
|
% u: Output
|
||||||
|
|
||||||
|
% Inputs:
|
||||||
|
% fis: FIS to use
|
||||||
|
% e: error
|
||||||
|
% Ke: error gain
|
||||||
|
% Kde: error derivative gain = a*Ke
|
||||||
|
% Kdu: du gain
|
||||||
|
% Ts: Sampling period
|
||||||
|
|
||||||
|
persistent prev_e;
|
||||||
|
persistent prev_u;
|
||||||
|
|
||||||
|
if isempty(prev_e) % first call
|
||||||
|
prev_e = 0;
|
||||||
|
prev_u = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Saturation between min: m and max: M
|
||||||
|
sat = @(x, m, M) max(m, min(M, x));
|
||||||
|
|
||||||
|
|
||||||
|
% calculate error diff
|
||||||
|
de = (e - prev_e)/Ts;
|
||||||
|
prev_e = e;
|
||||||
|
|
||||||
|
% Normalize e and de
|
||||||
|
en = sat(Ke*e, -1, 1);
|
||||||
|
den = sat(Kde*de, -1, 1);
|
||||||
|
% evaluate FIS
|
||||||
|
dun = evalfis(fis, [en den]);
|
||||||
|
% De-normalize dun
|
||||||
|
du = Kdu * dun;
|
||||||
|
|
||||||
|
|
||||||
|
% Update outputs
|
||||||
|
u = du + prev_u;
|
||||||
|
prev_u = u;
|
||||||
|
|
||||||
|
end
|
||||||
171
Work 1/source/satelite_PI.m
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
%% Satellite - Classical PI (Part A)
|
||||||
|
%
|
||||||
|
% Classical control script for Assignment 1 in Fuzzy systems
|
||||||
|
%
|
||||||
|
% author:
|
||||||
|
% Christos Choutouridis ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
%
|
||||||
|
% -------------------------------------------------------
|
||||||
|
% Givens
|
||||||
|
% 10
|
||||||
|
% Plant: Gp(s) = ------------
|
||||||
|
% (s+1)(s+9)
|
||||||
|
%
|
||||||
|
% s + c
|
||||||
|
% PI: Gc(s) = Kp + Ki/s = Kp --------- , with c = Ki/Kp
|
||||||
|
% s
|
||||||
|
|
||||||
|
clear; clc; close all;
|
||||||
|
|
||||||
|
s = tf('s');
|
||||||
|
|
||||||
|
% Givens
|
||||||
|
% -------------------------------------------------------
|
||||||
|
Gp = 10/((s+1)*(s+9)); % given plant
|
||||||
|
spec.Mp_max = 0.10; % 10% overshoot
|
||||||
|
spec.Ts_max = 2.0; % 2sec settling time
|
||||||
|
spec.SteadyStateValue = 1.0; % step of 1
|
||||||
|
|
||||||
|
% Configuration
|
||||||
|
config.PI_zero = -1;
|
||||||
|
config.stepresp_time = 5;
|
||||||
|
|
||||||
|
% Control
|
||||||
|
Gc = @(c) (s + c)/s; % No gain controller
|
||||||
|
L0 = @(c) 0.1 * Gc(c) * Gp; % No gain open loop
|
||||||
|
Lk = @(K, c) K * L0(c); % open-loop with K [requested by the assignment]
|
||||||
|
|
||||||
|
% Utilities to extract Kp, Ki from K [variable requested by the assignment]
|
||||||
|
Kp = @(K) 0.1*K;
|
||||||
|
Ki = @(K, c) c*Kp(K);
|
||||||
|
|
||||||
|
% ---------- Brute force Root-locus exploration for fixed zero ----------
|
||||||
|
c = -config.PI_zero; % zero location
|
||||||
|
best = struct('cost',Inf);
|
||||||
|
for K = linspace(0, 100, 400)
|
||||||
|
CL = feedback(Lk(K, c), 1, -1); % closed loop unity feedback
|
||||||
|
info = stepinfo(CL);
|
||||||
|
if ~isfinite(info.SettlingTime) || isnan(info.Overshoot)
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
% First check hard specs
|
||||||
|
if info.Overshoot/100 <= spec.Mp_max && ...
|
||||||
|
info.SettlingTime <= spec.Ts_max
|
||||||
|
%
|
||||||
|
% Select the best CL based on a more appropriate cost function
|
||||||
|
% (ITAE-like): integral of t*|e(t)| approximated by weights
|
||||||
|
%
|
||||||
|
[y, t] = step(CL, 0:0.001:config.stepresp_time);
|
||||||
|
e = spec.SteadyStateValue - y;
|
||||||
|
cost = trapz(t, t.*abs(e));
|
||||||
|
if cost < best.cost
|
||||||
|
best.cost = cost;
|
||||||
|
best.K = K;
|
||||||
|
best.info = info;
|
||||||
|
best.CL = CL;
|
||||||
|
best.ess = e(end);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('Best match: Kp=%.3g, Ki=%.3g\n', Kp(best.K), Ki(c, best.K));
|
||||||
|
fprintf('Poles:\n');
|
||||||
|
p = pole(best.CL);
|
||||||
|
for k = 1:numel(p)
|
||||||
|
fprintf(' Pole %d: %.5f %+.5fi\n', k, real(p(k)), imag(p(k)));
|
||||||
|
end
|
||||||
|
fprintf('Step response:\n');
|
||||||
|
fprintf(' RiseTime : %.4g s\n', best.info.RiseTime);
|
||||||
|
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);
|
||||||
|
|
||||||
|
f1 = figure( ...
|
||||||
|
'Color','w', ...
|
||||||
|
'Name',sprintf('Root Locus - c=%.3g', c), ...
|
||||||
|
'Position',[100 100 1200 800] ...
|
||||||
|
);
|
||||||
|
h = rlocusplot(L0(c));
|
||||||
|
setoptions(h, 'XLim', [-12 2], 'YLim', [-8 8]);
|
||||||
|
ax = findobj(h, 'Type','Axes');
|
||||||
|
set(ax,'NextPlot','add');
|
||||||
|
grid(ax,'on');
|
||||||
|
|
||||||
|
% Overlays
|
||||||
|
p_cl = pole(best.CL);
|
||||||
|
hCL = plot(ax, real(p_cl), imag(p_cl), 'ro', 'MarkerSize', 8, ...
|
||||||
|
'MarkerFaceColor','r', 'DisplayName', ...
|
||||||
|
sprintf('CL poles: K_p=%.3g, K_i=%.3g', Kp(best.K), Ki(best.K, c)));
|
||||||
|
|
||||||
|
infoRL = sprintf([ ...
|
||||||
|
'K_p = %.3g\n' ...
|
||||||
|
'K_i = %.3g\n' ...
|
||||||
|
'c = %.3g\n' ...
|
||||||
|
'Poles:\n' ...
|
||||||
|
' %.4f%+.4fi\n' ...
|
||||||
|
' %.4f%+.4fi\n' ...
|
||||||
|
' %.4f%+.4fi'], ...
|
||||||
|
Kp(best.K), Ki(c,best.K), c, ...
|
||||||
|
real(p_cl(1)), imag(p_cl(1)), ...
|
||||||
|
real(p_cl(2)), imag(p_cl(2)), ...
|
||||||
|
real(p_cl(3)), imag(p_cl(3)));
|
||||||
|
|
||||||
|
p_ol = pole(L0(c));
|
||||||
|
hOL = plot(ax, real(p_ol), imag(p_ol), 'kx', 'MarkerSize', 9, ...
|
||||||
|
'LineWidth', 1.4, 'DisplayName','OL poles');
|
||||||
|
|
||||||
|
% z_ol = zero(L0(c));
|
||||||
|
% hZ = plot(ax, real(z_ol), imag(z_ol), 's', 'MarkerSize', 8, ...
|
||||||
|
% 'MarkerFaceColor',[1 0.9 0.2], 'MarkerEdgeColor','k', ...
|
||||||
|
% 'DisplayName','OL zero');
|
||||||
|
|
||||||
|
% Legend - annotations
|
||||||
|
lg = legend(ax, [hCL hOL], {'CL poles','OL poles'}, ...
|
||||||
|
'Location','best','AutoUpdate','off');
|
||||||
|
|
||||||
|
annotation(f1, 'textbox', [0.75 0.05 0.4 0.3], ...
|
||||||
|
'String', infoRL, 'Interpreter','tex', ...
|
||||||
|
'FontName','monospaced', 'FontSize',12, ...
|
||||||
|
'FitBoxToText','on', 'BackgroundColor', 'w', 'EdgeColor', [1 1 1]);
|
||||||
|
|
||||||
|
% titles
|
||||||
|
% xlabel(ax,'Real Axis (s^{-1})'); ylabel(ax,'Imaginary Axis (s^{-1})');
|
||||||
|
% title(ax, sprintf('Root Locus (c=%.3g)', c));
|
||||||
|
drawnow;
|
||||||
|
|
||||||
|
% save figure
|
||||||
|
exportgraphics(f1, sprintf('Root Locus c%.3g.png', c), 'Resolution', 300);
|
||||||
|
% exportgraphics(f1, sprintf('Root Locus c%.3g.pdf', c));
|
||||||
|
|
||||||
|
|
||||||
|
f2 = figure( ...
|
||||||
|
'Color','w', ...
|
||||||
|
'Name',sprintf('Step responce - c=%.3g, Kp=%.3g, Ki=%.3g', c, Kp(best.K), Ki(best.K, c)), ...
|
||||||
|
'Position',[200 200 1200 800] ...
|
||||||
|
);
|
||||||
|
step(best.CL);
|
||||||
|
xlabel('Time (s)');
|
||||||
|
ylabel('Amplitude');
|
||||||
|
title(sprintf('Step Response - c=%.3g, Kp=%.3g, Ki=%.3g', c, Kp(best.K), Ki(best.K, c)));
|
||||||
|
grid on;
|
||||||
|
|
||||||
|
infoStep = sprintf(['RiseTime : %.4g s\n' ...
|
||||||
|
'Settling : %.4g s\n' ...
|
||||||
|
'Overshoot : %.2f %%\n' ...
|
||||||
|
'Peak : %.4g (at %.4g s)\n' ...
|
||||||
|
'SS error : %.3f'], ...
|
||||||
|
best.info.RiseTime, best.info.SettlingTime, best.info.Overshoot, ...
|
||||||
|
best.info.Peak, best.info.PeakTime, best.ess);
|
||||||
|
|
||||||
|
annotation(f2, 'textbox', [0.7 0.05 0.4 0.25], ...
|
||||||
|
'String', infoStep, 'Interpreter','tex', ...
|
||||||
|
'FontName','monospaced', 'FontSize',12, ...
|
||||||
|
'FitBoxToText','on', 'BackgroundColor','w', 'EdgeColor',[1 1 1]);
|
||||||
|
|
||||||
|
|
||||||
|
% 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)));
|
||||||
90
Work 1/source/scenario1_tune.m
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
%% Satellite - Scenario 1 tune FZ-PI
|
||||||
|
%
|
||||||
|
% Assignment 1 in Fuzzy systems
|
||||||
|
%
|
||||||
|
% author:
|
||||||
|
% Christos Choutouridis ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
%
|
||||||
|
|
||||||
|
%
|
||||||
|
clear; clc; close all;
|
||||||
|
|
||||||
|
s = tf('s');
|
||||||
|
|
||||||
|
% Givens
|
||||||
|
% -------------------------------------------------------
|
||||||
|
Gp = 10/((s+1)*(s+9)); % given plant
|
||||||
|
spec.Mp_max = 0.07; % 7% overshoot
|
||||||
|
spec.Tr_max = 0.6; % 0.6sec rise time
|
||||||
|
spec.SteadyStateValue = 1.0; % step of 1
|
||||||
|
|
||||||
|
Ts = 0.01;
|
||||||
|
|
||||||
|
% Configuration
|
||||||
|
tEnd = 5;
|
||||||
|
Ke = 1;
|
||||||
|
fis = mkFIS();
|
||||||
|
|
||||||
|
best = struct('cost',Inf);
|
||||||
|
for Kde = 0.2:0.01:0.35
|
||||||
|
for Kdu = 0.3:0.01:0.5
|
||||||
|
% Convert Gp -> A,B,C,D (z)
|
||||||
|
Gz = c2d(Gp, Ts, 'zoh');
|
||||||
|
Gd = ss(Gz);
|
||||||
|
Ad=Gd.A; Bd=Gd.B; Cd=Gd.C; Dd=Gd.D;
|
||||||
|
|
||||||
|
%figure('Name','FLC surface'); gensurf(fis); grid on;
|
||||||
|
|
||||||
|
|
||||||
|
t = 0:Ts:tEnd;
|
||||||
|
r = ones(size(t));
|
||||||
|
x = zeros(size(Ad,1),1);
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
% logs
|
||||||
|
Y = zeros(size(t)); U = zeros(size(t)); E = zeros(size(t));
|
||||||
|
|
||||||
|
clear satFZ_PI; % Init satFZ_PI
|
||||||
|
for k = 1:numel(t)
|
||||||
|
% calculate error
|
||||||
|
e = r(k) - y;
|
||||||
|
|
||||||
|
%evaluate controller
|
||||||
|
u = satFZ_PI(fis, e, Ke, Kde, Kdu, Ts);
|
||||||
|
|
||||||
|
% plant update (ZOH)
|
||||||
|
x = Ad*x + Bd*u;
|
||||||
|
y = Cd*x + Dd*u;
|
||||||
|
|
||||||
|
% keep logs
|
||||||
|
Y(k) = y; U(k) = u; E(k) = e;
|
||||||
|
end
|
||||||
|
info = stepinfo(Y, t, 1);
|
||||||
|
% First check hard specs
|
||||||
|
if info.Overshoot/100 <= spec.Mp_max && ...
|
||||||
|
info.RiseTime <= spec.Tr_max
|
||||||
|
%
|
||||||
|
% Select the best CL based on a more appropriate cost function
|
||||||
|
% (ITAE-like): integral of t*|e(t)| approximated by weights
|
||||||
|
%
|
||||||
|
cost = trapz(t, t.*abs(E));
|
||||||
|
if cost < best.cost
|
||||||
|
best.cost = cost;
|
||||||
|
best.Kdu = Kdu;
|
||||||
|
best.Kde = Kde;
|
||||||
|
best.info = info;
|
||||||
|
best.ess = E(end);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('Best match: Kde=%.3g, Kdu=%.3g\n', best.Kde, best.Kdu);
|
||||||
|
fprintf('Step response:\n');
|
||||||
|
fprintf(' RiseTime : %.4g s\n', best.info.RiseTime);
|
||||||
|
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);
|
||||||
90
Work 1/source/scenario1a.m
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
%% Satellite - Scenario 1a
|
||||||
|
%
|
||||||
|
% Assignment 1 in Fuzzy systems
|
||||||
|
%
|
||||||
|
% author:
|
||||||
|
% Christos Choutouridis ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
%
|
||||||
|
|
||||||
|
%
|
||||||
|
clear; clc; close all;
|
||||||
|
|
||||||
|
s = tf('s');
|
||||||
|
|
||||||
|
% Givens
|
||||||
|
% -------------------------------------------------------
|
||||||
|
Gp = 10/((s+1)*(s+9)); % given plant
|
||||||
|
spec.Mp_max = 0.07; % 7% overshoot
|
||||||
|
spec.Tr_max = 0.6; % 0.6sec rise time
|
||||||
|
spec.SteadyStateValue = 1.0; % step of 1
|
||||||
|
|
||||||
|
Ts = 0.01;
|
||||||
|
|
||||||
|
% Configuration
|
||||||
|
tEnd = 5;
|
||||||
|
Ke = 1;
|
||||||
|
Kde=0.29; % Calculated with scenario1_tune.m
|
||||||
|
Kdu=0.33;
|
||||||
|
fis = mkFIS();
|
||||||
|
|
||||||
|
Gz = c2d(Gp, Ts, 'zoh');
|
||||||
|
Gd = ss(Gz);
|
||||||
|
Ad=Gd.A; Bd=Gd.B; Cd=Gd.C; Dd=Gd.D;
|
||||||
|
|
||||||
|
|
||||||
|
t = 0:Ts:tEnd;
|
||||||
|
r = ones(size(t));
|
||||||
|
x = zeros(size(Ad,1),1);
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
% logs
|
||||||
|
Y = zeros(size(t)); U = zeros(size(t)); E = zeros(size(t));
|
||||||
|
|
||||||
|
clear satFZ_PI; % Init satFZ_PI
|
||||||
|
for k = 1:numel(t)
|
||||||
|
% calculate error
|
||||||
|
e = r(k) - y;
|
||||||
|
|
||||||
|
%evaluate controller
|
||||||
|
u = satFZ_PI(fis, e, Ke, Kde, Kdu, Ts);
|
||||||
|
|
||||||
|
% plant update (ZOH)
|
||||||
|
x = Ad*x + Bd*u;
|
||||||
|
y = Cd*x + Dd*u;
|
||||||
|
|
||||||
|
% keep logs
|
||||||
|
Y(k) = y; U(k) = u; E(k) = e;
|
||||||
|
end
|
||||||
|
info = stepinfo(Y, t, 1);
|
||||||
|
|
||||||
|
|
||||||
|
f1 = figure( ...
|
||||||
|
'Color','w', ...
|
||||||
|
'Name',sprintf('Step responce - Kde=%.3g, Kdu=%.3g', Kde, Kdu), ...
|
||||||
|
'Position',[200 200 1200 800] ...
|
||||||
|
);
|
||||||
|
plot(t, Y);
|
||||||
|
xlabel('Time (s)');
|
||||||
|
ylabel('Amplitude');
|
||||||
|
title(sprintf('Step responce - Kde=%.3g, Kdu=%.3g', Kde, Kdu));
|
||||||
|
grid on;
|
||||||
|
|
||||||
|
infoStep = sprintf(['RiseTime : %.4g s\n' ...
|
||||||
|
'Settling : %.4g s\n' ...
|
||||||
|
'Overshoot : %.2f %%\n' ...
|
||||||
|
'Peak : %.4g (at %.4g s)\n' ...
|
||||||
|
'SS error : %.3f'], ...
|
||||||
|
info.RiseTime, info.SettlingTime, info.Overshoot, ...
|
||||||
|
info.Peak, info.PeakTime, E(end));
|
||||||
|
|
||||||
|
annotation(f1, 'textbox', [0.7 0.05 0.4 0.25], ...
|
||||||
|
'String', infoStep, 'Interpreter','tex', ...
|
||||||
|
'FontName','monospaced', 'FontSize',12, ...
|
||||||
|
'FitBoxToText','on', 'BackgroundColor','w', 'EdgeColor',[1 1 1]);
|
||||||
|
|
||||||
|
|
||||||
|
% save figure
|
||||||
|
exportgraphics(f1, sprintf('Step Responce_FZ.png'), 'Resolution', 300);
|
||||||
|
% exportgraphics(f1, sprintf('Step Responce_FZ.pdf'));
|
||||||
|
|
||||||
25
Work 1/source/scenario1b_c.m
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
%% Satellite - Scenario 1b, 1c
|
||||||
|
%
|
||||||
|
% Assignment 1 in Fuzzy systems
|
||||||
|
%
|
||||||
|
% author:
|
||||||
|
% Christos Choutouridis ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
%
|
||||||
|
|
||||||
|
%
|
||||||
|
clear; clc; close all;
|
||||||
|
|
||||||
|
% load fuzzy controller
|
||||||
|
flc = mkFIS();
|
||||||
|
|
||||||
|
% test controller
|
||||||
|
% e=NM for ex: -0.41
|
||||||
|
% de=ZR for ex: 0.03
|
||||||
|
evalfis(flc, [0.41 0.03]);
|
||||||
|
ruleview(flc);
|
||||||
|
|
||||||
|
|
||||||
|
f1 = figure('Name','FLC surface'); gensurf(fis); grid on;
|
||||||
|
exportgraphics(f1, sprintf('FLC surface.png'), 'Resolution', 300);
|
||||||
|
% exportgraphics(f1, sprintf('FLC surface.pdf'));
|
||||||
127
Work 1/source/scenario2.m
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
%% Satellite - Scenario 2
|
||||||
|
%
|
||||||
|
% Assignment 1 in Fuzzy systems
|
||||||
|
%
|
||||||
|
% author:
|
||||||
|
% Christos Choutouridis ΑΕΜ 8997
|
||||||
|
% cchoutou@ece.auth.gr
|
||||||
|
%
|
||||||
|
|
||||||
|
%
|
||||||
|
clear; clc; close all;
|
||||||
|
|
||||||
|
s = tf('s');
|
||||||
|
|
||||||
|
% Givens
|
||||||
|
% -------------------------------------------------------
|
||||||
|
Gp = 10/((s+1)*(s+9)); % given plant
|
||||||
|
spec.Mp_max = 0.07; % 7% overshoot
|
||||||
|
spec.Tr_max = 0.6; % 0.6sec rise time
|
||||||
|
spec.SteadyStateValue = 1.0; % step of 1
|
||||||
|
|
||||||
|
Ts = 0.01;
|
||||||
|
|
||||||
|
% Configuration
|
||||||
|
Ke = 1;
|
||||||
|
Kde=0.29; % Calculated with scenario1_tune.m
|
||||||
|
Kdu=0.33;
|
||||||
|
fis = mkFIS();
|
||||||
|
|
||||||
|
Gz = c2d(Gp, Ts, 'zoh');
|
||||||
|
Gd = ss(Gz);
|
||||||
|
Ad=Gd.A; Bd=Gd.B; Cd=Gd.C; Dd=Gd.D;
|
||||||
|
|
||||||
|
|
||||||
|
% Control inputs
|
||||||
|
tEnd = 16;
|
||||||
|
t = 0:Ts:tEnd;
|
||||||
|
|
||||||
|
% 2a
|
||||||
|
r_step = zeros(size(t));
|
||||||
|
r_step(t < 4) = 60;
|
||||||
|
r_step(t >= 4 & t < 8) = 20;
|
||||||
|
r_step(t >= 8) = 40;
|
||||||
|
|
||||||
|
x = zeros(size(Ad,1),1);
|
||||||
|
y = 0;
|
||||||
|
% logs
|
||||||
|
Y = zeros(size(t)); U = zeros(size(t)); E = zeros(size(t));
|
||||||
|
|
||||||
|
clear satFZ_PI; % Init satFZ_PI
|
||||||
|
for k = 1:numel(t)
|
||||||
|
% calculate error
|
||||||
|
e = r_step(k)/60 - y;
|
||||||
|
|
||||||
|
%evaluate controller
|
||||||
|
u = satFZ_PI(fis, e, Ke, Kde, Kdu, Ts);
|
||||||
|
|
||||||
|
% plant update (ZOH)
|
||||||
|
x = Ad*x + Bd*u;
|
||||||
|
y = Cd*x + Dd*u;
|
||||||
|
|
||||||
|
% keep logs
|
||||||
|
Y(k) = y; U(k) = u; E(k) = e;
|
||||||
|
end
|
||||||
|
|
||||||
|
f1 = figure( ...
|
||||||
|
'Color','w', ...
|
||||||
|
'Name',sprintf('MultiStep responce'), ...
|
||||||
|
'Position',[200 200 1200 800] ...
|
||||||
|
);
|
||||||
|
plot(t, r_step, 'k--', 'LineWidth',1.2); hold on;
|
||||||
|
plot(t, Y*60, 'b', 'LineWidth',1.2);
|
||||||
|
grid on; xlabel('Time (s)'); ylabel('Amplitude');
|
||||||
|
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'));
|
||||||
|
|
||||||
|
|
||||||
|
% 2b
|
||||||
|
r_trap = zeros(size(t));
|
||||||
|
ix = (t <= 5);
|
||||||
|
r_trap(ix) = 60/5 * t(ix);
|
||||||
|
ix = (t > 5 & t <= 8);
|
||||||
|
r_trap(ix) = 60;
|
||||||
|
ix = (t > 8 & t <= 16);
|
||||||
|
r_trap(ix) = 60 * (1 - (t(ix) - 8)/(16 - 8));
|
||||||
|
|
||||||
|
x = zeros(size(Ad,1),1);
|
||||||
|
y = 0;
|
||||||
|
% logs
|
||||||
|
Y = zeros(size(t)); U = zeros(size(t)); E = zeros(size(t));
|
||||||
|
|
||||||
|
clear satFZ_PI; % Init satFZ_PI
|
||||||
|
for k = 1:numel(t)
|
||||||
|
% calculate error
|
||||||
|
e = r_trap(k)/60 - y;
|
||||||
|
|
||||||
|
%evaluate controller
|
||||||
|
u = satFZ_PI(fis, e, Ke, Kde, Kdu, Ts);
|
||||||
|
|
||||||
|
% plant update (ZOH)
|
||||||
|
x = Ad*x + Bd*u;
|
||||||
|
y = Cd*x + Dd*u;
|
||||||
|
|
||||||
|
% keep logs
|
||||||
|
Y(k) = y; U(k) = u; E(k) = e;
|
||||||
|
end
|
||||||
|
info = stepinfo(Y, t, 1);
|
||||||
|
|
||||||
|
|
||||||
|
f2 = figure( ...
|
||||||
|
'Color','w', ...
|
||||||
|
'Name',sprintf('Trapezoid responce'), ...
|
||||||
|
'Position',[200 200 1200 800] ...
|
||||||
|
);
|
||||||
|
plot(t, r_trap, 'k--', 'LineWidth',1.2); hold on;
|
||||||
|
plot(t, Y*60, 'b', 'LineWidth',1.2);
|
||||||
|
grid on; xlabel('Time (s)'); ylabel('Amplitude');
|
||||||
|
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'));
|
||||||