19.07.2014 Views

Övningstillfälle 1: Introduktion till MatLab

Övningstillfälle 1: Introduktion till MatLab

Övningstillfälle 1: Introduktion till MatLab

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Linköpings universitet <strong>Övnings<strong>till</strong>fälle</strong> 1 & 2<br />

Institutionen för Teknik och Naturvetenskap<br />

<strong>Introduktion</strong> <strong>till</strong> <strong>MatLab</strong><br />

Mika Gustafsson<br />

Nätverk<br />

Tillfälle 1 och 2<br />

<strong>Introduktion</strong> <strong>till</strong> <strong>MatLab</strong><br />

Start: <strong>MatLab</strong> startas genom dubbelklickning på dess ikon.<br />

Kommandon: Kommandon i <strong>MatLab</strong> skrives <strong>till</strong> höger om >> . Denna kommer i<br />

fortsättningen att beteckna att det är ett <strong>MatLab</strong>-kommando. För att <strong>MatLab</strong> ska utföra ett<br />

kommando avslutar man med enter-knappen. Vill man skriva in flera kommandon efter<br />

varandra kan man särskilja dem med ett kommatecken eller semikolon. Dessa får <strong>MatLab</strong><br />

att göra de olika kommandona efter varandra med början av det kommando som står längst<br />

<strong>till</strong> vänster osv. Semikolonet hindrar dessutom <strong>MatLab</strong> att skriva ut svaret på kommandot.<br />

Hjälpfunktion: <strong>MatLab</strong> har också en mycket välutvecklad hjälpfunktion, vilken man enkelt<br />

kan söka i efter de kommandon man vill veta mer om, eller om det finns ett kommando som<br />

gör vad man söker. <strong>MatLab</strong>s hjälpfunktion kommer man åt under ’<strong>MatLab</strong> Help’ under<br />

fliken ’Help’.<br />

<strong>MatLab</strong> som en kraftfull ”mini”‐räknare<br />

<strong>MatLab</strong> är i praktiken ett program som gör att du kan använda din dator <strong>till</strong> allt som din<br />

vanliga miniräknare kan göra plus en massa mera. Vi kommer i denna kurs inte använda<br />

<strong>MatLab</strong> <strong>till</strong> speciellt mycket mer än vad din miniräknare klarar av, men då datorn har<br />

mycket större kapacitet kan vi göra mycket mera kraftfulla beräkningar än vad som är<br />

möjligt enbart med en miniräknare. De fyra räknesätten klarar <strong>MatLab</strong> galant. Skriver man<br />

t.ex. >>5+3 i kommando-prompten matar <strong>MatLab</strong> ut: ans = 8 (fast på två rader).<br />

Övning 1.1: Testa själv att använda <strong>MatLab</strong> som en enkel kalkylator. Testa hur de fyra<br />

1+<br />

2<br />

räknesätten fungerar. Försök sedan få <strong>MatLab</strong> att räkna ut korrekt (tips: använd<br />

3 + 4<br />

parenteser). Testa även ”upphöjt” vilket i <strong>MatLab</strong> (precis som på många miniräknare) skrives<br />

^.<br />

Ibland vill man som bekant göra mera avancerade uträkningar som involverar t.ex.<br />

logaritmering, exponentiering, beräkna någon trigonometrisk funktions värde eller dylikt.<br />

Dessa funktioner finns givetvis implementerade i <strong>MatLab</strong> och deras namn är listade i<br />

nedanstående tabell.<br />

Betydelse<br />

<strong>MatLab</strong>-kommando<br />

3<br />

e , ln(3), lg(100)<br />

exp(3), log(3), log10(100)<br />

5 sqrt(5) eller 5^(1/2)<br />

Övning 1.2: Testa ovanstående funktioner. Beräkna sedan nedanstående uttryck:<br />

a)<br />

5<br />

e + ln 3 + lg 7<br />

5<br />

5<br />

b)<br />

5<br />

e + ln 3 + lg 7<br />

