Introductie in MATLABhomepage.tudelft.nl/11r49/onderw0102/linalgmt/opdracht/...Introductie in MATLAB...

36
Introductie in MATLAB Andr´ e Hensbergen Inhoudsopgave Introductie in MATLAB, deel 1 1.1 Invoeren van opdrachten 1.2 De help-faciliteit 1.3 Rekenen met getallen 1.4 Toekenningen 1.5 Werken met matrices 1.6 Matrixbewerkingen; oefeningen 1.7 Functies in Matlab 1.8 Plotten 1.9 Printen Introductie in MATLAB, deel 2 2 .m-files 3 Control Flow 3.1 for-loops 3.2 if-else en while 4 Algemene commando’s 5 Opgaven Opdrachten

Transcript of Introductie in MATLABhomepage.tudelft.nl/11r49/onderw0102/linalgmt/opdracht/...Introductie in MATLAB...

Introductie in MATLAB

Andre Hensbergen

Inhoudsopgave

Introductie in MATLAB, deel 1

1.1 Invoeren van opdrachten1.2 De help-faciliteit1.3 Rekenen met getallen1.4 Toekenningen1.5 Werken met matrices1.6 Matrixbewerkingen; oefeningen1.7 Functies in Matlab1.8 Plotten1.9 Printen

Introductie in MATLAB, deel 2

2 .m-files3 Control Flow

3.1 for-loops3.2 if-else en while

4 Algemene commando’s5 Opgaven

Opdrachten

Introductie in MATLAB, deel 1

Matlab (afkorting voor Matrix Laboratory) is een interactief systeem: de ingetiktecommando’s (opdrachten), afgesloten door ”Enter”, worden direct uitgevoerd, enindien gewenst verschijnen de resultaten direct op het scherm. Om de ‘output’ ophet scherm te onderdrukken sluit je een commando af met een puntkomma.

1.1 Invoeren van opdrachten

Het intikken van opdrachten vraagt wel enige nauwkeurigheid. Het vergeten vanbijvoorbeeld een * of een ) kan ertoe leiden dat de opdracht niet of verkeerd wordtuitgevoerd. Hieronder volgt een lijst met links de in de wiskunde gebruikelijke no-tatie en rechts de vorm waarin het ingetikt moet worden. (a, b, x en y zijn getallen)

Wiskundige notatie Intikken

a + b a+b

a− b a-b

ab a*b

3xy 3*x*yab

a/b

ab a^b√x sqrt(x)

π pi

e exp(1)

3− 4i 3-4*i

sin x, arctan x, . . . sin(x), atan(x), ...

ex, ln x exp(x), log(x)

log x ( = 10 log x ) log10(x)

|x| abs(x)

∞ Inf

(i) Houd er rekening mee dat Matlab ‘case sensitive’ is. Dat wil zeggen dat erverschil is tussen hoofd- en kleine letters. Het getal π bijvoorbeeld wordtbinnen Matlab geschreven als pi, het invoeren van Pi zal een foutmeldingopleveren.

(ii) Opdrachten in Matlab worden afgesloten door het indrukken van de Enterof RETURN-toets. Het antwoord verschijnt direct op het scherm. Door hetcommando af te sluiten met een ; (puntkomma) wordt de uitvoer op hetscherm onderdrukt.

1

1.2 De help-faciliteit

Matlab beschikt over een uitgebreide help-functie. Met behulp van het commandohelp onderwerp verschijnt er een toelichting bij onderwerp. Bijvoorbeeld:

� help elfun

geeft informatie over de elementaire functies die Matlab kent. Lees (via ↑ ↓ in derechterbalk of Page Up/Down) wat er zoal in staat.Met alleen het commando help verschijnt een lijst van mogelijke onderwerpen.

1.3 Rekenen met getallen

Matlab is in feite een zeer uitgebreide programmeerbare rekenmachine. Om met hetpakket kennis te maken en te wennen aan het invoeren van commando’s zullen weeen aantal korte opdrachten uitvoeren.Tik in:

� 12/3 (Druk nu de Enter of RETURN–toets in)

Op het scherm verschijnt de uitvoer van het commando in de volgende vorm:

ans =

4

Matlab is een numeriek pakket, dat wil zeggen dat er geen exacte berekeningen uit-gevoerd kunnen worden. Het hangt van de opgegeven nauwkeurigheid af in hoeveeldecimalen er wordt gerekend. Matlab ongeveer 16 decimalen nauwkeurig (waarvaner standaard vijf op het scherm verschijnen).

Voer in:

� 12/9 (Druk nu de Enter of RETURN–toets in)

Als antwoord verschijnt op het scherm:

ans =

1.3333

2

Rekenen met complexe getallen is voor MATLAB geen probleem. Het getal i kentMATLAB ook als i. het getal a + bi voer je in als a+b*i. Met de commando’s absen angle kun je de modulus resp. het argument van een complex getal vinden, enverder zijn er de commando’s real, imag, conj en exp met voor de hand liggendeacties (zo niet: raadpleeg help).

Opgave

Bereken (1 + 2i)(5− 3i) en (1 + i√

3)5,

en ga met MATLAB na dat e34πi = −1

2

√2 + 1

2

√2i.

Standaard geeft Matlab op het scherm 5–cijferige getallen met een vaste komma.Met behulp van het format–commando kun je opgeven welke notatie–vorm je wiltgebruiken. In onderstaande tabel staan verschillende opties:In de rechterkolom staan de representaties van π, van 1.23456 · 10−3

en van 1.23456 · 10−6.

Commando Resultaat Voorbeeld

format short 5 cijfers, 3.1416‘scaled fixed point 0.0012

1.2346e–006

format short e 5 cijfers, 3.1416‘floating point’ 1.2346e–003

1.2346e–006

format long 15 cijfers, 3.14159265358979als short 0.00000123456000

1.23456000000000e–006

format zonder toevoegingen is hetzelfde als format short.Voor overige mogelijkheden: raadpleeg help format.

Stel Matlab in op long.

Voer in:� pi

� sin(pi) Het antwoord is (bijna!) 0.

Ga nu weer over op de standaard-instelling .

3

1.4 Toekenningen

Als een matrix (of getal) meerdere keren gebruikt gaat worden kun je de waardeervan toekennen aan een variabele. Je hebt hem dan als het ware een naam gegeven,en kunt hem via die naam weer oproepen.

Als voorbeeld berekenen we de eerste vier machten van de matrix

1 2 12 −1 21 3 −2

.

� A = [1, 2, 1; 2, -1, 2; 1, 3, -2] (i.p.v. komma’s kun je ook spatiesnemen)� A2 = A^2; A3 = A^3; A4 = A^4;

Vervolgens kun je de som hiervan berekenen via

� som = A + A2 + A3 + A4

(De spaties staan hier slechts voor de leesbaarheid. Matlab negeert ze.)De naam van een variabele hoeft natuurlijk niet beperkt te blijven tot een karakter.Het is aan te raden bij het maken van programma’s ‘logische’ variabele-namen tekiezen; dit zal de leesbaarheid en duidelijkheid zeer ten goede komen.

N.B.1 Als je niet zelf een variabele introduceert om een waarde in op te slaan, kiestMatlab hiervoor de variable ans. Dit is hierboven al een paar keer gebeurd.Het is echter een goede gewoonte om de resultaten van elke berekening in een eigenvariabele op te slaan, in dit geval bijv. in A2, A3, A4.N.B.2 bij de eerstvolgende toekenning A = ..... wordt de oude waarde van A

weggegooid/vergeten.

Een paar commando’s om de ‘actuele stand van zaken’ op te vragen of te beınvloeden:

� who opvragen van alle variabelen met een waarde;� size(x) geeft de afmetingen (aantal rijen, kolommen) van x;� clear x1 verwijder de variabele x1 ;� clear all verwijder de waarden van alle variabelen.� clc veegt het scherm schoon (idem: Clear Command Window).

In Matlab is het alleen mogelijk aan een variabele een gedefinieerde waarde toe tekennen Het volgende geeft bijvoorbeeld problemen:

� clear x; (hiermee wordt x ‘leeg’ gemaakt)

� functie = x^2 + 4 * sin(x)

Om een dergelijke functie in te voeren moet deze door de gebruiker zelf ‘ingepro-grammeerd’ worden. De gebruiker breidt als het ware de lijst Matlab-commando’suit met een nieuwe functie. In deze fase gaan wij hier niet verder op in. Het is(nog) niet mogelijk formulemanipulatie uit te voeren met Matlab, daartoe zijn an-dere pakketten beschikbaar (bijvoorbeeld: Maple, Mathematica).

Het berekenen van de functiewaarde van boven bedoelde functie f in bijv. het puntπ/3 kan als volgt gebeuren:

4

� x = pi/3;

� y = x^2 + 4*sin(x)

Voer dit uit.

Opmerking. Met de ↑-toets kun je voorgaande commando’s terughalen en, al ofniet gewijzigd, opnieuw uit laten voeren door op Enter te drukken. (Hiervoor hoeftde cursor niet aan het eind van de regel te staan.)Met de Delete- en de Back Space-toets (dat is bij sommige toetsenborden de ←toets boven Enter) kun je symbolen wegvegen; met de ← en → rechts van deCtrl-toets kun je binnen een regel van links naar rechts lopen. Probeer dit uit!

1.5 Werken met Matrices

Het basis-element van Matlab is de matrix. Speciale gevallen hiervan zijn een 1×1–matrix, d.w.z. een scalar, en een matrix bestaande uit slechts een rij of kolom, d.w.z.een vector. De grenzen van een matrix hoeven niet gedeclareerd te worden. (Zekunnen opgevraagd worden met het commando size.)

Bij het elementsgewijs invoeren van een matrix worden de verschillende rij-elementengescheiden door spaties of door komma’s. De rijen worden gescheiden door punt-komma’s, of door naar een nieuwe regel te gaan. De getallen worden omsloten doortwee rechte haken, [ en ].

De matrix A =

1 2 34 5 67 8 9

wordt als volgt ingevoerd:

� A = [ 1 2 3 ; 4 5 6 ; 7 8 9] ( spaties tussen de getallen! )

Op het scherm verschijnt:

A =

1 2 34 5 67 8 9

Voorbeeld van het invoeren van een kolomvector:

� b = [ 1; 6; 7; 5; -3 ]

Matrix-elementen kunnen afzonderlijk of in groepen opgeroepen of van een waardevoorzien worden, onderstaande tabel geeft een overzicht van de mogelijkheden:

A(i,j) Aij (het element in de ie rij, je kolom)A(:,j) je kolom van AA(i,:) ie rij van AA(k:l, m:n) deelmatrix van alle elementen Aij k ≤ i ≤ l, m ≤ j ≤ n

(oftewel: k-de t.e.m. l-de rij, m-de t.e.m. n-de kolom)v(i:j) ‘deelvector’ (vi, vi+1, . . . , vj) van de vector v

5

En voor een vierkante matrix:

diag(A) geeft de hoofddiagonaal van A (als kolom-vector);diag(A,k) geeft de k-de nevendiagonaal van A (als k < 0,

dan wordt degene onder de hoofddiagonaal genomen)

Probeer het een en ander uit:

Voer in de 3× 4-matrix: A = [1 2 3 4; 5 6 7 8; 1 1 1 1] (spaties!)

Voorspel en controleer wat het resultaat is van de volgende commando’s:(N.B.: een van de commando’s zal een foutmelding geven. Welke, en waarom? )

• B = A(:, 3)

• C = A(1:3,2:4)

• D = diag(C,-1)

• A(1,1) = 9

• A(2:3, 1:3) = [0 0 0; 0 0 0]

• A(1:3, 1) = [1, 1, 5]

• A(1:2, 1:2) = [-1, -1; 3, 3]

• A = A(3:3, 1:4)

Hoewel de laatste regel een voorbeeld is van ‘slordig programmeren’, kun je er welduidelijk aan aflezen wat er in feite gebeurt bij een toekenning (Engels: assignment)van het type A = B. Eerst wordt de waarde van B uitgerekend, en vervolgens wordtdeze waarde (een getal, een vector of een matrix) toegekend aan de variabele A.Als A reeds een waarde had dan wordt die ‘weggegooid/vergeten’.Het ‘=’teken betekent hier dus iets heel anders dan ‘is gelijk aan’.Je kunt A = B dan ook het best lezen als: ‘A wordt B’.In programmeertalen als Pascal, maar ook in computeralgebra pakketten als Mapleen Derive, is hiervoor het symbool := gebruikelijk.

Voorspel wat het resultaat zal zijn van de volgende commando’s:

� s = 1, s = s+1, s = s+5, s = s^2

6

1.6 Matrix-bewerkingen

Wat nu volgt is een greep uit het grote arsenaal aan matrix-bewerkingen waar deMatlab-gebruiker standaard de beschikking over heeft.De commando’s met een worden toegelicht in het volgende punt.De commando’s met een � hebben betrekking op begrippen die pas later (bij lineairealgebra) aan de orde zullen komen.Voor alle bewerkingen geldt: is het je niet duidelijk wat er bedoeld wordt: raadpleeghelp.

C = A+B gewone optelling van matricesC = A-B gewone verschil van matricesC = A*B gewone matrixvermenigvuldiging (bij onjuiste afmetingen

volgt een foutmelding);C = A.*B ‘elementsgewijze’ vermenigvuldiging

(A en B moeten dezelfde afmetingen hebben);C = A+k bij elk element van A wordt het getal k opgeteld;C = A^k gewone machtsverheffing (k ∈ Z);

bijv. te gebruiken voor berekening van A−1;C = A.^k ‘elementsgewijze’ machtsverheffing; (kan handig zijn

bij het invoeren van een polynoom)C = A’ berekent de getransponeerde AT ;C = A\B berekent voor een niet-singuliere, vierkante matrix A

de unieke oplossing van het de vergelijking AX= B;berekent voor een overbepaald stelsel (meer vergelijkingendan onbekenden) een kleinste kwadraten oplossing;

C= B/A oplossing van XA = B, analoog aan vorige commando;[L,U,P] = lu(A) berekent de PLU-ontbinding van A;� L = eig(A) L is een kolomvector met de (mogelijk complexe)

eigenwaarden van A;� [X,D] = eig(A) D is een diagonaalmatrix met op de diagonaal

de eigenwaarden van A, de kolommen van X zijnde bijbehorende eigenvectoren;

� [Q,R] = qr(A) produceert een QR-ontbinding van matrix A;A = diag(v) geeft diagonaalmatrix met diagonaal v(1), v(2), ...,v(n);A = zeros(n) A wordt de n×n nulmatrix;A = zeros(n,m) A wordt de n×m nulmatrix;A = eye(n) A wordt de n×n identiteitsmatrix;A = ones(n,m) A wordt de n×m matrix met louter 1-en;x = k:n x wordt de vector (k, k+1, k+2, ..., n);x = a:h:b x wordt de vector (a, a+h, a+2h, ..., b),

aangenomen dat b–a deelbaar is door h

7

Een paar voorbeelden ter illustratie (verklaar waar nodig de foutmeldingen):

(i) Voer in x = [1,3,5,8]

y = [2,2,0,6]

z = x.*y

w = x*y’ (wat gaat ‘voor’? * of ’ ? )

(ii) Voer in s = 1:10

s1 = s^2

s2 = s.^2

s3 = s.^3

(iii) Laat A =

1 11 00 1

en b =

215

Merk op: Ax = b is strijdig.

Bereken u = A\b, en ga na of Au = b.

N.B. dit is geheel in overeenstemming met de uitleg bij het commando U= A\B

(meer hierover: straks bij lineaire algebra)

Om het ‘denken in rijen en kolommen’ te bevorderen:

Opgave

Voer (op een handige manier) de volgende twee matrices in:

A =

1 3 5 7 91 3 5 7 9: : : : :: : : : :: : : : :1 3 5 7 9

