dictaat Matlab

71
Introductie Programmeren in Matlab 10 5 0 5 10 10 5 0 5 10 1 0.5 0 0.5 1 x sin( x)cos(y ) y Hans Mulder, Rory Dijkink, Harmke van der Velde en Edip Can versie 1 datum: September 10, 2015

Transcript of dictaat Matlab

Page 1: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 1/71

Introductie Programmeren in Matlab

−10

−5

0

5

10

−10

−5

0

5

10

−1

−0.5

0

0.5

1

x

sin(x)cos(y)

y

Hans Mulder, Rory Dijkink, Harmke van der Velde en Edip Can

versie 1datum: September 10, 2015

Page 2: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 2/71

Contents

1 Inleiding 1

2 Matlab als programma (vier lessen) 32.1 De beginselen van Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.1 Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.1.2 Gebruik als rekenmachine . . . . . . . . . . . . . . . . . . . . . . 52.1.3 Variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.1.4 Wiskundige functies en constanten . . . . . . . . . . . . . . . . . 132.2 Plotten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2.1 Het idee van de plot commando . . . . . . . . . . . . . . . . . . . 162.2.2 1D-arrays en de : (dubbele punt) operator . . . . . . . . . . . . . 172.2.3 1D-arrays en de linspace commando . . . . . . . . . . . . . . . . 192.2.4 Vermenigvuldigen van arrays . . . . . . . . . . . . . . . . . . . . 192.2.5 Opmaak van grafieken . . . . . . . . . . . . . . . . . . . . . . . . 21

2.3 Werken met Matlab bestanden (m-files) . . . . . . . . . . . . . . . . . . 272.3.1 Input en Output bij Scripts . . . . . . . . . . . . . . . . . . . . . 31

2.4 Werken met arrays (Een les) . . . . . . . . . . . . . . . . . . . . . . . . 342.4.1 1D en 2D arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

2.4.2 Bewerkingen met arrays . . . . . . . . . . . . . . . . . . . . . . . 43

3 Programmeren in Matlab (vier of vijf lessen) 503.1 Function m-files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.2 Relationele en logische operatoren . . . . . . . . . . . . . . . . . . . . . 543.3 Voorwaardelijke uitspraken . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.3.1   if,   if else,   if elseif   . . . . . . . . . . . . . . . . . . . . . 583.4 Herhalende berekeningen: Loops . . . . . . . . . . . . . . . . . . . . . . 62

3.4.1 De   for loop   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.4.2 De  while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

i

Page 3: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 3/71

ii   CONTENTS 

Page 4: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 4/71

1Inleiding

Programmeren is een zeer belangrijke vaardigheid voor ingenieurs en onderzoekers.Je zult er veelvuldig mee in aanraking komen. Denk aan het verwerken van je ex-perimentele data, berekeningen uitvoeren, modellen maken, regeltechnische systemensimuleren, signaalanalyse en nog veel meer. Programmeren kan in veel verschillendetalen. Bekende talen, die veel gebruikt worden door ingenieurs, zijn onder meer   C,

C++, Java en Python. Hoewel de talen veel van elkaar kunnen verschillen, zijn deprogrammeerstructuren die gebruikt worden over het algemeen gelijk. Vandaar dat hetleren van een programmeertaal gemakkelijker wordt als je al een taal kent. Voordelenvan de genoemde talen zijn hun snelheid en de flexibiliteit. Het grootste nadeel echter,

voor mensen die willen leren programmeren, is dat ze best moeilijk te leren zijn.Matlab is een programma dat ook veel gebruikt wordt door ingenieurs, zowel bij uni-

versiteiten als bij bedrijven. Matlab wordt in zeer veel verschillende gebieden gebruikt,zoals voor regeltechniek, signaalanalyse, beeldbewerking, data analyse en nog veel meer.Matlab is relatief gemakkelijk te leren, en het heeft een goede en overzichtelijke Graph-ical User Interface (GUI), met goede documentatie. Daarnaast is Matlab niet alleenmaar een programma, het is ook een programmeertaal, met alle gebruikelijke program-meerstructuren die de andere talen ook bieden.

Deze module heeft daarom een aantal doelen. We hopen dat je door het afrondenvan deze module:

1. met zelfvertrouwen Matlab zult opstarten voor het maken van grafieken, analy-seren van experimentele metingen en het doen van berekeningen.

2. in staat bent om zelf, gebruik makend van de uitvoerige documentatie van Matlab,zelf verder te leren hoe Matlab gebruikt kan worden.

3. de beginselen van het programmeren leert. Deze kennis maakt het leren vanandere programmeertalen veel gemakkelijker (en geheid dat je ze tegenkomt bi-

 jvoorbeeld bij projecten, stage of afstuderen en je latere werk.)

1

Page 5: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 5/71

2   CHAPTER 1. INLEIDING

In dit dictaat beginnen we met de beginselen van Matlab. Hier leren we het programmakennen en we zullen zeer veel verschillende functies tegenkomen. In het tweede deelbespreken we de meer traditionele onderwerpen wanneer we het over programmerenhebben.

Dit dictaat

De beste manier om een programma te leren is door veel te oefenen. We hebbendaarom geprobeerd om de concepten uit te leggen aan de hand van voorbeelden. Weraden je aan om de voorbeelden zelf over te typen en goed te bestuderen. Daarnaasthebben we zoveel mogelijk oefeningen opgesteld. Bij de oefeningen hebben we zoveelmogelijk proberen aan te sluiten bij de kennis die je zou moeten hebben qua wiskundeen natuurkunde. Zo zul je veel oefeningen zien die met de mechanica te maken hebben.We hebben dit gedaan zodat je direct ziet in welke situaties Matlab gebruikt zou kunnenworden. Uiteraard is Matlab niet gelimiteerd aan deze situaties, Matlab kan veel meerdan dit. De oefeningen herken je aan het blauwe kader waarin ze staan. Het is debedoeling dat je alle oefeningen probeert op te lossen. Ten slotte zijn er ook opgaven.Deze herken je aan het groene kader waarin ze staan. De opgaven (veel minder inaantal dan de oefeningen) dienen te worden afgetekend door de docent. Dat betekentdat jouw oplossing, voor het einde van de les, door de docent als correct beoordeelddient te kunnen worden.

Matlab downloaden

Om Matlab te downloaden neem je je favoriete web browser en ga je naar de website

www.mathworks.com. Op de hoofdpagina is een knop voor het downloaden van delaatste versie van Matlab. Klik hierop. Je wordt gevraagd om inlog gegevens.  Gebruik 

hier je Saxion webmail adres en je Saxion wachtwoord.

Page 6: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 6/71

2Matlab als programma (vier lessen)

2.1 De beginselen van Matlab

2.1.1 Layout

Wanneer je Matlab opstart zie je (als het goed is) een layout zoals weergegeven in figuur2.1. De standaard layout van Matlab bestaat uit een aantal deelschermen.

Figuur 2.1:  Layout van Matlab.

  Command Window: Hier kan de gebruiker interactief met Matlab omgaan.Commando’s kunnen hier ingetypt worden en het resultaat van een berekening

3

Page 7: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 7/71

4   CHAPTER 2. BLOK 1

wordt hier ook geprint. De Command Window is handig voor korte berekeningen,en even snel iets uitzoeken. Het kan opgevat worden als een zeer uitgebreiderekenmachine.

  Command History: Dit is een soort van logboek. Alle commando’s die inde Command Window gebruikt zijn, worden opgeslagen in de Command His-tory. Door op een commando in de Command History te dubbelklikken wordtdeze opnieuw uitgevoerd. Dit logboek blijft bestaan, ook na het afsluiten vanMatlab en opnieuw opstarten. In de praktijk echter zul je de Command Historywaarschijnlijk niet vaak gebruiken.

  Workspace: Dit deel van de layout is wel zeer belangrijk. In Matlab werkenwe veelal met variabelen. In de Workspace kunnen we zien welke variabelen wegemaakt hebben en wat hun namen, waarde, grootte en type is. Je kunt het alseen soort boekhoudsysteem opvatten, waaraan je kunt zien waar Matlab op elkmoment kennis van heeft.

 

Path: Path, of in het Nederlands, het pad, geeft aan in welke directory Matlabzoekt naar bestanden. Dit zal belangrijk zijn wanneer we programma’s schrijvenen opslaan in zogenaamde m-files (Matlab bestanden). Om deze programma’suit te kunnen voeren (runnen) moet Matlab wel verteld worden waar deze zijnopgeslagen. Het aanpassen van het pad gaat op dezelfde manier als in Windowsverkenner.

 

Current folder: Dit deel geeft een overzicht van alle bestanden in de locatie vanhet huidige pad. Oftewel, dit is een soort verkenner binnen de Matlab omgeving.Door op bestanden te dubbelklikken kunnen deze ook geopende worden.

  Help: Dit is wellicht de meest belangrijke deel van de gehele layout. Het icoon

met de vraagteken leidt ons naar de Matlab documentatie. In deze documentatieis alle informatie over alle commando’s (en meer) van Matlab te vinden. Vaakwordt het gebruik van de commando’s ook toegelicht met behulp van voorbeelden(welke je vaak kunt kopieren en plakken). De Matlab documentatie beschikt ookover een goede zoekfunctie.   Het leren omgaan met de Matlab zoekfunctieis misschien wel het belangrijkste dat je moet leren aan het einde vandeze module. We raden je dan ook aan om veelvuldig gebruik te makenvan de helpfunctie.  Vanuit de Command Window kan de help ook aangeroepenworden. Door   doc functienaam in de Command Window te typen, worden wenaar de documentatiepagina van de functie geleid. Een korte samenvatting vandeze documentatie kan ook opgeroepen worden in de Command Window, door

middel van het commando   help functienaam. Zoals duidelijk mag zijn, moet je wel de functienaam weten waarop je wilt zoeken. Over het algemeen is het hethandigst om gewoon de documentatie en de zoekfunctie hierin te gebruiken.

Oefening 2.1 Zoekfunctie gebruiken

1. Zoek in de Matlab documentatie uit hoe de natuurlijke logaritme van

Page 8: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 8/71

2.1. DE BEGINSELEN VAN MATLAB   5

een getal berekend kan worden, dus ln(x).

2. Bestudeer de voorbeelden die je vind.

3. Bestudeer de verwijzingen naar andere gerelateerde commando’s (on-deraan staat altijd een sectie:   see also). Kun je hier uithalen wat de

commando is voor het berekenen van een   10 log(x).

4. Probeer ook het   help commando in de Command Window om de kortegebruiksaanwijzing voor de natuurlijke logaritme functie naar voren tehalen.

2.1.2 Gebruik als rekenmachine

Matlab kan gebruikt worden als een uitgebreide rekenmachine. In de Command Win-dow kunnen berekeningen uitgevoerd worden. Probeer de volgende uitdrukking maareens in te typen (eindig met  enter).

>>   1 + 3*4.5

ans =

14.5000

Merk op dat

1. Matlab het antwoord laat zien in de Command Window. Soms wil je liever

het antwoord niet zien op het scherm. Dit kun je voor elkaar krijgen door deuitdrukking te eindigen met een punt-komma (;).

2. Matlab het antwoord een naam geeft, namelijk ans, dit staat voor   answer  en isde standaard naam die gebruikt wordt als de gebruiker niet zelf een naam toekentaan het resultaat. Als je in de Workspace kijkt, zie je dat het resultaat van deberekening onder de naam   ans   is opgeslagen. De waarde van   ans   is altijd delaatste berekening die uitgevoerd is.

3. er een punt gebruikt wordt voor decimale getallen en niet een komma, zoals jewaarschijnlijk gewend bent.

Voer de volgende berekening uit, en let op de waarde van  ans  in de Workspace.

>>   5 + 3

ans =

8

Page 9: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 9/71

6   CHAPTER 2. BLOK 1

Als het goed is zie je dat de waarde van   ans   overschreven is met de waarde van delaatste berekening. In Matlab kunnen we ook onze eigen namen bedenken. We noemendeze ook wel   variabelen . Bijvoobeeld:

>>   x = 1 + 2*3

x =

7

De waarde 7, (het resultaat van 1+2×3) is nu toegekend aan de variabele met de naam

x. Het mooie hiervan is dat we  x  nu ook kunnen gebruiken in verdere uitdrukkingen.In het volgende voorbeeld wordt er een nieuwe variabele gemaakt met de naam  y, doorgebruik te maken van de variabele  x:

>>   y = 5*x

y =

35

De variabele y  heeft nu de waarde 5x = 5×7 = 35. Wanneer de waarde van de variabelex  nu veranderd wordt, bijvoorbeeld door   x = 100 in te typen, heeft dat geen effect opde waarde van   y. Om ook  y  mee te laten veranderen moet je de uitdrukking voor   y

evalueren. Check dit door in de Workspace de waarden te bekijken. In de volgendeparagraaf gaan we dieper in op het gebruik van variabelen.

Volgorde van wiskundige operatoren en gebruik van haakjes

Matlab kent (onder meer) de gebruikelijke wiskundige operatoren. Deze zijn in tabel2.1 te zien.

SYMBOOL OPERATIE VOORBEELD

^   Machtsverheffen   10^2

*   Vermenigvuldigen   10*8

/   Delen   10/8

+   Optellen   10 + 8

-   Aftrekken   10 - 8

Tabel 2.1:  Basis wiskundige operaties in Matlab.

De volgorde waarin deze wiskundige operatoren uitgevoerd worden is:

1. machtsverheffen

2. vermenigvuldigen en delen

3. optellen en aftrekken

Page 10: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 10/71

2.1. DE BEGINSELEN VAN MATLAB   7

Om precies controle te hebben op de volgorde van je berekening kun je haakjes ge-bruiken, net zoals op je rekenmachine. Het volgende voorbeeld laat dit zien.

>>   6ˆ2*4/2+6

ans =

78

>>   6ˆ(2*4)/(2+6)

ans =

209952

De eerste is het resultaat van  62 × 4

2  + 6, terwijl de tweede berekening het resultaat is

van   68

2 + 6. Je ziet dat het plaatsen van een aantal haakjes nogal een effect kan hebben.

Oefening 2.2 Gebruik van haakjes

1. Bereken met Matlab.

(a) 6 ×  10

13 +

  18

5 × 7 + 5(92)   antw : 410.1297

(b)   272  × 91/2 + 7.25 × (10 − 6.14)64   antw : 40.9373

(c) 4(351/4) + 140.35 antw : 12.2477

(d)  1

2 + 32 +

 4

5 ×  6

7  antw : 0.7766

2. Bereken met Matlab en check het antwoord met je rekenmachine

(a)  2

7(15)(32/5) +

  41/5

(3.5)4 − 221

(b)  (55)112.14 − (4.5)6

31 + 173

Page 11: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 11/71

8   CHAPTER 2. BLOK 1

(c)  134

4  +

 4131/5

2.5  + 13(4)−5/2

2.1.3 Variabelen

Een variabele is simpelweg een bakje waarin een waarde bewaard kan worden. Tot nutoe heb je kennis gemaakt met de variabele  ans. Dit is de standaard variabelenaam dieMatlab gebruikt om de waarde van de laatste berekening in op te slaan. Bij het pro-grammeren is het gebruik van zelfgedefinieerde variabelen erg belangrijk. Een variabelewordt in Matlab aangemaakt op de volgende manier:

variabelenaam = waarde (of uitdrukking)

Links van het  =  teken wordt de naam die we de variabele willen geven ingetikt. Bij hetbedenken van een naam zijn de volgende opmerkingen van belang:

1. De naam moet met een letter beginnen. De rest van de naam mag bestaan uitletters, getallen, underscores.   De naam mag absoluut geen spaties bevat-ten.

2. De maximale lengte van de naam is 63 karakters

3. Matlab maakt onderscheid tussen hoofdletters en kleine letters. Dus   Tijd is niethetzelfde als   tijd

4. De naam mag niet hetzelfde zijn als een naam die Matlab intern al kent. Wezullen er nog vele langs zien komen. In de meeste gevallen bedenk je variabelenamen die Matlab niet zal kennen. Echter, om hier zeker van te zijn, kun jeMatlab vragen of het een bepaalde naam al kent. Dit doe je met de commandoexist   'naam'. Zoek in de documentatie naar de werking van deze commando.

Rechts van het  =  teken geven we de waarde die we aan de variabele willen toekennen.De waarde kan op verschillende manieren gegeven worden. De waarde kan:

1. handmatig ingevoerd worden als getal

2. het resultaat zijn van een uitdrukking