3<br />

(tips: ↑-tangenten ger <strong>till</strong>baka den sista kommandoraden.)<br />

Du borde ha fått svaren: a) 0.0481, respektive b) 86.8086.<br />

Det är ofta man behöver använda en uträkning flera gånger, eller att spara ett delresultat i<br />

en uträkning. Man kan då spara värdet på en uträkning i en variabel. Detta är framförallt<br />

användbart om man vill upprepa en beräkning och endast ändra någon detalj, men även för<br />

1+ 2<br />

att dela upp en beräkning. Vill man t.ex. beräkna kan man dela upp beräkningen i<br />

3 + 4<br />

flera steg så att: >>a=1+2; b=3+4; c=a/b , vilket resulterar i att c=0.4286 skrivs på skärmen<br />

(inget annat av kommandona skrivs ut eftersom ; skiljer dem åt). Dessutom har man nu<br />

sparat a och b och kan använda dessa senare. Man kan även ha längre variabelnamn<br />

såsom skalfritt_natverk, men man får inte använda åäö eller specialtecken i namnet<br />

1


Linköpings universitet <strong>Övnings<strong>till</strong>fälle</strong> 1 & 2<br />

Institutionen för Teknik och Naturvetenskap<br />

<strong>Introduktion</strong> <strong>till</strong> <strong>MatLab</strong><br />

Mika Gustafsson<br />

Nätverk<br />

(undantaget _ ), ej heller mellanslag. Det är också viktigt att komma ihåg att <strong>MatLab</strong> skiljer<br />

på versaler och gemener, så att kommandoraden >>ab=1;Ab=2;aB=3;AB=4; resulterar i 4<br />

olika variabler.<br />

Övning 1.3: Gör om uppgift 1.2a) och 1.2b), genom att först <strong>till</strong>dela en variabel värdet<br />

5<br />

e + ln 3 + lg 7 och använd sedan denna variabel i uträkningarna.<br />

Att rita figurer i <strong>MatLab</strong><br />

En annan viktig sak när man studerar olika typer av problem är att kunna visualisera sina<br />

resultat. Detta kan man göra m.h.a. en figur, vilket fås genom<br />

>>plot(koordinat1,koordinat2), så ritar <strong>MatLab</strong> en snöflinga på den plats i fönstret som har<br />

koordinat1 som x-koordinat och koordinat2 som y-koordinat. Oftast (rättare sagt alltid) vill<br />

man dock rita upp flera värden i en graf, det är ju det som är själva poängen med<br />

visualisering.<br />

Detta gör man genom att skapa objekt med flera komponenter, t.ex. kan man skapa en s.k.<br />

vektor, V, med tre komponenter genom >> V1 = [5 9 11]. Denna har 5 som första<br />

komponent, 9 som andra och 11 som tredje. Låt oss nu skapa en annan vektor, V2,<br />

>>V2=[2 6 4] . Om vi nu ritar V1 på x-axeln och V2 på y-axeln, genom<br />

>> plot(V1,V2) , kommer vi att få en figur med tre snöflingor med koordinaterna (5,2), (9,6)<br />

och (11,4). Man kan också få <strong>MatLab</strong> att också dra raka linjer mellan punkterna genom att<br />

skriva >> plot(V1,V2,’*-’), eller bara linjerna genom kommandot >> plot(V1,V2,’-’). Det finns<br />

en hel uppsjö av extra valmöjligheter med plot-kommandot och de kan hittas i <strong>MatLab</strong>s<br />

hjälpfunktion.<br />

Övning 1.6 Rita tre snöflingor med koordinaterna (1,2), (3,5), (6,9)<br />

Förbind dem med streck.<br />

Öppna hjälpfunktionen och sök reda på hur man kan skriva saker på axlarna och hur man<br />

kan skriva saker i figuren. (Tips: Funktionerna ni ska använda heter xlabel, ylabel och text.)<br />

Rita det förbindande strecket så tjockt som det går och blått.<br />

x<br />