(A heeft 18 rijen. Gebruik decommando’s a:h:b en ones. )

B =

1 2 3 4 ... 91 4 9 16 ... 92

1 8 27 ... ... 93

1 16 81 ... ... 94

1 32 ... ... ... 95

Overigens zullen we later een andere manier zien een ‘gestructureerde’ matrix in tevoeren, nl. met een for-loop.

8

Opgave

Gegeven een rijvector v van lengte n. Hoe kun je de som van de elementen van vberekenen? Aanwijzing: neem het product met een geschikte kolomvector.

Bereken op deze manier de som van de eerste honderd kwadraten, dat wilzeggen: 1 + 4 + 9 + . . . . + 992 + 1002.

(Antwoord: 338350)

1.7 Functies in Matlab

Zoals gezegd: Matlab giet alle structuren in de vorm van matrices. Zo ook functies.Matlab kent de elementaire functies xα, sin, cos, tan, ex, ln ( log !),

√x ( sqrt(x) ),

en zo nog wat meer. (Als je wilt weten welke: vraag het op met help elfun.)Als je invoert

x = 0:0.1:pi; (Zie lijst met matrixbewerkingen.)y = sin(x)

dan worden er twee variabelen x en y ‘aangemaakt’ met waarden(0, 0.1, 0.2, ... , 3.0, 3.1) resp. (sin(0), sin(0.1), sin(0.2), ... , sin(3.0), sin(3.1) ).Matlab neemt dus elementsgewijs de sinus van x, en slaat de ‘functie’ als het wareop in een tabel. Meer ‘weet’ Matlab niet van de ‘functie’ y.Het is zinloos om bijvoorbeeld met y(0.25) de sinus van 0.25 te willen berekenen.(Kijk maar wat er gebeurt.)

Vraag: wat stelt y(5) voor ?

De ‘elementsgewijze’ matrix-operaties .* en .^ zijn met name handig om‘functies’ in te voeren:

Voorbeeld

De functie f(x) = 13x2 + x sin x op het interval [0, 3] met ‘stapgrootte’ 0.1.

Ten eerste de x-waarden:

� x = 0:0.1:3.0; (dit geeft een vector van lengte 31)

Nu moeten we voor k = 1, 2, 3, . . . , 31 berekenen y(k) = f(x(k)).Met behulp van de .* en de .^ operator lukt dit als volgt:

� y = (1/3)*x.^2 + x.*sin(x)

Het resultaat van de toekenning y = (1/3)*x^2+x.*sin(x) is niet direct leesbaarte noemen. Het volgende punt betreft het grafisch weergeven van gegevens.

9

1.8 Plotten

Met het plot–commando kun je vectoren (en matrices) grafisch laten weergeven.Als je een ‘functie’ invoert door een rij x-waarden met bijbehorende y-waarden tegeven, krijg je met het commando plot(x,y) min of meer de grafiek op het scherm:

plot(y) tekent de punten (1, y(1)), (2, y(2)), ... , (n, y(n)) en verbindt zemet rechte lijnen.

plot(x,y) doet hetzelfde voor de punten (x(1), y(1)), ... , (x(n), y(n)).x en y mogen hier rij- of kolomvectoren van gelijke lengte zijn.

Voorbeelden

Voer in x = [2,5,4,8,10,4]

y = [6,3,9,1,4,0]

plot(x,y)

Voer in (bij het invoeren van tekst springt Matlab automatischnaar het Command Window terug):

x = 0:0.1:3;

y = sin(x);

plot(x,y) (geen paniek, zie eerstvolgende opmerking! )

OpmerkingBij een volgende plot-opdracht komt het plaatje niet altijd direct in beeld. Als hetPlot Window zich achter het Command Window bevindt, kun je het op verschillendemanieren naar voren halen:A) als een deel van het Plot Window wel zichtbaar is, click je het simpelweg aan

met de muis. (Je kunt een deel zichtbaar maken door het Command Windowiets te verkleinen.)

of

B) door op de menubalk ”Windows” aan te clicken en vervolgens ”Figure No. 1”.

of

C) door te ‘bladeren’ via Alt-Tab.

Nog een voorbeeld:

Voer in x = 1:10; y = 20:30;

plot(x,y) Wat gaat hier fout?

10

Bij het plotten van meerdere grafieken in een plaatje is het soms handig om verschil-lende kleuren en tekens te gebruiken. De volgende tabel biedt voldoende variatie-mogelijkheden; voor het volledige aanbod: raadpleeg help plot.

Symbool Kleur Symbool Stijly geel (yellow) . ‘stip’r rood o ‘rondje’g groen - ‘lijn’b blauw -. ‘streep-stip’w wit * ‘ster’

Voorbeeld

Voer in: x = 0:.1:3.1;

y = sin(x);

z = x.*sin(x); (elementsgewijze matrixvermenigvuldiging!)plot(x,y,’y-’, x,z,’r-.’)

Er zijn twee manieren om meerdere grafieken in een plaatje te krijgen: met eenplot-opdracht, zoals boven, of met een aantal plot-opdrachten na elkaar, mettussendoor het commando hold on.

Voorbeeld

Voer in: x = 0:0.1:3.2; y = sin(x);

x2 = 0:0.3:3; y2 = sin(x2); (haal de vorige regel terug en wijzig)plot(x,y,’g’)

Ga nu naar het Command Window terug. Het Plot Window is dan nog steeds aan-wezig. Geef vervolgens:

hold on

plot(x2,y2,’yo’)

en de twee grafieken staan in een plaatje (achter het Command Window).Alle volgende plot-opdrachten geven grafieken in hetzelfde plaatje.Wil je een heel nieuw plaatje maken dan kun je dat doen door hold off tegeven, of door het Plot Window te verlaten door de Control Menu Box (het hokjelinksboven) te double-clicken.

11

Met onderstaande commando’s kun je de ‘layout’ van een bestaande plot beınvloeden:

axis([xmin xmax ymin ymax]) ‘x-coordinaat’ loopt van xmin tot xmax,de ’y-coordinaat’ van ymin tot ymax.

axis(’off’) tekent de assen niet

title(’tekst’) geeft de titel tekst .(N.B. tekst moet tussen quotes gezet worden.)

xlabel(’tekst’) zet tekst langs de x-as

ylabel(’tekst’) analoog aan xlabel

gtext(’tekst’) doet het (evt. nog lege) Plot-Window in beeldverschijnen, en zet tekst op de positiedie je met de muis (linkerknop) aanklikt.

Voorbeeld

Voer in p = [2, 5, 5, 2, 2];

q = [2, 2, 5, 5, 2];

plot(p,q)

title(’vierkant ?’)

Het resultaat is het ‘vierkant’ met hoekpunten (2,2), (5,2), (5,5) en (2,5).Door op de x-as en y-as het interval [0,7] te nemen krijg je een duidelijker beeld:

� axis([0,7,0,7])

Wil je tenslotte dat het vierkant er als een vierkant uitziet, geef dan de opdracht:

� axis(’square’)

Probeer tenslotte het volgende uit:

� gtext(’Dit is het punt (5, 5)’)

Opmerking De zelf gedefinieerde instellingen m.b.v. axis blijven geldig zolang jemet hetzelfde plaatje werkt.

Oefeningen

1. Construeer een (gladde) grafiek van sin x op het interval [0, 4π], waarin depunten

(kπ6

, sin(

kπ6

) ), k = 0, 1, . . . , 24 met een * zijn aangegeven.

2. (Krommen in het (complexe) vlak. Zie moduul 1, § 1.4)De kromme gedefinieerd door x = x(t), y = y(t), a ≤ t ≤ b, of doorΦ: [a, b]→ C kun je met Matlab eenvoudig op het scherm krijgen.We nemen als voorbeeld x = 3 cos(t), y = sin(t), t ∈ [0, 2π]. Voer in

12

� t = 0:0.1:2*pi; (een redelijk fijne interval-verdeling)

� x = 3*cos(t);

� y = sin(t);

� plot(x,y)

Nu zelf:

(a) Maak mooie plaatjes van een aantal Lissajoux-figuren. Bepaal zelf eengeschikt interval voor t en een geschikte interval-verdeling (zodat de vol-ledige kromme glad op het scherm verschijnt).

(i) x(t) = cos(2t), y(t) = sin(5t)

(ii) x(t) = cos(2t + π/3), y(t) = sin(5t)

(iii) x(t) = cos(5t + π/4), y(t) = sin(4t)

(b) Teken de kromme z = t eit, 0 ≤ t ≤ 4π. (In feite opgave 2 van § 4uit moduul 1.) Aanwijzing: je kunt t en z vrijwel letterlijk invoeren.z wordt dan een vector van complexe getallen. Je krijgt de kromme inbeeld met

� plot(real(z), imag(z))

Geef ook eens de stijl-optie ‘punt’ of ‘ster’ mee; dan kun je als het warezien hoe de ‘snelheid’ verandert

1.9 Printen

Als je het plaatje op het scherm er acceptabel uit vindt zien, dan kun je het alsvolgt vastleggen op papier (= printen):Klik in de menubalk van het Plot Window ”File” aan, en in de Dialog Box dieverschijnt ”Print”. In het ”Afdrukken” Window tenslotte click je ”OK” (okay) aan.Als de opdracht is verwerkt kom je weer terug in het Plot Window. Een van deprinters zal een plaatje uitspuwen (eventueel nadat jij op de knop continue resethebt gedrukt, of vandaag of morgen weer een andere knop).[Printen vanuit Matlab geeft nogal eens complicaties. Voordat je bij weigering omte printen hulp inroept van een begeleider of systeembeheerder, kun je het volgendenog proberen: verlaat (bv. met Alt+Tab) Matlab, click in de Program Manager hetTurbo Pascal ikoon aan, en vervolgens het ikoon Recapture(dosprint). Vorig jaarlukte het printen dan soms wel.]

13

Introductie in MATLAB, deel 2

2 .m-files

In de eerste introductie heb je kennisgemaakt met een aantal basiscommando’s vanhet pakket Matlab, alsmede met enkele van de plot-mogelijkheden. In deze tweedeintroductie leer je (een klein beetje) programmeren in Matlab.

Laten we om te beginnen eens kijken naar de structuur van Matlab.

Matlab bestaat uit een kleine kern, met daarin basiscommando’s als

+, .* , : , rand , who , size , plot , det , sin , exp

met daaromheengebouwd een scala aan al dan niet specialistische proceduresen functies, opgeslagen in zogenoemde M-files (of .m-files). Voorbeelden hiervan:

mean, hist, quad, fzero, trace

De (implementaties van de) basis-commando’s zijn voor de gebruiker niet zichtbaaren niet te beınvloeden.

De gebruiker kan zelf .m-files toevoegen. Die optie maakt dragelijk dat het MatlabCommand Window nogal beperkt is in z’n mogelijkheden. In feite is Matlab nogsteeds een DOS-programma met een Windows-jasje. Commando’s (opnieuw) latenuitvoeren door ze aan te clicken werkt niet, en het telkens terughalen van eerderingetypte commando’s gaat bij een wat ingewikkelder probleem al snel irriteren.Een Matlab-sessie opslaan om er op een later moment mee verder te gaan heeft ookgeen zin.

Script Files

Ten eerste kun je een aantal commando’s in een zogenaamde script file zetten (of-tewel een programma’tje schrijven) en die vervolgens ‘runnen’.Ten tweede kun je function files maken met procedures en functies, die je vanuit hetcommand window aan kunt roepen.Werkend op een computer in de pc-zaal ga je eerst via het commando cd a:

naar de a-drive (nadat je hebt gezorgd dat zich daarin een schijfje bevindt).Het is namelijk niet de bedoeling allemaal prive-spullen op het netwerk op te slaan.Voor een script file ga je als volgt in te werk (eerst a.u.b. cd a:)

— Click op de menubalk aan: File New M-file

— De Matlab Editor/Debugger opent een nieuw document, waarin jij een pro-gramma kunt schrijven. (In oudere versies van Matlab wordt de notepad-editorgebruikt.)

— Het is een goede gewoonte om het programma te beginnen met een of enkeleregels commentaar over de werking van het programma. (Een commentaarwordt voorafgegaan door %).Met help naam (de nog te verzinnen naam) krijg je dit commentaar later snelin beeld.

14

Ben je klaar met schrijven dan moet je het ‘programma’ (dat nu alleen nogmaar op het scherm staat) ergens opslaan, in jargon: ‘saven’.

— Click aan: File Save As

Geef het beest een naam: naam.m gevolgd door Enter of Ok

De extensie .m is belangrijk! (Als jij hem niet geeft, dan voegt de editordie standaard toe.)

— Verlaat de .m-file. (Alt-F4, of Alt-Tab, of File Exit)

— Laat vanuit het Matlab Command Window de commando’s uitvoeren, doorsimpelweg naam te geven (zonder .m), of via: File Run naam.m

— Wil je het programma wijzigen, dan roep je de M-file op door:File Open naam.m (of door te bladeren met Alt-Tab, als je de editoraldus verlaten had.)Om de gewijzigde versie te bewaren geef je Save in plaats van Save As

(tenzij je de oude versie ook nog wilt bewaren natuurlijk).

— Zoals de naam al aangeeft kun je de Matlab-editor ook gebruiken om fouten inje programma’s op te sporen en te verwijderen (= ‘debuggen’ ). Indien nodigmoet je dit t.z.t. zelf maar zien uit te vogelen.

Voorbeeld (Tevens oprakelen van plotten)

Maak een .m-file met de volgende commando’s:

x = 0:0.1:4*pi;

y = sin(x);

plot(x,y);

hold on; (toegelicht in § 1.8: ‘plotten’)

x = 0:pi/6:4*pi;

y = sin(x);

plot(x,y,’r*’)

Save het geheel (op de a: onder de naam plotsin.m (of iets anders, mits nieuwen eindigend op .m), ga naar het Command Window en geef het commando

plotsin

Het voordeel moge duidelijk zijn: mocht je achteraf besluiten dat je toch lievergroene rondjes in plaats van rode sterretjes hebt, dan wijzig je de laatste regel vande .m-file. Voer iets dergelijks uit.

15

Function Files

Deze paragraaf is ter extra informatie aangeboden. Voor de opdrachten hoef je nietper se zelf function-files te maken (hoewel het handig kan zijn). Sla hem in eersteinstantie over, en lees verder bij:Control Flow.

Zoals gezegd, er kunnen twee soorten .m-files onderscheiden worden:script files en function files.In script files wordt simpelweg een aantal commando’s in een .m-file gegroepeerd.Met function files kun je zelf functies en procedures aan Matlab toevoegen.Script files kun je ”runnen”, function files roep je aan.

De eerste regel van een function file luidt in het algemeen als volgt:

function y = functienaam(x)

Ook hier is het een goede gewoonte om te te beginnen met een of meer regels com-mentaar over de werking van de functie.Met help functienaam kun je dit commentaar later eenvoudig opvragen.

Enkele voorbeelden:

1. De functie f : R→ R met functievoorschrift f(x) = x2 e−x2

kun je toevoegen als .m-file newfunc:

function y = newfunc(x);

% newfunc(x) berekent (elementsgewijs) x^2 * exp(-x^2)

y = x.^2 .* exp(-x.^2);

Doe dit, en maak een plot van deze functie op het interval [0, 5].

2. De volgende functie berekent het grootste verschil tussen twee opeenvolgendeelementen van een vector:function result = maxdiff(x)

% maxdiff(x) berekent het grootste verschil |x(i) - x(i-1)|

% van vector x

L = length(x);

v = x(2:L) - x(1:L-1);

result = max(abs(v));

Als je deze M-file opslaat als maxdiff.m, dan kun je voortaan het ”maximaleverschil tussen twee opeenvolgende elementen van een vector y” laten bereke-nen via

� s = maxdiff(y)

Doe dit voor de vector z gedefinieerd door

� x = 0:0.1:1.5*pi;

� z = sin(x.^2);

16

Opmerkingen:

1. Bij ‘zinvoller’ function files zul je vaak gebruikmaken van de commando’s for,if, while, . . . .

2. Voor een-regelige functies als in voorbeeld 1. kent Matlab (vanaf versie 5) hetcommando inline. De functie newfunc is daarmee in te voeren als

� newfunc = inline(’x.^2 .* exp(-x.^2)’, ’x’);

waarna je bijvoorbeeld newfunc(5) kunt berekenen via

� newfunc(5)

Raadpleeg desgewenst help inline.

3. De variabelen result en x in de regel function result = functienaam(x)

zijn, hoe kan het anders in Matlab, matrices.x heet de input, result de output.

In plaats van een enkele variabele, kun je ook meerdere variabelen als inputen/of output nemen. De aanhef wordt dan

function [res1, res2, ..., resk] = functienaam(x1, x2, ..., xn)

Tot slot:

4. Een belangrijk verschil tussen script files en function files is het karakter van devariabelen. De variabelen die in een function file gebruikt worden zijn lokaal.Ze leven als het ware alleen binnen de procedure. We gaan hier niet verder inop dit punt.

17

3 Control Flow (for, while, if...)

3.1 for-loops

Met de commando’s

for k = 1:n

<opdr.1> ;

<opdr.2> ;

...

...

<opdr.m> ;

end;

wordt de serie opdrachten <opdr.1>; . . . . . ; <opdr.m.>;

n keer uitgevoerd.Het verdient aanbeveling om elke opdracht af te sluiten met een puntkomma,om onnodige output op het scherm te onderdrukken.In het algemeen zullen de uit te voeren opdrachten afhangen van de zogenoemdeloop-variabele k. (Spreek uit: ”loep-variabele”)Het is een goede gewoonte om de loop-opdrachten in te laten springen, en niet meerdan een opdracht per regel te schrijven.

Voorbeelden

1) Met de volgende commando’s kun je de som van de eerste 50 kwadratenberekenen (maak een .m-file som.m):