3. het resultaat zijn van het aanroepen van een Matlab functie.

Deze drie opties worden in onderstaande voorbeeld geıllustreerd.

Page 12: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 12/71

2.1. DE BEGINSELEN VAN MATLAB   9

>>   afstand = 5

afstand =

5

>>   afstand 2 = 2*afstand

afstand 2 =

10

>>   afstand 3 = sqrt(100)

afstand 3 =

10

>>   afstand = afstand + 10

afstand =

15

De variabele  afstand wordt gemaakt door handmatig de waarde te geven, namelijk5. Vervolgens wordt er een tweede variabele gemaakt, met de naam  afstand 2, door eenuitdrukking waarin de vorige variabele gebruikt wordt. Daarna wordt er een variabelegemaakt, genaamd   afstand 3, door gebruik te maken van de Matlab functie  sqrt. Defunctie berekent de wortel (Eng: square root) van het getal dat tussen haakjes wordt

meegegeven. Het resultaat van deze berekening wordt in de variabelenaam   asftand 3gestopt. Tenslotte wordt de waarde van de eerste variabele,  afstand overschreven dooreen berekening waarin de variabele zelf gebruikt wordt.

Oefening 2.3 Variabelen maken

1. Maak de volgende variabelen aan in Matlab en geef ze een waarde naarkeuze.Mijn positie, Jouw positie, positieVerschil

Appels, Peren, Bananen, FruitTotaal

massa, valversnelling, zwaartekracht

2. Definieer variabelen en bereken de volgende uitdrukkingen. Gebruikx = 3 en  y  = 7;

(a)   p =  x + y

(b)   q  =  xy

Page 13: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 13/71

10   CHAPTER 2. BLOK 1

(c)   r =  x2/y1

2

(d)   s = 4x − 2y +  4y3

5x(− 1

4)

3. Een balk heeft afmetingen:

lengte:   l = 10 cm,   breedte:   b = 20 cm,   hoogte:   h = 5 cm

Ken bovenstaande waarden toe aan variabelen in Matlab en bereken devolume van de balk. De waarde van de volume moet ook toegekendworden aan een variabele.

4. Een balk heeft afmetingen:

lengte:   l = 10cm,   breedte:   b =  l2 cm,   hoogte:   h =√ 

l cm

Ken bovenstaande waarden toe aan variabelen in Matlab en bereken de

volume van de balk. De waarde van de volume moet ook toegekendworden aan een variabele.

5. Je laat een euromunt vallen (vanuit rust) van de 112 meter hoge Dom-toren in Utrecht.

(a) Bereken na hoeveel seconden de munt de grond raakt. Neem aandat luchtwrijving verwaarloosbaar is.

(b) Bereken de snelheid waarmee de muntstuk de grond raakt.

Definieer zelf variabelen voor deze berekeningen.

antw :   tgrond  = 4.78 sec,  vgrond = 46.88 m/s.

Datatypen

Deze bespreking van verschillende datatypen dient enkel om je er bewust van te makendat deze concepten betaan. We zullen in de praktijk maar met enkele datatypen werken(namelijk, numeric, strings en logical).

De waarde van een variabele is niet het enige dat van belang is, ook het type datadat de variabele representeert is van belang. Matlab kent verschillende datatypen. Eencompleet overzicht hiervan is in de documentatie te vinden:   Matlab - Language   ...

Fundamentals - Data Types. De belangrijkste voor ons zijn de   numeric type. Dezetype is voor het representeren van getallen en is weer onder te verdelen in verschil-lende typen die varieren in hoe nauwkeurig een getal wordt gerepresenteerd, hoeveelbits ervoor nodig zijn en hoe snel er gerekend mee kan worden. De standaard type is

double  en voor ons is dit de type waar we mee zullen werken. De datatype   string

dient voor het representeren van letters. Ook deze zullen we nog tegenkomen. De typelogical  neem in principe de waarden 1 en 0 aan, welke staan voor Waar en Onwaar.Deze type wordt veel gebruikt bij het programmeren om te controleren of bepaalde

Page 14: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 14/71

2.1. DE BEGINSELEN VAN MATLAB   11

uitspraken waar of onwaar zijn. Op basis hiervan kan besloten worden welke richtinghet programma op moet gaan.

Dan zijn er nog typen zoals   structure en   cell arrays waarmee arrays gemaaktkunnen worden waarmee variabelen met verschillende datatypen kunnen worden geor-ganiseerd. Deze zullen we in deze module echter niet gebruiken.

Naast een overzicht van alle datatypen is er in de documentatie een mooi overzichtvan allerlei functies die handig zijn voor het checken van de datatype van een variabele,en voor het omzetten van de datatype van een variabele. Een functie die bijvoorbeeldbij het creeren van plots handig kan zijn is   str = num2str(A)   (Lees: number tostring). Deze functie neemt als input een getal ( numeric) en zet dit om in een string.Op deze manier kun je het getal gebruiken om bijvoorbeeld in de titel of assen-label tegebruiken.

De toekennings operator

Op dit moment is het van belang om even stil te staan bij het =  teken. De betekenis van

dit teken is in Matlab anders dan dat jullie gewend zijn van de wiskunde. Wanneer je inMatlab   x=3 typt, vertel je Matlab dat de waarde 3  toegekend  wordt aan de variabelex. Dit is hetzelfde als in de wiskunde. Echter, in Matlab kun je vervolgens ook intypenx = x+2. Hiermee vertel je Matlab dat de waarde van de variabele x  opgehoogd wordtmet 2, de nieuwe waarde van  x is dus 5. In de wiskunde heeft de uitdrukking  x = x+2

geen betekenis, want dan zou er staan 0 = 2.

In Matlab wordt de waarde van de variabele links van het   =   teken   vervangen 

door de waarde rechts van het  =  teken. Het is handig om dit te lezen als:   x  wordt 2.Vandaar dat er in Matlab links van het  =  teken nooit meer dan een variabele magstaan. Verder moet de uitdrukking aan de rechterkant wel te berekenen zijn. Dus allevariabelen aan de rechterkant moeten wel een waarde hebben. Een aantal voorbeelden

zie je hieronder:

>>   x = 3 ;   %dit is prima. de variabele x krijgt de waarde 3

>>   6 = x   %variabele naam moet links van = teken

>>   x + 2 = 5   %FOUT:in Matlab mag er enkel een variabele ...

naam links van het = teken staan.

>>   x = 5*y   %mag alleen als y al een waarde heeft

>>   x = x + 2;   %prime, de nieuwe waarde van x is de oude ...

waarde van x plus 2

Handige commando’s en wijzigen van invoer.De uitdrukkingen die je in de Command Window invoert kunnen soms erg lang zijn.Dan kan het vervelend worden als je ze meerdere malen moet intikken. Gelukkig is ditniet nodig, omdat Matlab een Command history bijhoudt. Alle ingevoerde commando’sworden dus bijgehouden. Je kunt de pijltoetsen ↑↓   gebruiken om eerder ingevoerdecommando’s terug te halen zodat je deze dan kunt aanpassen zoals je wilt.

Verder kent Matlab een aantal handige commando’s waarmee je je Workspace kuntonderhouden. Zie tabel 2.2 voor de werking hiervan.

Page 15: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 15/71

12   CHAPTER 2. BLOK 1

COMMANDO WERKING

clear   verwijdert alle variabelen in de Workspace

clear var1 var2   Verwijdert alleen de variabelen   var1  en   var2

who   Geeft een lijst van alle variabelen in de Workspacewhos   Zelfde als   who, maar geeft meer informatie over de variabelen

save   'bestandsnaam'   Slaat de gehele Workspace op in een  .mat  bestand.load   'bestandsnaam'   Laad de variabelen opgeslagen in   'bestandsnaam.mat'.clc   Maakt de Command Window leeg

Tabel 2.2:   Matlab commando’s voor het bijhouden van de Workspace

Errormessages (Foutenberichten)

Matlab doet precies wat jij het opdraagt om te doen, in de vorm van commando’s.Dit betekent wel dat de commando’s begrepen moeten worden door Matlab. Als Mat-lab jouw commando’s niet begrijpt, zal het dit aangeven, door middel van een Er-rormessage. Deze worden in de Command Window met rode tekst geplaatst. Je zultontzettend veel fouten maken bij programmeren, maar wees gerust, iedereen die ooitheeft geprogrammeerd doet dit. We mogen blij zijn dat Matlab in veel gevallen onswaarschuwt wanneer we een fout maken (veel andere programmeertalen doen dit nieten laten je aan je lot over). Matlab probeert zelfs aan te geven waar er iets mis gaat.In figuur 2.2 zijn twee voorbeelden te zien van veelvoorkomende errors.   Goed lezenvan de foutberichting scheelt ontzettend veel tijd in het zoeken naar fouten(en daarmee frustraties).

(a) (b)

Figuur 2.2:   Matlab geeft aan dat het iets niet begrijpt door middel van een Error. In deel(a) kent Matlab de uitdrukking  5x niet. Hier is dus een vermenigvuldigingsteken vergeten. Indeel (b) geeft Matlab aan dat de uitdrukking niet klopt want er is haakje te weinig.

Oefening 2.4 Opslaan en laden van Workspace, en fouten opsporen1. Als je de vorige oefening hebt uitgevoerd, heb je als het goed is een

aantal variabelen in je Workspace staan. Sla deze op door gebruik temaken van het commando   save. De gehele Workspace is nu opgeslagenin een bestand met extensie   .mat. (Let op waar het bestand opgeslagenwordt)

Page 16: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 16/71

2.1. DE BEGINSELEN VAN MATLAB   13

2. Als de vorige vraag goed gegaan is, delete dan je gehele workspace enzorg dat je Command Window leeg is.

3. Laad nu je opgeslagen Workspace weer in met het   load commando.

4. Neem de volgende commando’s over en maak deze kloppend.

