Matlab+Tips+voor+MAS

=Matlab & Simulink tips voor studenten Modelvorming & Simulatie=

toc

Hoe data importeren in Matlab?
Er is data beschikbaar in een Excel bestand (.xlsx). Ga in Matlab naar 'File -> Import Data' en selecteer het excel bestand. Matlab opent de file, selecteer het juiste tabblad in het Excel bestand. Dus zorg ervoor dat het tabblad met meetdata is geselecteerd. Klik op 'next' of 'finish' om de data te importeren. Er verschijnt een nieuwe set data in de Matlab Workspace, met de naam 'data' of 'untitled'. De naam kun je aanpassen door met de rechtermuisknop op 'rename' te klikken.

Een dataset van meerdere kolommen splitsen
Stel dat er een dataset is die uit meerdere kolommen bestaat, dan kun je de data er per kolom uithalen en een naam geven. In dit geval nemen we de data uit de opwarm-meting als voorbeeld. De dataset heet 'data', en bevat 3 kolommen: tijd - temperatuur - spanning We nemen de eerste kolom, en noemen die: 'tijd_meting' De tweede kolom noemen we: 'temp_meting' De derde kolom noemen we: 'spanning_meting' code format="matlab" tijd_meting = data(:,1); temp_meting = data(:,2); spanning_meting = data(:,3); code

Meetdata plotten
Nu de meetdata beschikbaar is in drie verschillende kolommen (tijd_meting, temp_meting en spanning_meting), kan dit geplot worden. Er wordt een leeg figuur aangemaakt en op de x-as wordt de tijd gezet. Op de y-as komt de temperatuur (blauw) en de spanning (rood) te staan. code format="matlab" figure(1) plot(tijd_meting,temp_meting,'b',tijd_meting,spanning_meting,'r') title('Meting opwarmen') legend('Temperatuur [graden]','Spanning [V]') grid on xlabel('tijd [s]') ylabel('meetwaarde') code

Blokgolf maken in simulink
Stel dat je een blokgolf wil maken in simulink, bijvoorbeeld het spanning signaal in de opwarm meting (of vermogen), dan kan dat op de volgende manier: Neem twee 'step' blokjes en voeg die samen met een 'add' blokje. Nu kunnen de 'step' blokjes ingesteld worden, zie hiervoor het simulink model: 'Blokgolf.mdl' code format="matlab" open('Blokgolf.mdl') % commando wordt gebruikt om plaatje van model te tonen code

Meetdata uit simulatie halen
Gebruik een 'To Workspace' blokje om een signaal naar de Matlab Workspace te sturen. Dit blokje heeft standaard de naam 'simout'. Zorg ervoor dat je in dit blokje bij 'Save format' aangeeft dat je een structure with time wil hebben. Nu is het mogelijk om de data uit deze structure-with-time te halen. Als eerste wordt dit simulink blokschema gesimuleerd met het commando 'sim(.)'. Dan wordt de data uit de structure with time gehaald en krijgt het een andere naam. Daarna wordt de data in een grafiek weergegeven code format="matlab" open('Blokgolf_naarWorkspace.mdl') % commando wordt gebruikt om plaatje van model te tonen

% simulatie uitvoeren, waardes uit simulatie halen en hernoemen sim('Blokgolf_naarWorkspace.mdl',8) % simuleer 8 seconden tijd_sim = simout.time; waarde_sim = simout.signals.values;

figure(2) plot(tijd_sim,waarde_sim) title('grafiek Blokgolf') legend('Blokgolf') grid on xlabel('tijd [s]') axis([0 8 -0.5 13]) % assen aanpassen ylabel('meetwaarde') code



Sinus als input
In simulink kan een sinus of cosinus als input gebruikt worden. Hiervoor kan het blokje 'Sine Wave' gebruikt worden. De belangrijkste instellingen in dit blokje zijn: Amplitude Frequency Phase Het is handig om deze waarden in het script in te geven. Hiervoor moeten we in de settings alvast de parameters ingeven. De parameters die we nu gebruiken zijn: A, voor Amplitude w, voor de frequentie in rad/sec phi, voor de faseverschuiving (rad)

code format="matlab" open('Sinus_naarWorkspace.mdl') % commando wordt gebruikt om plaatje van model te tonen

% parameters ingeven A = 3; % Amplitude sinus f = 10; % frequentie van 10 Hz w = f*2*pi; % van Hz naar rad/sec phi = 0; % faseverschuiving van 0 (zuivere sinus)

