3-D grafieken
Annotatie
Berekeningen op element niveau het . commando
Het tekenen van grafieken
Het wijzigen van matrix-elementen
Inwendig (dot) en cross product
Matrices
Ones, Zeros, Eye and Rand
Oplossen van stelsels lineaire vergelijkingen

Programmeren
Programmeren in Matlab
Structuurdiagram
Subplots
Variabelen en Workspace
Vector definities
Voorbeeld van een programma in Matlab



Benodigde dictaten/handleidingen:


 

Opzet:

Alles op ELO
 


 

Wat is Matlab eigenlijk ???

Het is een gebruikersvriendelijke werkomgeving waarin men o.a. de volgende bewerkingen kan uitvoeren:

Matlab = Matrix Laboratory
 

Men kan Matlab in eerste instantie beschouwen als een krachtige rekenmachine.

Het is bijvoorbeeld in staat eenvoudige berekeningen uit te voeren zoals:

Matlab kan echter ook wetenschappelijke berekeningen uitvoeren. Bijvoorbeeld sinus/cosinus/tangens, maar ook logaritme.
 

Maar dan moet wel de naam van de functie bekend zijn; hoe kan men de naam achterhalen ??

Lookfor ..... en help !!


Variabelen en Workspace.

In matlab kan handig gebruik gemaakt worden van variabelen.
Bijvoorbeeld:
 
De variabele A krijgt de waarde 10 toegekend.

De variabele B krijgt de waarde 15 toegekend.

De variabele C krijgt de waarde A+B/2 toegekend.
 

Voor namen van variabelen gelden de volgende regels:


Matlab kent een aantal speciale variabelen zoals:



Matrices.

De matrix is de basis voor matlab, maar hoe worden die aangegeven ??

Vector = (simple) array
 
Een rij-vector (zonder ;) Een kolom-vector (met ;)

Array elementen (= vector elementen) zijn op vele manieren te benaderen; hoofdzaak is, gebruik ronde haken ( ).
 
Stel A = [10 20 30 40 50 60 70 80]
Aanroep Geeft als resultaat
A(4) 40
A(1:3) 10 20 30
A(6:end) 60 70 80
A(3:-1:1) 30 20 10
A(2:2:7) 20 40 60
A([8 2 5 1]) 80 20 50 10



Vector definitie.
In het algemeen kunnen vectoren als volgt gedefinieerd worden:
 
X = [ 2  2*pi  sqrt(2)] Een array met 3 elementen wordt gecreëerd.
X = [start:end] Definieert een rijvector die begint bij start, steeds met de waarde 1 verhoogd wordt, totdat end bereikt is.
X = [start:stapgrootte:end] Definieert een rijvector die begint bij start, steeds met de waarde stapgrootte verhoogd wordt, totdat end bereikt is (nooit groter dan end)
X = linspace(start, end, N) Definieert een rijvector die begint bij start, en eindigt bij end. Dit traject wordt in N stappen onderverdeeld (stapgrootte is dus niet opgegeven) 
X = linspace(start, end) Definieert een rijvector die begint bij start, en eindigt bij end. Dit traject wordt in 100 stappen onderverdeeld (stapgrootte is dus niet opgegeven)
X = logspace(start, end, N) Definieert een logaritmisch verdeelde rijvector die begint bij 10start, en eindigt bij 10end. Dit traject wordt in N stappen onderverdeeld (stapgrootte is dus niet opgegeven) 



Getransponeerde.

Om van een rijvector een kolomvector te maken wordt de transpose-functie gebruikt. In matlab is dat '
 

 


Matrix = multi-dimensionale array
 
 
Rijen worden afgescheiden door ;
Alle rijen zijn even lang !

Mathematische berekeningen op element niveau.

Matlab kent een bijzondere symbool, het dot symbool. Deze wordt gebruikt om aan te geven dat bepaalde bewerkingen op element niveau moeten plaatsvinden.
 