(a)   >>   t = 4; v = (t+2ˆ2

(b)   >>   r = 10; Omtrek = 2 pi r

(c)   >>   arctan(pi)

2.1.4 Wiskundige functies en constanten

In de techniek gebruiken we veelvuldig allerlei wiskundige functies en constanten.Gelukkig kent Matlab alle wiskundige functies die we ooit zullen tegenkomen. In devorige paragraaf zijn we de wortelfunctie al tegengekomen, namelijk   sqrt(x). In tabel2.3 is een(zeer) kleine greep van de wiskundige functies die Matlab kent te zien. Zie deMatlab documentatie voor een complete lijst.

sin(x)   sinus   asin(x)   arcsinuscos(x)   cosinus   acos(x)   arccosinustan(x)   tangens   atan(x)   arctangens

log(x)   natuurlijke logaritme (ln(x))   log10(x)   logaritme basis 10 (log(x))exp(x)   exponentiele functie   abs(x)   absolute waarde

Tabel 2.3:   Matlab kent ontzettend veel wiskundige functies. Deze tabel geeft een aantalveelgebruikte functies.

pi   het getal π = 3.141592653589793i,j   het imaginaire getal i  =

√ −1Inf   oneindig ∞NaN   Not a Number

Tabel 2.4:  Constanten die Matlab intern kent. Zorg ervoor dat je nooit jouw eigen variabeleneen van deze namen geeft.

In tabel 2.4 zijn een aantal belangrijke variabelenamen te zien die voorgedefinieerdeconstanten voorstellen. De belangrijkste is misschien wel  pi. Het is belangrijk om jouweigen variabelen dus nooit deze namen te geven. Het imaginaire getal is per definitiei  =

√ −1. Deze zullen jullie bij Mathematics 20 leren kennen. Oneindig wordt door

Matlab gebruikt voor berekeningen zoals  x  =  5

0. De laatste is   NaN, dit betekent Not a

Number (oftewel: ”het is geen getal”). Matlab geeft dit als output als een berekening

geen goed gedefinieerd antwoord heeft , bijvoorbeeld  0

0.

Page 17: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 17/71

14   CHAPTER 2. BLOK 1

De wiskundige functies die Matlab kent, zijn voorbeelden van zoge-naamde Matlab functies. Dit zijn commando’s die een input verwachtenen een waarde als output teruggeven. De input is datgene dat tussen haakjesstaat. De output kan weer toegekend worden aan een variabele. Zie voorbeeld hieron-der.

>>   sqrt(100)   %input is 100

ans =

10   %output is 10, variabele is ans

>>   y = sqrt(100)   %input is 100

y =

10   %output toegekend aan variabele y

OPMERKING:

  Matlab functies mogen alleen aan de rechterkant van het = teken staan.

 

Gebruik   pi   nooit   links van het = teken, want dan overschrijf je de waarde endat wil je niet hebben.

  In principe is het niet handig om de variabelen   i   en   j   te overschrijven, wantdan kun je niet meer beschikken over complexe getallen. Dit is echter voor dezemodule nog niet van belang. Pas wanneer je met complexe getallen gaan werkenwordt dit een punt om te onthouden.

  De meeste Matlab commando’s kunnen op verschillende manieren gebruikt wor-den. Ze accepteren vaak verschillende soorten inputs en geven verschillende out-puts. In dit dictaat is het niet mogelijk om alle mogelijkheden te beschrijven.Vandaar dat je aangeraden wordt om de werking van zoveel mogelijkcommando’s, die hier besproken worden, in de documentatie te bestud-eren.

Andere voorbeelden van Matlab functies die veelvuldig gebruikt worden in berekenin-gen voor het afronden van getallen op verschillende manieren zie je in tabel 2.5. Voormeer informatie over deze functies raadpleeg de documentatie.

Oefening 2.5 Wiskundige functies en constanten

1. In de commando   sin(x)   staat de   x   voor een hoek. Ga in de Matlabdocumentatie na of deze hoek in graden of in radialen hoort te zijn.

2. Bereken de volgende expressies, en bestudeer goed de uitkomst. Komenalle resultaten overeen met wat je zou verwachten. Zo niet, probeer te

Page 18: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 18/71

2.1. DE BEGINSELEN VAN MATLAB   15

floor(x)   rond een getal af naar dichtsbijzijnde gehele getal (integer)  lager dan   x

round(x)   rond een getal af naar dichtsbijzijnde  gehele getal   x

fix(x)   rond een getal af richting 0ceil(x)   rond een getal af naar dichtsbijzijnde gehele getal  groter dan   x

rem(x,y)   getal dat overblijft na x/y . vb:   rem(10.5,2)= 0.5

mod(x,y)   getal dat overblijft na x/y . vb:   mod(10.5,2)= 0.5

Tabel 2.5:   Een aantal functies voor afronden van van getallen. Dit kan op verschillendemanieren. Het verschil tussen   rem(x,y)  en   mod(x,y)  is zeer subtiel.

bedenken wat een reden zou kunnen zijn.

sin(0) sin(0.5π) sin(π)

cos(0) cos(π/2) cos(π) cos(33◦)

tan(π/2) tan(

∞) arctan(

∞)

3. Bereken de waarde van de volgende uitdrukking:

y =  e−a sin(x) + 10√ 

x + a ,

neem a  = 5 en  x  = 2.

4. Bereken de waarde van de volgende uitdrukking:

y =  e−x+a sin

arctanx

a

+ ln x + a ,

neem a  = 10 en  x  = 7.5. Probeer van te voren te bedenken wat het resultaat is van de volgende

commando’s, en check het dan door de commando’s uit te voeren in deCommand Window. Raadpleeg de Matlab documentatie voor deze func-ties.

floor(-7.8) floor(5.5)

fix(-7.8) fix(5.5)

round(-7.8) round(5.5)

ceil(-7.8) ceil(5.5)

rem(25,5) mod(25,5)

rem(-10.5,2) mod(-10.5,2)

6. Een cirkel heeft een oppervlak van 0.002m2. Bereken de omtrek vandeze cirkel in meters.

Page 19: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 19/71

16   CHAPTER 2. BLOK 1

7. De schaal van Richter wordt gebruikt bij aardbevingen. De energie vaneen aardbeving wordt volgens deze schaal berekend met:

E  = 104.4101.5x ,

waarbij x  de waarde van de aardbeving is op de schaal van Richter.

Bereken hoeveel keer meer energie vrijkomt bij een aardbeving met x = 5ten opzichte van een aarbeving met  x  = 3.

Opgave 2.1 Deze opgave dient door de docent afgetekend te worden.

1. De formule voor de volume van een cylinder met straal r  en hoogte  h  is

V   = πr2h

(a) Bereken de volume van een cylinder met   r  = 5 cm en   h  = 30 cm.Maak gebruik van variabelen.

(b) De volume die je bij de vorige opgave berekend hebt is in cm3.Bereken deze volume in de eenheid m3.HINT: een getal als 10000 kan in Matlab geschreven worden met decommando   1e4. Net zo kan een klein getal als 0.0001 geschrevenworden als   1e-4. Kortom, de   e   staat voor de wetenschappelijkenotatie 10ˆ

(c) Als de volume van een cylinder   V   = 5000cm3 is en   h   = 20 cm.Bereken dan de bijbehorende straal in cm.

2.2 Plotten

Een van de belangrijkste toepassingen van Matlab is het visualiseren van data, Matlabis hier zeer goed. Met een paar commando’s kan een grafiek worden gemaakt vanwiskundige functies, en in het algemeen van allerlei soorten data. Visualiseren vandata is erg belangrijk bij zowel experimenteren als modelleren.

2.2.1 Het idee van de plot commando

Op de middelbare school heb je vast wel eens een grafiek moeten tekenen (zonder ge-bruik te maken van je grafische rekenmachine). De manier waarop je dat waarschijnlijkhebt gedaan is door een tabel te maken waarin je een aantal x-waarden schrijft, endaaronder, de functiewaarden die horen bij die x-waarden. Een voorbeeld van zo’ntabel is te zien in tabel 2.6, waarin een willekeurige functie  y(x) is genomen. Om een

Page 20: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 20/71

2.2. PLOTTEN    17

x   0 1 2 3 4 5 6

y   -3 2 -1 1 4 -2 2

Tabel 2.6:   Een aantal  x-waarden met bijbehorende  y -waarden. Elk koppel (x, y) is een puntop de grafiek.

grafiek te maken van de punten in de tabel gebruiken we de Matlab functie   plot(x,y)

(input:   x   en   y   waarden, output: figuur met plot). Zie voorbeeld hieronder, met alsresultaat figuur 2.3.

>>   x = [0 1 2 3 4 5 6];

>>   y = [-3 2 -1 1 4 -2 -2];

>>   plot(x,y)

0 1 2 3 4 5 63

2

1

0

1

2

3

4

Figuur 2.3:  Grafiek behorend bij de punten in tabel 2.6.

2.2.2 1D-arrays en de : (dubbele punt) operator

Uitleg van de code in het voorbeeld hierboven:

1. De variabelen  x

  en  y

  zijn nu niet een enkele getal, maar een getallenrij. Ditwordt ook wel een  1D-array   of een  rijvector   genoemd. Een rijvector makenwe door getallen tussen rechte haakjes te plaatsen. De getallen scheiden we vanelkaar door middel van een spatie (of een komma). Het onderwerp Arrays is zeerbelangrijk in Matlab, we zullen daarom dit onderwerp verder bespreken in eenaparte paragraaf.

2. Voor het plotten is het zeer belangrijk dat de getallenrijen   x en   y evenveelelementen hebben. Probeer de volgende commando’s maar eens:

Page 21: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 21/71

18   CHAPTER 2. BLOK 1

>>   x = [1, 2, 3, 4, 5, 6, 7];

>>   y = [-5, 1, 10, 7, 12];

>>   plot(x,y)

3. De plot commando opent automatisch een figuurvenster. De coordinaten in de xen y arrays worden geplot en verbonden met rechte lijnen.

Om een vloeiend uitziende grafiek te krijgen is het nodig om veel punten (dicht bijelkaar) te berekenen en te plotten. Al snel is het niet meer handig om de   x-rijvector,waarin de  x-coordinaten staan, een voor een in te typen zoals in het vorige voorbeeld,want dan blijf je bezig. Matlab beschikt over handige commando’s waarmee arraysgemaakt kunnen worden waarbij de waarden van opeenvolgende getallen stapsgewijsgroter worden. De variabele   x, met de x-waarden in het vorige voorbeeld had ook metde commando   x = [0:6]  gemaakt kunnen worden. Met behulp van de : vertel jeMatlab dat je graag een array wilt hebben die begint bij 0 en eindigt bij 6, met stapjesvan 1. We kunnen ook een andere stapgrootte nemen, bijvoorbeeld   x = [0:0.1:6].Nu krijgen we ook een getallenrij die bij 0 begint en bij 6 eindigt, maar nu wordenstapjes van 0.1 genomen. In het voorbeeld hieronder wordt de grafiek van een sinusgeplot (zie figuur 2.4)

>>   x = [0:0.1:6];

>>   y = sin(x);

>>   plot(x,y)

0 1 2 3 4 5 6−1

0.8

0.6

0.4

0.2

0

0.2

0.4

0.6

0.8

1

Figuur 2.4:  Grafiek van een sinus functie. Door de kleine stapjes in de x variabele krijgen weeen vloeiende grafiek.

OPMERKING: hopelijk heb je gemerkt dat er iets bijzonders gebeurd is. In de vorigeparagraaf heb je namelijk de sinus berekend van een   enkel   getal. Nu echter, wordter een array als input aan de   sin   commando gegeven. De output is een array dateven groot is (evenveel elementen) als   x. Dit is een voorbeeld van hoe een Matlabfunctie op verschillende manieren gebruikt kan worden. Afhankelijk van het type en/of aantal inputs reageert de functie op een bepaald manier. In de documentatie worden

Page 22: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 22/71

2.2. PLOTTEN    19

de verschillende manieren altijd toegelicht, het is zeer belangrijk om dit altijd goed uitte zoeken.

2.2.3 1D-arrays en de linspace commando

In de vorige paragraaf heb je gezien dat we een array kunnen maken waarbij de waardenmet een bepaalde stapgrootte groeien met het : -teken. Een tweede manier om snel engemakkelijk een 1D-array te maken is met de   linspace  functie (afkorting voor ’linearspacing’). Deze functie geeft je controle over het   aantal   elementen van de array enbepaalt zelf de benodigde stapgrootte. De linspace heeft drie inputs nodig, namelijkhet begin, het einde en het aantal elementen (de grootte) van de array. De functiewerkt als volgt. Er wordt een array gemaakt van 0 tot 6 met 1000 punten.

>>   x = linspace(0,6,1000);

>>   y = sin(x);

>>   plot(x,y)

2.2.4 Vermenigvuldigen van arrays

Stel we willen de functie   y   =   x2 plotten, voor −4 ≤   x ≤   4. De   x-as maken we bi- jvoorbeeld met   linspace(-4,4,100), zodat we een  array   krijgen van -4 tot 4 methonderd waarden. Als we nu simpelweg   y = xˆ2   intypen, krijgen we de volgendefoutmelding. Matlab weet dat we een 1D-array willen kwadrateren. Echter, voor het

Figuur 2.5:   Foutmelding die ons verteld dat we een array willen kwadrateren en dus deoperator voor  elementsgewijze machtverheffing moeten hebben. Dit is dus  .ˆ

kwadrateren (en vermenigvuldigen en delen van arrays) gelden in de wiskunde specialeregels. Dit vakgebied heet lineaire algebra (of matrix algebra) en jullie zullen dit inde module Mathematics 30 uitvoerig bestuderen. Wat we hier echter willen is sim-pelweg dat elk element van de array   x   wordt gekwadrateerd.   Voor elementsgewijsvermenigvuldigen, delen en machtverheffen van arrays gebruiken we de op-eratoren in onderstaande tabel. Oftewel, we gebruiken een punt om aan te gevendat we elementsgewijze operaties willen uitvoeren. Om de functie  y  = x2 dus te plot-

ten gebruiken we de volgende commando:   y = x.ˆ2. Hieronder een aantal anderevoorbeelden:

Page 23: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 23/71

20   CHAPTER 2. BLOK 1

operator uitleg

+ optellen van twee matrices−   aftrekken van twee matrices.∗   elementsgewijs vermenigvuldigen van twee matrices

./   elementsgewijs delen van twee matrices

.ˆ elementsgewijs tot de macht verheffen.

Tabel 2.7:   Operatoren behorende bij arrays.

functie die we willen plotten commando

y(x) = x cos(x)   x.*cos(x)

y(x) = x2 sin(x)   x.ˆ2.*sin(x)

y(x) =  x4

ex  x.ˆ4./exp(x)

Tabel 2.8:   Een aantal voorbeelden van elementsgewijze operaties.

Oefening 2.6 Creeren van 1D-arrays en plotten

1. Creeer (en bedenk zelf variabelenamen voor) de volgende 1D arrays. Gabij elke array ook na uit hoeveel elementen het bestaat.

(a) van 0 tot 100 in stapjes van 0.1. Hoeveel elementen heeft deze array?

(b) van

 −π   tot  π   in stapjes van

  2π

100

. Bekijk de waarde van het laatste

element.

(c) van −π  tot  π   in stapjes van 0.01. Bekijk de waarde van het laatsteelement. Waarom is deze niet gelijk aan   pi?

2. Plot de volgende functies. Maak de x-array d.m.v. de : operator. Kieszelf een geschikte stapgrootte van de x-array. HINT: Met de commandofigure(1)   open je een lege figuurvenster. Zodra er nu een plot com-mando gegeven wordt, wordt de actieve figuurvenster gebruikt voor hetplotten. Op deze manier kun je alle onderstaande functies in apartefiguurvensters plotten (uiteraard moet je het cijfer telkens met een oplaten lopen).

(a)   y  = 3x − 5 op het domein  x  = [−4, 4]

(b)   y  = −x2 + 2x − 3 op het domein  x  = [−4, 4]

(c)   y  =  e−x op het domein  x  = [−3, 2]

(d)   y  =  ex op het domein  x  = [−2, 3]

Page 24: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 24/71

2.2. PLOTTEN    21

(e)   y  =  ex

−(x2) op het domein  x  = [1, 6]

(f)   y  =√ 

x  op het domein  x  = [0, 10]

(g)   y  =√ 

x  op het domein  x  = [0, 100000]

3. Plot de volgende functies. Maak de x-array d.m.v. de   linspace  com-mando. Kies zelf een geschikte aantal elementen voor de x-array. Bepaalvan elke functie de periode  T   (in sec.) en de frequentie 1/T   (in Hz).

(a)   y  = 3cos(t − π/4) op het domein  t  = [−2π, 2π].

(b)   y  = 3cos

3  t

 op het domein  t  = [−6, 6].

(c)   y  = sin

5.5t

2.2.5 Opmaak van grafieken

Een grafiek zoals in figuur 2.4 kan eigenlijk niet op deze manier gepresenteerd worden.Bij een grafiek hoort op zijn minst de assen benoemd te worden. Soms is een titel ookgewenst. Al deze eigenschappen, en meer, van een figuur kunnen we aanpassen naarwens. De eigenschappen van figuren kunnen aangepast worden d.m.v. commando’s,maar ook via de  plot tools. Zie figuur 2.6 voor de knop die de plot tools tevoorschijnhaalt. Je wordt aangeraden om de mogelijkheden die deze plot tools je bieden teonderzoeken. Echter, sommige eigenschappen van grafieken zul je zo vaak moetenaanpassen, dat het wel handig is om enkele commando’s uit het hoofd te kennen.

Figuur 2.6:   Bovenin het figuurvenster zijn er verschillende opties. Voor het zichtbaar makenvan de plot tools kun je de knop gebruiken die aangegeven wordt d.m.v. de rode pijl.

Page 25: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 25/71

22   CHAPTER 2. BLOK 1

Assen labels en titel

Het geven van assen labels en een titel illustreren we middels het volgende voorbeeld.We plotten de grafiek van een sinus met frequentie  f  = 10 Hz. Omdat de sinus functiein Matlab als argument een hoek in radialen verwacht, wordt de functie sin(2π f t). Weplotten deze functie voor   t  = 0 tot 1 seconde. De grafiek is te zien in figuur 2.7(a).Merk op dat we als input bij de   plot   commando niet perse variabelenamen   x   en   y

hoeven te gebruiken. We mogen elke willekeurige (geldige) variabelenaam gebruikendie we willen (zolang de arrays maar even lang zijn).

>>   f = 10;   %frequentie

>>   t = linspace(0,1,1000);   %tijd as

>>   sinus 10Hz = sin(2*pi*f*t);   %signaal

>>   plot(t,sinus 10Hz)   %plot

>>   xlabel('tijd (sec)')   %label x-as

>>   ylabel('spanning (V)')   %label y-as

>>   title('Sinusvormige spanningssignaal van 10 Hz')   %titel

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

tijd (sec)

  s  p  a  n  n   i  n  g   (   V   )

Sinusvormige spanningssignaal van 10 Hz

(a)

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

tijd (sec)

  s  p  a  n  n   i  n  g   (   V   )

Sinusvormige spanningssignaal van 10 Hz

(b)

Figuur 2.7:  Plot met assen labels, titel en verschillende kleuren en lijnstijlen.

Lijnstijlen, markers, e.d.

De standaard manier van plotten voor Matlab is een getrokken blauwe lijn. We kun-nen echter lijnstijl, kleur en dergelijke zelf kiezen. Verander de plot commando vanhet vorige voorbeeld in  plot(t,sinus 10Hz,   'r--')  en je krijgt als resultaat figuur2.7(b). De verschillende opties voor kleuren, lijnstijlen en markers kun je gemakkelijkvinden in de Matlab documentatie door te zoeken op ’linespec’, of door   help plot  inde Command Window te typen.

Meerdere plots in een figuur:   hold   on, legend, subplot

Vaak is het handig om meerdere functies in een figuur te plotten. Hierdoor is hetvergelijken van verschillende data gemakkelijker. Vaak plaatsen we dan ook een legenda.We kunnen op verschillende manieren meerdere curves plotten in een figuur. De eerste

Page 26: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 26/71

2.2. PLOTTEN    23

manier is door gebruik te maken van de   hold   on  commando. Na het plotten van deeerste lijn gebruiken we de commando   hold   on. Alle plots die hierna volgen worden indezelfde figuur geplaatst. De  hold   on kun je weer ongedaan maken door de commandohold   off. Als resultaat krijg je een grafiek waarin twee functies te zien zijn. Zie figuur2.8 en het voorbeeld hieronder.

>>   f = 10;

>>   t = linspace(0,1,1000);

>>   sinus 10Hz = sin(2*pi*f*t);

>>   cosinus 10Hz = cos(2*pi*f*t);

>>   plot(t,sinus 10Hz)

>>   hold   on

>>   plot(t,cosinus 10Hz,   'k.-')

>>   xlabel('tijd (sec)')

>>   ylabel('spanning (V)')

>>   title('Sinusvormige en cosinusvormig spanningssignaal van   ...

10 Hz')

>>   legend('sinus signaal',   'cosinus signaal')

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

tijd (sec)

  s  p  a

  n  n   i  n  g

   (   V   )

Sinusvormige en cosinusvormig spanningssignaal van 10 Hz

 

sinus signaal

cosinus signaal

Figuur 2.8:   meerdere plots in een figuur. Om het vergelijken te vergemakkelijken gebruikenwe verschillende kleuren en markers. Tevens is er een legenda bijgezet.

Een tweede manier om meerdere plots in een figuur te verkrijgen is met behulp vande   subplots(m,n,p) commando. Met deze commando kan de figuur opgedeeld wordenin   m  rijen en   n  kolommen. (p  is een teller waarmee je een bepaalde plot kunt plaatsenin het venster). Dit is het beste uit te leggen met een voorbeeld. We willen graag driesinusfuncties met dezelfde frequentie van 10 Hz, maar verschillende amplitudes onderelkaar plotten. Dit doen we door het figuurvenster op te breken in drie rijen en eenkolom met behulp van de   subplot commando. Zie hieronder.

Page 27: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 27/71

24   CHAPTER 2. BLOK 1

>>   f = 10;

>>   t = linspace(0,1,1000);

>>   y1 = sin(2*pi*f*t);

>>   y2 = 0.5*sin(2*pi*f*t);

>>   y3 = 0.25*sin(2*pi*f*t);

>>   figure(1)   %open een figuurvenster>>   subplot(3,1,1)   %3 rijen, 1 kolom, eerste plot

>>   plot(t,y1,   'b')

>>   subplot(3,1,2)   %3 rijen, 1 kolom, tweede plot

>>   plot(t,y2,   'r')

>>   subplot(3,1,3)   %3 rijen, 1 kolom, derde plot

>>   plot(t,y3,   'k')

Figuur 2.9:   meerdere plots in een figuur. Nu door gebruik te maken van de   subplot  com-mando.

Van elk van deze drie plots zijn de assen-labels, titels, legenda’s etc... apart in testellen (zie oefeningen).

Plots opslaan

Wanneer je tevreden bent over hoe een plot eruit ziet, kun je deze opslaan voor verder

gebruik in andere toepassingen, zoals Word of Powerpoint. Opslaan van een plot kand.m.v. commando’s (documentatie), maar het gemakkelijkst is door in het figuurvensterte klikken op   File - Save As. Een figuur kan opgeslagen worden in verschillendeformats. Voor gebruik in een programma als Word zijn de formats   .jpg   en   .png

geschikt. Een format die zeker ook genoemd dient te worden is Matlab’s eigen format,namelijk .fig. Dit format slaat niet alleen het plaatje op, maar alle data die erbij hoort.Dit betekent dat je een   .fig-bestand in Matlab weer kunt  openen en bewerken .Het isdaarom aan te raden om een figuur ook altijd op te slaan in   .fig   format

Page 28: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 28/71

2.2. PLOTTEN    25

Oefening 2.7 Plotten en optiesBij alle oefeningen hoor je de assen te voorzien van labels. Mocht de lijnstijlen kleur niet vermeld worden, maak dan zelf keuzes zodat je mooie en vooralduidelijke grafieken krijgt. Bij veel van de plots die je bij deze oefening gaat

maken dien je de elementsgewijze operatoren te gebruiken.1. Zoek in de documentatie naar ’linespec’. Gebruik dit voor het plotten

van de volgende functies.

(a) Plot de functie:   f (t) = 3cos(2πt), voor 0 ≤   t ≤  6π. Gebruik eenzwart, gestreepte lijn met lijndikte 2 pt.

(b) Plot de functie:   y(x) = −x2 + 4x + 3, voor −5 ≤  x ≤   5. Gebruikeen groene, getrokken lijn met lijndikte 2 pt.

(c) Plot, in dezelfde figuur als (b), de functie:   y(x) = −x2 + 4x + 3voor   x = [-5:0.5:5]. Gebruik alleen markers: vierkant, grootte

12, blauw ingekleurd.2. Bij het modelleren van ingewikkelde systemen gebruiken we vaak de

kleine hoek benadering om het systeem te versimpelen. Met de kleinehoek benadering bedoelen we sin(x) ≈ x  voor kleine waarden van  x  enx  in radialen (denk aan Optics 1). In deze opgave gaan we na hoe goeddeze benadering is.

(a) Plot, in een figuur, de functies  y1 =  x  en  y2 = sin(x) op het domein0 ≤  x ≤  π/2. Gebruik verschillende kleuren voor de functies. Ge-bruik de commando   grid   on om een raster zichtbaar te maken.

(b) Open een nieuw figuur en plot het verschil tussen de twee functies.

(c) Druk het verschil (dus de afwijking) uit in percentage van de functiesin(x), en plot deze relatieve afwijking.

(d) Lees af tot welke hoek de relatieve fout kleiner is dan 5%. Hoe grootis deze hoek in graden?

3. Een experiment is uitgevoerd waarbij de uitrekking van een veer is geme-ten ten gevolge van het ophangen van een massa aan de veer. De resul-taten van deze meting staan weergeven in onderstaand tabel.

massa (kg) 0.050 0.100 0.150 0.200 0.250 0.300 0.350

uitrekking (m) 0.040 0.088 0.136 0.184 0.232 0.282 0.328

(a) Gebruik deze tabel om de uitrekking van de veer als functie vande   zwaartekracht   te plotten. Omdat dit experimentele data is,gebruik je GEEN lijn door de punten, je gebruikt Markers. Kiesgeschikte markers, grootte van de markers, en zorg dat ze een kleurhebben.

Page 29: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 29/71

26   CHAPTER 2. BLOK 1

(b) Voor een ideale veer geldt de wet van Hooke, deze zegt dat de krachtrecht evenredig is met de uitwijking. In formulevorm:   F   =   kx,waarbij  k  de veerconstante wordt genoemd. Wat is de eenheid vank?

(c) Je gaat nu de waarde van de veerconstante bepalen. Hiervoor ga je

proberen om een rechte lijn door de experimentele data te fitten. Ditis een zeer vaak gebruikte methode om informatie uit experimenteledata te halen. Voor het fitten ga je naar het tabblad   Tools   inhet figuurvenster waar je je experimentele data geplot hebt. Ergensonderaan zie je   Basic Fitting  staan, klik hierop. Genereer eenlineaire fit door je data (vink het vakje   show equations aan). Watis de waarde van de veerconstante?

4. Bij mechanica leer je dat, wanneer je een voorwerp met massa   m   kg,wegschiet onder een hoek  θ  en met beginsnelheid  v0, deze een pad volgtdie beschreven wordt door de volgende vergelijkingen.

x(t) = vx,0t + x0

y(t) = −mg

2  t2 + vy,0t + y0

Hierbij zijn x0 en  y0 de horizontale en verticale coordinaten van de start-positie, wij zullen hier aannemen dat deze gelijk zijn aan  x0   =  y0   = 0.En  vx,0  en  vy,0  zijn de horizontale en verticale componenten van de be-ginsnelheid.

(a) Plot het pad dat een voorwerp met massa 0.1 kg aflegt, wanneer dezeonder een hoek van 45 graden met een beginsnelheid van 20 m/s

wordt weggeschoten. Bekijk de hoogte die dit voorwerp behaalt, ende horizontale afstand die afgelegd wordt.

(b) Afhankelijk van je tijd as zal het voorwerp onder de y  = 0 lijn komen.Dit willen we natuurlijk niet zien. Om alleen positieve waarden opde y-as te verkrijgen, kun je het commando   ylim   gebruiken. Zoekin de documentatie hoe deze commando gebruikt dient te worden enpas het toe op je plot.

(c) Varieer nu de hoek waaronder dit voorwerp afgeschoten wordt van10 graden tot 80 graden (in stappen van 10 graden) en plot al dezepaden in dezelfde figuur.

Page 30: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 30/71

2.3. WERKEN MET MATLAB BESTANDEN (M-FILES)   27

Opgave 2.2 Deze opgave dient door de docent afgetekend te worden.

Plot de volgende functies voor   x   = [0, 2π] in 1 figuur. Maak gebruik vansubplots. Organiseer het zodat je 3 rijen en 2 kolommen krijgt. Zet de functiesy1, y2, y3  onder elkaar in de linker kolom, en  y4, y5, y6  in de rechter. Zorg voor

geschikte assen labels.

y1(x) = e−x

y2(x) = cos(6πx)

y3(x) = e−x cos(6πx)

y4(x) = ex

y5(x) = sin(3πx)

y6(x) = ex sin(3πx)

2.3 Werken met Matlab bestanden (m-files)

Tot nu toe hebben we interactief met Matlab gewerkt door alle commando’s in deCommand Window in te voeren. Waarschijnlijk heb je gemerkt bij het maken vanfiguren dat dit niet erg handig is. Zodra je bijvoorbeeld de x-as verandert, moeten alleopvolgende commando’s opnieuw uitgevoerd worden. Het gebruik van de CommandWindow is prima voor simpele berekeningen. Zodra het aantal commando’s die je wiltuitvoeren wat groter wordt, is het werken in de Command Window niet meer aan teraden. In plaats daarvan werken we met Matlab bestanden, zogenaamde m-files (we

noemen dit ook wel   Programma’s ).Er zijn twee soorten Matlab bestanden. De eerste is een   script   bestand. Een

script bestand is eigenlijk simpelweg een manier om de Command Window niet tehoeven gebruiken. In een script kun je allerlei commando’s plaatsen die je anders in deCommand Window, een voor een zou typen. De script kun je uitvoeren (Eng: runnen)waardoor alle commando’s op volgorde (van boven naar onder) worden uitgevoerd. Eenscript maakt het wijzigen en aanpassen van commando’s gemakkelijker, want je hoeftna een wijziging niet alle volgende commando’s opnieuw in te typen.

Het tweede type m-file is een   function   bestand. Matlab kent al heel veel func-ties, waar je veel mee kunt doen. Tot nu toe heb je er al een aantal van gebruikt.Soms wil je echter iets doen waar Matlab zelf geen functie voor heeft. We kunnen dan

onze eigen functie definieren in een function bestand. Deze zelfgedefinieerde functieszijn cruciaal bij het programmeren. Function bestanden worden voornamelijk gebruiktbij grote programma’s. Wanneer je een groot programma schrijft, die waarschijnlijkveel verschillende taken uitvoert, dan is het verstandig om de verschillende taken opte breken in veel kleine taken. Zo’n kleine taak kan efficient in een function bestandgeprogrammeerd worden. Zo blijft de code overzichtelijk, zowel voor jezelf als vooreen ander die eventueel aan jouw code gaat werken. We gaan dieper in op functionbestanden in het volgende hoofdstuk.

Page 31: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 31/71

28   CHAPTER 2. BLOK 1

We gaan nu starten met de eerste type Matlab bestand, de zogenaamde script m-file. We starten een nieuwe script door op   File → New → Script  te klikken. Je krijgteen nieuw venster te zien, dit is de  Matlab editor. De standaard naam van een nieuwem-file is   untitled. Het is van belang je m-file op te slaan onder een zinvolle naam.

De regels voor een geldige bestandsnaam zijn dezelfde als voor een variabele, namelijk:

1. De naam moet met een letter beginnen. De rest van de naam mag bestaan uitletters, getallen en underscores. Gebruik absoluut geen spaties.

2. Maximale aantal karakters van een bestandsnaam is 63.

3. Matlab maakt onderscheid in hoofd -en kleine letters.

4. De naam mag niet hetzelfde zijn als een naam die Matlab al intern kent.

5. De naam mag niet hetzelfde zijn als een variabelenaam die in de script wordtgedefinieerd.

Runnen van een script

In het script hieronder maken we een array voor de x-as van 0 tot 2π in stapjes van 0.01.Vervolgens worden de sinus en cosinus op dit bereik berekend. Tenslotte wordt er eenfiguurvenster geopend en de functies worden geplot. Uiteraard worden er assen-labelsgeplaatst.

1   x = [0:0.01:10*pi];

2

3   y1 = sin(x);

4

  y2 = cos(x);5

6   figure(1)

7   plot(x,y1,'b')

8   hold   on

9   plot(x,y2,'r')

10   xlabel('x')

11   ylabel('y')

12   title('plot van een sinus en een cosinus')

Het valt je misschien op dat de Matlab editor kleuren gebruikt om verschillende typevariabelen aan te geven. Zo worden strings (variabelen die tekst representeren) metpaars aangegeven. We zullen gaandeweg nog meer kleuren tegen komen. Bovendienworden de regels genummerd. Dit is handig wanneer Matlab een foutmelding geeft,want vaak kan er dan naar een specifieke regelnummer gerefereerd worden.

We runnen dit script door in de toolbar van de editor op te klikken. (Anderemanieren om een script te runnen zijn door middel van de sneltoets F5, of door denaam van het script in de Command Window te typen). Na het runnen verschijnt deplot, en alle variabelen die in de script gedefinieerd worden, zijn te zien in deWorkspace. Het voordeel van een script is dat we nu gemakkelijk wijzigingen kunnen

Page 32: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 32/71

2.3. WERKEN MET MATLAB BESTANDEN (M-FILES)   29

aanbrengen zonder alles opnieuw te hoeven intypen. Stel bijvoorbeeld dat we het bereikvan de x-as willen vergroten van 2π  naar 10π. Dit kan gemakkelijk door deze wijzigingin de eerste regel door te voeren, en het script dan opslaan en vervolgens opnieuwte runnen. Als we dit in de Command Window zouden willen doen, dan zouden allecommando’s opnieuw geevalueerd moeten worden.

Oefening 2.8 Basis m-files: scripts

1. Neem bovenstaande script over en run deze.

2. Verander de  x-as zodat deze van −5π  tot 5π  loopt.

3. Breidt het script uit zodat je ook de functie sin(x) cos(x) in dezelfdefiguur plot. Geeft deze de kleur magenta, en kies een gestreepte lijnstijl.

4. Voeg nu ook een legenda toe.

Commentaar toevoegen

Een script zoals hierboven bevat relatief weinig commando’s en variabelen. Hierdooris de werking ervan simpel te begrijpen. Dit zal echter niet meer het geval zijn bijeen script met veel commando’s en variabelen. Het is vaak zelfs zo dat als je zelf een groot script geschreven hebt, en daar dan na een maand terugkijkt, dat je danniet meer weet hoe alles in elkaar steekt. Vandaar dat het gebruik van toelichting (of commentaar) bij een programma erg belangrijk is. In de Matlab editor geven we aandat iets commentaar is door het achter een procent teken (%) te typen. De tekst kleurtdan automatisch groen. Matlab weet dan dat dit geen commando’s zijn die uitgevoerddienen te worden, maar simpelweg tekst is die het programma uitlegt. Bij het runnenvan een script wordt het commentaar dus compleet genegeerd. In het script hieronderis hetzelfde programma te zien als eerder, nu echter met toevoeging van commentaar.

1   % programma plot sin cos: plot een sinus en een cosinus

2   % Edip Can: 12-10-2014

3

4   clear   all   %delete workspace

5   close   all   %delete alle figuurvensters die mogelijk openstaan

6   clc   %clear command window (maak scherm schoon)

7   %creeer een array met x-waarden waar de functies geevalueerd

8   %worden9   x = [0:0.01:2*pi];

10   %bereken de sinus en cosinus waarden

11   y1 = sin(x);

12   y2 = cos(x);

13

14   %plot de functies

15   figure(1)   %open een nieuw figuurvenster

16   plot(x,y1,'b')

Page 33: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 33/71

30   CHAPTER 2. BLOK 1

17   hold   on

18   plot(x,y2,'r')

19   xlabel('x')

20   ylabel('y')

21   title('plot van een sinus en een cosinus')

Je ziet in dit voorbeeld dat commentaar zowel apart op een regel, als achter een com-mando geplaats kan worden. Misschien is het je ook op gevallen dat er drie extracommando’s aan het begin zijn geplaatst. Deze zijn niet perse noodzakelijk, maar hetis wel handig om scripts te starten met deze drie commando’s. Vooral de   clear   ...

all   commando is belangrijk. Als je de Workspace niet leegmaakt, kan het zijn dat je in het script variabelen gebruikt die al bestaan en een waarde hebben. Dit wil jevermijden want het kan rare/onverwachte/foute resultaten opleveren. In het voorbeeldis tenslotte te zien dat het script begint met een stuk commentaar, waarin de werkingvan dit script kort omschreven wordt, en de auteur en datum gegeven wordt. Het isbelangrijk om een script te voorzien van dit commentaar want het commentaar datvoor de eerste Matlab commando in een script staat wordt in de Command Window

weergegeven wanneer er   help   'bestandsnaam'  getypt wordt.Een aantal stelregels voor het netjes programmeren worden in de volgende opsom-

ming besproken.

1.   Commentaar gedeelte : Begin elk programma (script of function) met commen-taar, met opbouw:

(a) naam van het programma en een korte omschrijving van wat het doet

(b) datum en auteur

(c) alle input en output variabelen (dit geldt voor functions, en we bespreken ditlater)

(d) namen van user-defined functions die aangeroepen worden.

2.   Input gedeelte : in dit gedeelte zorg je ervoor dat alle benodigde parameters (en/of input data) gedefinieerd worden. Dit kan door dit in het script te typen, maarkan ook uit andere bestanden e.d. gehaald worden (wordt later besproken).

3.  Berekeningen gedeelte : Doe dan alle berekeningen.

4.   Output gedeelte : Zet hier alle functies/variabelen of plots die als output gerekendkunnen worden.

OPMERKING: Dit is maar een groffe structuur, maar is wel handig om in je achter-

hoofd te houden. Verder geldt het uiteraard dat er overal   relevante   commentaargeplaatst wordt waar dit nodig is om het programma te begrijpen. Ter illustratie, hi-eronder een voorbeeld. Probeer de werking van het programma te begrijpen door hetcommentaar te bestuderen.

Page 34: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 34/71

2.3. WERKEN MET MATLAB BESTANDEN (M-FILES)   31

1   % Programma ConverteerTemp: Zet temperatuurwaarden in graden

2   % Celsius om in twee andere schalen, namelijk Fahrenheit, en

3   % Kelvin

4   %

5   % Edip Can, 12-10-2014

6   %7   % Input variabele:

8   % T C (in graden Celsius)

9   %

10   % Output variabelen:

11   % T F (in Fahrenheit)

12   % T K (in Kelvin)

13

14   %met een schone lei beginnen

15   clear   all

16   close   all

17   clc

18

19   % Input: de temperatuurwaarden in graden Celsius.

20   T C = [0:0.5:100];

21

22   % Berekeningen.

23   T F = (9/5)*T C + 32;   %omrekenen naar Fahrenheit

24   T K = T C + 273.15;   %omrekenen naar Kelvin

25

26   % Output: plots met T C op de x-as

27   figure(1)

28   subplot(2,1,1)

29   plot(T C,T F,'b',   'linewidth',2)

30   grid   on

31   xlabel('Temperatuur in graden Celsius')32   ylabel('Temperatuur in Fahrenheit')

33

34   subplot(2,1,2)

35   plot(T C,T K,'b',   'linewidth',2)

36   grid   on

37   xlabel('Temperatuur in graden Celsius')

38   ylabel('Temperatuur in graden Kelvin')

2.3.1 Input en Output bij Scripts

Wanneer een script wordt uitgevoerd moeten de variabelen waar berekeningen meegedaan worden een waarde hebben. In bovenstaande voorbeeld zie je dat de tem-peratuur in graden Celsius in het script gedefinieerd wordt (regel 20), waarna alleberekeningen gedaan kunnen worden. In de meeste gevallen zal de input data in eenscriptbestand zelf ingevoerd worden (want dit is meestal het meest efficient). Soms ishet echter nodig om de gebruiker van een programma om input te vragen. Dit kan metde commando  input. Naast het vragen om input, kunnen we ook output printen naarhet scherm (of zelfs naar textbestanden, maar dat behandelen we niet verder). Voor

Page 35: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 35/71

32   CHAPTER 2. BLOK 1

printen naar het scherm zijn er twee commando’s, namelijk   disp  en   fprintf. Dezelaatste commando is iets gecompliceerder in gebruik, maar het geeft je wel veel meercontrole over hoe de output eruit ziet op het scherm. Voor meer informatie hieroverkun je de help functie gebruiken. We illustreren het gebruik hiervan hieronder.

1   % programma gemiddelde 3 cijfers: vraagt de gebruiker om

2   % drie cijfers in te voeren. Hiervan wordt vervolgens het

3   % gemiddelde berekend.

4

5   clear   all

6   clc

7

8   %vraag de gebruiker om drie cijfers in te voeren

9   cijfer 1 = input('Geef het eerste cijfer ');

10   cijfer 2 = input('Geef het tweede cijfer ');

11   cijfer 3 = input('Geef het derde cijfer ');

12

13   %bereken het gemiddelde14   gemiddelde = (cijfer 1 + cijfer 2 + cijfer 3)/3;

15

16   %Twee manieren om het resultaat te printen in de Command

17   %Window

18   disp('het gemiddelde van de drie ingevoerde cijfers is: ')

19   disp(gemiddelde)

20

21   fprintf('het gemiddelde van de drie ingevoerde cijfers is   ...

%6.3f\n', gemiddelde)

Bij het runnen van dit script krijg je het volgende te zien in de Command Window:

Geef het eerste cijfer 4

Geef het tweede cijfer 3

Geef het derde cijfer 5

het gemiddelde van de drie ingevoerde cijfers is:

4

het gemiddelde van de drie ingevoerde cijfers is 4.000

Toelichting op de commando’s

In regel 9 van het script wordt d.m.v. het  input commando de tekst tussen aanhaling-stekens naar de Command Window gestuurd. De gebruiker dient nu in de CommandWindow een getal te geven. Dit getal wordt in de variabele   cijfer 1   opgeslagen.Zodra de gebruiker op ENTER drukt gaat het script verder. Nadat het gemiddeldeberekend is wordt het resultaat naar de Command Window geprint. In regels 18 en 19wordt dit middels de   disp   commando gedaan. Eerst wordt er een stuk tekst geprint(tussen aanhalingstekens), daarna de waarde van de variabele   gemiddelde. In regel 21wordt hetzelfde gedaan, maar nu met de meer geavanceerde   fprintf commando. Ook

Page 36: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 36/71

2.3. WERKEN MET MATLAB BESTANDEN (M-FILES)   33

deze commando kan tekst naar het scherm printen door dit tussen aanhalingstekenste plaatsen. Het procent-teken is de plek waar de waarde van de variabele geplaatstwordt. De toevoeging   6.3f houdt in dat het getal weergegeven wordt met 3 decimalenachter de komma. Voor andere formats, zie help functie. Tenslotte, \n  betekent ’new 

line ’ , oftewel een Enter.

Oefening 2.9 Basis m-files: scriptsSla alle scripts die je gaat schrijven op. Gebruik veelzeggende bestandsnamen.Zorg ervoor dat je de scripts voorziet van voldoende commentaar.

1. Schrijf een script die de discriminant van een kwadratische functie, gegevendoor  y   =  ax2 + bx + c, naar het scherm print. Het script moet de ge-bruiker vragen om de waarden van de coefficienten  a, b en  c  in te voerenin de Command Window. Gebruik voor het printen van de discriminantzowel de   disp  als de   fprintf  commando’s.

2. Breid je script uit zodat de parabool ook geplot wordt. Vergeet niet deassen te voorzien van labels. Maak een raster zichtbaar in de figuur.

Test de werking van je script. Doe dit door waarden voor de coefficientente kiezen waarvoor je direct kunt zien of de plot correct is. Gebruik ookextreme waarden voor de coefficienten. Krijg je altijd een mooie plotwaarin het verloop van de parabool goed zichtbaar is?

3. Als het goed is heb je gezien dat de manier waarop je plot eruit komtte zien nogal afhangt van de waarden van de coefficienten. Dit komtwaarschijnlijk doordat je bij het opstellen van de x-as geen rekeninghebt gehouden met de waarden van de coefficienten. Breid je script uit,

zodanig dat je altijd een mooie parabool te zien krijgt.HINTS: wat is de formule voor de x-coordinaat van het maximum/mini-mum van de parabool? Wat zijn de x-coordinaten van de nulpunten vande parabool (het kan zijn dat jouw parabool niet door de x-as gaat ener dus geen nulpunten zijn.)? Gebruik deze gegevens voor het opstellenvan het domein van de  x-as.

Opgave 2.3 Deze opgave dient door de docent afgetekend te worden.Bij mechanica heb je geleerd dat een voorwerp die weggeschoten wordt ondereen hoek een parabolische baan aflegt. De  x  en  y  coordinaten van deze baanworden beschreven door de volgende formules:

x(t) = vx,0t + x0

y(t) = −g

2t2 + vy,0t + y0

Page 37: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 37/71

34   CHAPTER 2. BLOK 1

Hierbij zijn x0  en  y0  de horizontale en verticale coordinaten van de startposi-tie, wij zullen hier aannemen dat deze gelijk zijn aan  x0 =  y0 = 0. Verder zienwe de valversnelling  g  = 9.8m/s2 en  t  de tijd in seconden, en  vx,0   en  vy,0  zijnde horizontale en verticale componenten van de beginsnelheid. Neem voor demassa m  = 0.1 kg, en beginsnelheid  v0 = 20 m/s.

Schrijf een Matlab script waarin de banen die het voorwerp aflegt berekendworden. Doe die voor hoeken van 10 tot 80 graden in stappen van 10 graden.Plot al deze paden in dezelfde figuur. Zorg dat je figuur goed opgemaakt is(kleuren , legenda, assen e.d.).

Voor welke hoek legt het voorwerp de grootste afstand af in de  x-richting?

2.4 Werken met arrays (Een les)

In de vorige paragraaf hebben we gezien dat meerdere getallen in een variabele kunnenworden gestopt. Deze variabele is dan een  array. Array’s zijn erg belangrijk, omdatdit eigenlijk de basis elementen zijn van Matlab. Het belang van arrays zit al in denaam Matlab, want Matlab is een afkorting voor   Matrix Laboratory , en matrix is eenander woord voor array.

Gezien het feit dat Matlab berust op het gebruik van array’s, gaan we in dezeparagraaf verder in op het definieren, manipuleren en rekenen met array’s. Hiervooris het nodig dat we een aantal basisbegrippen -en concepten betreft matrixrekeningbespreken. Tijdens de wiskunde module mathematics 3 gaan jullie dieper in op detheorie van de matrixrekening.

2.4.1 1D en 2D arrays

Definitie en notatie

Een array is een collectie van getallen die geordend zijn in rijen en/of kolommen. Eenarray met  m  rijen en  n  kolommen noteren we met  m × n. We zeggen dan dat we hethebben over een  m  bij  n  array. Afhankelijk van de dimensies van een array gebruikenwe verschillende benamingen, zie tabel 2.9.

dimensies benaming

1 × 1 scalar (simpelweg een getal)1 × n   rijvector met lengte nm × 1 kolomvector met lengte  mm × n   een m  bij  n  matrix

Tabel 2.9:   benaming voor arrays afhankelijk van de dimensies

Page 38: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 38/71

2.4. WERKEN MET ARRAYS (E EN LES)   35

Invoeren van 1D-array’s (vectoren)

Arrays kunnen in Matlab gedefinieerd worden door getallen tussen rechte haakjes teplaatsen. Zo maken we een rijvector bijvoorbeeld door:

>>   rijvector = [ 1 3 5 7 9]rijvector =

1 3 5 7 9

Een array heeft niet alleen maar waardes, maar ook iets wat een index genoemd wordt.Het eerste element van een array heeft index = 1. Daarna loopt het op in stapjes van1. Schematisch staat de rijvector weergegeven in figuur 2.10

Figuur 2.10:   Schematische weergave van een rijvector. Een array heeft altijd een index diebegint bij 1.

Een kolomvector kunnen we maken door de getallen te scheiden met een punt-komma teken. Een tweede manier is door een rijvector te   transponeren , de operatorhiervoor is het accent teken.

>>   kolomvector = [2;4;6;8;10]kolomvector =

2

4

6

8

10

>>   kolomvector1 = rijvector'

kolomvector1 =

13

5

7

9

Heel vaak zul je vectoren nodig hebben die bestaan uit getallen met vaste stappenertussen. We hebben dit bij het plotten al gezien. Hier nogmaals de manieren om zulkevectoren te maken.

Page 39: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 39/71

36   CHAPTER 2. BLOK 1

>>   x = [0:0.01:100];%van 0 t/m 100 in stapjes van 0.01

>>   y = linspace(0,100,10000);   %van 0 t/m 100 in 10000 stappen

Het selecteren van stukjes uit een 1D-array

Wanneer we een array gemaakt hebben, kunnen we ook weer de afzonderdelijk el-ementen, of zelfs gedeeltes van een array selecteren. De waarde van een specifiekeelement van een array kan opgevraagd worden door de index tussen haakjes te zetten.Bijvoobeeld, de waarde van het tweede element van de array met de naam ’rijvector’vragen we op door het volgende in te typen:

>>   rijvector(2)

ans =

3

Je ziet dat het antwoord in de standaard variabele   ans   wordt geplaatst. We kunnenuiteraard de waarde ook toekennen aan zelfgedefinieerde variabelenamen. Wanneer wemeerdere elementen uit een array willen halen, kunnen we de index van de elemententussen rechte haken stoppen. Om bijvoorbeeld het eerste, derde en vijfde element uitde rijvector te halen doen we:

>>   rijvector([1,3,5])

ans =

1 5 9

Soms wil je gedeeltes uit een array halen en die in een nieuwe array stoppen. Dit doen

we gebruik makend van het dubbele-punt teken (:). In het volgende voorbeeld halenwe de eerste 3 elementen uit de rijvector.

%(1:3) betekent: index 1 t/m 3 in stapjes van 1

>>   rijvector(1:3)

ans =

1 3 5

De derde tot en met de laatste element kunnen we op de volgende manier eruit halen,waar we gebruik maken van het gereserveerde woord   end:

>>   rijvector(3:end)ans =

5 7 9

%de laatste drie elementen kan ook door:

>>   rijvector(end-2:end)

ans =

5 7 9

Page 40: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 40/71

2.4. WERKEN MET ARRAYS (E EN LES)   37

Oefening 2.10 1D arrays maken en selecteren van delen.In deze oefenopgaven ga je verschillende rij -en kolomvectoren maken. Daarnawordt je gevraagd om enkele selecties uit deze vectoren te maken. Doe dit ineen m-file (script).

1. Maak een rijvector met de waarden (1 , 7 , 3 ,−4 , 9 , 18). Geef deze vectorde variabelenaam   a

2. Maak een kolomvector met de waarden (2 ,−5 , 6 , 24 ,−29 ,−10). Geef deze vector de variabelenaam   b

3. Maak een rijvector dat bestaat uit 500 elementen waarvan het eersteelement 0 is en het laaste element 5. Geef deze vector de variabelenaamc.

4. Maak een kolomvector waarvan het eerste element 10 is, het laaste ele-ment 70 en de stapjes tussen de elementen 0.5 is. Geef deze vector devariabelenaam   d.

5. Selecteer de volgende delen van de vectoren en geef ze zelf een naam.

(a) Element 3 van vector   a

(b) Element 5 van vector  b

(c) Elementen 1 tot en met 3 van vector   a

(d) Elementen 4 tot en met 6 van vector   a

(e) Elementen 1 en 2 van vector   b

(f) Elementen 4 tot en met 6 van vector   b

(g) Elementen 1, 3 en 5 vector   a

(h) Elementen 2, 4 en 6 vector   b

(i) De eerste 100 elementen van  c

(j) De laatste 100 elementen van   c

(k) De laatste 100 elementen van c, behalve de laatste twee elementen.

(l) De elementen van   d met een even getal als index.

(m) De elementen van   c waarvan de index een veelvoud van 10 is.

Invoeren van 2D-arrays (matrices)

Matrices bestaan uit meerdere rijen en kolommen. Er zijn verschillende manieren omeen matrix te maken in Matlab. De meest simpele manier is om alle elementen hand-matig in te voeren, waarbij   de rijen gescheiden worden met het punt-kommateken. In het volgende voorbeeld maken we de volgende matrix met drie rijen en drie

Page 41: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 41/71

38   CHAPTER 2. BLOK 1

kolommen.

A =

1 2 3

4 5 67 8 9

We zeggen ook wel: 3 bij 3 matrix en noteren dit met 3

×3 matrix. Matrices worden

vaak weergegeven met dikgedrukte letters. Hieronder zie je hoe deze matrix in Matlabgedefinieerd wordt.

>>   A = [1 2 3 ; 4 5 6; 7 8 9 ]

A =

1 2 3

4 5 6

7 8 9

Speciale matrices

Net zoals er speciale manieren zijn om snel grote vectoren te maken, zijn er commando’som grote matrices te maken, die vaak handig kunnen zijn. In tabel 2.10 geeft een kortlijstje met commando’s voor enkele speciale matrices.

commando uitleg

ones(m,n)   genereert een  m × n  matrix waarvan alle elementen de waarde 1hebben.

zeros(m,n)   genereert een  m × n  matrix waarvan alle elementen de waarde 0hebben.

eye(m,n)   genereert een m×n matrix waarvan de elementen op de diagonaalde waarde 1 hebben en alle andere elementen de waarde 0.

Tabel 2.10:  Een aantal commando’s waarmee speciale matrices snel gemaakt kunnen worden.

Selecteren van stukjes uit een matrix

Matrices krijgen ook een index mee, maar omdat er nu zowel meerdere rijen als kolom-men zijn, zijn er twee indices nodig om de positie van een element weer te geven. Ziefiguur 2.11 voor een schematische weergave hiervan. De eerste index geeft de rij weer,

de tweede geeft de kolom weer. Dus het element in bovenstaande matrix in de tweederij en de derde kolom noteren we met   A23   = 6. Net zoals bij vectoren, kan ook bijmatrices gedeeltes eruit geselecteerd worden. We maken hier wederom gebruik van deindices, de dubbele punt operator en het gereserveerde woord   end. Om het elementvan de matrix  A  in de derde rij, tweede kolom te selecteren typen we  >>   A(3,2).   De 

eerste index is altijd de rij, de tweede index is de kolom . Met de (:) operator kunnenwe delen van een matrix selecteren. Zie hieronder voor een aantal voorbeelden, typede commando’s zelf in om het resultaat te bekijken.

Page 42: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 42/71

2.4. WERKEN MET ARRAYS (E EN LES)   39

Figuur 2.11:   Opbouw van een matrix. Omdat een matrix zowel rijen als kolommen heeft,krijgt het in Matlab 2 indices mee. De eerste geeft de rij aan, de tweede de kolom.

>>   A(1:2, 1:3)   %rijen 1 t/m 2 en kolommen 1 t/m 3

>>   A(:, 2:3)   %alle rijen, kolommen 2 t/m 3

>>   A(:,3)   %alle rijen, derde kolom

>>   A(2,:)   %tweede rij, alle kolommen

>>   A(3,2:end)   %derde rij, kolommen 2 t/m de laatste

>>   A(:,1:end-1)   %alle rijen, kolommen 1 t/m een-na-laatste

>>   A([1,3],[2,3])   %rij 1 en 3, kolom 2 en 3

Wanneer je een matrix gemaakt hebt, kun je deze vervolgens altijd nog aanpassen. Jezou er bijvoorbeeld een rij of kolom aan kunnen toevoegen of juist deleten. Ook hier-voor is het : -teken van belang. Zie het volgende voorbeeld.

%Stel we maken een (2x5) matrix

>>   B = [1 2 3 5 6; 21 6 7 4 1 0]

B =

1 2 3 5 6

21 6 7 4 10

%Om een zesde kolom toe te voegen aan B

>>   B(:,6) = [11 ;22]

B =

1 2 3 5 6 11

21 6 7 4 10 22

%Om vervolgens een derde rij toe te voegen

>>   B ( 3 , : ) = [ 1 2 3 4 5 6 ]

B =

1 2 3 5 6 11

21 6 7 4 10 22

1 2 3 4 5 6

Page 43: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 43/71

40   CHAPTER 2. BLOK 1

%Bij nader inzien, willen we de derde rij toch maar niet. In ...

onderstaande commando betekent [] een lege array

>>   B(3,:) = []

B =

1 2 3 5 6 11

21 6 7 4 10 22

Oefening 2.11 Matrices maken en selecteren van delen hiervan.In deze oefening wordt je gevraagd om een aantal matrices te maken. Daar-naast ga je enkele selecties uit deze matrices definieren. Werk in een m-file.

1. Maak de matrix

A =

2 4 10 320 5 9   −2−11 0.5 17 2115 12

  −7 31

2. (a) Maak een 10 × 5 matrix gevuld met enen.

(b) Maak een 5× 10 matrix waarbij alle elementen de waarde 4 hebben.

(c) Maak een 20 × 20 matrix met enen op de diagonaal.

3. Hieronder wordt met een rechthoekje een selectie aangegeven uit matrixA  die je in opg (1) gemaakt hebt. Maak deze selecties en wijs deze toeaan variabelen.

4. (a) Voeg een rij toe aan  A. Bedenk zelf de waarden.

(b) Voeg vervolgens een kolom toe aan A. Bedenk zelf de waarden.

(c) Delete de derde kolom van  A.

Figuur 2.12:  Behorend bij opgave (4). Selecties uit matrix  A  die je moet maken.

Page 44: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 44/71

2.4. WERKEN MET ARRAYS (E EN LES)   41

Figuur 2.13:  Overzicht van concatenatie van matrices

Matrices aan elkaar plakken

Matrices kunnen ook aan elkaar geplakt worden om grotere matrices te maken, ditproces wordt concatenatie  genoemd. Bij het concateneren moet er goed opgelet wordenop de dimensies van de matrices. Figuur 2.13 geeft schematisch weer hoe matricesgecombineerd kunnen worden.

 

Voor horizontaal concateneren moeten de twee matrices dezelfde hoeveelheid rijen

hebben.

  Voor verticaal concateneren moeten de twee matrices dezelfde hoeveelheid kol-lomen hebben.

Hieronder worden twee voorbeelden gegeven van matrix concatenatie.

%drie rijvectoren maken

>>   b1 = [1 2 3];   %rijvector 1

>>   b2 = [4 5 6];   %rijvector 2

>>   b3 = [7 8 9];   %rijvector 3

%vectoren onder elkaar plaatsen. met de ; ga je naar de ...

volgende rij in de matrix>>   B = [ b 1 ; b 2 ; b 3 ]

B =

1 2 3

4 5 6

7 8 9

%drie kolomvectoren maken.

>>   c1 = [ 1;2;3];   %kolomvector 1

Page 45: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 45/71

42   CHAPTER 2. BLOK 1

>>   c2 = [4;5;6];   %kolomvector 2

>>   c3 = [7;8;9];   %kolomvector 3

%vectoren naast elkaar plaatsen. met een spatie (of komma) ga ...

je naar de volgende kolom.

>>   C = [c1 c2 c3]

C =

1 4 72 5 8

3 6 9

%matrix a = (3x4)

>>   a = [ 1 2 3 4 ; 5 6 7 8 ; 9 1 0 1 1 1 2 ]

a =

1 2 3 4

5 6 7 8

9 10 11 12

%matrix b is (3x2)>>   b = [-1 -2; -3 -4; -5 -6]

b =

-1 -2

-3 -4

-5 -6

%matrix c is (2x4)

>>   c = [12 13 14 15; 161 7 18 19]

c =

12 13 14 15

161 7 18 19

%matrix A bestaat uit matrices a en b naast elkaar. Dimensies ...

(3x6) = (3x4) en (3x2)

>>   A = [ a b ]

A =

1 2 3 4 -1 -2

5 6 7 8 -3 -4

9 10 11 12 -5 -6

%matrix B bestaat uit matrices a en c onder elkaar. Dimensies ...

(5x4) = (3x4) en (2x4)

>>   B = [ a ; c ]

B =

1 2 3 4

5 6 7 8

9 10 11 12

12 13 14 15161 7 18 19

%matrix C is a en c naast elkaar. (3x4) en (2x4). Dit kan ...

niet. Matlab geeft de foutmelding dat dimensies niet ...

consistent zijn.

>>   C = [ a c ]

Error using horzcat

Dimensions of matrices being concatenated

are not consistent.

Page 46: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 46/71

2.4. WERKEN MET ARRAYS (E EN LES)   43

2.4.2 Bewerkingen met arrays

Naast het creeren van vectoren en matrices willen we graag bewerkingen kunnen uitvo-eren op matrices, zoals optellen en vermenigvuldigen. Het rekenen met vectoren enmatrices is onderwerp van mathematics 30 (wordt ook wel lineaire algebra genoemd).Hier gaan we enkel de operaties behandelen die we nu nodig zullen hebben.

Optellen, aftrekken en vermenigvuldigen met een scalar

Stel we hebben twee matrices, we nemen voor het gemak 3 × 3 matrices.

A =

a11   a12   a13

a21   a22   a23a31   a32   a33

  B =

b11   b12   b13

b21   b22   b23b31   b32   b33

De som (het verschil) van deze twee matrices   wordt gedefinieerd door het ele-mentsgewijs optellen (aftrekken). Het resultaat is dus een matrix met  dezelfde

dimensies.

A + B =

a11 + b11   a12 + b12   a13 + b13

a21 + b21   a22 + b22   a23 + b23a31 + b31   a32 + b32   a33 + b33

A − B =

a11 − b11   a12 − b12   a13 − b13

a21 − b21   a22 − b22   a23 − b23a31 − b31   a32 − b32   a33 − b33

Uit bovenstaande definitie volgt meteen dat   het alleen mogelijk is om matricesbij elkaar op tellen als de matrices dezelfde dimensies hebben

Vermenigvuldigen van een matrix met een getal (scalar) gebeurd ook elements-gewijs. Dus

cA =

c a11   c a12   c a13

c a21   c a22   c a23c a31   c a32   c a33

In Matlab kunnen bovenstaande bewerkingen uitgevoerd worden met de normale op-eratoren + ,− , ∗. Het voorbeeld hieronder illustreert dit.

Page 47: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 47/71

44   CHAPTER 2. BLOK 1

A =

1 2 3

4 5 6

7 8 9

>>   B

B =

3 5 1

2 4 6

10 1 4

>>   A+B

ans =

4 7 4

6 9 12

17 9 13

>>   2*A

ans =

2 4 6

8 10 12

14 16 18

Wanneer we een rijvector bij een kolomvector proberen op te tellen geeft Matlab

aan dit niet kan omdat de dimensies niet overeenkomen.

>>   a = [ 1 2 3 ]

a =

1 2 3

>>   b = [4;5;6]

b =

45

6

>>   a + b

??? Error using ==>   plus

Matrix dimensions must agree.

Page 48: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 48/71

2.4. WERKEN MET ARRAYS (E EN LES)   45

vermenigvuldigen van twee matrices: het commando   .*

Het vermenigvuldigen van twee matrices kan op twee manieren worden opgevat. Eenvan deze manieren is het centrale thema van de module mathematics 3. Vooralsnogzullen we onder het vermenigvuldigen van twee matrices verstaan:   het elements-gewijs   vermenigvuldigen. Dus:

A ×B =

a11 b11   a12 b12   a13 b13

a21 b21   a22 b22   a23 b23a31 b31   a32 b32   a33 b33

Om elementsgewijs twee matrices met elkaar te vermenigvuldigen is het dus noodza-kelijk dat beide dezelfde dimensies hebben. Het resultaat is weer een matrix metdezelfde dimensies. In Matlab wordt elementsgewijs vermenigvuldigen gedaan door decommando  .*, dus door een punt voor het keer-teken.  Het is zeer belangrijk dat depunt gebruikt wordt in deze module. Als dit vergeten wordt kun je rekenenop veel foutmeldingen en rare resultaten.  In tabel 2.11 is een overzicht gegevenvan de wiskundige operatoren die we in deze module gebruiken voor matrixbewerkingen.

operator uitleg

.∗   elementsgewijs vermenigvuldigen van twee matrices

./   elementsgewijs delen van twee matrices

.ˆ elementsgewijs tot de macht verheffen.

Tabel 2.11:   Operatoren behorende bij arrays.

Hieronder nog een voorbeeld van vermenigvuldigen, delen en tot de macht verheffenvan matrices in Matlab.

>>   A = [1 2 ; 4 5 ]

A =

1 2

4 5

>>   B = [3 5 ; 2 4 ]

B =

3 52 4

>>   A.*B

ans =

3 10

8 20

Page 49: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 49/71

46   CHAPTER 2. BLOK 1

>>   A./B

ans =

0.3333 0.4000

2.0000 1.2500

>>   A.ˆ2

ans =

1 4

16 25

Wiskundige functies en arrays

Bij het bespreken van de plotcommando’s is al naar voren gekomen dat arrays als inputmeegegeven kunnen worden aan wiskundige functies (voorbeeld   sin(x), waarbij  x een1D array is). Dit maakt het plotten van functies erg gemakkelijk. Nu we arrays ookelementsgewijs tot de macht kunnen verheffen, is het ook mogelijk om polynomen temaken. (Polynomen zijn functies van de vorm   y   =   a0  + a1x +  a2x2 + a3x3 + · · · ,waarbij de  a’s constanten zijn). Bij het berekenen van wiskundige functies moeten wein de gaten houden dat we de juiste Matlab commando’s gebruiken. In het volgendevoorbeeld berekenen we de functie  y  =  e−xx2 cos(2πx).

>>   x = linspace(0,10,1000);

>>   y = exp(-x).*x.ˆ2.*cos(2*pi*x);

>>   plot(x,y)

Het gebruik van punten in de tweede regel is nodig omdat   x een array is met 1000 ele-menten. Dus de functies cos(2*pi*x),  x.ˆ2 en  exp(-x) leveren allen een array op metieders 1000 elementen. Om deze op een juiste manier met elkaar te vermenigvuldigenmoeten we dus elementsgewijs vermenigvuldigen, vandaar het gebruik van   .*  en  nietsimpelweg   *.

Handige functies te gebruiken bij arrays

Sommige bewerkingen op arrays komen zo vaak voor dat er aparte functies voor on-twikkeld zijn. In tabel 2.12 staan een aantal veelgebruikte commandos met een korte

uitleg. Alle commando’s in de tabel accepteren zowel 1D als 2D arrays. De werk-ing van de functies echter kan iets verschillen afhankelijk van de input. Zoek op decommandonaam in de documentatie voor uitgebreidere uitleg.

Oefening 2.12 Elementsgewijze bewerkingen op 1D en 2D arraysWerk de volgende oefeningen uit in een of meerdere m-files (scripts).

Page 50: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 50/71

2.4. WERKEN MET ARRAYS (E EN LES)   47

commando uitleg

length(x)   geeft het aantal elementen van de 1D-array  x

size(A)   geeft de dimensies van de array  A.

max(x)   geeft de grootste waarde die voorkomt in   x

min(x)   geeft de kleinste waarde die voorkomt in   x

sum(x)   geeft de som van alle elementen van   xprod(x)   geeft het product van alle elementen van   x

fliplr(x)   keert de elementen van een rijvector om.flipud(x)   keert de elementen van een kolomvector om.

Tabel 2.12:  Een aantal handige functies die als input een array accepteren. In de tabel wordtx  gebruikt om een 1D array en  A een 2D array weer te geven

Begin met het maken de volgende matrices

A =

  2 51 4

  B =

  10 20 30−5 0 5

C =

  3   −2−7 6

  D =

−9 1−1   −43 6

1. Neem voor deze opgave de matrix B.

(a) Vraag Matlab het aantal rijen op. HINT: bestudeer de documentatiebij de commando   size.

(b) Vraag Matlab het aantal kolommen op.(c) Vraag Matlab het aantal rijen en kolommen op.

(d) Bepaal de grootste waarde van elk kolom.

(e) Bepaal de grootste waarde van alle elementen van de matrix.

(f) Bepaal de kleinste waarde van alle elementen van de matrix.

2. Concateneer indien mogelijk

(a)   A  en  B

(b)   A  en  C

(c)   A  en  D(d)   B  en  D

(e)   B  en  C

Page 51: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 51/71

48   CHAPTER 2. BLOK 1

3. Bereken de volgende uitdrukkingen, waarbij overal elementsgewijze op-eraties bedoeld worden. Als de opgave niet mogelijk is, leg uit waaromhet onmogelijk is.

(a)   A + B

(b)   A + C(c)   B − D

(d)   B + D

(e)   C2

(f) −2B

(g)   A3 − 15C

4. Voer de volgende bewerkingen uit. Raadpleeg zonodig de helpfunctievoor extra informatie over de te gebruiken commando’s

(a) Keer de kolommen van  A  om(b) Keer de rijen van B  om

(c) Bereken de som van de rijen van B

(d) Bereken de som van alle elementen van D

(e) Bereken de som van de kolommen van D

(f) Bereken het product van de rijen van C

(g) Bereken het product van alle elementen van  C

5. Plot de volgende wiskundige functies, in een figuur, op het domein 1 ≤x

≤5

(a)   y  =  x2

(b)   y  =  x2 cos(x)

(c)   y  =  e−0.3xx2 cos(x)

(d)   y  = e−0.3xx2 cos(x)

0.1√ 

x3

(e)   y  = ln

x5

e−0.3xx2 cos(x)

0.1√ 

x3

Page 52: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 52/71

2.4. WERKEN MET ARRAYS (E EN LES)   49

Opgave 2.4 Deze opgave dient door de docent afgetekend te worden.In figuur 2.14 zie je een sudoku puzzel. Het is jouw taak om een script teschrijven waarin gecontrolleerd wordt of deze oplossing aan alle regels voldoet.De regels zijn:

  De som van elke goede rij is 45 en het product is 362880

  De som van elke goede kolom is 45 en het product is 362880

  De som van elk van de negen goede vierkanten is 45 en het product is362880

Op blackboard is een   sudoku.mat   bestand beschikbaar die je kunt inladen(load   commando). Dit bestand bevat een 8 × 8 matrix. Voeg hier zelf delinker kolom en de onderste rij aan toe. Gebruik dan de commando’s   sum enprod  voor het controlleren of aan de regels voldaan is.

Maak zonodig de sudoku kloppend.

Figuur 2.14:  Is dit een correcte sudoku oplossing?

Page 53: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 53/71

3Programmeren in Matlab (vier of vijf lessen)

Inleiding

In het vorige hoofdstuk hebben we gewerkt met zogenaamde script m-files. Een script iseigenlijk simpelweg een set van commando’s die achter elkaar uitgevoerd worden. In dithoofdstuk gaan we verder in op het programmeren met Matlab. Bij programmeren heb

 je vaak te maken met beslissingen die bijvoorbeeld afhangen van voorgaande uitkomstenvan berekeningen. Daarnaast wil je vaak berekeningen herhaaldelijk uitvoeren. Om-dat Matlab ook een programmeertaal is, beschikt het over structuren die dit mogelijkmaken. We beginnen dit hoofdstuk met het tweede soort Matlab bestand, namelijk

Function m-files. Dit soort bestanden zijn handig wanneer een bepaalde berekeningvaak gedaan moet worden. Door een aparte functie voor een dergelijke berekening tedefinieren wordt het programma overzichtelijker en gemakkelijker aan te passen.

3.1 Function m-files

Tot nu toe hebben we veel Matlab functies voorbij zien komen. Een Matlab functieaccepteert een (of meerdere) input en geeft een (of meerdere) outputs. Denk bijvoor-beeld aan de commando   x = linspace(0,1,100). De functie   linspace  accepteertdrie inputs, namelijk een beginwaarde, een eindwaarde en het aantal stapjes. De out-put van deze functie is een array bestaande uit 100 getallen.   Function m-files   zijn

eigen gedefinieerde functies. In het algemeen zullen ze dus input nodig hebben en out-put terug geven. Hieronder is een voorbeeld van een eigen geschreven function te zien.Deze functie geeft als output de discriminant van een kwadratische vergelijking, waarbijde coefficienten als input gegeven worden.

50

Page 54: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 54/71

3.1. FUNCTION M-FILES    51

1   function   D = discriminant(a,b,c)

2   %bereken de discriminant van een kwadratische vergelijking.

3   %door elementsgewijs operatoren te gebruiken (.ˆ en .*)

4   %kunnen ook arrays als input gegeven worden.

5   %input: coefficienten van een kwadratische vergelijking a b

6   %en c7   %output: de waarde van de discriminant bˆ2 - 4ac

8

9   D = b . ˆ 2 - 4*a.*c;

Wat opvalt is de eerste regel. Een function m-file begint met de regel

function   [output variabelen] = functie naam(input variabelen)

MERK OP: de output variabelen worden tussen rechte haakjes geplaatst, tenzij ermaar 1 outputvariabele is, dan mogen de haakjes achterwege blijven. De input vari-abelen staan altijd tussen normale haakjes (ook al is er maar 1 inputvariabele).   De

function m-file moet opgeslagen worden in een bestand met dezelfde naamals de functienaam. Bovenstaand voorbeeld is dus opgeslagen in een bestand metde naam   discriminant.m. Na het opslaan van de function, kan deze gebruikt wordenzoals elke andere Matlab functie.

MERK OP: een functie kun je niet runnen zoals een script. Een functie kan alleenin de Command Window, in een script m-file, of door andere functies aangeroepenworden door de juiste input parameters mee te geven.

Naast het feit dat een function m-file input en output heeft, is het grootste verschilmet een script m-file het feit dat de function m-file een  eigen workspace  heeft. Ditbetekent dat de variabelen die in de function gebruikt worden alleen binnen in de func-tie bekend zijn. Je zult ze dus ook niet in de Workspace vinden. We illustreren dit aande hand van onderstaand voorbeeld.We kunnen de functie   discriminant  aanroepen  vanuit de Command Window (of va-nuit een script m-file). Probeer het volgende maar eens.

>>   discr = discriminant(2,6,1)

discr =

28

Je ziet dat de input variabelen niet de namen   a,b,c  hoeven te hebben. We kunnendirect getallen invoeren, of variabelen met elke willekeurige naam. Het enige dat vanbelang is, zijn de waarden van de variabelen. Deze waarden worden binnen in de functiein de variabelen  a,b,c gezet, maar deze zijn verder niet bekend in de Workspace (checkdit door je Workspace te bekijken na het uitvoeren van het voorbeeld). Ook de outputkunnen we elke willekeurige naam geven, de variabele  D is alleen bekend bij de functie,en niet in de Workspace.

Page 55: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 55/71

52   CHAPTER 3. BLOK 2 

Een voorbeeld van een functie met 1 input en 2 outputs zie je hieronder.

1   function   [omtrek, oppervlak] = cirkel(r)

2   %berekend de omtrek en oppervlak van een cirkel met straal

3   %r.

4   %input : straal r. dit moet een enkele getal zijn5   %output: omtrek en oppervlak

6

7   omtrek = 2*pi*r;

8   oppervlak = pi*rˆ2;

Onderstaand voorbeeld illustreert het gebruik van deze functie.

>>   [O, A] = cirkel(3)

O =

18.8496

A =

28.2743

>>   P = cirkel(3)

P =

18.8496

In de eerste regel zie je hoe we beide outputs terugkrijgen. Als we maar 1 outputdefinieren (tweede aanroep  P = cirkel(3)), zie je dat de eerste output van de functiegenomen wordt, in dit geval dus de omtrek van de cirkel.

Figuur 3.1:  Schematische weergave van rechthoekige (cartesische) en polaire coordinaten

Page 56: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 56/71

3.1. FUNCTION M-FILES    53

Oefening 3.1 oefening met functies

1. (a) Neem de functie   cirkel(r)  uit het voorbeeld over en pas deze zoaan dat de functie ook overweg kan met een array als input.

(b) Schrijf een script m-file waarin je gebruikt maak van de functie die jebij (a) geschreven hebt om de omtrek en oppervlakte van een cirkel:

 

te berekenen voor een straal van 0 tot en met 10

  in 1 figuur te plotten.

(c) Vanaf welke straal is het oppervlak groter dan de omtrek?

2. Schrijf een Matlab functie waarin de volgende wiskundige expressie berek-end wordt:   y(x) =  ex − 5x. De functie moet als input zowel een enkelgetal als een array kunnen accepteren. Test je functie door deze aan teroepen in een script bestand:

(a) voor 3 verschillende getallen. Controlleer de waarde van  y   met jerekenmachine.

(b) voor een getallenrij met waarden van -1 tot 5 in stapjes van 0.1.Maak een plot van deze functie.

3. Een punt in het xy-vlak met coordinaten (x, y) kan ook beschreven wor-den door de afstand  R  van het punt tot de oorsprong en de hoek  θ  metde positieve  x-as, zie figuur 3.1. Deze  R   en  θ  zijn zogenaamde polairecoordinaten. Om van (x, y) naar (R, θ) om te schrijven en andersom,kun je de volgende formules gebruiken.

R = 

x2

+ y2

θ = arctany

x

x =  R cos θ y =  R sin θ

(a) Schrijf een functie die:

  als input de waarden accepteert voor  x  en  y   coordinaten.

 

als output de de bijbehorende R  en  θ  terug geeft. De hoek moetin graden zijn.

Suggestie voor een functienaam:   cartesisch naar polair(x,y).

(b) Schrijf een functie die

  als input waarden accepteert voor   R   en   θ   coordinaten,   θ   ingraden

  als output de bijbehorende  x  en  y  terug geeft.

Suggestie voor een functienaam:  polair naar cartesisch(R,theta).

Page 57: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 57/71

54   CHAPTER 3. BLOK 2 

(c) Het omschrijven van de ene naar een andere coordinatenstelsel komtzo vaak voor dat Matlab hier al functies voor heeft. Deze zijncart2pol(x,y)  en   pol2cart(theta,Rho). Zoek in de helpfunctiehoe deze werken. Vergelijk jouw eigen geschreven functies met deMatlab functies. Probeer getallen in alle vier de kwadranten. Zoek

uit waar jouw functie andere resultaten geeft als de Matlab functies,en probeer te achterhalen wat het verschil is.

4. Schrijf een functie die als input een array met getallen aanneemt enals output het gemiddelde van die getallen geeft. Check dat je functiecorrect werkt door een array in te voeren waarvan je het gemiddeldegemakkelijk kunt berekenen. Bereken vervolgens de gemiddelde van devolgende wiskundige functies. Plot deze functies ook in een figuur.

(a)   y  = cos(x) voor 0 ≤ x ≤ 2π.

(b)   y  = sin(x) voor 0 ≤ x ≤ 2π

(c)   y  = cos2

(x) voor 0 ≤ x ≤ 2π(d)   y  = sin2(x) voor 0 ≤ x ≤ 2π

(e)   y  = sin(x)cos(x) voor 0 ≤ x ≤ 2π

(f)   y  = sin(5x) cos(3x) voor 0 ≤ x ≤ 2π

5. Een bal wordt losgelaten vanaf een hoogte h0  met beginsnelheid  v0   envoert een in vrije val (zonder wrijving) uit. Na   t   seconden heeft debal een snelheid   v(t) =   v0  +  gt   en heeft het een afstand   1

2gt2 + v0tafgelegd. Schrijf een functie die als input de beginhoogte, beginsnelheiden tijdstip heeft. Als output moet de functie de actuele hoogte, snelheiden afgelegde afstand geven.

Opgave 3.1 Deze opgave dient door de docent afgetekend te worden.

Pas je functie die bij oefenopgave 5 zonodig aan dat het niet 1 tijdstip ac-cepteert maar een array van tijdstippen. Schrijf dan een script waarin jede function gebruikt voor het berekenen van de hoogte, afgelegde afstand ensnelheid van de bal. Genereer plots voor alle drie grootheden.

3.2 Relationele en logische operatoren

Matlab kan aangeven wanneer een expressie waar of onwaar is. Dit doet Matlab d.m.v.1 en 0, namelijk WAAR = 1  en  ONWAAR = 0. Het voorbeeld hieronder illustreerteen aantal expressies die in een logische waarde resulteren. De logische waarde iseen aparte data klasse in Matlab, de zogenaamde   logical   data type. Je kunt ditnagaan door onderstaande commando’s uit te voeren en dan in de Command Windowde commando   whos  uit te voeren.

Page 58: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 58/71

3.2. RELATIONELE EN LOGISCHE OPERATOREN    55

>>   x = 5 ;   %we geven x een waarde

>>   x   >   2   %is x groter dan 2?

ans =

1   %antw: waar

>>   x   <   2   %is x kleiner dan 2?

ans =

0   %antw: onwaar

>>   x = = 5   %is x gelijk aan 5 (LET OP HET DUBBELE = TEKEN)

ans =

1   %antw: waar

>>   x   >= 5   %is x groter of gelijk aan 5

ans =

1   %antw: waar

>>   x   <= 4   %is x kleiner of gelijk aan 4

ans =

0   %antw: onwaar

>>   x   ~= 5

ans =

0

In het voorbeeld zie je enkele zogenaamde relationele operatoren. De meeste kennen jullie wel uit de wiskunde (groter dan, kleiner dan enz...). Let vooral op het teken   ==

dat ”is gelijk aan” betekent. Een enkele   =   teken wordt gebruikt voor het toekennenvan een waarde aan een variabele, de dubbele   = teken wordt gebruikt voor het checkenof iets gelijk is aan elkaar. Het andere teken dat waarschijnlijk nieuw is, is de tilde

(     ), die in de laatste expressie in bovenstaand voorbeeld te zien is. De tilde betekentNIET, deze laatste expressie stelt dus: is  x  niet gelijk aan 5. Het antwoord is natuurlijkonwaar (0) want   x   is wel gelijk aan 5.

Wanneer arrays gebruikt worden in zulke vergelijkingen dan worden de waar/onwaartests elementsgewijs uitgevoerd. Het resultaat is dus een array gevuld met enen ennullen. Deze logical array heeft dezelfde dimensies als de variabele die getest wordt.De logical array kan gebruikt worden voor het selecteren van delen van een array die aaneen bepaalde voorwaarde voldoen. Dit wordt in onderstaande voorbeeld geillustreerd.

Page 59: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 59/71

56   CHAPTER 3. BLOK 2 

>>   x = [-2, 1, 3, -5];   %variabele die we willen testen

>>   x   >   0   %welke elementen zijn groter dan nul

ans =

0 1 1 0   %resultaat: een array. plekken ...waarvoor WAAR is, zijn 1, rest 0

>>   x   >   2

ans =

0 0 1 0

>>   x = = 1

ans =

0 1 0 0

>>   y = x   >= -2   %het resultaat kan toegewezen worden aan ...

een variabele voor later gebruik

y =

1 1 1 0

>>   z = x(y)   %door de logische array te gebruiken kunnen we ...

alle elementen van x waarvoor WAAR gold gemakkelijk eruit ...

pikken.

z =

-2 1 3

Logische testen kunnen worden gecombineerd door gebruik te maken van logischeoperatoren: de   and en   or.

>>   x = [-2.5 -1.25 0 1.25 2.5];   %array

>>   x   >   1   |   x   <   -1   % |   betekent "of"

ans =

1 1 0 1 1

>>   x   >   - 2 & x   <   2   %& betekent "en"

ans =

0 1 1 1 0

Page 60: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 60/71

3.2. RELATIONELE EN LOGISCHE OPERATOREN    57

>>   positief = x   >= 0   %zoek de positieve waarden

positief =

0 0 1 1 1

>>   x pos = positief.*x   %zo pikken we de positieve ...

waarden uit de originele array

x pos =

0 0 0 1.2500 2.5000

operator uitleg

>   groter dan

>= groter of gelijk aan<   kleiner dan<= kleiner of gelijk aan== is gelijk aan.∼= is niet gelijk aan

& AND (en)|   OR (of)∼   NOT (niet)

Tabel 3.1:   vergelijkings en logische operatoren.

Oefening 3.2 oefening met relationele en logische operatoren

1 gebruik   x = [5,-3,18,4]   en   y = [-9,13,7,4]. Probeer eerst te be-denken wat de volgende expressies als antwoord zullen hebben. Check jeantwoord met Matlab.

(a)   z = x   >= 0

(b)   z = y   >   5 & y   <   15

(c)   z = x == y

(d)   z = x|y(e)   z = x & y

(f)   z =   ~y

(g)   z =   ~y   >   x

Page 61: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 61/71

58   CHAPTER 3. BLOK 2 

Opgave 3.2 Deze opgave dient door de docent afgetekend te worden.We definieren een sinus signaal met periode 2 sec. door

x = linspace(0,6,1000);

y = sin(pi*x);

Maak een nieuw signaal die hetzelfde is als deze sinus, maar waar de sinusnegatieve waarden heeft, moet het nieuwe signaal de waarde nul hebben. Plotbeide signalen in hetzelfde figuur.

3.3 Voorwaardelijke uitspraken

3.3.1   if,   if else,   if elseif

Tot nu hebben we programma’s geschreven waarin alle commando’s op volgorde, van

boven naar beneden, uitgevoerd werden door Matlab. Vaak echter willen we dat Matlabbepaalde berekeningen alleen doet als er aan specifieke voorwaarden voldaan wordt.Door het stellen van voorwaardes kunnen beslissingen genomen worden om de ene of andere route door het programma te doorlopen. Op deze manier wordt een programmadus veel flexibeler.

Matlab kent de gebruikelijke beslis structuren die elk andere programmeertaal ookkent. De simpelste structuur is de   if structuur. Hiermee kunnen bepaalde statementsuitgevoerd worden als een bepaalde conditie waar is. Als de conditie niet waar is, wor-den de statements overgeslagen. De   if-structuur ziet er als volgt uit

if  voorwaarde 

statements 

end

Schematisch kan deze structuur in een zogenaamde flow-chart weergegeven wordenzoals in figuur 3.2 Een illustratie van het gebruik van deze structuur zie je hieronder.Bij het oplossen van kwadratische vergelijkingen kijken we naar het teken van de dis-criminant. Als deze positief is zijn er 2 verschillende reeele oplossingen. Als hij nul iszijn er twee reele maar gelijke oplossingen en als hij negatief is zijn er twee complexeoplossingen. Met de voorwaardelijke expressies gaan we de verschillende opties checkenen wordt er feedback gegeven naar het scherm.

D = b ˆ 2 - 4*a*c;

if   D   <   0

disp('Pas op: de discriminant is negatief. De oplossingen   ...

zijn imaginair')

end

De discriminant wordt berekend. Er wordt hier gecontrolleerd of de waarde negatief is.Als dit waar is worden de commando’s tussen de   if  en   end  uitgevoerd. Als het niet

Page 62: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 62/71

3.3. VOORWAARDELIJKE UITSPRAKEN    59

Figuur 3.2:   Flow-chart voor de if-structuur. Als de conditie waar is, gaat het programmaverder met het uitvoeren van de statements. Als de conditie niet waar is, negeert het programmade statements en stapt uit de if-structuur.

waar is worden deze commando’s overgeslagen.

Het kan ook voorkomen dat er statements zijn die uitgevoerd dienen te worden alsde conditie bij de if-structuur niet waar is. Hiervoor is de   if,   else   structuur. Dezeziet er als volgt uit. De bijbehorende flow-chart zie je in figuur 3.3

if  voorwaarde 

statements 1else

statements 2 

end

Bovenstaand voorbeeld kan uitgebreid worden:

D = b ˆ 2 - 4*a*c;

if   D   <   0

disp('Pas op: de discriminant is negatief. De oplossingen   ...

zijn imaginair')else

disp('De oplossingen zijn reeel maar kunnen wel hetzelfde   ...

zijn')

end

Als de voorwaarde bij de  if  commando niet waar is worden de commando’s na de  else

uitgevoerd. Nog een uitbreiding is de  if,   elseif structuur. Met   elseif kunnen allemogelijkheden voor de conditie nagelopen worden. De flow-chart voor deze structuur zie

Page 63: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 63/71

60   CHAPTER 3. BLOK 2 

Figuur 3.3:  Flow-chart voor de if else-structuur. Als de conditie waar is, gaat het programmaverder met het uitvoeren van statements 1. Als de conditie niet waar is, voert het programma

statements 2 uit en stapt dan uit de if else-structuur.

 je in figuur 3.4. Als de conditie waar is, gaat het programma verder met het uitvoerenvan statements 1. Als de conditie niet waar is, wordt een tweede conditie nagegaan.Is deze waar dan voert het programma statements 2 uit anders voert het statements 3uit en stapt dan uit de if elseif-structuur.

D = b ˆ 2 - 4*a*c;

if   D   <   0

disp('Pas op: de discriminant is negatief. De oplossingen   ...zijn imaginair')

elseif   D   >   0

disp('De oplossingen zijn reeel en verschillend')

else

disp('De oplossingen zijn reeel en hetzelfde')

end

Als de discriminant niet kleiner dan nul is, zijn er nog twee mogelijkheden. De discrim-inant is groter dan nul of gelijk aan nul. De   elseif   statement checkt of de waardegroter dan nul is. Mocht dit niet het geval zijn, dan is het dus gelijk aan nul en wordende commando’s na de   else  uitgevoerd.

Oefening 3.3 Oefenening met voorwaardelijke uitspraken

1. Schrijf een Matlab script waarin je de gebruiker vraagt om een getal inte voeren. Als de wortel van het getal reeel is (dus als het getal >= 0 is )moet het resultaat (de wortel van het getal) naar het scherm geschrevenworden. Als de wortel imaginair is (dus getal  < 0) dan moet de gebruiker

Page 64: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 64/71

3.3. VOORWAARDELIJKE UITSPRAKEN    61

Figuur 3.4:   Flow-chart voor de if elseif-structuur.

dit verteld worden.

2. Schrijf een Matlab functie die twee getallen als input accepteert, x  en  y .De output is een enkel getal, waarvan de waarde afhangt van de waardenvan de input.

 

Als  x ≥ en  y ≥ 0, bereken dan √ 

x√ 

y.

  Als  x < 0 en  y ≥ 0, bereken dan  x2√ y.

  Als  x ≥ 0 en  y < 0, bereken dan  y2√ 

x.

  Als  x < 0 en  y < 0 bereken dan  x2y2.

Print in alle gevallen het resultaat op het scherm.

3. Schrijf een Matlab functie die een getal tussen 0 en 100 als input ac-cepteert. De output moet een letter zijn volgens het onderstaande tabel.

letter conditieA   x ≥ 90B 80 ≤ x ≥ 89C 70 ≤ x ≥ 79D 60

≤x≥

69E   x < 60

(a) doe dit met geneste if  statements, dus zonder gebruik te maken vanelseif.

(b) doe dit door gebruik te maken van   elseif.

Page 65: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 65/71

62   CHAPTER 3. BLOK 2 

4. Doe opgave (6) van oefening 2.12 over de sudoku puzzel opnieuw. Nuechter kun je een if-structuur gebruiken om de oplossing te checken. Jescript moet feedback naar de Command Window sturen met het resul-taat, dus of de oplossing correct is of niet.

Opgave 3.3 Deze opgave dient door de docent te worden afgetekendDe regels voor het bepalen of een jaar een schrikkeljaar is, zijn de volgende

(I) alle jaren die deelbaar zijn door 400 zijn schrikkeljaren (bijv: 400,1200,2000)

(II) alle jaren die deelbaar zijn door 4 maar niet door 100 zijn schrikkeljaren(bijv: 132, 536, 1336)

(III) alle jaren die deelbaar zijn door 100 maar niet door 400 zijn GEENschrikkeljaren (bijv: 1800,2100,2500)

(IV) alle andere jaren zijn geen schrikkeljaren.

Schrijf een functie die een jaartal als input accepteert en als output de vari-abele   schrikkeljaar   geeft die de waarde 1 heeft als het een schrikkeljaarbetreft en de waarde 0 als het geen schrikkeljaar is.

HINT: gebruik de   mod functie, zoek het nogmaals op in de documentatie.

3.4 Herhalende berekeningen: Loops

Vaak is het nodig om dezelfde berekeningen vele malen uit te voeren. Hiervoor ge-bruiken we een zogenaamde loop. Er zijn twee soorten loops, de   for loop en de   while

loop. Bij de   for  loop is het aantal keer dat de loop doorlopen moet worden bekend.Bij de   while   loop is dit niet het geval. De  while  loop stopt als er aan een bepaaldevoorwaarde voldaan wordt.

3.4.1 De   for loop

De structuur voor deze loop is als volgt:

for loop variabele   = a:b:c

commando’s end

De expressie   a:b:c   geeft de loop variabele de waarde   a   wanneer de loop voor heteerst ingestapt wordt, vergroot deze met   b  bij elke iteratie tot de waarde   c  bereikt of overschreden wordt. Als de stapgrootte (b) gelijk is aan 1, dan kan deze ook weggelatenworden. Laten we dit illustreren met enkele simpele voorbeelden. Het eerste voorbeeldgebruikt een   for loop om een vector te vullen met de kwadraten van de getallen 1 tot

Page 66: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 66/71

3.4. HERHALENDE BEREKENINGEN: LOOPS    63

en met 10. Het tweede voorbeeld gebruikt een loop om de kwadraten van de onevengetallen tussen 1 en 11 naar de Command Window te printen.

1   %De loop variabele is k, deze gaat van 1 naar 10 in stapjes ...

van 1

2   for   k = 1:103   %Een array A wordt gevuld met opeenvolgende kwadraten. De ...

loopvariabele wordt gebruikt als index van de array

4   A(k) = kˆ2;

5   end

6

7   %De loop variabele is weer k, nu van 1 tot 11 in stapjes van 2.

8   for   k = 1:2:11

9   disp(kˆ2)   %print naar het scherm de waarde van kˆ2;

10   end

Geneste loopWe kunnen binnen in een loop ook weer een loop plaatsen die een andere loop variabelegebruikt. Een loop binnen in een loop heet een geneste loop. In het volgende voorbeeldwordt een 2D array gevuld met getallen.

1   K = 1 0;

2   P = 5 ;

3   %Eerste loop variabele is k, deze gaat van 1 naar 10, stapjes ...

van 1

4   for   k = 1:K

5   for   p = 1:P   %2e loop variabele, p, van 1 naar 5

6   %2D array wordt gevuld met de som van de loopvariabelen7   A(k,p) = k+p;

8   end

9   end

Bij het runnen van dit script wordt de volgende 2D array gemaakt.

>>   A

A =

2 3 4 5 6

3 4 5 6 7

4 5 6 7 85 6 7 8 9

6 7 8 9 10

7 8 9 10 11

8 9 10 11 12

9 10 11 12 13

10 11 12 13 14

11 12 13 14 15

Page 67: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 67/71

64   CHAPTER 3. BLOK 2 

3.4.2 De   while   loop

De structuur voor deze loop is als volgt:

while voorwaarde 

commando’s 

end

De   while   loop is iets algemener dan de   for   loop omdat het aantal keer dat de loopdoorlopen wordt niet vaststaat. De   while loop wordt doorlopen zolang de  voorwaarde 

WAAR is. Dit houdt dus ook in dat de voorwaarde een uitdrukking moet zijn waarin re-lationele en/of logische operatoren worden gebruikt. In het voorbeeld hieronder vullenwe weer een array met de kwadraten van de getallen 1 tot en met 10, maar nu met dewhile loop. We gebruiken als voorwaarde dat de array index kleiner moet zijn dan 11.Let op: voordat we de   while  loop instappen, moet de indexvariabele  k  al een waardehebben. Vandaar dat deze de regel ervoor een waarde krijgt. Nog iets om op te merkenis dat de   while   loop de index variabele niet uit zichzelf verhoogd (de   for   loop deeddit wel). Aangezien de index variabele in onze voorwaarde gebruikt wordt, moeten weer wel voor zorgen dat deze in de loop aangepast wordt. Zouden we dit niet doen, danblijft de loop oneindig lang doorgaan.

k = 1 ;   %geef de loopvariabele een waarde voordat de ...

while loop wordt ingestapt.

while   k   <   11

%Een array A wordt gevuld met opeenvolgende kwadraten. De ...

loopvariabele wordt gebruikt als index van de array

A(k) = kˆ2;

k = k + 1 ;   %de loop variabele moet verhoogd worden met 1 ...

voor de volgende iteratieend

Net zoals de for loop, kunnen while loops ook genest worden. Het is ook dan weervan groot belang om de loopvariabelen op de juiste plekken te verhogen met 1. In deoefeningen zul je hiermee geconfronteerd worden.

Binnen in de loops kun je natuurlijk ook gebruik maken van de   if  structuren endergelijke. Op deze manier hebben we veel controle over welk pad ons programma aflegt,afhankelijk van de waarden van onze gegevens. Hieronder nog een voorbeeld, waar degebruiker gevraagd wordt om een getal tussen 0 en 10 in te voeren. Vervolgens checkthet programma of het getal even of oneven is, en geeft feedback naar de Command

Window. Dit alles wordt N  keer herhaald. Tenzij de gebruiker zo stom is om een getalbuiten dit gebied in te voeren, want dan kapt dit programma er direct mee.

Page 68: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 68/71

3.4. HERHALENDE BEREKENINGEN: LOOPS    65

1   N = 3 ;

2   for   k = 1:N

3   x = input('geef een getal tussen 0 en 10: ');

4   if   x   >   10   |   x   <   0

5   fprintf('Getal niet geldig. Begin opnieuw\n');

6   break7   end

8   if   mod(x,2) == 0

9   fprintf('jouw getal is een EVEN getal\n\n')

10   else

11   fprintf('jouw getal is een ONEVEN getal\n\n')

12   end

13   end

Figuur 3.5:   Schematische lay-out van een rechthoekig grid, behorende bij opgave 2 van deoefening 3.4

Oefening 3.4 oefening met loopsDe volgende oefeningen kunnen in Matlab vaak efficienter gedaan worden.Echter, de bedoeling is om specifiek loop structuren te gebruiken. Werk inm-files.

1. Schrijf een functie die twee 1D arrays (met evenveel elementen) als input

neemt. De output is het elementsgewijze product van deze arrays. Defunctie moet werken ongeacht het aantal elementen van de input arrays.

2. Doe de vorige opgave, maar nu met een while loop.

3. In de techniek en wiskunde komen we vaak reeksen van getallen tegen.

Page 69: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 69/71

66   CHAPTER 3. BLOK 2 

Een voorbeeld is de volgende reeks:

1

1, 1

2, 1

3, 1

4 . . .

 1

n

De vraag is dan altijd: Als je alle getallen bij elkaar opteld, krijg je er

dan een getal uit, of wordt de som oneindig groot. De technische term isconvergentie. Als de som begrensd is dan is de reeks convergent. Als desom naar oneindig gaat, dan is de reeks divergent. Voor de som wordtvaak de Griekse letter Sigma gebruikt. Zo kan de som van de eerste5 getallen van bovenstaande reeks op de volgende manier geschrevenworden

Som  =5

n=1

1

n =

  1

1 +

 1

2 +

 1

3 +

 1

4 +

 1

5

Er is een heel vakgebied in de wiskunde die draait om het bepalen of 

een reeks convergent of divergent is. Met Matlab kunnen we simpeleen idee krijgen van de convergentie van een reeks, zonder het echt tebewijzen. In een loop kan er telkens het volgende getal erbij komen ende som geupdate worden. Door de som te plotten krijg je een idee vande convergentie. Probeer de volgende stuk code maar eens.

Som(1) = 0;

for   k = 1:10000

getal = 1/k;

Som(k+1) = Som(k) + getal;

end

plot(Som,   'linewidth', 2)

xlabel('aantal getallen')

ylabel('Som')

Ga na of de volgende reeksen convergent of divergent zijn.

a)∞n=1

1

n  c)

∞n=1

(−1)n−1

n  e)

∞n=0

1

2n

b)∞

n=1

1

n2  d)

n=1

1

n3  f)