Vi ska nu gå in på hur man kan rita upp en funktion y = e i <strong>MatLab</strong>. Man skulle ju helst<br />

bara vilja skriva plot(x,exp(x)), men vad är då x ? I er miniräknare går detta eftersom den<br />

själv delar upp x i diskreta punkter och ritar ut dessa i figuren. I <strong>MatLab</strong> måste man göra<br />

detta själv. Man skapar således ett objekt x som innehåller de punkter vi vill rita upp. Okej,<br />

vi vill ju rita funktionen så noggrant som möjligt och inte över ett alltför litet intervall. För<br />

att skapa ett sånt här objekt har <strong>MatLab</strong> ett snabbkommando, :. Vill vi att x ska börja med<br />

exempelvis 0 och sluta med 10 och innehålla alla punkter med 0.01 enheters mellanrum<br />

kan vi bara skriva:<br />

>> x = 0:0.01:10; , vilket alltså generar en vektor med utseendet<br />

[ 0 0.01 0.02 0.03 osv. <strong>till</strong> 9.98 9.99 10]. Semikolonet är bra att använda vid sådana här<br />

<strong>till</strong>fällen eftersom man annars får hela den långa vektorn utskriven. Nu kan vi skapa >><br />

y=exp(x); , vilket alltså blir en vektor med utseende [exp(0) exp(0.01) exp(0.02) exp(0.03)<br />

osv. <strong>till</strong> exp(9.98) exp(9.99) exp(10)] . Det går nu att rita funktionen genom >>plot(x,y,’-’) ,<br />

eller likvärdigt >> plot(x,exp(x),’-’) .<br />

Det viktigaste för vår del är att det går att skapa loglog-diagram och linlog-diagram (dvs.<br />

figur med båda respektive endast ena axeln, logaritmisk). Genom att istället för plot skriva<br />

loglog eller semilogy ritas figuren med logaritmiska axlar respektive enbart y-axel<br />

logaritmisk (samma sak som loglog-papper respektive linlog-papper). Det är förhoppningsvis<br />

bekant att exponentialfunktioner blir räta linjer i ett linlog-diagram. Annars följer en kort<br />

härledning nedan.<br />

kx<br />

Om y = A e (d.v.s. y är en exponentialfunktion) så gäller att<br />

kx<br />

kx<br />

ln y = ln( A e ) = ln A + ln e = ln A + kx ln e = ln A + kx , d.v.s. om man ritar x mot ln y så får vi en<br />

rät linje i ett vanligt diagram, eller ekvivalent om man ritar x mot y i ett linlog-diagram så får<br />

2


Linköpings universitet <strong>Övnings<strong>till</strong>fälle</strong> 1 & 2<br />

Institutionen för Teknik och Naturvetenskap<br />

<strong>Introduktion</strong> <strong>till</strong> <strong>MatLab</strong><br />

Mika Gustafsson<br />

Nätverk<br />

vi en rät linje. Vi ser också att linjens lutning är k och att ln A är det y-värde som svarar<br />

mot linjens skärning med y-axeln.<br />

En sådan ”linlog-plot” kan skapas genom kommandot >> semilogy(x,y) . Detta är av vikt<br />

för oss eftersom vi senare kommer att ha en vektor, vars uppförande vi gärna vill beskriva<br />

kvalitativt med hjälp av en funktion och vi då enkelt kan se om en exponentialfunktion kan<br />

komma ifråga.<br />

Nu <strong>till</strong> den andra (för oss) viktiga typen av funktion, nämligen potensfunktionen y = A x .<br />

Förhoppningsvis vet ni att den uppträder som en rät linje i ett loglog-diagram, vilket följer<br />

av den nedanstående resonemang:<br />

k<br />

k<br />

Om y = A x (d.v.s. y är en potensfunktion) så gäller att ln y = ln( A x ) = ln A + k ln x , så om man<br />

ritar ln x mot ln y så får vi en rät linje med lutning k och ln A är y-värdet vid skärningen på<br />

