Matlab+tips+for+control+engineering

=Matlab tips voor control engineering=

Simulatie met Simulink
Parameters definiëren code format="matlab" m = 3; % massa k = 12; % veerconstante d = 0.2; % demper constante

xd0 = 0; % Beginsnelheid x0 = -10; % begin positie

Tsim = 50; % simulatietijd code Simulatie runnen code format="matlab" open('voorbeeldsimu') sim('voorbeeldsimu',Tsim) code

Data ophalen code format="matlab" t = Xout.time; x = Xout.signals.values(:,2); v = Xout.signals.values(:,1); code Plotten

code format="matlab" figure(1) plot(t,x,'r',t,v,'b') grid on title('voorbeeld') xlabel('tijd [s]') ylabel('amplitude') legend('positie [m]','snelheid [m/s]') code

Overdrachtsfunctie
Er kan een overdrachtsfunctie van dit systeem gemaakt worden: math \dfrac{1}{m s^2 + d s + k} math code format="matlab" H = tf([1],[m d k])

H =

1 --  3 s^2 + 0.2 s + 12

Continuous-time transfer function. code

Bode plot van systeem, gebruik het commando "bode": code format="matlab" figure(2) bode(H)

% Een handigheidje is het instellen van de gewenstie settings van het bode % plaatje: opts = bodeoptions opts.Grid = 'on'; opts.FreqUnits = 'Hz'; % Maak nu een nieuw bode plaatje, en gebruik de settings in 'opts' figure(3) bode(H,opts) code



Er kan een stap-responsie gemaakt worden met het commando "step": code format="matlab" figure(4) step(H) grid on code

Bode plaatje 'met de hand' tekenen
Hier een methode om zelf de amplitude en fase van een overdrachtsfunctie uit te rekenen en er een bode plot van te maken. Het echte rekenwerk laten we wel aan Matlab over. Stel dat de overdrachtsfunctie de volgende is (RLC circuit):

math H(s) = \dfrac{1}{L C s^2 + R C s + 1} math waar math s = j \omega math code format="matlab" % Parameters definieren R = 1; % Weerstand [Ohm] L = 1; % Zelfinductie [Henry] C = 1; % Capaciteit [Farad]

% Maak een vector met frequenties waarvoor de responsie wordt berekent. % w = 0.01:0.01:100; % Omdat de x-as van een bode plaatje meestal logaritmisch wordt % weergegeven, is het beter om ook een logaritmische vector met frequenties % aan te maken: w = logspace(-2,2,1000); % Frequenties, van 10^-2 rad/s tot en met 10^2 rad/s, logaritmisch verdeeld over 1000 punten

% Maak nu de variabele 's' (s = j*omega) aan: s = j*w;

% Bereken nu de Teller en Noemer van de overdrachtsfunctie: Htel = 1;

% Noemer Hnoem = L*C*s.^2 + R*C*s + 1;

% Om de amplitude en fase van de overdrachtsfunctie te kunnen berekenen, zijn het % Imaginaire en het Reele deel nodig, voor zowel Teller als Noemer: Htel_Re = real(Htel); Htel_Im = imag(Htel);

Hnoem_Re = real(Hnoem); Hnoem_Im = imag(Hnoem); code

Amplitude berekenen
De absolute waarde is : math \sqrt{\text{Re}^2 + \text{Im}^2} math code format="matlab" Htel_abs = sqrt(Htel_Re.^2 + Htel_Im.^2); Hnoem_abs = sqrt(Hnoem_Re.^2 + Hnoem_Im.^2);

% De totale amplitude is de absolute waarde van de teller gedeeld door de % absolute waarde van de noemer: Hamp = Htel_abs./Hnoem_abs; code

Plotten van de amplitude
code format="matlab" figure(5) plot(w,Hamp) grid on xlabel('frequentie [rad/s]') ylabel('amplitude [-]')

% Plot met logaritmische x-as figure(6) semilogx(w,Hamp) grid on xlabel('frequentie [rad/s]') ylabel('amplitude [-]')

% Plot met logaritmische x-as en amplitude in decibel: Hamp_db = log10(Hamp)*20; % makkelijker is: db(Hamp) % Hamp_db = db(Hamp);

figure(7) semilogx(w,Hamp_db) grid on xlabel('frequentie [rad/s]') ylabel('amplitude [-]') code



Berekenen van de fase
Fase is hoek Teller - hoek Noemer Om de hoek te berekenen is het imaginaire deel en het reele deel nodig. De hoek zelf wordt berekent met het commando atan2(Im,Re) code format="matlab" Htel_hoek = atan2(Htel_Im, Htel_Re); Hnoem_hoek = atan2(Hnoem_Im, Hnoem_Re);

% Bereken fase Hfase = Htel_hoek - Hnoem_hoek; code

Plotten fase
code format="matlab" figure(8) semilogx(w,Hfase) grid on xlabel('frequentie [rad/s]') ylabel('fase [rad]')

% Fase in graden Hfase_deg = (Hfase/pi)*180;

figure(9) semilogx(w,Hfase_deg) grid on xlabel('frequentie [rad/s]') ylabel('fase [deg]') code



Compleet bode plaatje (amplitude en fase)
code format="matlab" figure(10) subplot(2,1,1) semilogx(w,Hamp_db) grid on title('Bode figuur') ylabel('amplitude [-]') subplot(2,1,2) semilogx(w,Hfase_deg) grid on xlabel('frequentie [rad/s]') ylabel('fase [deg]') code