Class Hub
Lab · 3 of 6·~30 min

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 συγκρίνουμε δύο σήματα:

  1. sys(x(t)) μετά ολίσθηση: παίρνω την έξοδο για το αρχικό σήμα, και την ολισθαίνω κατά τ.
  2. 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 στις διαφάνειες.

Τελείωσες αυτή τη σελίδα;

Φόρτωση σχολίων…
Lab 3 — Γραμμικά συστήματα συνεχούς χρόνου στο MATLAB · Signal Processing Class Hub