n=1

(−1)n−1

2n

4. In figuur 3.5 zie je een rechthoekig rooster, met maasgrootte  dx  en  dy.Schrijf een script waarin je een geneste for loop gebruikt om

  een 2D array   x  te vullen met de  x-coordinaten van elk punt in hetrooster.

Page 70: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 70/71

3.4. HERHALENDE BEREKENINGEN: LOOPS    67

  een 2D array   y  te vullen met de  y -coordinaten van elk punt in hetrooster.

  een 2D array  R te vullen met de afstand van elk punt in het roostertot de oorsprong.

Opmerking: in het script moet je het bereik van het rooster kunnenvarieren. Dit betekent dat je het aantal roosterpunten, dus het bereikvan de for loops, moet berekenen. Als het je gelukt is om de arrays temaken, probeer dan eens de volgende plot commando   contour(x,y,R).Kun je beschrijven wat deze commando plot?

5. Je kunt de vorige opgave ook met geneste while loops doen. Doe dit.

6. De Fibonnaci reeks is een rij getallen die begint met 0 en 1. Elk volgendegetal is de som van de vorige twee getallen. Dus:

f (1) = 0   f (2) = 1

f (k) = f (k − 2) + f (k − 1) voor   k = 3, 4, 5, . . .

De verhouding   f (k−1)f (k)   schijnt, voor grote waarden van k, de gulden snede