A = [a1 a2 a3 ....an], B = [ b1 b2 b3 ......bn], C = constante
scalair som A + C = [a1+C a2+C ..... an+C]
scalair product A * C = [a1*C a2*C ..... an*C]
array som A + B = [a1+b1 a2+b2 .... an+bn]
array product  A.*B =  [a1*b1 a2*b2 .... an*bn]
array quotient (links) A./B =  [a1/b1 a2/b2 .... an/bn]
array quotient (rechts) A.\B =  [a1\b1 a2\b2 .... an\bn]
array machtsverheffen A.^C =  [a1^C a2^C ..... an^C]
C.^A =  [C^a1 C^a2 ..... C^an]
A.^B = [a1^b1 a2^b2 ..... an^bn]



Denk ook aan inwendig (dot) en cross product:

C = dot(a,b)        % inwendig product
C = cross (a,b)     % uitwendig product


Het wijzigen van matrix-elementen.

De afzonderlijke elementen van een matrix A zijn te bereiken via de notatie:
                A(rij-nummer, kolom-nummer)

 



Ones, Zeros, Eye and Rand

Er zijn ook speciale (standaard) matrices:
 



Let op:  de functie rand () levert getallen in het interval [2(-53), 1 - 2(-53)].
In de praktijk komt de nul niet, maar de één wel voor!!


Naast de rand functie bestaan ook de functie randi (integers) en randn (normaalverdeling).


Handige functies bij matrices.
 

Oplossen van stelsels lineaire vergelijkingen

Voor het oplossen van stelsels lineaire vergelijkingen kan men in Matlab de inverse van een matrix laten uitrekenen, maar er is nog een tweede mogelijkheid ..... \

I.h.a. geldt:

Ax = b Waarbij A een 'meer-dimensionale' vierkante matrix is en x en b kolomvectoren (zelfde aantal rijen als A.

Uit de lineare algebra is bekend dat een oplossing zou kunnen zijn:
x = Ainv * b (indien Ainv bestaat, en dus det(A) ongelijk aan nul is

In Matlab kunnen we de oplossing ook vinden met de formule:
x =  A\b  (let op: b is een kolomvector en we gebruiken 'backslash').

 

Voorbeeld twee snijdende lijnen

2x - 5y = 4
6x - 10y = 2
A = [ 2  -5; 6  -10]
b = [4;  2]
Substitutie methode
x = A\b x = Ainv * b

2x = 5y + 4
=>
3(5y + 4) - 10y = 2
15y + 12 -10y = 2
y = -2

2x = 5(-2) + 4
x = -3



Voorbeeld drie snijdende vlakken.

2x  + y  − z    =  −1
  x  + y  + z    =    6
3x  + 6y − 3z = −18
A = [2 1 -1; 1 1 1; 3 6 -3]
b = [-1; 6; -18]

Met de 'hand' vegen
x = A\b x = Ainv * b









Programmeren.

Programmeren: het goed stellen en vervolgens oplossen van een probleem.
 
 
 

Uitgangspunt: de probleemstelling.
Doel: een beschrijving van de oplossing.
 

Wanneer dit niet juist en/of onvolledig is, is een verdere uitwerking bij voorbaat ook fout.

Na de interpretatie van de probleemstelling dient zo nodig het geheel aangevuld te worden, waarna de zaak met de opdrachtgever wordt doorgesproken.
Na één of enkele malen kan de conclusie getrokken worden dat het probleem correct is gesteld.
Vervolgens dient er een oplossing gezocht te worden voor het probleem => Algoritme ontwikkelen.

Voor het formuleren van de oplossing is de computer of de taal waarin het programma aan de computer moet worden aangeboden niet van belang. 



Nadat een oplossing is bepaald en vastgelegd, dient deze te worden omgezet in een bepaalde taal die door de computer te lezen is => Coderen.

De computer kan het programma alleen uitvoeren als de formulering voldoet aan de regels die gelden voor de gebruikte taal (syntaxes).
De computer controleert allereerst of aan deze regels wordt voldaan en zet, als dit inderdaad het geval is, het programma om in een interne code => Vertalen.

Als de regels bij het coderen niet goed zijn toegepast, maakt de computer hier melding van en geeft een foutenlijst.



Nadat geconstateerd is dat het programma door de computer uitgevoerd kan worden, moet nagegaan worden of het resultaat van de uitvoering overeenkomstig de verwachting (vastgelegd tijdens de fase programmeren) is => Testen.



Een programma dat na verloop van tijd niet meer voldoet, moet worden aangepast.
 

Algoritmen.

Algoritmen vormen het fundament van de huidige computerwetenschap.
Een algoritme is een nauwkeurige omschrijving van een (eindig) aantal stappen die consequent achterelkaar uitgevoerd moeten worden om een bepaalde taak te verwezenlijken.
Anders geformuleerd:
Een algoritme is een verzameling regels voor het oplossen van een klasse van problemen in een eindig aantal stappen.

Algoritmen komen we ook in het dagelijks leven tegen zoals:


Een eenvoudig delingsalgoritme.

Stel dat we over een calculator beschikken waarop uitsluitend optellingen en aftrekkingen kunnen worden uitgevoerd.

Opgave: bepaal van twee positieve gehele getallen het quotiënt en de restterm (integerdeling).


Gezocht een nauwkeurig gedefinieerde reeks van regels die op eenduidige en eindige wijze aangeeft hoe we aan het quotiënt en de rest van deeltal en deler komen.

Neem als voorbeeld 17 gedeeld door 3 (is 5 rest 2 :-)
1e aftrekking:   17 - 3 = 14,    verschil ≥ 3. Ga verder
2e aftrekking:   14 - 3 = 11,    verschil ≥ 3. Ga verder
3e aftrekking:   11 - 3 = 8,      verschil ≥ 3. Ga verder
4e aftrekking:   8 - 3 = 5,        verschil ≥ 3. Ga verder
5e aftrekking:   5 - 3 = 2,        verschil < 3. Stop

Het quotiënt is gelijk aan het aantal malen dat 3 van 17 afgetrokken kan worden, totdat het resultaat kleiner is dan 3, de rest is het laatst verkregen verschil.

Let op de volgende kenmerken:
  1. Eenzelfde soort bewerking moet een aantal malen worden uitgevoerd (bepaal verschil);
  2. Na of voor een dergelijke bewerking moet een inspectie plaatsvinden of verdergaande herhalingen nodig is (verschil ≥ 3)
  3. Er vindt weliswaar een aantal malen eenzelfde soort bewerking plaats, maar één bij deze bewerkingen betrokken getal verandert voortdurend van waarde (17, 14, 11, ... monotoon dalend en dus eindigend).

Dit is een (nogal omslachtige) omschrijving van het delingsalgoritme. Zeker bij 'grotere' problemen loont het de moeite over te gaan op een meer schematische weergave => structuurdiagram.

Structuurdiagram.

Bij de formulering van het programma (ofwel de oplossing) wordt in deze fase nog geen gebruik gemaakt van een programmeertaal, maar van schema's..... Programma Structuur Diagrammen (PSD), ook wel Nassi-Schneidermanndiagrammen genoemd.

Opdrachten na elkaar => concatenatie


Voorwaardelijke of alternatieve opdrachten


 


Herhaling opdrachten (iteraties)



Case




Opgave: teken de structuurdiagram van een programma dat uitgaande van  twee positieve gehele getallen het quotiënt en de restterm (integerdeling) bepaalt.



Programmeren in matlab.

In de matlab werkomgeving is het mogelijk steeds weer terugkerende commando's op te nemen in zogenaamde script of M-files. Dit zijn leesbare ascii files waarin men matlab commando's achter elkaar plaatst.

De files worden M-files genoemd, omdat ze de extensie .m hebben.
Om een nieuwe M-file te maken wordt de optie 'new' uit
het file pulldown menu gekozen.
 

Bij het programmeren kan men als volgt te werk gaan:


Een aantal vaak voorkomende commando's zijn:
 
disp(ans) schrijft resultaat naar het scherm
input('string') vraagt de gebruiker om invoer
% alles na % wordt genegeerd
%{
  .
%}

voor veel commentaar over meerdere regels (block of comment).
 %{ moet echter wel op een lege regel worden ingetyped.
for, while loops; herhalingen
if .. else .. end keuze mogelijkheden
... hiermee wordt aangegeven dat een commando op de volgende regel doorgaat.
format hiermee wordt aangeven hoe de resultaten gepresenteerd zullen worden (het aantal decimalen). Dit heeft geen effect op de nauwkeurigheid van de berekeningen!
format short => 4 decimalen
format long  => 16 decimalen
format bank  => 2 decimalen (geld)
exist('naam') hiermee wordt gecontroleerd of een variabele/commando/bestand reeds bestaat.
zie help exist.



Voorbeeld 1.
Schrijf een programma in Matlab dat de gebruiker vraagt om de teller en noemer van een breuk en vervolgens de integer deling met restterm bepaald.

%
% MijnDeling
% Programma om de integerdeling uit te voeren.
%

% Haal eerst de invoer op
teller = input('Voer teller in: ');
noemer = input('Voer noemer in: ');

aantal = 0;
verschil = teller;

if(noemer > teller)
   
else
    while(verschil >= noemer)
        verschil = verschil - noemer;
        aantal = aantal + 1;
    end
end
%
% Let op: aangezien het disp commando alleen 'strings' kan verwerken moeten
% we eerst de getallen omzetten naar een 'string' m.b.v. het commando
% num2str
%
disp([num2str(teller), ' / ', num2str(noemer), ' = ' num2str(aantal), ...
    ' met restterm: ', num2str(verschil)]);



Test de M-file.
Om het programma te laten draaien kan men als volgt te werk gaan:









Het save and run icoon
b.
Voer in de command window de naam van de m-file in (laat de extensie .m weg).
Zorg er daarbij wel voor dat Matlab naar de juiste directory wijst. De gewenste directory kan via de optie 'Browse for folder' in de knoppenbalk worden ingesteld.

Voorbeeld 2.
Schrijf een programma dat de gebruiker vraagt om de lengten van twee zijden van een rechthoekige driehoek. Met behulp van deze invoer wordt vervolgens de lengte van de hypotenusa en de grootte van de ingesloten hoeken bepaald.

Stap 1: teken een structuurdiagram.



Stap 2: begin een nieuwe M-file.

 
%
% Zorg ervoor dat elke file voorzien is van voldoende 
% commentaar zodat later  eenvoudig kan worden achterhaald
%  wat de functie was.
%
% Vraag eerst om de invoer van de gebruiker.
x = input('Lengte van eerste zijde is: ');
y = input('Lengte van tweede zijde is: ');

% Bereken nu de lengte van de hypotenusa m.b.v. Pythagoras
z = sqrt(x^2 + y^2);

% Bereken de hoek alpha (omzetten van radialen naar graden)
alpha = atan(y/x)*(180/pi);

% Bereken de hoek betha (omzetten van radialen naar graden)
betha = atan(x/y)*(180/pi);

%controleer het resultaat.
if (abs(alpha + betha - 90) > 0.1) 
    disp('Er is iets misgegaan bij de berekening !')
else
    disp(['De lengte van de hypotenusa is: ' num2str(z)])
    disp(['De hoek alpha is: ' num2str(alpha) ' graden'])
    disp(['De hoek betha is: ' num2str(betha) ' graden'])
end 

 

Deel het programma in 
logische blokken in. 
Later zullen we aparte functies 
gaan gebruiken.

Stap 3: test de M-file.
Om het programma te laten draaien kan men als volgt te werk gaan:







Het save and run icoon




Tekenen.

Om grafieken te tekenen kan men de commando's plot of line gebruiken.

Bijvoorbeeld:
    x = linspace (0, 2*pi, 60);    % de ; voorkomt echo van x
    y = sin(x);
    plot (x,y)


 

Een vergelijkbaar resultaat is ook te verkrijgen via:
    x = linspace (0, 2*pi, 60);    % de ; voorkomt echo van x
    y = sin(x);
    line (x,y)


Annotatie in figuren / meerder grafieken.

Om annotatie in figuren aan te brengen kan gebruik gemaakt worden van de volgende commando's:
 
Title('Tekst') De opgegeven string komt boven het figuur te staan.
Xlabel('Tekst') De opgegeven string komt langs de X-as te staan.
Ylabel('Tekst') De opgegeven string komt langs de Y-as te staan.
Text(x, y, 'Tekst') De opgegeven string komt op de opgegeven positie te staan (x, y).
legend('Tekst1', 'Tekst2') Maakt een legende met de opgegeven teksten.



Subplot.

Om meerder grafieken in één figuur aan te brengen wordt het commando subplot gebruikt:
 
subplot(a, b, 1) Dit wordt een figuur bestaande uit a rijen, met per rij b kolommen. 
De hierna volgende commando's hebben betrekking op de eerste grafiek.

Hier volgt een voorbeeld:

x = [0:pi/100:2*pi];
y = sin(x);
z = cos(x);
 
subplot(2,2,1);
plot(x,y,'r-.') 
xlabel('x = 0:2\pi')
ylabel('Sin(x)')
title('Sinus functie')
Definitie van de eerste grafiek.

Kleur wordt rood; 
lijntype is dash-dot

subplot(2,2,2);
plot(x,z,'mp') 
xlabel('x = 0:2\pi')
ylabel('Cos(x)')
title('Cosinus functie')
Definitie van de tweede grafiek.
Kleur wordt magenta; 
marker symbool is pentagram.
De \pi zorgt ervoor dat er een echte  wordt gebruikt.
subplot(2,2,3);
plot(x,y,x,z)
xlabel('x = 0:2\pi')
ylabel('Sin(x) / Cos(x)')
title('Sinus en Cosinus functie')
legend('Sin(x)', 'Cos')
Definitie van de derde grafiek.
Zowel de sinus als cosinus functie wordt getekend.

Tevens wordt een legende aangebracht.

subplot(2,2,4);
plot(x,y,'r:',x,z,'k.')
xlabel('x = 0:2\pi')
ylabel('Sin(x) / Cos(x)')
title('Sinus en Cosinus functie')
grid on;

text(1.6*pi+0.1*pi,cos(1.6*pi),'cos(x)');

Definitie van de vierde grafiek.
Zowel de sinus als cosinus functie wordt getekend.
De sinus functie wordt echter in het rood en gestippeld getekend.
De cosinus functie wordt in het zwart met punten getekend.
Tenslotte wordt ook de tekst 'cos(x)' aangebracht.

 In  onderstaand figuur wordt het resultaat getoond.


 


Mesh.

Naast lijn-plots kunnen in Matlab ook oppervlakte-plots worden getekend. Hiertoe wordt het mesh commando gebruikt.

In de meest eenvoudige vorm ziet het mesh commando er als volgt uit:
mesh(X, Y, Z) waarbij:

De elementen van matrix Z komen dan als volgt tot stand:
neem Y constant(rijnummer), laat X variëren en schrijf in de daarmee overeenkomende kolom de bijbehorende Z waarde.




Opdracht:
teken een mesh evenwijdig aan het XY-vlak op hoogte Z = 1.








Een mogelijke oplossing is:

x = [0 1 2 3]
y = [0 1 2]

z moet een 3 x 4 matrix worden immers length(y) = 3 en length(x) = 4. Verder moet de hoogte gelijk zijn aan 1.

        => z = ones(3,4)

Het resultaat wordt in onderstaand figuur getoond.
 


Op analoge wijze is onderstaand resultaat verkregen.