Övningstillfälle 1: Introduktion till MatLab
Övningstillfälle 1: Introduktion till MatLab
Övningstillfälle 1: Introduktion till MatLab
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