s = 0;

for k = 1:50

s = s + k^2;

end;

s

De opdracht die 50 keer wordt uitgevoerd is: tel k^2 op bij s.Het laatste commando, zonder puntkomma, doet het antwoord op het schermverschijnen.

Voor wie nog nooit geprogrammeerd heeft: kijk eens wat er gebeurt als in dederde regel de puntkomma weggelaten wordt.

18

2) De rij van Fibonacci 1, 1, 2, 3, 5, 8, 13, . . . . . is vastgelegd door de eerste tweewaarden en het voorschrift fn+1 = fn + fn−1

Het volgende ‘programma’ genereert de eerste vijftig Fibonacci-getallen.

f(1) = 1; f(2) = 1;

for k = 3:50

f(k) = f(k-1) + f(k-2);

end;

Aan het eind is f een vector van lengte 50, en het k-de element van f is precieshet k-de Fibonacci-getal.Als je alleen geınteresseerd bent in de waarde f50, dan spaar je op de volgendemanier enige geheugenruimte uit (maak een M-file fibo.m):

f1 = 1; f2 = 1;

for k = 1:48

f3 = f1+f2;

f1 = f2;

f2 = f3;

end;

f2

Er zijn nu slechts drie variabelen f1, f2 en f3 in het spel; na elke stap wordt dewaarde die niet meer nodig is ‘weggegooid’.Ook weer voor wie nog weinig of geen programmeerervaring heeft:na de volgende wijzigingen zijn de eerste acht stappen goed te volgen:laat k lopen van 1 t/m 8, en voeg de volgende commando’s als zesde regel(direct boven end) tussen:

disp([f1, f2, f3]), pause(2)

Het is ook mogelijk om binnen een for-loop een andere for-loop te plaatsen.We spreken dan van een geneste loop.

Voorbeeld

clear all

for k = 1:8

for l = 1:8

A(k,l) = k+l-1;

end;

end; (twee keer end!)A (voor het resultaat)

Hiermee wordt de 8×8 matrix A met Akl = k + l − 1 geconstrueerd.(Nu wordt het wel echt vervelend de puntkomma in de loop weg te laten.)

19

Opmerking:

Vermijd for-loops als er een (efficienter) alternatief voorhanden is. Onder anderedoor handig gebruik van het Matlab commando : is dit vaker mogelijk dan je (vooralde wat meer ervaren programmeur !) zou verwachten, en het kan de rekentijd aan-zienlijk bekorten.

Voorbeeld

Zoals in de eerste introductie beschreven, kun je de som van de eerste N kwadratenook berekenen met de commando’s:

v = 1:N;

enen = ones(N,1);

kwad = v.^2;

somkwad = kwad*enen

of zo je wilt (maar leesbaarder wordt het er niet op) als:

somkwad = ((1:N).^2)*ones(N,1)

Met de commando’s tic en toc kun je de verstreken tijd in beeld krijgen.Neem om de gedachte te bepalen N = 10000.Voeg in de m-file som.m (van voorbeeld 1) als eerste regel toe:

tic

en als laatste regel

toc

en verander de waarde 50 door de waarde 10000.Voer het programma uit.Vergelijk dit met het volgende ‘programma’:

N= 10000;

tic; somkwad = ((1:N).^2)*ones(N,1), toc

Voor de volledigheid (en misschien begin je er ook wel lol in te krijgen) noemen wede while- en de if-statement.Heb je er geen lol in c.q. tijd voor, dan is dit voor jou het eind van de introductie.Blader door naar de pagina met kop foutmeld.m, en zet vervolgens je tanden in deopgaven en opdrachten.

20

3.2 while-loops en if ... else

Met het commando

while cond<opdrachten>;

end;

wordt de serie opdrachten uitgevoerd zolang voldaan is aan de voorwaarde cond.De voorwaarden zullen zijn van het type n < N, n = p, n 6= m, of combinatieservan. De volgende tabel geeft een overzicht van de ‘logische operatoren’:

n > m n is groter dan m;n < m n is kleiner dan m;n >= m n is groter dan of gelijk aan m;n <= m n is kleiner dan of gelijk aan m;n == m n is gelijk aan m;n ~= m n is niet gelijk aan m;

A & B A en BA | B A of B (evt. beiden)

(logische ‘of’)xor(A,B) A of B, maar niet beiden

(exclusieve ‘of’)~A ontkenning van A (‘niet A’)

De logische operatoren, die elementsgewijs werken, kunnen twee waardenopleveren: 0 en 1. 1 staat voor ‘waar’ en 0 staat voor ‘onwaar’.Probeer eens uit:

2 == 3

waarde = [1 3 5] <= [1 2 6]

x = sqrt(10); x > 2 & x < 3

x = 1:10, w = ( sin(x) > 0.5 | sin(x) < -0.5 )

Oefening

Hoeveel van de getallen sin(1), sin(2), sin(3), . . . . . , sin(1000) zijn groter dan 0.5 ?

(Antwoord: 332 )

21

Opmerking

Met een while-loop kan een for-loop nagebootst worden:

k = 1;

while k < n

<opdrachten>;

k = k+1;

end;

heeft dezelfde werking als:

for k = 1:n

<opdrachten> ;

end;

N.B. Kom je er tijdens het rekenen achter dat er iets misgaat, (met name bij eenwhile-loop ligt het gevaar van een ‘oneindige’ loop op de loer), dan kun je hetrekenproces stopzetten met de toetsen [Ctrl]+C of [Ctrl]+[Break].

(Voorbeeld: n = 1; while n > 0 n = n+1; end; )

Behalve met de zojuist genoemde ‘noodstop’, kun je met de volgende commando’shet rekenproces tijdens een loop in de gaten houden en beınvloeden:

disp(’tekst’) toont de tekst tekst op het scherm.

disp(X) toont de inhoud (zonder de naam) van matrix X.(X zal in het algemeen een ‘tekstvector’ zijn.)

x = input(’tekst’) toont tekst op het scherm en wacht op een waardevan de gebruiker (gevolgd door Enter), en kent deze waardeaan x toe. (Indien de gebruiker direct Enter geeftdan wordt x de lege matrix.)

