Lab 3 — Γραμμικά συστήματα συνεχούς χρόνου
Στο θεωρητικό κεφάλαιο για συστήματα είδαμε τι σημαίνει ένα σύστημα να είναι γραμμικό (ισχύει η αρχή της υπέρθεσης) και χρονικά αμετάβλητο (μια χρονική ολίσθηση στην είσοδο δίνει την ίδια ολίσθηση στην έξοδο). Εδώ θα δούμε πώς επαληθεύουμε αριθμητικά αυτές τις ιδιότητες στο MATLAB.
Anonymous functions ως «συστήματα»
Η πιο φυσική γέφυρα μεταξύ θεωρίας και MATLAB: ορίζεις ένα σύστημα ως anonymous function που παίρνει σήμα εισόδου x και επιστρέφει σήμα εξόδου y.
sys_a = @(x) 5 * x; % y(t) = 5 x(t)
sys_b = @(x) 5 * x + 3; % y(t) = 5 x(t) + 3
sys_c = @(x) 3 * x.^2; % y(t) = 3 [x(t)]^2
sys_d = @(x) cos(x); % y(t) = cos(x(t))
Έλεγχος γραμμικότητας
Παίρνουμε δύο σήματα x1, x2 και δύο σταθερές α1, α2. Συγκρίνουμε:
- Αναμενόμενη έξοδος αν είναι γραμμικό:
α1 * sys(x1) + α2 * sys(x2) - Πραγματική έξοδος:
sys(α1*x1 + α2*x2)
Αν είναι ίσα → υπόνοια γραμμικότητας. Αν διαφέρουν → σίγουρα όχι γραμμικό.
t = 0:0.01:4;
x1 = cos(2*pi*5*t);
x2 = exp(-0.5*t);
alpha1 = 2;
alpha2 = 1.25;
x = alpha1*x1 + alpha2*x2;
% Ορισμός όλων των συστημάτων
sys_a = @(x) 5*x;
sys_b = @(x) 5*x + 3;
sys_c = @(x) 3*x.^2;
sys_d = @(x) cos(x);
% Έλεγχος sys_a
y1 = sys_a(x1);
y2 = sys_a(x2);
y_exp = alpha1*y1 + alpha2*y2; % αναμενόμενο αν γραμμικό
y_act = sys_a(x); % πραγματικό
subplot(2,1,1);
plot(t, y_exp);
title('y_{exp} = \alpha_1 y_1 + \alpha_2 y_2')
xlabel('t (s)'), ylabel('Amplitude')
subplot(2,1,2);
plot(t, y_act);
title('y_{act} = Sys_a\{\alpha_1 x_1 + \alpha_2 x_2\}')
xlabel('t (s)'), ylabel('Amplitude')
Αν τα δύο γραφήματα είναι ταυτόσημα, το σύστημα φαίνεται γραμμικό. Για το sys_a αυτό είναι όντως αληθές (γραμμικό). Για το sys_b θα δεις σταθερή διαφορά (επειδή το +3 σπάει την υπέρθεση). Για το sys_c και sys_d θα δεις εντελώς διαφορετικά σχήματα.
Έλεγχος χρονικής αμεταβλητότητας
Ένα σύστημα είναι χρονικά αμετάβλητο αν:
Δηλαδή: ολισθαίνω την είσοδο, παίρνω την ίδια έξοδο ολισθημένη.
Στο MATLAB συγκρίνουμε δύο σήματα:
sys(x(t))μετά ολίσθηση: παίρνω την έξοδο για το αρχικό σήμα, και την ολισθαίνω κατάτ.sys(x(t - τ)): τρέχω το ήδη ολισθημένο σήμα μέσα από το σύστημα.
Αν τα δύο σήματα είναι ίδια → χρονικά αμετάβλητο. Αν διαφέρουν → όχι χρονικά αμετάβλητο.
Παράδειγμα — με anonymous functions
Δίνονται 3 συστήματα:
y₁(t) = 3 cos(x(t))— χρονικά αμετάβλητοy₂(t) = 3 cos(t) · x(t)— όχι χρονικά αμετάβλητο (ηcos(t)εξαρτάται απευθείας απόt)
Δοκιμή με σήμα x(t) = e^{-5(t-1)} u(t) και ολίσθηση τ = 2:
t = -1:0.01:6;
u = @(t) (t >= 0);
x = @(t) exp(-5*(t - 1)) .* u(t);
y1 = @(t) 3*cos(x(t)); % χρονικά αμετάβλητο
y2 = @(t) 3*cos(t) .* x(t); % ΟΧΙ χρονικά αμετάβλητο
% --- Σύστημα y1 ---
figure;
subplot(3,1,1);
plot(t, y1(t));
title('y(t) = 3 cos(x(t))'), xlabel('t'), ylabel('y(t)'), grid on
subplot(3,1,2);
plot(t, y1(t - 2), 'm'); % παίρνω την έξοδο και την ολισθαίνω
title('y(t - 2)'), xlabel('t'), ylabel('y(t-2)'), grid on
subplot(3,1,3);
plot(t, 3*cos(x(t - 2)), 'g'); % τρέχω την ολισθημένη είσοδο μέσα στο σύστημα
title('Sys\{x(t - 2)\}'), xlabel('t'), ylabel('y(t)'), grid on
Αποτέλεσμα: Το δεύτερο και τρίτο subplot είναι ταυτόσημα → επιβεβαιώνεται ότι το y1 είναι χρονικά αμετάβλητο.
% --- Σύστημα y2 ---
figure;
subplot(3,1,1);
plot(t, y2(t));
title('y(t) = 3 cos(t) x(t)'), grid on
subplot(3,1,2);
plot(t, y2(t - 2), 'r'); % έξοδος ολισθημένη
title('y(t - 2)'), grid on
subplot(3,1,3);
plot(t, 3*cos(t) .* x(t - 2), 'y'); % τρέχω ολισθημένη είσοδο μέσα στο σύστημα
title('Sys\{x(t - 2)\}'), grid on
Αποτέλεσμα: Το δεύτερο και τρίτο subplot είναι διαφορετικά → επιβεβαιώνεται ότι το y2 δεν είναι χρονικά αμετάβλητο. Ο λόγος: η cos(t) στο y2 εξαρτάται από τον "απόλυτο" χρόνο, όχι μόνο από την είσοδο — οπότε αν αλλάξεις πότε φτάνει η είσοδος, το σύστημα την «πολλαπλασιάζει» με διαφορετική στιγμιαία τιμή της cos(t).
Convolution στο MATLAB
Από τη θεωρία ξέρουμε ότι η έξοδος ενός LTI συστήματος δίνεται από:
Στο MATLAB υπάρχει η εντολή conv:
y = conv(x, h);
που υλοποιεί τη διακριτή συνέλιξη. Αν τα x και h έχουν μήκη N και M, η έξοδος έχει μήκος N + M - 1.
Παράδειγμα — convolution δύο ορθογώνιων παλμών
Από τη θεωρία, η συνέλιξη δύο ίδιων ορθογώνιων παλμών δίνει τριγωνικό παλμό. Ελέγχουμε αριθμητικά:
t = -2:0.01:2;
x = double(abs(t) <= 0.5); % ορθογώνιο πλάτους 1, διάρκειας 1
h = x; % ίδιο σήμα ως κρουστική απόκριση
y = conv(x, h) * 0.01; % πολλαπλασιάζουμε με Δt (= 0.01) για σωστή κλίμακα
t_y = (2*t(1)) : 0.01 : (2*t(end)); % νέος άξονας χρόνου, μήκος N+M-1
subplot(3,1,1), plot(t, x), title('x(t) — ορθογώνιο'), grid on
subplot(3,1,2), plot(t, h), title('h(t) — ίδιο'), grid on
subplot(3,1,3), plot(t_y, y), title('y = x * h — τρίγωνο'), grid on
Cascade & parallel σύνθεση
Από τη θεωρία:
- Cascade (αλυσίδα):
h_eq = h1 * h2 - Parallel (παράλληλο):
h_eq = h1 + h2
Στο MATLAB:
% Cascade
h_cascade = conv(h1, h2) * dt;
% Parallel (πρέπει να έχουν ίδιο μήκος)
h_parallel = h1 + h2;
Quick recap
- Ορίζεις συστήματα ως anonymous functions
sys = @(x) .... Το.^,.*,./είναι υποχρεωτικά. - Γραμμικότητα: σύγκρινε
sys(α1*x1 + α2*x2)μεα1*sys(x1) + α2*sys(x2). Διαφορά → όχι γραμμικό. - Χρονική αμεταβλητότητα: σύγκρινε
y(t-τ)μεsys(x(t-τ)). Διαφορά → όχι ΧΑ. - Κανόνας του παρατηρητή: εμφάνιση
tεκτός τηςx(...)→ πιθανότατα όχι ΧΑ. - Convolution:
conv(x, h), πολλαπλασιασμός μεΔtγια συνεχή σήματα.
Lab 5 — Τυχαία σήματα & θόρυβος →
rand/randn, ιστόγραμμα, μέση τιμή/διασπορά, συσχέτιση, λευκός θόρυβος, PSD με periodogram, θόρυβος μέσα από φίλτρα. Δεν υπάρχει Lab 4 στις διαφάνειες.
Τελείωσες αυτή τη σελίδα;