% simulatie uitvoeren sim('Sinus_naarWorkspace.mdl',0.5); % 0.5 seconden simuleren

% waardes uit simulatie halen en andere naam geven: tijd_sim2 = simout2.time; waarde_sim2 = simout2.signals.values;

% plotten figure(3) plot(tijd_sim2,waarde_sim2) title('grafiek sinus') legend('Sinus') grid on xlabel('tijd [s]') ylabel('y-as') code

Ingang en uitgang systeem plotten
Er is een model van een systeem gemaakt in simulink. Het systeem heeft een ingang en een uitgang. Het ingangsignaal en het uitgangsignaal worden met een 'to Workspace' blokje naar de Matlab Workspace gestuurd. Hierna worden de twee signalen in een grafiek gezet. De tijd waarop het 'step' blokje van 0 naar 1 gaat, wordt hier in het script ingegeven met de naam: t_step. Als de grafiek bekeken wordt, valt op dat de simulatie van de ingang en uitgang exact hetzelfde lijken te zijn. Dit komt doordat de tijdconstante van dit systeem zo klein is dat de grafiek het verschil tussen in-en uitgang niet kan laten zien.

code format="matlab" % stap tijd: t_step = 1;

open('Ingang_Uitgang.mdl') % commando wordt gebruikt om plaatje van model te tonen

% simulatie uitvoeren (10 sec) sim('Ingang_Uitgang.mdl',10)

% waardes uit simulatie halen en andere naam geven: tijd_sim3 = simout_ingang.time; in = simout_ingang.signals.values; uit = simout_uitgang.signals.values;

% plotten figure(4) plot(tijd_sim3,in,'b',tijd_sim3,uit,'r--') title('grafiek systeem, ingang en uitgang') legend('ingang','uitgang') grid on xlabel('tijd [s]') ylabel('simulatiewaarde') code

Simulatie van een proces met kleine tijdconstante tau
Om het verschil tussen ingang en uitgang in bovenstaand proces te laten zien, moeten we 'inzoomen' op het interessante deel van de grafiek. Dit is het gebied waar de ingang van 0 naar 1 gaat. Dus op het moment waarop de 'step' omhoog gaat. We gaan de simulatietijd verkorten en ook gaan we de 'step' eerder uitvoeren.

code format="matlab" t_step = 0.001; % stap op 0.001 sec t_eind = 0.003; % simulatie duurt 0.003 seconde sim('Ingang_Uitgang.mdl',t_eind);

% waardes uit simulatie halen en andere naam geven: tijd_sim4 = simout_ingang.time; in2 = simout_ingang.signals.values; uit2 = simout_uitgang.signals.values;

% plotten figure(5) plot(tijd_sim4,in2,'b',tijd_sim4,uit2,'r--') title('grafiek systeem, ingang en uitgang') legend('ingang','uitgang') grid on xlabel('tijd [s]') ylabel('simulatiewaarde') code

Plotten met logaritmische assen
Eerst wordt er een lijst met frequenties en bijbehorende amplitudes aangemaakt. Deze frequenties en amplitudes worden op lineaire, en logaritmische assen getekend. Met het standaard 'plot' commando worden lineaire assen gebruikt. 'semilogx' maakt een logaritmische x-as, 'semilogy' maakt een logaritmische y-as en 'loglog' maak zowel de x- als de y-as logaritmisch.

code format="matlab" % Frequenties ingeven: f = [0.0010 0.0100   0.0500    0.1000    0.5000    1.0000    5.0000   10.0000   15.0000   50.0000  100.0000]

% Amplitudes: A = [1.6667 1.6667   1.6663    1.6652    1.6313    1.5373    0.7181    0.3870    0.2620    0.0795    0.0398]

% lineair figure(6) plot(f,A,'b-*') title('Amplitude tegen frequentie, lineair') legend('Amplitude') grid on xlabel('frequentie [Hz]') ylabel('Amplitude')

% x-as logaritmisch figure(7) semilogx(f,A,'b-*') title('Amplitude tegen frequentie, logaritmische x-as') legend('Amplitude') grid on xlabel('frequentie [Hz]') ylabel('Amplitude')

% x- en y-as logaritmisch figure(8) loglog(f,A,'b-*') title('Amplitude tegen frequentie, logaritmische x- en y-as') legend('Amplitude') grid on xlabel('frequentie [Hz]') ylabel('Amplitude') code