te benaderen. De formule voor de gulden snede is  R  =√ 5−12

Bereken een aantal getallen van de Fibonnaci reeks door gebruik temaken van een for loop. Plot de verhouding   f (k−1)

f (k)   en check dat deze in-derdaad overeenkomt met bovenstaande formule voor de gulden snede.Na ongeveer hoeveel getallen in de Fibonnaci reeks is de benaderinggoed?

7. Doe de vorige opgave nu met een while loop. Je zou als voorwaarde in dewhile statement bijvoorbeeld de absolute waarde van het verschil tussende berekende verhouding en de gulden snede waarde kunnen nemen. Dewhile loop mag stoppen als dit verschil kleiner is dan een bepaalde in testellen (lage) waarde.

Opgave 3.4 Deze opgave dient door de docent te worden afgetekendJe gaat een m-file schrijven dat met jou het spelletje hoger/lager speelt. Noem

het   hogerlager.m.Het spel moet als volgt werken:

  Het script vraagt de gebruiker een getal in gedachten te nemen tussen 0en 1000.

  Vervolgens probeert het script jouw getal te achterhalen door te gokken.Na de gok vraagt het script of jouw getal hoger of lager is dan de gok,

Page 71: dictaat Matlab

7/25/2019 dictaat Matlab

http://slidepdf.com/reader/full/dictaat-matlab 71/71

68   CHAPTER 3. BLOK 2 

of dat het toevallig goed is.

  Die beantwoord je door in te typen:

(a) hoger (indien het getal in je gedachten hoger is dan het getal datMatlab heeft geraden)

(b) lager (indien het getal in je gedachten lager is)

(c) goed (indien de gok goed is)

  Vervolgens berekent Matlab een nieuwe gok

  Indien goed is ingevuld rondt Matlab het programma af door het aantalgebruikte gokbeurten te geven

Wat je je misschien realiseert is dat de duur van het spel niet van te vorenvastligt. De computer kan immers direct het goede getal gokken. Dan is het inn beurt afgelopen. Maar het kan ook zijn, dat het pas na honderd keer raden

het goede getal raadt. Handig is het om de while loop te gebruiken: Zolang(Eng. while) niet goed geraden is moet een nieuwe gok bedacht worden.

Ontwerp zelf een algoritme waarmee Matlab de gokgetallen bepaalt: In hetwilde weg raden is een algoritme maar dat levert een langdurig spel op. Ad-vies: Speel het spel een keer met een ander persoon en denk na hoe je zelf tewerk gaat. Een keer zul je goed gokken en is het programma afgelopen.