[x,y] = ginput(n) (‘graphical input’) vraagt n punten (xi, yi),die worden opgeslagen in de vectoren x en y.De gebruiker clickt de punten aan met de muis.

[x,y] = ginput gaat door met punten op te slaantot de gebruiker Enter geeft.

pause onderbreekt een loop tot de eerstvolgende toetsaanslag(bijv. handig na disp )

pause(n) onderbreekt de loop n seconden(bijvoorbeeld om even een tussenresultaat te bekijken).

break breekt een loop af.

error(’tekst’) breekt een loop af en geeft tevens de (fout)melding tekst.

22

if ... else

Met het commando

if cond<opdrachten A>;

else

<opdrachten B>;

end;

wordt eerst gekeken of aan de voorwaarde cond is voldaan.Zo ja, dan worden de opdrachten A uitgevoerd, zo nee, opdrachten B.

Het gedeelte else ... mag ontbreken, en het mag ook op zijn beurt een ‘vertak-king’ geven. De constructie gaat er dan als volgt uitzien:

if cond.A <opdrachten A>;

elseif cond.B <opdrachten B>;

else <opdrachten C>;

end;

Voorbeelden

Het volgende ‘programma’ slaat de kwadraten onder de duizend op in devector kw.

n = 1;

while n^2 < 1000

kw(n) = n^2;

n = n+1;

end;

kw

En met het volgende wordt gekeken of de elementen van vector x naar groottegeordend zijn :

L = length(x); k = 1; Geordend = 1;

while Geordend & k < L

if x(k) > x(k+1)

Geordend = 0;

else

k = k+1;

end;

end; (x is geordend ⇐⇒ Geordend = 1)

23

Opmerkingen (Voor diegenen die geprogrammeerd hebben in Pascal, Algol, ...)

1. In for- en while-loops geen do gebruiken,en bij de if ... else - constructie geen then.

2. Bij een voorwaarde van het type ‘A is gelijk aan B’A == B gebruiken, en niet A = B.Het laatste geeft de nogal vage foutmelding: missing variable or function

3. Matlab kent ook een case-constructie. Zo je wilt: raadpleeg help case.

24

4 Algemene commando’s

Nog even op een rijtje gezet een aantal commando’s om een soepele omgang metMatlab te bewerkstelligen.

clc maakt het command window leeg(maar de toegekende waarden blijven actief)

clg leegt alle plot-windowsdiary bewaart de tekst van een Matlab-sessiesave fname var slaat de waarde van de variabele var ‘extern’ op in de

file fname of fname.matload data.dat laadt variabele data (of data.mat)cd naam directory naam wordt de nieuwe working directorydir geeft de inhoud van de directory waarin u werkthelp comm geeft hulp bij het commando commwhat geeft de M-, Mat- en MEX-files uit de huidige directorylookfor naam doorzoekt de eerste ‘comment’-regels van

alle M-files. Voorbeeld: lookfor zeros

who geeft lijst met actieve variabelen in de huidige Matlab-sessiewhos als who maar met extra informatieclear variabele verwijdert genoemde variabeleclear all verwijdert alle variabelendisp ‘tekst’ toont tekst op het scherm (de commando’s

T = ’tekst’; disp(T) geven hetzelfde resultaat)format stelt de vorm van de output in

(opties: long, short, bank, compact, loose)

Verder kun je vanuit Matlab externe commando’s uitvoeren door ze vooraf telaten gaan door een uitroepteken.

Voorbeeld

(Als je in een DOS-omgeving werkt) !copy file1 file2

!cd en !dir kunnen wel eens problemen geven, vermoedelijk omdat cd en dir ookMatlab-commando’s zijn.

Tenslotte: is de hier gegeven uitleg te summier, dan kan de help-functie wellichtuitkomst bieden.

26

5 Oefeningen

Voor oefening 1 t.e.m. 4 die van harte aanbevolen zijn, heb je alleen for-loops no-dig.Bij oefening 6 t.e.m. 8, bedoeld voor liefhebbers, is het gebruik van if en while

aan te raden.

1. Voer de volgende matrices A en B in met behulp van een of meer loops.

A =

1 3 5 ...... 151 3 5 ...... 151 3 5 ...... 151 3 5 ...... 15: : : ...... :: : : ...... :: : : ...... :1 3 5 ...... 15

(15 rijen), B =

1 2 3 4 ... 91 4 9 16 ... 92

1 8 27 ... ... 93

1 16 81 ... ... 94

1 32 ... ... ... 95

... ... ... ... ... ...

... ... ... ... ... ...1 ... ... ... ... 99

.

2. n! (spreek uit ”n faculteit”) is gedefinieerd via: n! = n(n−1)(n−1) . . . . ·3·2·1(en apart: 0!= 1 ).

Bereken de som van de eerste eenentwintig getallen1

n!: S =

20∑n=0

1

n!

(Antwoord (via format long ): S = 2.71828182845905 )

3. Construeer de 30 bij 30 matrix A met op de hoofddiagonaal 2-en, direct bovenen onder de diagonaal 1-en, en verder overal 0-en.Doe dit op twee manieren:

(a) Met behulp van het commando diag(.., ..):als v een (rij- of kolom-)vector is van lengte m, dan wordt met

V = diag(v, k)

een vierkante matrix V geconstrueerd met v als k-de nevendiagonaal, enmet verder overal 0-en.

(b) Via enkele loops. (Begin met het invoeren van een 30×30 nulmatrix.)

(Een derde mogelijkheid is: met een dubbele loop waarin via if

verschillende gevallen onderscheiden worden.)

Bekijk ter controle de 5× 5 rechter-onder-matrix, en bereken de determinantvan A. (Antwoord: 31)

27

4. In hoofdstuk 3 moduul 1 is als beste eerste-orde-benadering van een functie delinearisering ingevoerd. In moduul 2 bekijken we hogere orde benaderingen,en dan blijkt de beste benadering van sin x met polynomen van graad ≤ 2n+1gegeven te worden door het polynoom

t2n+1(x) = x− x3

3!+ x5

5!− ... + (−1)n x2n+1

(2n + 1)!

In deze opgave bekijken we grafieken van tn voor verschillende n.

Neem om te beginnen n = 4 en interval I = [−5, 5]. Voer in:

x = -5:.1:5;

t9 kun je natuurlijk invoeren via:

t9 = x - x.^3/6 + x.^5/120 - x.^7/(120∗6∗7) + x.^9/(120∗6∗7∗8∗9)maar voor grotere n wordt zoiets al snel ondoenlijk.We kiezen een slimmere aanpak, gebruik makend van de ’gelijkvormigheid’ vande termen die gesommeerd moeten worden:

term = x; t9 = term;

term = -term.∗x.^2/(2∗3); t9 = t9 + term;

term = -term.∗x.^2/(4∗5); t9 = t9 + term;

term = -term.∗x.^2/(6∗7); t9 = t9 + term;

term = -term.∗x.^2/(8∗9); t9 = t9 + term;

De laatste vier regels lenen zich prima voor het gebruik van een for-loop!

(i) Voer bovenstaande uit. Let goed op hoe je de loop-variabele, zeg k ge-bruikt (met name wat de begin- en eindwaarde moeten zijn).

(ii) Bekijk sin x en t15(x) op het interval [-5, 5] en op het interval [-8, 8].Bekijk ook de verschilfunctie om te zien hoe groot de afwijking maximaalis.

(iii) Bekijk sin x en t25(x) op het interval [-10, 10] en op het interval[-12, 12]. Mooi he!

Terzijde

Een handig commando om polynomen in te voeren is polyval:Laat v = [v1, v2, v3, ... , vk] en x vectoren zijn. Dan is

y = polyval(v,x)

equivalent met

y = v(k) + v(k-1)∗x + v(k-2)∗x.^2 + ... + v(1)∗x.^(k-1)Hetgeen overigens veel efficienter berekend wordt via:

y = (( ... (((v(1)*x+ v(2)).*x + v(3)).∗ ..... ).*x + v(k)

(Ter vergelijking: 2x3 + 5x2 − 3x + 7 = ((2x + 5)x− 3)x + 7 )

28

5. (Lagrange-polynomen)

Deze opgave geeft nog wat extra oefenmateriaal. Op de volgende pagina vindje een korte uitwerking.Gegeven n + 1 verschillende getallen x0, x1, x2, ..., xn in R, en n + 1 nietnoodzakelijk verschillende y-waarden y0, y1, y2, ..., yn. We willen een polynoomvan zo laag mogelijke graad berekenen dat door alle n + 1 punten (x0, y0),(x1, y1), . . . . , (xn, yn) gaat.We gaan daartoe als volgt te werk:Het gezochte polynoom p moet voldoen aan de n + 1 eisen p(xi) = yi,dus het ligt voor de hand om te proberen:p(x) = a0 + a1x + a2x

2 + . . . + anxn.

Invullen van de n+1 gegeven punten levert voor de coefficienten a0, ... , an hetvolgende stelsel vergelijkingen:

a0 + a1x0 + a2x20 + ... + anx

n0 = y0

a0 + a1x1 + a2x21 + ... + anx

n1 = y1

: : :: : :: : :

a0 + a1xn + a2x2n + ... + anx

nn = yn

Oftewel:

1 x0 x2

0 ..... xn0

1 x1 x21 ..... xn

1

1 x2 x22 ..... xn

2

: : : :: : : :1 xn x2

n ..... xnn

a0

a1

a2

::

an

=

y0

y1

y2

::

yn

.

Aangetoond kan worden dat de coefficientenmatrix van dit stelsel niet singulieris, als de ‘steunpunten’ x0, x1, x2, ..., xn verschillend zijn.

Neem bijv. de zes punten (-2, 3), (-1, 5), (0, 2), (1, 2), (2, 0) en (4, -2).Gezocht is nu het polynoom p5(x) van graad ≤ 5 door deze punten.

(i) Sla de x-waarden op in x, en de y-waarden in y en plot de zes puntenmet de plot-optie *.

(ii) Voer de coeff. matrix A op een handige manier in. Controleervoordat je gaat rekenen of de gegevens goed zijn ingevoerd!

(iii) Bereken de coefficienten a0, ...., a5 via het commando u = A\y.(y moet een kolom zijn.)

(iv) Vorm nu het polynoom p5, waarvan de coefficienten in u zijn opgeslagen.(Zie opg. 4)

(v) Bekijk het resultaat:

hold on;

plot(t,p5)

29

6. (‘bubble sort’)Schrijf een function file sorteer.m die de elementen van een vector x naaroplopende grootte sorteert, en wel op de volgende wijze:– ‘doorloop’ de vector x van voor naar achter,– en verwissel ‘buren’ die niet in de juiste volgorde staan,– houdt met een variabele change bij of er verwisselingen plaatsvinden,

zo nee, dan is x geordend, zo ja, herhaal de stappen.

Overigens, Matlab bevat een veel sneller sorteercommando: sort.

7. (Nulpuntsbepaling via bisectie)De functie f : R → R, met f(x) = x + exp(x) heeft een nulpunt p op hetinterval [-2, 0]. Gevraagd wordt p te benaderen tot op 5 decimalen achter dekomma, door herhaalde halvering van het interval [-2, 0] tot een interval [a, b]van lengte kleiner dan 2·10−5 dat nulpunt p bevat.Het midden c = (a + b)/2 wijkt dan hoogstens 10−5 van p af.Ga bijvoorbeeld als volgt te werk:stel om te beginnnen a = -2; b = 0; err = 2;

Laat c het midden zijn van [a, b], bereken f(c),stel a = c dan wel b = c,al naar gelang f van teken wisselt tussen c en b, of tussen a en c.Halveer err en herhaal deze stappen totdat err kleiner is geworden dan 2·10−5.

Ook hier: Matlab heeft ingebouwde commando’s roots (voor nulpunten vanpolynomen) en fzero.

8. Neem een willekeurig positief geheel getal p groter dan 1.Als p even is: deel p door 2,als p oneven is: vermenigvuldig p met 3 en tel er 1 bij op.Herhaal dit proces tot het resultaat 1 is.Het is een open vraag uit de getaltheorie of dit proces altijd eindigt, c.q. hetgetal 1 altijd bereikt wordt.Twee commando’s voor ‘integer division’ (n en k zijn gehele getallen):

r = rem(n,k) geeft de rest r bij deling van n door k: n = q·k + rq = floor(n/k) geeft bovengenoemde q.

a. Na hoeveel stappen wordt 1 bereikt als p = 99 ?(Maak een M-file grow.m.)

b. Wat is de hoogste tussenwaarde die voor een startwaarde p=99 bereiktwordt?

c. Wat is de hoogste tussenwaarde die voor een startwaarde p kleiner dan100 bereikt wordt, en voor welke p gebeurt dit?

30

6 Opdrachten

In het verleden was er een verplicht Matlab-practicum waarin iedere student (onderanderen) vijf van de volgende opdrachten moest beantwoorden en inleveren. Ze zijntoegevoegd als extra (en eenvoudig) oefenmateriaal.

In een opdracht wordt een print (of twee prints) van een kromme gevraagd. Bij deandere opdrachten is het voldoende de antwoorden in een .m-file te zetten en dievervolgens net als een plot uit te printen (nl. door aanclicken van File Print ).Hiertoe copieer je eerst de relevante zaken vanuit het Command Window naar de‘verslag .m-file’. Dit gaat als volgt:

— zet de mouse-pointer aan het begin van het te copieren gedeelte;

— houd de linkerknop van de muis ingedrukt terwijl je de mouse-pointernaar het einde van het te copieren gedeelte schuift. Laat daar los;

Het ‘ge-highlighte’ (zwartgemaakte) gedeelte kan gecopieerd worden door

— Edit Copy aan te clicken (of Edit Cut als je de tekst op de oorspronkelijkepositie weggegooid wilt hebben.),

— de muis naar de positie (eventueel in een ander window) te verplaatsen waarje de tekst wilt hebben, en vervolgens

— Edit Paste te geven.

(De zogenaamde shortcut keys Ctrl-C, Ctrl X en Ctrl-V hebben hetzelfde effect alsEdit Copy, Edit Cut resp. Edit Paste.)

In elke opdracht geldt: c1c2c3c4c5c6 is je zes-cijferige studienummer. Met eenparameter als c2c3c4 wordt bedoeld het getal met de drie cijfers c2, c3 en c4.Op de volgende wijze bepaal je jouw vijf opdrachten:

Laat vk = ck +2ck+1, k = 1, 2, 3, 4, 5 en rk = vk (mod 4) (de rest bij deling door4; dus rk =0, 1, 2, of 3). Het k-de opdrachtnummer wordt: 5rk + k.

Ingewikkeld? De volgende commando’s doen precies wat nodig is:

� c = [c1 c2 c3 c4 c5 c6];

� v = c(1:5) + 2*c(2:6); r = rem(v,4);

� nrs = 5*r + (1:5)

en de vijf opdrachtnummers verschijnen in beeld.

32

Opdrachten

1. A is de 24× 24 matrix met in de eerste rij en in de eerste kolomc1 c2 c3 c4 c5 c6 c1 c2 ..... c6, op de diagonaal c1, 1, −1, 1, . . . . , −1, 1en verder overal 0-en. (Handig invoeren die hap!) Bereken de determinantvan A. (Vind zelf het commando om de determinant te berekenen. Vergeetbij dit commando niet de haakjes.)

2. Laat a1 = c1c2c3 en a2 = c4c5c6.Laat verder, voor n > 2 an+1 = 2

3an + 2

5an−1.

Bereken a99 en a100 tot drie cijfers achter de komma.Let bij gebruik van een loop op de onder- en de bovengrens!

3. Construeer als volgt vector v:laat n = 10 · (c1 + c2 + c3 + c4), h = π/n,dan wordt v = (sin(h), sin(2h), sin(3h), . . . . . , sin(nh) ).Bereken p = v1 · v2 + v2 · v3 + . . . . + vn−1 · vn

en ook de maximale coordinaat van w = ( |v1 · v2|, |v2 · v3|, . . . , |vn−1 · vn| ).

4. Neem p = 1.c1c2, q = 2.c3c4.(Bijv. bij studienr. 123456: p = 1.12, q = 2.34 )Maak een tabel van de functies f(x) = sin(px) en g(x) = x cos(qx) op hetinterval [0, 6] met stapgrootte 0.3.

M.a.w.: 0.0 f(0.0) g(0.0)0.3 f(0.3) g(0.3).. .. .... .. .... .. .... .. ..

6.0 f(6.0) g(6.0)

5. Laat a het grootste cijfer zijn van je studienummer en b het kleinste. Laatc = a − 2, en d = b + a + 1. Geef in een plaatje de volgende twee Lissajoux-krommen weer:{

x(t) = cos(at)y(t) = sin(ct)

en

{x(t) = cos(at + π/d)y(t) = sin(ct)

Neem het interval zo groot dat er de krommen gesloten zijn, en gebruik ver-schillende lijn-stijlen.

33

6. Gevraagd wordt van de volgende matrix A de determinant te berekenen.A is een 24× 24 matrix met op de diagonaal c1 c2 c3 c4 c5 c6 c1 c2 . . . . . c6,direct boven en onder de diagonaal 1-en en verder overal 0-en. (Handiginvoeren die hap!)(Vind zelf het commando om de determinant te berekenen. Vergeet bij ditcommando niet de haakjes.)

7. Neem α = 3.c2. De rij 〈xn〉n is gedefinieerd door x0 = c3c4 en x1 = c5c6,en voor n ≥ 1: xn+1 = α ·

√3xn + 2xn−1. Bereken x14 en x15 tot op 14

decimalen nauwkeurig.Let bij gebruik van een loop op de onder- en de bovengrens!

8. Construeer als volgt vector v:laat n = 10 · (c1 + c2 + c3 + c4), h = π/n,dan wordt v = (cos(h), cos(2h), cos(3h), . . . . . , cos(nh) )Bereken A = (v1− v2)

2 +(v2− v3)2 + . . . . , (vn−1− vn)2, alsmede de maximale

coordinaat van w = ( |v1 − v2|, |v2 − v3|, . . . , |vn−1 − vn| ).

9 Neem p = 1.c1c2, q = 0.c3c4c5.(Bijv. bij studienr. 123456: p = 1.12, q = 0.345 )Maak een tabel van de functies f(x) = xe(−px) + x en g(x) = eqx/x op hetinterval [1, 5] met stapgrootte 0.2.

M.a.w.: 1.0 f(1.0) g(1.0)1.2 f(1.2) g(1.2).. .. .... .. .... .. .... .. ..

5.0 f(5.0) g(5.0)

10. Laat a het grootste cijfer zijn van je studienummer en b het kleinste.

Laat R = a+b, r = a–b–2 , α = R− rr enβ = R + r

r .

(Als r toevallig kleiner zou worden dan 3: neem r = 3.)Geef in een plaatje de volgende ’Spirograaf-figuren’ weer

K1 :

{x(t) = (R− r) cos(t) + r cos(αt)y(t) = (R− r) sin(t) + r sin(αt)

en K2 :

{x(t) = (R + r) cos(t) + r cos(βt)y(t) = (R + r) sin(t) + r sin(βt)

Neem het interval zo groot dat de krommen gesloten zijn, zorg dat de verhou-ding x:y gelijk is aan 1:1, en gebruik verschillende lijn-stijlen.

34

11. A is de 24× 24 matrix met op de diagonaal c1 c2 c3 c4 c5 c6 c1 c2 . . . . . c6,direct boven en onder de diagonaal 2-en en verder overal 1-en. (Handiginvoeren die hap!)Bereken de determinant van A. (Vind zelf het commando om de determinantte berekenen. Vergeet bij dit commando niet de haakjes.)

12. Laat a1 = 0.c3c4c5, en an+1 = 3.5an(1− an), n ≥ 1.Bereken a74 en a75 tot 10 cijfers achter de komma.Let bij gebruik van een loop op de onder- en de bovengrens!

13. Construeer als volgt vector v:laat n = 10 · (c1 + c2 + c3 + c4), h = 3/n,dan wordt v = (cos(h), cos(2h), cos(3h), . . . . . , cos(nh) )

Laat w = (v2

v1

,v3

v2

, . . . ,vn

vn−1

).

Bereken A = (w1)2 + (w2)

2 + . . . . . (wn−1)2 en ook

het minimum M van {w1, w2, w3, . . . , wn−1 }

14. Neem p = 1.c1c2, q = 0.c3c4c5.Maak een tabel van de functies f(x) = x2e(−px) +x en g(x) = eqx/(x+1) ophet interval [0, 4] met stapgrootte 0.2.

M.a.w.: 0.0 f(0.0) g(0.0)0.2 f(0.2) g(0.2).. .. .... .. .... .. .... .. ..

4.0 f(4.0) g(4.0)

15. We bekijken de kromme die een punt doorloopt dat meebeweegt met een wieldat over een horizontale weg loopt. Het wiel heeft straal R, en het punt begintzich op afstand d van de as. (d kan groter zijn dan R, denk bijvoorbeeld aaneen treinwiel over een rail, en als d=R dan doorloopt het punt een cycloıde.)

Een parametrisering voor de kromme{x(t) = Rt− d sin(t)y(t) = R− d cos(t)

Laat R = 1, d1 = 34R en d2 = b ·R, waarbij b = 1 + (c1 + c2)/40.

Geef in een plaatje de twee krommen weer met de gegeven waarden voor R end, waarbij het wiel twee volledige omwentelingen maakt. Gebruik verschillendelijn-stijlen.Maak ook een plot waarbij de assen zodanig gekozen zijn dat de verhoudingx:y ongeveer 1:1 is.

35

16. A is de 3×24matrix met als eerste rij vier keer (naast elkaar) c1 c2 c3 c4 c5 c6,als tweede rij [ 1 2 3 . . . . 24 ], en als derde rij [ 25 26 . . . 48 ]. (Handig invoe-ren die hap!)Bereken de determinanten van de matrices AAT en (AT A− I24). (Vind zelfhet commando om de determinant te berekenen. Vergeet bij dit commandoniet de haakjes.)

17. Laat a1 = c1c2c3 en a2 = c4c5c6.Laat verder, voor n > 2 an+1 = 1

2an + 1

2an−1 + 10.

Bereken a99 en a100 tot drie cijfers achter de komma.Let bij gebruik van een loop op de onder- en de bovengrens!

18. Construeer als volgt vector v:laat n = 2(c1 + c2 + c3 + c4 + c5 + c6),dan wordt v = (cos((1.1)2), cos((1.2)2), cos((1.3)2), . . . . . , cos((1 + n

10)2 )

Laat w = (w1, w2, . . . , wn−1 ) = ( |v1 − v2|, |v2 − v3|, . . . , |vn−1 − vn| ).Bereken A = (w1)

2 + (w2)2 + . . . . . + (wn−1)

2 en het maximumM van {w1, w2, w3, . . . , wn−1 }.

19. Neem p = 1.c1c2, q = 0.c3c4c5.(Bijv. bij studienr. 128756: p = 1.12, q = 0.875 )Maak een tabel van de functies f(x) = x sin(px) en g(x) = cos(qx2) op hetinterval [0, 6] met stapgrootte 0.3.

M.a.w.: 0.0 f(0.0) g(0.0)0.3 f(0.3) g(0.3).. .. .... .. .... .. .... .. ..

6.0 f(6.0) g(6.0)

20. Laat a = 14

+ c420

en b = 3 + 12(c5 + c6).

Teken de kromme gedefinieerd door z = e(a+bi)t, waarbij −2 ≤ t ≤ 4.Bereken de minimale waarde r en de maximale waarde R van |z|, en teken inhetzelfde plaatje de cirkels met middelpunt (0, 0) en stralen r resp. R.

36