y-axeln för linjen.<br />

2<br />

Vi väljer nu den speciella potensfunktionen y = x . Denna kan studeras i en vanlig ’plot’<br />

med kommandot >>plot(x,x.^2), eller >>plot(x,x.*x) (om vi antar att x är definierad som<br />

ovan). Märk att vi måste skriva .^ istället för bara ^ och .* istället för bara * . Detta för att<br />

markera att varje komponent i vektorn x ska upphöjas med två, respektive multipliceras<br />

med motsvarande komponent i sig själv (detsamma gäller för /), mer om detta under nästa<br />

övnings<strong>till</strong>fälle. Detta måste man göra eftersom multiplikation mellan vektorer kan ha en<br />

annan betydelse. Om vi nu ritar ut vår funktion >>y=x.^2; i ett loglog-diagram så vet vi vad<br />

vi kan förvänta oss. Kommandot >>loglog(x,y) generar alltså en rät linje 1 . Det är därför ett<br />

användbart redskap att studera mätdata (givet som en vektor) i ett loglog-diagram för att<br />

detektera ett eventuellt potensuppförande (d.v.s. om komponenterna beter sig som<br />

något k).<br />

k<br />

x<br />

k<br />

för<br />

Övning 1.7<br />

a) Rita funktionen y=5x^(-3) för x mellan 1 och 10 i ett vanligt figurfönster,<br />

därefter i ett linlog-fönster och sedan i ett loglog-fönster. Förhoppningsvis<br />

såg du att funktionen avbildades som en rät linje i loglog-fönstret, det är<br />

också fullt möjligt att få <strong>till</strong>baks exponenten (-3) utifrån loglog-plotten.<br />

Denna uppträder i figuren som lutningen på den räta linjen, d.v.s.<br />

ln( y slut ) − ln( ystart<br />

)<br />

. Försök att få ut exponenten figuren!<br />

ln( xslut<br />

) − ln( xstart<br />

)<br />

b) Rita funktionen y= 10exp(-7.5x) i alla olika fönstertyperna. I linlog-fönstret<br />

såg du att funktionen representerades av en rak linje. I denna<br />

ln( y slut ) − ln( ystart<br />

)<br />

representeras (-7.5) som lutningen på linjen, dvs.<br />

. Se<br />

xslut<br />

− xstart<br />

om du kan återfå (-7.5) utifrån denna formel.<br />

Speciella kommandon i Matlab<br />

Slumptal<br />

Under kursens gång kommer vi att studera många nätverk genererade utifrån<br />

slumpprocesser. <strong>MatLab</strong> har ett särskilt kommando, rand, för att generera slumptal. Varje<br />

gång detta kommando används ger det som svar ett tal som är större än 0 och mindre än 1<br />

(och alla tal är lika sannolika). Detta kommando kan användas i kombination med andra för<br />

att generera alla tänkbara slumptal. Vill man t.ex. ha att slumptalet ska ligga i intervallet<br />

(0,100) multiplicerar man bara det värde man får med 100. Man kan också generera ett<br />

objekt med flera slumptal som komponenter, dvs. en slumpvektor genom kommandot<br />

>>rand(1,antal_komponenter) , vilket genererar en slumptalsvektor med så många<br />

komponenter som ges av antal_komponenter.<br />

1 <strong>MatLab</strong> ignorerar den första mätpunkten eftersom log(0) ej är ett tal. Den talar inte om detta, men om man låter<br />

x anta negativa värden, så varnar <strong>MatLab</strong> för att dessa inte är definierade.<br />

3


Linköpings universitet <strong>Övnings<strong>till</strong>fälle</strong> 1 & 2<br />

Institutionen för Teknik och Naturvetenskap<br />

<strong>Introduktion</strong> <strong>till</strong> <strong>MatLab</strong><br />

Mika Gustafsson<br />

Nätverk<br />

Vill man generera slumpmässiga heltal är kommandot >>floor(tal), vilket rundar av talet tal<br />