Niet lineair gedrag in Simulink
Niet lineair gedrag is bijvoorbeeld een kwadraat van een signaal (u^2), of de reciproke van een signaal (1/u). Dit kan in Simulink vrij gemakkelijk ingegeven worden met het 'math function' blokje. Dit blokje is te vinden onde 'Math Operations' in de Simulink library. Dit 'math operations' blokje kan zelf meerdere functies aannemen, welke in te geven zijn door het blokje te openen (dubbelklik) en een functie te selecteren. De wortel van een signaal kan berekend worden met het het Square Root ('sqrt') blokje. Dit is in dezelfde library te vinden.

Delen door 0 in Simulink
Als er in simulink een 'reciproke' functie gebruikt wordt (1/u) dan levert dat natuurlijk problemen op als u naar 0 gaat. Het is daarom verstandig om goed op te letten wat er in je blokschema gebeurt als je een dergelijk blokje gebruikt. In dit voorbeeld is er een integratorblokje gebruikt met een hele kleine initial value (startwaarde). Normaal is deze startwaarde 0, maar dit zou meteen problemen opleveren (waarom?). Om deze problemen te omzeilen, wordt er in eerste instantie gekozen voor een (te) kleine beginwaarde. In de grafiek is te zien dat er een knik in zowel de afgeleide (d/dt) als in de waarde zelf (y) zit. Dit is niet realistisch. In de tweede grafiek is de beginwaarde wat hoger gekozen, zodat de afgeleide (dy/dt) niet absurd hoog wordt. Let op! dit is slechts een voorbeeld om te laten zien wat de effecten van beginwaarden en een 1/u blokje kunnen zijn. Om hier verstandig mee om te kunnen gaan moet je zelf even goed nadenken over wat je precies probeert te doen met de vershillende blokjes, en hoe dat relateerd aan de werkelijkheid.

code format="matlab" % beginwaarde (in integrator) Ystart = 0.01

open('nulpunt.mdl')

sim('nulpunt.mdl',2)

% grafiek figure(9) plot(duitdt.time,duitdt.signals.values,'b',uit.time,uit.signals.values,'r') title('dy/dt en y, beginwaarde Ystart = 0.01') legend('dy/dt','y') grid on xlabel('tijd [s]') ylabel('waarde')

% Inzoomen figure(10) plot(duitdt.time,duitdt.signals.values,'b',uit.time,uit.signals.values,'r') title('Ingezoomd, Ystart = 0.01') legend('dy/dt','y') grid on xlabel('tijd [s]') ylabel('waarde') axis([0 2 0 5])

Ystart = 0.5 sim('nulpunt.mdl',2) % grafiek figure(11) plot(duitdt.time,duitdt.signals.values,'b',uit.time,uit.signals.values,'r') title('dy/dt en y, beginwaarde Ystart = 0.5') legend('dy/dt','y') grid on xlabel('tijd [s]') ylabel('waarde') code

In Simulink 'schakelen' tussen twee ingangen
Soms is het handig als je een waarde/gain in een simulink model kunt aanpassen terwijl de simulatie wordt uitgevoerd, afhankelijk van een bepaalde conditie in de simulatie. Een voorbeeld: Stel je wil een grafiek van de lijn y=2*x maken, die verandert in de lijn y=x/3 als x boven een bepaalde waarde uit komt (bijvoorbeeld x=4). In het simulink model hieronder is te zien hoe je zoiets kun bereiken. Het is belangrijk dat je de juiste instellingen van het 'Multiport Switch' blokje gebruikt. In dit geval is het aantal 'data ports' in dit blokje 2 (gain: k=2 en gain k=1/3). Zorg er ook voor dat de 'data port order' op 'zero based' staat, zodat er bij 0 begonnen wordt (omdat het 'compare to' blokje een 0 geeft als de conditie niet waar is en een 1 als deze wel waar is. In de grafiek hieronder is het resultaat te zien. code format="matlab" open('sim_switch.mdl')

sim('sim_switch.mdl',10); % 10 seconden simuleren

tijd = switchout.time; x = switchout.signals.values(:,1); y = switchout.signals.values(:,2);

% Plotten figure(12) plot(tijd,x,'b',tijd,y,'r') grid on title('Gebruik van Switch') xlabel('tijd [s]') ylabel('waarde [-]') legend('x','y') code