nedåt. Det är användbar1 om man vill slumpa t.ex. 1/0 eller en tärnings utfall.<br />

Övning 2.1<br />

a) Generera ett slumptal i intervallet (-2,2).<br />

b) Hur ser kommandot ut som simulerar en tärnings utfall? Försök göra ett<br />

objekt (en vektor) som genererar 10 tärningsutfall på en och samma gång!<br />

c) Rita en figur med 10 snöflingor som har både x- och y-koordinat<br />

slumpmässigt i intervallet (0,1).<br />

Vektorer<br />

Varje vektor har som bekant komponenter utplacerade på olika positioner. En komponents<br />

position i vektorn benämnes dess index. Det är ibland intressant att veta vilken position en<br />

komponent som uppfyller ett specifikt villkor har. Säg att vi t.ex. har en slumptalsvektor,<br />

som vi kallar S. Det skulle då kunna vara intressant att veta vilka av dess komponenter som<br />

är större än exempelvis 0.5 . Detta kan man få reda på genom det specifika kommandot<br />

find. I det specifika fallet används det genom >>find(S>0.5) , vilket returnerar en vektor med<br />

de positioner som uppfyller kriteriet har.<br />

Ex. >>S=[0 2 3 4 5 9 1 2];<br />

>>find(S>sum(vek), som beräknar summan av<br />

elementen i vek.<br />

Övning 2.2 I nedanstående övningar ska du utgå från V = [1, 0, 3, 0, 1, 2]. Kan du<br />

förutsäga vad som händer om du skriver:<br />

a) >>a=find(V==1) (‘==’ används för att <strong>MatLab</strong> enbart ska testa om V=1 och<br />

inte sätta V <strong>till</strong> 1.)<br />

b) >>V(a)<br />

Histogram<br />

Vi kommer under kursens gång att ha ett behov av att rita upp hur vanliga vissa tal är. Det<br />

är då lämpligt att använda funktionen >>utvektor=hist(V,centervek), vilken först skapar<br />

intervall med centrum givet av centervek, där det första (resp. sista) intervallet innehåller<br />

alla elementet i V som är mindre eller lika med (resp. större) än första/sista värdet i<br />

centervek. Det blir lättare med ett exempel.<br />

Ex. >>vektor=[1 50 2 3 0 5 7 9 100 300]; ut=hist(vektor, 0:2:10) returnerar ut = 2 2<br />

1 1 1 3.<br />

Detta sker eftersom <strong>MatLab</strong> försträknar ut att centervek = [0 2 4 6 8 10]. Sedan ser att 2<br />

element är mindre än eller lika med 1 (som är mittemellan 0 och 2), 2 element som är större<br />

än 1och samtidigt mindre än eller lika med 3, osv. <strong>till</strong>s 3 element som är större än 9. Värt<br />

att påpeka är att om ett element hamnar på gränsen hamnar det i det intervall som ligger<br />

närmast noll. Genom att utelämna ’utvektor’ så får man ett histogram uppritat, d.v.s.<br />

genom att skriva: >>hist(V,centervek)<br />

Övning 2.3 Generera vektorn V=[1 2 3 6 7 8 12 14].<br />

a) Rita ett histogram över elementen med några intervall. Försök förutsäga<br />

hur det kommer att se ut. Rita speciellt ett som räknar hur många element<br />

av varje heltal det finns i V.<br />

b) Bestäm en centrumvektor så att du får 2 element i varje intervall.<br />

4


Linköpings universitet <strong>Övnings<strong>till</strong>fälle</strong> 1 & 2<br />

Institutionen för Teknik och Naturvetenskap<br />

<strong>Introduktion</strong> <strong>till</strong> <strong>MatLab</strong><br />

Mika Gustafsson<br />

Nätverk<br />

c) Gör ett histogram med centervek = [0 3 6 9 12], genom att använda :<br />

kommandot.<br />

Matriser<br />

Ni har fått lära er att matriser är en behållare med tal, vilket vektorer också är. Matriser<br />

består av flera vektorer under varandra. En vektor är därför en matris med en rad. En<br />

matris kan skapas på flera olika sätt i <strong>MatLab</strong>. Vill man skriva in matrisen direkt kan man<br />

skriva in raderna efter varandra (p.s.s. som för vektorerna) åtskiljda av semikolon. För att<br />

skapa matrisen<br />

⎛0<br />

⎜<br />

⎜1<br />

A = ⎜1<br />

⎜<br />

⎜0<br />

⎜<br />

⎝0<br />

1<br />

0<br />

1<br />

1<br />

1<br />

1<br />

1<br />

0<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

0⎞<br />

⎟<br />

1⎟<br />

0⎟<br />

⎟<br />

0⎟<br />

0<br />

⎟<br />

⎠<br />

skriver man t.ex.<br />

>> A =[0 1 1 0 0; 1 0 1 1 1;1 1 0 1 0;0 1 1 0 0;0 1 0 0 0] (notera hakparenteserna) och får<br />

<strong>till</strong> svar:<br />

A =<br />

0 1 1 0 0<br />

1 0 1 1 1<br />

1 1 0 1 0<br />

0 1 1 0 0<br />

0 1 0 0 0.<br />

Man kan nu enkelt få tag på elementen i matrisen. Vill man t.ex. få värdet på element a 23<br />

kan skriver man >> A(2,3) och får då <strong>till</strong> svar: ans=0 . Man kan även få tag i flera element<br />

genom : tecknet, t.ex. >>A(1:2,3) betyder de rader som ligger mellan (och inklusive) 1 och 2<br />

1<br />

och i kolumn 3, så kommandot returnerar: ans = . Man kan även lägga <strong>till</strong><br />

1<br />

rader/kolumner. Kommandot A =[A; 1 0 0 0 0] lägger <strong>till</strong> raden [1 0 0 0 0] underst i<br />

matrisen. Man kan även ändra en enstaka komponents värde i matrisen. Vill man t.ex.<br />

ändra element i 2:a radens 1:a kolumn <strong>till</strong> 0 skriver man >>A(2,1) = 0.<br />

Ett användbart kommando är att kunna summera vektorer, eller kolumner i matriser (även<br />

rader kan vara av intresse men gås inte igenom här). <strong>MatLab</strong> har ett enkelt kommando för<br />

detta: >>sum(A) . Appliceras detta kommando på en vektor får man <strong>till</strong>baka summan av<br />

elementen i denna och om man applicerar den på en matris får man <strong>till</strong>baks en vektor med<br />

summan av matrisens kolumner som element.<br />

Ex. >>sum(A) returnerar ans = (2 4 3 2 1), medan >>sum(sum(A)) returnerar ans = 12.<br />

Övning 2.3 Generera vektorn V=[1 2 3 6 7 8 12 14].<br />

a) Rita upp (för hand) det nätverk som har A (som ovan) som adjacentmatris. Vilken<br />

gradfördelning har nätverket? Gör ett histogram över gradfördelningen. Hur många<br />

länkar finns i nätverket?<br />

b) Låt kolumn 2 och 3 byta plats, samt rad 2 och 3 i adjacentmatrisen ovan. Rita<br />

återigen upp nätverket för hand, och studera egenskaperna som du gjorde i a.<br />

Vilken skillnad gör detta för nätverket?<br />

c) Använd find-kommandot för att utifrån adjacentmatrisen få reda på vilka noder nod<br />

4 kopplar <strong>till</strong>. Genom att kombinera sum-kommandot med find-kommandot kan<br />

man enkelt få ut vilka noder som har en specifik grad. Använd detta för att ta reda<br />

på vilka noder som har grad större eller lika med 3.<br />

d) På kursens hemsida www.itn.liu.se/~micho/Breddning finns två adjacentmatriser.<br />

Studera deras gradfördelning. Vilket av dessa skulle du tro är ett slumpnätverk<br />

(ER)?<br />

5

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!