29.08.2013 Views

kompendium - Fysikum - Stockholms universitet

kompendium - Fysikum - Stockholms universitet

kompendium - Fysikum - Stockholms universitet

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

MATLAB 7 i kursen experimentella<br />

metoder<br />

av Sten Hellman<br />

med<br />

Introduktion till Microsoft Word<br />

av Jonas Strandberg<br />

Övningsuppgifter av<br />

Sten Hellman, Max Karlovini, Teresia M˚anson & Jonas Strandberg


ii<br />

3:a upplagan, Stockholm 2005.<br />

c○Sten Hellman, <strong>Stockholms</strong> <strong>universitet</strong>.


Inneh˚all<br />

1 Inledning 1<br />

1.1 Vad är MATLAB? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 Konventioner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

2 Att komma ig˚ang 3<br />

2.1 De första stegen - ”Hello World” . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2.1.1 Logga in p˚a datorn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2.1.2 Logga in p˚a afs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2.1.3 Starta Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.1.4 Matlabs “Skrivbord” (Desktop) . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.1.5 Say Hello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

2.1.6 Matlabs hjälpfunktion . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

2.1.7 Avsluta Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.2 Börja Räkna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.2.1 Matlab som en räknedosa . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.2.2 Operatorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.2.3 Variabler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

2.2.4 Konstanter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

2.3 Miljön i Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

2.3.1 Städa upp kommandofönstret: tyst input, fortsättningsrader . . . . . 12<br />

2.3.2 Format och avrundning . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

2.3.3 Matlabs “Workspace” . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.3.4 ”Play it again Sam”- att upprepa kommandon . . . . . . . . . . . . . 13<br />

2.3.5 Att ˚aterkalla kommandon . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

2.3.6 Matlabs historiefönster . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.4 M-filer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.4.1 Editorn för M-filer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.4.2 Att spara en M-fil p˚a disk . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

2.4.3 Läsa in och köra en m-fil . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />

2.4.4 Kommentarer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

2.4.5 In- och utmatning av data till M-filer . . . . . . . . . . . . . . . . . . 18<br />

2.4.6 Utskrift när M-filen kör - Echo kommandot . . . . . . . . . . . . . . . 19<br />

2.4.7 Paus i utskriften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

2.4.8 Namngivning av M-filer . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />

2.5 Litet om vektorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

2.5.1 Skapa vektorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

2.5.2 Räkna med vektorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

2.5.3 Elementvisa operationer . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

2.5.4 Litet om matriser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />

2.5.5 Räkna med matriser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

2.6 Inbyggda funktioner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

iii


iv INNEH˚ALL<br />

2.6.1 Operationer p˚a skalärer . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

2.6.2 Operationer p˚a vektorer . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />

2.6.3 Operationer p˚a matriser . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

2.7 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

3 Hitta p˚a datorn. Börja programmera 29<br />

3.1 Att navigera p˚a datorn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />

3.1.1 Minne och h˚arddisk p˚a en dator . . . . . . . . . . . . . . . . . . . . . 29<br />

3.1.2 Filnamn och Sökvägar . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />

3.1.3 Fullständiga filnamn . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

3.1.4 Aktuell katalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

3.1.5 ”Current directory browser” . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

3.1.6 Var söker MATLAB efter filer . . . . . . . . . . . . . . . . . . . . . . . 33<br />

3.1.7 Var skall jag spara filer . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

3.2 Att spara och läsa tillbaks inneh˚allet i workspace . . . . . . . . . . . . . . . . 35<br />

3.3 Villkorssatser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />

3.4 Slingor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />

3.4.1 for-slingor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

3.4.2 while-slingor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

3.4.3 Att hoppa ut ur en slinga - kommandot break . . . . . . . . . . . . . . 38<br />

3.5 Funktioner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

3.5.1 Syntaxen för funktioner . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

3.5.2 help för en funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

3.5.3 Testa antalet argument . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />

3.6 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />

4 Ordbehandling med Microsoft Word 43<br />

4.1 Allmänna kommentarer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

4.2 Textbehandling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

4.2.1 Typsnitt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

4.2.2 Storlek p˚a texten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

4.2.3 Fet, kursiv och understruken text . . . . . . . . . . . . . . . . . . . . . 45<br />

4.2.4 Att justera texten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />

4.2.5 Att göra en rubrik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />

4.3 Egna formatmallar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

4.4 Lägga till knappar till verktygsfältet . . . . . . . . . . . . . . . . . . . . . . . 47<br />

4.5 Sidbrytning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

4.6 Sidnumrering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />

4.7 Stavningskontroll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />

4.8 Fotnoter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />

4.9 Numrerade listor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />

4.10 Tabeller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />

4.10.1 Tabelltext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

4.11 Figurer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

4.11.1 Ankra bilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

4.11.2 Figurtext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.12 Speciella symboler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.13 Ekvationer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

4.14 Spara dokument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53<br />

4.15 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54


INNEH˚ALL v<br />

5 Felsökning - Debuggning. 57<br />

5.1 MATLABs debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />

5.2 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />

6 2D-Grafik 61<br />

6.1 Kurvor i tv˚a dimensioner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />

6.1.1 Att växla mellan fönster, och städa i fönster. . . . . . . . . . . . . . . 62<br />

6.1.2 plot-kommandot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

6.1.3 Styra utseendet p˚a grafiken . . . . . . . . . . . . . . . . . . . . . . . . 63<br />

6.1.4 Koordinataxlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />

6.1.5 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />

6.2 Plotta punkter med fel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

6.3 Histogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />

6.3.1 Kommandot bar - stapeldiagram . . . . . . . . . . . . . . . . . . . . . 66<br />

6.3.2 Kommandot hist - histogram . . . . . . . . . . . . . . . . . . . . . . . 67<br />

6.3.3 Kommandot stairs - konturdiagram. . . . . . . . . . . . . . . . . . . . 67<br />

6.3.4 Kommandot stem - stolpdiagram. . . . . . . . . . . . . . . . . . . . . 67<br />

6.4 Utskrifter av grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />

6.5 Spara grafer och flytta till andra program . . . . . . . . . . . . . . . . . . . . 68<br />

6.5.1 Lägga in bilder i Word . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

6.6 Fler Kurvor i samma graf - kommandot hold. . . . . . . . . . . . . . . . . . . 69<br />

6.7 Fler grafer i samma fönster - kommandot subplot . . . . . . . . . . . . . . . . 70<br />

6.8 Rita i grafer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />

6.9 Logaritm-skalor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

6.10 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

72<br />

73<br />

7 Gränssnitt, text-strängar,<br />

beräkningar och anpassningar 75<br />

7.1 MATLABs Workspace Browser . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />

7.1.1 Array Editorn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

7.1.2 Anpassa MATLABs Desktop . . . . . . . . . . . . . . . . . . . . . . . 76<br />

7.2 Text-strängar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

7.2.1 Manipulera textsträngar . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

7.2.2 Delsträngar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78<br />

7.3 Enkel statistik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78<br />

7.4 Polynom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />

7.4.1 Hitta rötter till polynom. . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />

7.4.2 Finn polynomuttryck för givna rötter . . . . . . . . . . . . . . . . . . 79<br />

7.4.3 Värden p˚a polynom . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />

7.4.4 Derivator av polynom . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />

7.4.5 Produkter och kvoter av polynom . . . . . . . . . . . . . . . . . . . . 80<br />

7.5 Matrisekvationer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />

7.6 Minsta kvadratanpassning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />

7.7 Minsta kvadratanpassning med matrismetod . . . . . . . . . . . . . . . . . . . 82<br />

7.8 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84<br />

8 Programmering 85<br />

8.1 Att programmera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />

8.1.1 Design av programmet . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />

8.1.2 Dokumentation av programmet. . . . . . . . . . . . . . . . . . . . . . 87<br />

8.2 Formaterad in- och utmatning . . . . . . . . . . . . . . . . . . . . . . . . . . . 87<br />

8.2.1 Läs data och strängar fr˚an kommandofönstret - kommandot input. . . 87


vi INNEH˚ALL<br />

8.2.2 Formatera strängar för utmatning - Formatkoder och kommandot sprintf 88<br />

8.3 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90<br />

9 Mer grafik och programmering 91<br />

9.1 Mer om 2D-grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />

9.1.1 Avancerade kommandon för 2-D grafik . . . . . . . . . . . . . . . . . . 91<br />

9.2 Att redigera en graf interaktivt . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />

9.2.1 Grafikfönstrets egenskaper . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />

9.2.2 Grafens egenskaper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />

9.3 Handtags-grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

9.3.1 Linjens egenskaper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

9.3.2 Axlarnas egenskaper . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

9.3.3 Figurens egenskaper . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

9.4 3-D grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

9.4.1 Kurvor i rymden - plot3 . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

9.4.2 Funktionsytor - mesh och surf . . . . . . . . . . . . . . . . . . . . . . . 95<br />

9.4.3 Att styra utseendet av en 3D-graf . . . . . . . . . . . . . . . . . . . . 95<br />

9.4.4 Konturplottar och projektioner . . . . . . . . . . . . . . . . . . . . . . 96<br />

9.4.5 Gradientplottar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96<br />

9.5 Mer om programmering och funktioner . . . . . . . . . . . . . . . . . . . . . . 97<br />

9.5.1 Linjär korrelationskoefficient . . . . . . . . . . . . . . . . . . . . . . . 97<br />

9.5.2 Viktad anpassning till rät linje . . . . . . . . . . . . . . . . . . . . . . 98<br />

9.5.3 Viktad anpassning och plottning av rät linje. . . . . . . . . . . . . . . 99<br />

9.6 Övningsuppgifter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102<br />

10 Svar och lösningar 103<br />

10.2 Svar till kapitel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103<br />

10.3 Svar till kapitel 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104<br />

10.5 Svar till kapitel 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105<br />

10.6 Svar till kapitel 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105<br />

10.7 Svar till kapitel 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106<br />

10.8 Svar till kapitel 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107


Kapitel 1<br />

Inledning<br />

Det här kompendiet är avsett att användas i kursen ”Den experimentella metoden” som ing˚ar<br />

i första˚arskursen i fysiklinjen vid <strong>Stockholms</strong> Universitet. Kompendiet är inte avsett att vara<br />

en komplett kurs i MATLAB utan strävar till att ge en introduktion till programmet, och mer<br />

detaljerade kunskaper inom de omr˚aden som är nödvändiga för kursen ”Den experimentella<br />

metoden”. Tonvikten ligger inom tv˚a omr˚aden: beräkningar för att behandla mätvärden<br />

fr˚an laborationer, och grafisk presentation av mätdata och resultat, främst d˚a 2D grafik.<br />

Detta upplägg innebär att en del omr˚aden inte alls kommer att beröras, som till exempel<br />

komplexa tal, 3D grafik och mer avancerade matematik-tillämpningar. Vi är dock förvissade<br />

om att man efter att ha följt kursen har s˚a goda kunskaper i att använda MATLAB s˚a att<br />

det skall vara relativt enkelt att p˚a egen hand läsa in andra omr˚aden vartefter behov av det<br />

uppst˚ar.<br />

Programmet MATLAB har en mycket väl utvecklad hjälpfunktion, men som med alla andra<br />

program kan det vara sv˚art att veta vad man skall be om hjälp med innan man har n˚att en viss<br />

kunskapsniv˚a. Dessutom kan det ibland vara besvärligt att vara hänvisad till engelska termer.<br />

För att träna upp det interaktiva hjälpsökandet använder kompendiet flitigt hänvisningar till<br />

MATLABs egen dokumentation.<br />

Kompendiet är skrivet i avsikt att läsas i en följd, m˚anga avsnitt bygger direkt p˚a tidigare<br />

avsnitt, en hel del av de exempel som ges förutsätter att föreg˚aende exempel har körts.<br />

Organisationen och inneh˚allet i det här kompendiet har l˚anat mycket ur ett <strong>kompendium</strong> av<br />

Hans Mühlen - “MATLAB” - som kom i flera upplagor under ˚aren 1987-93.<br />

Sedan den första versionen producerades har m˚anga fel rensats ut och m˚anga förbättringar<br />

gjorts med hälp av de doktorander som arbetat som assistenter p˚a kursen: Annelie Ehlerding,<br />

Attila Hidvégi, Max Karlovini, Teresia M˚ansson och Jonas Strandberg. Björn Selldén har<br />

bidragit med en mäng korrigeringar och förbättringar. Tack för hjälpen!<br />

1.1 Vad är MATLAB?<br />

MATLAB är ett kommersiellt program, eller snarare programpaket, för matematiska beräkningar<br />

och grafisk presentation. MATLAB-paketet har en mängd utbyggnadsmöjligheter<br />

med färdiga moduler och kan användas för ett stort antal mer eller mindre specialiserade<br />

beräknings- och simuleringsuppgifter.<br />

I den här kursen, och även i övrigt här p˚a fysikum, använder vi oss av MATLAB dels för<br />

att skriva program för att genomföra beräkningar, till exempel för att bearbeta lab-resultat,<br />

dels för att presentera resultat i grafisk form.<br />

Som alla andra program har MATLAB sina styrkor och svagheter. Namnet MATLAB stod<br />

ursrpungligen för MATrix LABoratory, och även om MATLAB har utvecklats enormt sedan<br />

det döptes s˚a är matrishanteringen fortfarande en av de starka sidorna hos MATLAB, n˚agot<br />

1


2 KAPITEL 1. INLEDNING<br />

som kommer att komma till stor användning under den här kursen. Rent allmänt är MAT-<br />

LAB väldigt förl˚atande, man behöver till exempel inte - som i de flesta högniv˚aspr˚aken för<br />

programmering - göra skillnad mellan heltal och decimaltal. Man behöver inte heller i förväg<br />

tala om hur stora vektorer skall vara. Det finns gott stöd för att producera grafik, men det<br />

kan i början kännas litet avigt att man inte enkelt kan plotta sin(x) mot x, utan först m˚aste<br />

man konstruera en vektor med x-värden och en annan vektor med y-värden och sedan plotta<br />

dem mot varandra.<br />

Vi skall ocks˚a komma ih˚ag att MATLAB är ett matematikprogram, inte ett ordbehandlingsprogram.<br />

Vi kommer allts˚a att behöva komplettera v˚ar arsenal med ett program som<br />

hanterar text och figurer för att kunna producera dokumentationen av v˚ara experiement.<br />

1.2 Konventioner<br />

I detta <strong>kompendium</strong> används endast ett f˚atal typografiska konventioner. En är när vi visar<br />

exakt hur det ser ut när man skriver in kommandon i MATLABs kommandofönster och f˚ar<br />

output tillbaks till det fönstret. S˚adana exempel visas inom en ram:<br />

≫ Kommandot som skrivs in<br />

Respons fr˚an MATLAB<br />

Ibland refererar vi till kommandon och variabler i löpande text, och markerar d˚a detta genom<br />

att skriva variabelnamnet med särskilt typsnitt a = sin(x).<br />

Referenser till MATLABs hjälp-dokument skrivs med initialt ? och särskilt typsnitt, t.ex.<br />

?/MATLAB/Reference/MATLAB Function Reference/Mathematics/Elementary<br />

Math/<br />

Hur man använder en s˚adan referens för att söka ett avsnitt i dokumentationen beskrivs i<br />

avsnitt 2.1.6.<br />

Notera ocks˚a att MATLAB använder den anglosaxiska konventionen där decimalkommat inte<br />

skrivs med komma utan med punkt. S˚aledes är 2,3 ett talpar medan 2.3 är ett decimaltal.


Kapitel 2<br />

Att komma ig˚ang<br />

Efter det första dataövningspasset skall du kunna:<br />

• Logga in p˚a ditt studentkonto p˚a <strong>Fysikum</strong>s datorer<br />

• Starta MATLAB<br />

• Använda MATLAB som en enkel mini-räknare<br />

• ˚Aterkalla MATLAB kommandon fr˚an historie-filen.<br />

2.1 De första stegen - ”Hello World”<br />

Det finns en slags ”tradition” inom litteraturen om datorprogram och programmeringsspr˚ak<br />

enligt vilken den första uppgiften man skall lösa när man ger sig i kast med ett nytt program<br />

eller spr˚ak är att f˚a programmet att skriva ”Hello World” p˚a skärmen. Det här kan verka litet<br />

f˚anigt, men det är faktiskt inte s˚a dumt. Visserligen är det vi kräver av själva programmet<br />

tämligen trivialt, men för att det hela skall fungera m˚aste vi kunna en hel del saker om den<br />

miljö i vilket programmet fungerar: vi m˚aste kunna logga in p˚a den dator där programmet<br />

skall köras, hitta och starta programmet, f˚a programmet att acceptera v˚ara instruktioner<br />

om vad som skall utföras, köra programmet och till sist f˚a programmet att kommunicera<br />

ett resultat, vanligtvis via en bildskärm. Kan vi klara av alla dessa uppgifter s˚a kan vi<br />

i fortsättningen koncentrera oss p˚a att f˚a programmet att lösa mer och mer komplicerade<br />

uppgifter.<br />

2.1.1 Logga in p˚a datorn.<br />

Hur man loggar in p˚a datorerna p˚a övningslabbet kommer troligen att variera med tiden.<br />

Det beror ocks˚a p˚a vilket operativsystem den dator du skall arbeta vid använder. Här<br />

beskrivs hur det g˚ar till att logga in p˚a en dator som kör operativsystemet Windows under<br />

v˚arterminen 2005. Skulle du misslyckas att komma in p˚a det sätt som beskrivs här kan det<br />

bero p˚a att förh˚allandena ändrats, s˚a fr˚aga en assistent om du är tveksam.<br />

I normalfallet kommer datorn att visa upp en inloggningsruta p˚a skärmen där användarnamnet<br />

redan är ifyllt som ”student”. Allt du behöver göra är d˚a att klicka p˚a ”OK” s˚a<br />

loggas du in, och kan börja arbeta.<br />

2.1.2 Logga in p˚a afs<br />

För att kunna komma ˚at dina egna filer p˚a ditt afs-konto m˚aste du logga in dit. Det gör du<br />

enklast genom att klicka p˚a det lilla hängl˚aset till höger i listen längst ned p˚a skärmen. I<br />

menyn som kommer upp klickar du p˚a “obtain new tokens”. I inloggningsrutan skall “AFS<br />

3


4 KAPITEL 2. ATT KOMMA IG˚ANG<br />

cell” vara su.se, och sedan fyller du i ditt användarnamn och lösenord. AFS inloggningen<br />

gäller bara en viss tid, det kan därför vara klokt att ungefär en g˚ang i timmen klicka p˚a<br />

hängl˚aset och “obtain new tokens”, detta för att undvika att afs-förbindelsen bryts mitt i en<br />

word-session. Om det händer kan du förlora mycket arbete.<br />

2.1.3 Starta Matlab<br />

När du är inloggad kan du se ett antal sm˚a bilder - ”ikoner” - p˚a skärmen. Varje ikon är<br />

en symbol för ett objekt som finns i datorn. Det kan vara en fil, en mapp (katalog) eller<br />

ett program. Vad som händer när du dubbelklickar p˚a en ikon beror p˚a vad ikonen är en<br />

symbol för, är det t ex en symbol för en fil skapad i programmet Microsoft Word kommer<br />

programmet Microsoft Word att starta och öppna filen.<br />

P˚a din skärm kommer du att ha en ikon som visar MATLABs symbol. Den<br />

ikonen är länkad direkt till programmet MATLAB, s˚a genom att dubbelklicka<br />

p˚a den startar MATLAB.<br />

En alternativ metod att starta MATLAB är att klicka p˚a den lilla fyrkanten längst ned,<br />

märkt med Windows-symbolen och ordet ”Start”. D˚a öppnas en meny med ett antal alternativ<br />

varav ett är ”Program ”. Klickar du p˚a den raden s˚a öppnas en mindre meny (det är<br />

innebörden av symbolen ”⊲”), där väljer du ”MATLAB ⊲ ” och i den meny som d˚a kommer<br />

upp väljer du ˚ater ”MATLAB 7.0”.<br />

(om MATLAB 7.= inte syns s˚a klicka p˚a symbolen i botten av menyn s˚a öppnas fler alternativ)<br />

och p˚a den meny som d˚a öppnas ˚aterigen ”MATLAB 7.0”.<br />

2.1.4 Matlabs “Skrivbord” (Desktop)<br />

När MATLAB har startat öppnas ett nytt fönster p˚a din dator som kan se litet olika ut<br />

beroende p˚a vilka inställningar som har sparats, men det blir i alla fall en version av det som<br />

kallas MATLABs skrivbord. En variant av skrivbordet ser ut som nedan, men bli allts˚a inte<br />

förskräckt om det inte ser riktigt likadant ut.


2.1. DE FÖRSTA STEGEN - ”HELLO WORLD” 5<br />

Vi skall senare (avsnitt 7.1.2) ta en närmare titt p˚a hur man kan förändra utseendet p˚a det<br />

som MATLAB visar s˚a att informationen kan anpassas till vad vi vill göra under ett givet<br />

arbetspass. Men l˚at oss börja med en enkel konfiguration för att först bekanta oss litet med<br />

MATLAB: G˚a in i menyn ”Desktop”. Att g˚a in i en meny betyder att man klickar p˚a menyns<br />

titelord, i det här fallet ”Desktop”.<br />

När man gör det visas ett litet fönster<br />

(ungefär som i figuren härintill) som<br />

kallas rullgardinsmeny (pull-down menu).<br />

Genom att klicka p˚a n˚agot av de ord som<br />

st˚ar i menyn kan du utföra vissa kommandon.<br />

Dessa menyer har ett särskilt symbolspr˚ak,<br />

en liten triangel, som den du kan<br />

se efter ”Desktop Layout” anger att du<br />

genom att klicka p˚a den raden kan öppna<br />

upp ytterligare en meny, en undermeny till<br />

Undock Command Window ✄<br />

Desktop Layout<br />

Save Layout...<br />

Organize Layout...<br />

√<br />

Command Window<br />

Command History<br />

Current Directory<br />

Workspace<br />

Help<br />

Profiler<br />

Toolbar Shortcuts<br />

”Desktop Layout”. Symbolen Toolbar Titles<br />

” √ ” används för variabler som kan sl˚as p˚a och av i menyn. I det exempel som vi visar<br />

här betyder det att ”Command Window” är p˚aslaget, medan de andra alternativen är avslagna.<br />

När det st˚ar . . . till höger om ett alternativ betyder det att det öppnas en ny meny<br />

där du kan göra ytterligare val om du klickar p˚a det alternativet. Eventuellt är fler alternativ<br />

p˚aslagna när du startar MATLAB, sl˚a i s˚a fall av dem genom att klicka p˚a de ord<br />

som har symbolen ” √ ” till vänster om sig s˚a att det ser ut som i figuren. När vi nu lämnar<br />

menyn genom att klicka n˚agonstans utanför menyfönstret har vi en enkel MATLAB-desktop<br />

med ett enda fönster - kommandofönstret öppet. Kommandofönstret (Command Window)


6 KAPITEL 2. ATT KOMMA IG˚ANG<br />

är det fönster genom vilket vi och MATLAB kommunicerar med varandra, där skriver vi in<br />

kommandon och MATLAB skriver ut resultat.<br />

2.1.5 Say Hello<br />

S˚a har vi äntligen kommit fram till den punkt d˚a vi är redo att säga hall˚a världen. Det som<br />

˚aterst˚ar är att instruera MATLAB att skriva ut ”Hello World” p˚a skärmen. Det finns fler<br />

sätt att f˚a MATLAB att utföra kommandon, det enklaste som vi skall använda först är att<br />

skriva in kommandot i kommandofönstret. När vi skriver ett kommando i kommandofönstret<br />

och trycker p˚a ”return” s˚a kontrolleras först att kommandot har en korrekt syntax, dvs att<br />

kommandot är skrivet enligt de regler som gäller för MATLABs kommandospr˚ak s˚a att programmet<br />

kan tolka instruktionen. Om kommandot vi skrivit in är korrekt utförs det och<br />

eventuella resultat visas i kommandofönstret. Det kommando vi skall använda för att säga<br />

hall˚a heter disp() efter engelskans ”display”. Kommandot betyder helt enkelt att MAT-<br />

LAB skall visa det som st˚ar inom parantesen (argumentet) i kommandofönstret p˚a skärmen.<br />

Det som st˚ar inom parantesen kan vara en mängd olika storheter, men just nu är vi intresserade<br />

av n˚agot som kallas för textsträng. En textsträng är en sträng av tecken, omgiven av<br />

enkla citationstecken: ( ’ ’). MATLAB behandlar en textsträng som en liten l˚ada som man<br />

inte, i alla fall inte utan en del möda, kan göra n˚agot med annat än att spara och ta fram<br />

vid behov. Genom att ge textsträngen ’Hello World’ som argument till kommandot disp<br />

instruerar vi MATLAB att skriva ut strängen p˚a skärmen. Det sista steget blir allts˚a att ge<br />

kommandot disp(’Hello World’) i kommandofönstret, som svar kommer MATLAB att skriva<br />

”Hello World” i kommandofönstret, och vi har klarat av v˚ar första MATLAB uppgift.<br />

≫ disp(’Hello World’)<br />

Hello World<br />

Lägg märke till att under tiden som du skriver strängen s˚a är den mörkröd, och att den skiftar<br />

färg till lila när du skriver det andra citationstecknet och fullbordar en korrekt sträng. Det<br />

här är ett stöd som MATLAB ger oss för att underlätta att skriva korrekta kommandon. Vi<br />

˚aterkommer senare till en genomg˚ang av annan hjälp vi kan f˚a.<br />

2.1.6 Matlabs hjälpfunktion<br />

MATLAB har en mycket omfattande on-line dokumentation, och kraftfullt stöd för hjälpfunktionen.<br />

Det finns fler sätt att hitta information p˚a, s˚a vi kommer under kursens g˚ang<br />

att lära oss fler olika metoder att f˚a hjälp. Den första metoden vi skall använda är att<br />

öppna och använda hjälp-fönstret. Det gör du genom att i MATLABs desktop klicka p˚a ?<br />

symbolen. D˚a öppnas ett nytt fönster - ”Help window”, ett fönster som är uppdelat i tv˚a<br />

pann˚aer genom en vertikal avgränsning. Den vänstra pann˚aen används för att navigera i<br />

materialet och finna det avsnitt i dokumentationen som vi är intresserade av, i den högra<br />

pann˚an presenteras hjälp-texter.<br />

Tittar vi nu först p˚a den vänstra pann˚an s˚a kan vi välja fyra alternativa sätt att navigera<br />

genom att klicka p˚a n˚agon av de fyra flikarna högst upp:<br />

contents<br />

ger oss en inneh˚allsförteckning där ämnena är grupperade i kapitel och underkapitel i olika<br />

niv˚aer ner till enstaka sidor.


2.1. DE FÖRSTA STEGEN - ”HELLO WORLD” 7<br />

index<br />

ger oss tillg˚ang till ett alfabetiskt ämnesregister där vi kan söka om vi vet namnet p˚a det<br />

kommando eller det begrepp vi vill veta mer om.<br />

search<br />

ger oss möjlighet att söka i den samlade dokumentationen. Sökningen kan vara efter s˚aväl<br />

enstaka ord som hela fraser.<br />

Demos<br />

Är en flik där det finns samlat ett antal “demos” grupperade inom olika ämnen, som t ex<br />

“Mathematics “ och “Graphics”. Dessa ämnen är sedan i sin tur uppdelade i underavdelningar.<br />

Denna avdelning av MATLABS hjälpfunktion är ett utmärkt omr˚ade för självstudier.<br />

L˚at oss nu ta en närmare titt p˚a vad som möter oss<br />

under fliken ”contents”. Schematiskt ser pann˚an under<br />

”contents” ut s˚a här: Boxarna symboliserar avsnitt<br />

i hjälpkatalogen. Genom att klicka p˚a n˚agon<br />

av textraderna kommer vi till motsvarande avsnitt i<br />

hjälpdokumentationen. Den lilla fyrkanten med ett +<br />

-tecken visar att motsvarande symbol inneh˚aller<br />

underavdelningar som vi kan göra synliga genom att klicka p˚a plustecknet. När vi gör det<br />

- prova! - s˚a öppnas den avdelningen, och vi kan fortsätt att klicka oss fram tills vi n˚ar ner<br />

till den niv˚a vi söker. En underavdelning som är öppnad kan stängas igen: klicka bara p˚a<br />

minustecknet s˚a stängs motsvarande niv˚a. I den här kursen kommer vi nästan uteslutande<br />

att h˚alla oss inom den del av dokumentationen som startar med boxen ”MATLAB”. I det<br />

här kompendiet används en speciell syntax för att beskriva hur du skall navigera fram till<br />

givna avsnitt i hjälpdokumentationen. L˚at oss t ex börja med att läsa i dokumentationen hur<br />

MATLAB med hjälp av färgkodning och andra trix hjälper oss att skriva korrekta kommandon<br />

i kommandofönstret. Till den sidan n˚ar du genom att med början i läget som avbildas i<br />

figuren ovan klicka p˚a följande titlar:<br />

MATLAB<br />

Desktop Tools and Development Environment<br />

Editing and Debugging M-files<br />

Creating, Editing and Running Files<br />

Appearance of an M-file<br />

Preferences for the Command Window<br />

P˚a sidan finns en länk ”syntax highlightning” som leder oss till den sida som beskriver hur<br />

MATLAB använder färgkoder för att hjälpa till med syntaxen. För att spara utrymme<br />

kommer vi i det här kompendiet att skriva<br />

?/MATLAB / Desktop Tools and Development Environment / Editing and Debugging<br />

M-files/ Creating, Editing and Running Files / Appearance of an M-file/<br />

Preferences for the Command Window för klick-serien ovan.<br />

När vi har läst färdigt i hjälpfönstret s˚a kan det vara bekvämt att göra sig av med det s˚a att<br />

vi lättare kan se kommandofönstret.<br />

Det gör vi enklast genom att använda oss av en av symbolerna<br />

som visas högst upp till höger i varje fönster (allts˚a inte bara<br />

MATLABs) som visas p˚a datorn. De tre symbolerna<br />

används för att hantera fönster i Windowsmiljön.<br />

Symbolen till vänster används för att förminska fönstret till en ”ikon”. Prova att klicka p˚a<br />

den, och du ser att fönstret försvinner och att vi obehindrat kan se de fönster som tidigare<br />

var dolda bakom hjälpfönstret. Det fina i kr˚aks˚angen är att fönstret finns kvar i skepnad


8 KAPITEL 2. ATT KOMMA IG˚ANG<br />

av en liten symbol ”Help” p˚a listen längst ned p˚a datorskärmen. Genom att klicka p˚a den<br />

symbolen ˚aterställs fönstret genast. Det här är ett bekvämt sätt att göra det enklare att<br />

hitta bland alla sina öppna fönster, de som inte används för tillfället minimerar man bara och<br />

de finns fortfarande lätt tillgängliga. Krysset längst till höger stänger det aktuella fönstret.<br />

Om detta är ”topp-fönstret” avslutas det program som öppnat fönstret. Klickar vi där i<br />

hjälpfunktionen s˚a avslutas MATLABs hjälpfunktion och vi f˚ar börja om fr˚an början och<br />

klicka p˚a “?”om vi vill ha mer hjälp. Den mittersta symbolen slutligen används för att<br />

maximera ett fönsters storlek, klickar vi p˚a den s˚a förstoras fönstret s˚a att det täcker hela<br />

datorskärmen. Det här kan vara bekvämt om man till exempel vill kunna läsa en hel sida<br />

i dokumentationen p˚a skärmen utan att behöva bläddra upp och ner p˚a skärmen. När vi<br />

är klara klickar vi bara en g˚ang till p˚a samma symbol och fönstret ˚atertar sin ursprungliga<br />

storlek. Ett annat sätt att f˚a hjälp är att i kommandofönstret skriva help kommando , där<br />

”kommando” byts ut mot namnet p˚a det kommando man söker hjälp om. Detta leder ofta<br />

snabbare fram till den information man söker än att söka i dokumentationen. Sv˚arigheten<br />

är bara att man m˚aste ha en första idé om vad det är man vill ha hjälp med s˚a att man har<br />

n˚agot vettigt att skriva in i stället för ”kommando”.<br />

2.1.7 Avsluta Matlab<br />

Det finns tv˚a sätt att avsluta MATLAB. Du kan antingen g˚a in i menyn ”File” och där<br />

välja ”exit MATLAB” eller ocks˚a trycka p˚a ”ctrl Q” (trycker samtidigt ner tangenten ”ctrl”<br />

i nedre vänstra hörnet av tangentbordet och tangenten ”Q”).<br />

2.2 Börja Räkna<br />

2.2.1 Matlab som en räknedosa<br />

Enklare matematiska operationer görs precis som p˚a en vanlig räknedosa (med normal, dvs<br />

ej omvänd polsk notation à la HP-räknare) med den lilla skillnaden att vi trycker p˚a return<br />

i stället för ”=” när vi vill beräkna resultatet. Pröva t ex att beräkna 2+2:<br />

≫ 2 + 2<br />

ans =<br />

4<br />

2.2.2 Operatorer<br />

För aritmetik har MATLAB de vanliga (och en litet ovanlig) operatorerna:<br />

+ Addition<br />

- Subtraktion<br />

⋆ Multiplikation<br />

/ Division<br />

\ Vänsterdivision<br />

∧ Exponentiering, till exempel x∧2 = x 2<br />

’ Komplex konjugering och transponering<br />

( ) Paranteser för att definiera prioritetsordning<br />

Prioritetsordningen mellan operatorerna är den normala s˚a att när man till exempel skriver<br />

3 * 4 + 3*2 ∧3 s˚a beräknas först, 2 3 , därefter de bägge produkterna och sedan summan. 1<br />

1 Notera att Matlab ingorera mellanslag i alla uttryck. Det spelar allts˚a ingen roll om vi skriver 2+3+4*5<br />

eller 2 + 3 + 4*5 eller 2 + 3 + 4 * 5. För att det skall bli enklare att följa uttrycken s˚a är det mellersta sättet


2.2. BÖRJA RÄKNA 9<br />

2.2.3 Variabler<br />

I MATLAB kan man liksom i alla högniv˚aspr˚ak definiera variabler, och tilldela dessa värden.<br />

Dels underlättar det arbetet genom att man inte behöver upprepa inmatning av samma värde<br />

fler g˚anger, dels gör det instruktionerna enklare att följa och först˚a - ˚atminstone om man<br />

väljer namn p˚a konstanterna som är begripliga. Antag som ett exempel att en läskeblask<br />

kostar 10 kronor, en varmkorv 12 och en kaffe 4. Om d˚a Kalle köper en korv och fyra kaffe,<br />

Lisa en läskeblask och tv˚a korvar och Ludde tre korvar och tv˚a läskeblask, s˚a kan vi räkna<br />

ut vad var och en fick betala p˚a följande sätt (minns att varje rad m˚aste avslutas med return<br />

för att MATLAB skall utföra kommandot):<br />

att skriva (som ansluter till prioritetsordningen) att föredra.


10 KAPITEL 2. ATT KOMMA IG˚ANG<br />

≫ laskeblask = 10<br />

laskeblask =<br />

10<br />

≫ korv = 12<br />

korv =<br />

12<br />

≫ kaffe = 4<br />

kaffe =<br />

4<br />

≫ Kalle = 2*korv + 4*kaffe<br />

Kalle =<br />

40<br />

≫ Lisa = laskeblask + korv<br />

Lisa =<br />

22<br />

≫ Ludde = 3*korv + 2 *laskeblask<br />

Ludde =<br />

56<br />

I exemplet ovan är laskeblask, korv, kaffe, Kalle, Lisa och Ludde alla variabler. Variabler kan<br />

allts˚a tilldelas värden antingen explicit (uttryckligen) genom t ex korv = 12, eller genom<br />

en beräkning som t ex Kalle = 2*korv + 4*kaffe.<br />

Observera att man som alltid m˚aste vara noga med syntaxen, eller programmeringsspr˚akets<br />

grammatik. Det g˚ar inte att skriva<br />

≫ Dyrt = 3 korv<br />

Prova! Du kommer att f˚a ett prov p˚a hur MATLAB vänligt, men inte särskilt diskret hjälper<br />

en tillrätta när man f˚ar syntaxen fel. Glömmer man bort vad en läsk kostar kan vi fr˚aga<br />

MATLAB:<br />

≫ laskeblask<br />

laskeblask =<br />

10<br />

En fallgrop man f˚ar akta sig för är att variabler vars värde beräknas, som t ex Kalle ovan<br />

beh˚aller det värde som variabeln tilldelats senaste g˚angen den beräknas, även om en av de<br />

variabler som ing˚ar när man beräknar variabelns värde ändras. Ett exempel:<br />

≫ kola = 0.5<br />

kola =<br />

0.5000<br />

≫ klubba = 2.50<br />

klubba =<br />

2.5000<br />

≫ Sune = 20 * kola + 4 * klubba<br />

Sune =<br />

20<br />

≫ klubba = 5.00<br />

klubba =<br />

5.0000<br />

≫ Sune<br />

Sune =<br />

20<br />

Värdet p˚a variabeln Sune ändras allts˚a inte när värdet p˚a klubba ändras, när värdet p˚a<br />

Sune beräknades gällde det gamla värdet p˚a klubba och värdet p˚a Sune förblir oförändrat


2.2. BÖRJA RÄKNA 11<br />

s˚a länge vi inte räknar om det med<br />

≫ Sune = 20 * kola + 4 * klubba<br />

Sune =<br />

30<br />

Variabelnamn i MATLAB m˚aste börja med en bokstav, följd av en godtycklig kombination<br />

av bokstäver (ej ˚a, ä eller ö), siffror eller understrykning ( ), ett variabelnamn kan allts˚a<br />

inte inneh˚alla mellanslag. MATLAB ser skillnad p˚a stor och liten bokstav, ALLA, Alla och<br />

alla är allts˚a tre olika variabler. Om man vill skapa variabelnamn som är sammansättningar<br />

av mer än ett ord finns tv˚a konventioner: antingen binder man ihop med ett understrykningstecken,<br />

eller ocks˚a skriver man med sm˚a bokstäver, men inleder nya ord med versal. Allts˚a<br />

antingen lagsta strom eller LagstaStrom. Vilket du väljer att göra är godtyckligt, men det<br />

är bra om man försöker att h˚alla sig till ett sätt att skriva. Det är ju enkelt att komma ih˚ag<br />

att variabeln är ”lägsta ström”, men om man p˚a vissa ställen skriver lagsta strom och p˚a<br />

andra LagstaStrom s˚a kommer man att hänvisa till olika variabler p˚a olika ställen i sin kod.<br />

Man bör därför bestämma sig för en konvention och sedan h˚alla sig till den. Det kan ocks˚a<br />

vara bra att undvika de svenska bokstäverna även om det program man arbetar med stöder<br />

dessa. När man skriver m˚anga program skaffar man sig vanor, och det är bra om vanorna<br />

fungerar i s˚a m˚anga olika sammanhang som möjligt.<br />

2.2.4 Konstanter<br />

MATLAB har ett antal inbyggda konstanter:<br />

pi konstanten π = 3.14159265...<br />

i roten ur -1.<br />

j samma som i.<br />

eps 2 −52 den minsta relativa skillnaden mellan tv˚a rationella tal,<br />

eller uttryckt p˚a annat sätt: det minsta tal man kan addera till 1 och f˚a ett<br />

tal som är större än 1.<br />

realmin 2 −1022 , det minsta rationella talet som kan representeras p˚a datorn.<br />

realmax (2 − eps) 1023 , det största rationella talet som kan representeras p˚a datorn.<br />

Inf Oändligheten som resultat av en väl definierad matematisk operation, t ex 10/0.<br />

NaN Icke definierat (Not a Number), resultatet av en operation där resultate inte<br />

är definierat, t ex 0/0 eller Inf - Inf.<br />

ans Resultatet av det senaste kommandot.<br />

Av dessa kommer vi kanske inte att använda mer än pi (och möjligen ans) i den här<br />

kursen, men det är bra att veta att de finns, i vissa lägen kan MATLAB komma att använda<br />

dem i felmeddelanden och d˚a är det bra att veta vad till exempel NaN st˚ar för.<br />

Vi har här valt att kalla dessa tal för ”konstanter” eftersom det är s˚a vi betraktar och<br />

använder dem. Rent tekniskt är de dock implementerade som inbyggda funktioner vilket har<br />

som en konsekvens att man kan definiera om dem:<br />

≫ pi<br />

pi =<br />

3.1415<br />

≫ pi = 4.75<br />

pi =<br />

4.7500<br />

De är dock litet mer stabila än vanliga variabler av typ Kalle som vi själva definierar. En<br />

variabel vi har definierat kan tas bort s˚a att MATLAB inte längre minns n˚agot om dem


12 KAPITEL 2. ATT KOMMA IG˚ANG<br />

genom att ge commandot clear:<br />

≫ clear Kalle<br />

Gör vi samma sak med en av ”konstanterna” i tabellen ovan s˚a ˚aterställs värdet till det<br />

fördefinierade som visas i tabellen.<br />

2.3 Miljön i Matlab<br />

2.3.1 Städa upp kommandofönstret: tyst input, fortsättningsrader<br />

När man börjar komma ig˚ang litet med att använda MATLAB tycker man ofta att kommandofönstret<br />

blir litet ostrukturerat, alla kommandon man ger upprepas slaviskt, vissa<br />

värden ges utan decimaler, andra med en l˚ang rad nollor p˚a slutet. Det finns ett antal<br />

kommandon som hjälper en att skräddarsy vad vi ser i kommandofönstret.<br />

För att stänga av ekot, det vill säga för att f˚a MATLAB att avst˚a fr˚an att rapportera<br />

resultatet av varje kommando vi skriver in räcker det med att avsluta raden med semikolon.<br />

Egentligen är det inte raden, utan kommandot som avslutas med semikolon. Distinktionen är<br />

viktig, eftersom användandet av semikolon gör det möjligt att skriva mer än ett kommando<br />

p˚a varje rad. Denna finess bör användas med omdöme, driver man det för l˚angt kan det bli<br />

nästan omöjligt att se vad man gjort, men rätt använt kan det istället göra det lättare att<br />

följa med:<br />

≫ laskeblask = 10; korv = 12; kaffe = 4;<br />

≫ Kalle = 2*korv + 4*kaffe<br />

Kalle =<br />

40<br />

ser mycket bättre ut än förra g˚angen vi räknade ut Kalles utgifter.<br />

Man bör försöka undvika alltför l˚anga kommandon, men ibland kan man behöva skriva<br />

kommandon som inte f˚ar plats p˚a en rad, som till exempel:<br />

Y = ((3.5*(laskeblask+korv)-kaffe)+sin(pi-2.75*Kalle)/korv∧2 +(45-kaffe)∧3<br />

Om vi behöver dela upp ett kommando p˚a fler rader kan vi göra det: För att tala om för<br />

MATLAB att kommandot inte är slut när raden är slut, vilket är vad MATLAB normalt<br />

antar, s˚a m˚aste den rad som har en fortsättning avslutas med tre punkter omedelbart följda<br />

av return:<br />

≫ Y = ((3.5*(laskeblask+korv)-kaffe)+...<br />

sin(pi-2.75*Kalle)/korv∧2+(45-kaffe)∧ 3))<br />

är allts˚a ett kommando även om det sträcker sig över mer än en rad.<br />

2.3.2 Format och avrundning<br />

I exemplen vi sett s˚a här l˚angt har MATLAB genomg˚aende skrivit ut heltal utan decimaler<br />

och decimaltal med fyra decimaler. Det senare gäller s˚aväl i de fall där vi har definierat en<br />

variabel genom att skriva in bara en decimal som t ex 0.5, som i de fall d˚a MATLAB visar<br />

ett tal med oändligt l˚ang decimalutveckling som pi eller 1/3. När vi kommer till mycket<br />

stora eller mycket sm˚a tal sl˚ar MATLAB om till att använda ”scientific notation”, där tal<br />

representeras som ett decimaltal multiplicerat med en lämplig tiopotens. I denna notation<br />

skrivs till exempel 1.602·10 −19 som 1.602e-19.<br />

Hur MATLAB skall formattera de tal som visas kan p˚averkas genom kommandot format.<br />

För att se vilka alternativ som finns kan vi g˚a till help fönstret och söka p˚a


2.3. MILJÖN I MATLAB 13<br />

?/MATLAB/Functions – Categorical List/Desktop Tools and Development Environment/Command<br />

Window and History/Format<br />

Eller enklare genom att bara skriva<br />

≫ help format<br />

Lägg särskilt märke till kommandot format compact som tar bort alla dessa blanka rader<br />

som MATLAB spottar ur sig.<br />

2.3.3 Matlabs “Workspace”<br />

Vi har nu sett hur variabler som vi definierar, till exempel laskeblask i avsnitt 2.2.3, ”lever<br />

kvar”. L˚angt efter det att vi definierat dem kan vi använda dem i nya uttryck, och vi kan se<br />

vilka värden de har genom att skriva deras namn i kommandofönstret. Det ställe där dessa<br />

variabler lever är en del av datorminnet som MATLAB reserverar för variabler och som<br />

kallas ”workspace”. Under l˚anga MATLAB sessioner kan MATLABs workspace bli ganska<br />

tätbefolkad, man kan lätt samla p˚a sig en stor mängd variabler. Som vi snart kommer att<br />

se kan ett variabelnamn beteckna inte bara tal, utan vektorer och matriser med hundratals<br />

element. För att vi lättare skall kunna ha översikt och kontroll över de variabler som lever<br />

i workspace finns speciella kommandon och verktyg. Det kanske tydligaste är ytterligare ett<br />

fönster som kallas just ”workspace”. För att öppna det g˚ar vi in i ”Desktop” menyn och sedan<br />

“Desktop Layou” och bockar för ”Workspace” (det gör du genom att klicka p˚a ”Workspace”<br />

i menyn). När du gjort det öppnas detta fönster som en pann˚a i MATLABs desktop. I<br />

detta fönster ser du alla variabler som är definierade i den p˚ag˚aende MATLAB sessionen.<br />

Varje rad inneh˚aller tre kolumner, den första anger variabelns namn, nästa dess aktuella<br />

värden. Slutligen visas vilken klass variabeln tillhör. I workspace-fönstret kan vi manipulera<br />

inneh˚allet i variablerna, och ocks˚a arbeta med workspace självt. Det är till exempel möjligt<br />

att spara hela inneh˚allet i workspace till h˚arddisken för att sedan läsa in det till workspace<br />

igen när vi startar nästa MATLAB session. Detta är ett sätt att inte behöva skiva in alla<br />

data (som t ex priset p˚a en läskeblask och en varmkorv) varje g˚ang vi vill göra en viss typ<br />

av beräkningar.<br />

Vi kan ocks˚a studera variablerna närmare genom att dubbelklicka p˚a namnet för en av dem i<br />

workspace-fönstret. Gör vi det öppnas ett fönster med värdet p˚a variabeln. För tal är detta<br />

fönster inte särskilt intressant, men om vi gör för en en matris kommer vi att f˚a se en snygg<br />

representation av matrisen där vi kan g˚a in och ändra enstaka element. Vi ˚aterkommer till<br />

de mer avancerade användningarna av workspace-fönstret senare (när du har tittat klart p˚a<br />

det här fönstret stänger du det - precis som alla andra fönster i Windows - genom att klicka<br />

p˚a X i övre högra hörnet),<br />

Ett alternativt sätt att se vad som finns i workspace är att i kommandofönstret ge kommandot<br />

whos.<br />

Vi kan nu ocks˚a först˚a litet bättre vad clear kommandot gör: genom att skriva clear<br />

Kalle tar vi helt enkelt bort variabeln Kalle fr˚an MATLABs workspace, vilket gör att MAT-<br />

LAB helt glömmer bort att Kalle existerat. Du kan prova detta genom att skriva clear<br />

xxx i kommandofönstret för n˚agon av de variabler som syns i workspace-fönstret och se vad<br />

som händer.<br />

2.3.4 ”Play it again Sam”- att upprepa kommandon<br />

I ”Kalle Ankas Julafton” finns en film som visar en husvagnstur med Kalle Anka, Musse Pigg<br />

och L˚angben. I en av scenerna sitter L˚angben och äter en majskolv. När han gör det för han<br />

munnen över majskolven, varvid det hörs ett konstigt knattrande ljud. När han kommit till<br />

slutet av majskolven hörs ett pling, varvid han flyttar huvudet till andra sidan av majskolven


14 KAPITEL 2. ATT KOMMA IG˚ANG<br />

och proceduren börjar om. När mina barn ser det här skrattar dom, men dom har ingen<br />

aning om vad det hela anspelar p˚a: förr i tiden fanns det skrivmaskiner!<br />

När författaren var ung var skrivmaskiner n˚anting ganska häftigt. Med ganska mycket möda<br />

kunde man f˚a ett brev eller ett dokument att se jätteproffsigt ut. Kruxet var bara att<br />

skrivmaskiner var fullkomligt skoningslösa - skrev man fel var det bara att riva ut pappret och<br />

börja om (p˚a hemma-niv˚a kunde man först˚as backa och kryssa över med ett antal ”XXXX”,<br />

men det förtog ganska mycket av effekten). Det fanns speciella suddgummin för skrivmaskier,<br />

stenh˚arda skivor som antingen rev sönder pappret i sm˚abitar eller smetade ut skriften över<br />

hela pappret. S˚a sm˚aningom kom ”TipEx”, en vit färg man kunde m˚ala över sina misstag<br />

med, och sedan skriva ny text ovanp˚a. Det blev med ens möjligt att hyfsa till dokument om<br />

man gjorde n˚agot enstaka fel, men riktigt proffssnyggt blev det inte, och man kunde inte<br />

heller ändra hela stycken mitt i ett färdigt dokument.<br />

De av oss som har upplevt denna period kan till fullo uppskatta vad ankomsten av sm˚a billiga<br />

datorer betytt för ordbehandlingen: ändringar blir triviala, felstavningar korrigeras enkelt<br />

(ibland till och med automatiskt), man kan ˚ateranvända gamla dokument, byta ut stycken<br />

helt godtyckligt - aldrig tidigare har s˚a mycket text kunnat produceras med s˚a liten möda!<br />

Det vore naturligtvis skönt att kunna f˚a en ”räknebehandlare” som har alla dessa företräden.<br />

Har man väl skrivit in<br />

Y = ((3.5*(a+b)-c)+sin(phi-2.75*D)/epsil∧2+(455-abba∧)/ (cos(4+pi)-2.75) bara<br />

för att komma p˚a att det borde ha varit<br />

Y = ((3.5*(a+b)-c)+sin(phi-2.75*B)/epsil∧2+ (455-abba∧3)/(cos(4+pi)-2.75) s˚a<br />

kan man bli litet trött, och önska sig att MATLAB bar sig ˚at som en ordbehandlare. Om man<br />

sedan kommer tillbaks en vecka senare för att räkna om n˚agot p˚a en lab-rapport man f˚att<br />

˚ater p˚a s˚a önskar man verkligen att man kunde trolla tillbaks vad man gjorde förra veckan.<br />

MATLAB, och andra moderna beräkningsprogram, svarar upp till dessa förväntningar. Dels<br />

finns det ett sk ”historie-fönster” där man kan ˚aterkalla sina tidigare kommandon och redigera<br />

dessa innan man exekverar dem igen. Dessutom kan man spara hela sekvenser av<br />

kommandon i s˚a kallade ”M-filer” som man sedan kan ˚aterkalla, eventuellt redigera, och<br />

köra igen.<br />

2.3.5 Att ˚aterkalla kommandon<br />

Det enklaste sättet att f˚a chansen att göra om n˚agot vi gjort nyligen är att trycka p˚a upp-pilen<br />

p˚a tangentbordet. När vi gör det visas det senast utförda kommandot i kommandofönstret.<br />

Trycker vi p˚a pilen en g˚ang till kommer kommandot innan dess och s˚a vidare. När vi knappat<br />

oss fram till det kommando vi vill göra om s˚a är det bara att trycka p˚a return s˚a utförs<br />

kommandot en g˚ang till. Oftast s˚a ˚aterkallar man ju ett kommando för att man gjort n˚agot<br />

smärre fel som man vill korrigera, vilket är lätt gjort. När man bläddrat fram det kommando<br />

man vill göra om kan man flytta sig in i raden genom att trycka p˚a vänster-pil. När man<br />

gör det rör sig pekaren in över raden, när den st˚ar till höger om det man vill ändra kan man<br />

radera ut delar av kommandot genom att trycka p˚a delete-knappen. När man suddat det<br />

som är fel är det bara att skriva in vad som skall st˚a i stället. När man är nöjd är det sedan<br />

bara att trycka p˚a return. Oavsett om pekaren st˚ar mitt i raden s˚a kommer MATLAB att<br />

utföra kommandot som st˚ar p˚a hela raden.<br />

Man kan ocks˚a ta sig in i raden genom att bara flytta pekaren till n˚agot ställe i raden genom<br />

att klicka. Prova genom att t ex skriva<br />

≫ y = sin (2 * pi)<br />

och sedan till exempel ändra 2 till 3 eller sin till cos.


2.4. M-FILER 15<br />

2.3.6 Matlabs historiefönster<br />

Ett annat litet översk˚adligare sätt att se vad man gjort är att öppna MATLABs historiefönster,<br />

g˚a till Desktop och välj ”View Command History”. När du gör det öppnas<br />

ytterligare en pann˚a i MATLABs desktop. Om du fortfarande har ”Workspace” öppen<br />

kommer (oftast, detta kan variera litet med hur MATLAB är inställd) ”Command History”<br />

och ”Workspace” att dela p˚a den vänstra pann˚an, du kan d˚a växla mellan dem genom att<br />

klicka p˚a fliken som finns längst ned i denna pann˚a. När ”Command History” är aktivt s˚a<br />

kan du i det se de senaste kommandon du utfört i kommandofönstret.<br />

Om du dubbelklickar p˚a en rad i det fönstret s˚a utförs det kommandot en g˚ang till. Du<br />

kan ocks˚a göra mer avancerade operationer genom att klicka en g˚ang p˚a en rad och sedan<br />

högerklicka i historiefönstret.<br />

Du f˚ar d˚a upp en meny som ser ut ungefär som till höger.<br />

Vi ˚aterkommer till de flesta av alternativen, det vi skall<br />

använda nu är ”Copy”. Klicka p˚a ett kommando i historiefönstret,<br />

högerklicka och välj ”Copy”. G˚a därefter till kommandofönstret<br />

och högerklicka. I den meny som d˚a dyker upp<br />

kan du välja ”Paste” (klistra in). När du gjort det har du flyttat<br />

kommandot fr˚an historiefönstret till kommandofönstret.<br />

Väl där kan du ändra i det gamla kommandot och sedan utföra det nya modifierade kommandot<br />

genom att trycka p˚a return. Det kan tyckas vara ett omständigt sätt att skriva in<br />

ett kommando, men om vi minns<br />

Y = ((3.5*(a+b)-c)+sin(phi-2.75*D)/epsil**2+(455-abba**3)/(cos(4+pi)-2.75)<br />

s˚a inser vi att det kan vara mycket enklare och snabbare (och mindre känsligt för nya fel)<br />

att kopiera in kommandot fr˚an historiefönstret och ändra än att skriva in kommandot fr˚an<br />

scratch.<br />

2.4 M-filer<br />

Det absolut smidigaste sättet att använda MATLAB är att konsekvent jobba med s˚a kallade<br />

”m-filer”. I en m-fil kan man skriva in alla kommandon man kan skriva i MATLABs kommandofönster<br />

och spara dessa till h˚arddisken. När man sedan skriver namnet p˚a m-filen i<br />

MATLABs kommandofönster s˚a utförs alla kommandon som st˚ar i filen och resultatet visas<br />

i MATLABs kommandofönster. Genom att utnyttja m-filer kan vi spara en otrolig mängd<br />

arbete. Vi kan till exempel skriva in alla r˚adata fr˚an en laboration i en m-fil, sedan steg för<br />

steg skriva in alla operationer för att göra mätvärdesbehandling p˚a laborationen. Därefter<br />

skriver vi in de kommandon som krävs för att producera de grafer vi skall redovisa i laborationsredogörelsen.<br />

Vi kan när som helst i den här processen ta paus, spara filen till disk och<br />

fortsätta vid ett senare tillfälle. Det är ocks˚a enkelt att ändra ett enstaka kommando om<br />

man har f˚att n˚agon formel om bakfoten, eller om man vill ändra n˚agon detalj i ett histogram.<br />

Det bästa man kan göra som student är att bygga upp ett förr˚ad av sm˚a m-filer som gör<br />

avgränsade uppgifter, till exempel en anpassning till en andragradskurva eller en beräkning<br />

av chi-kvadrat. Eftersom en m-fil kan kalla en m-fil kan filer som utför klart definierade<br />

uppgifter enkelt ˚ateranvändas när liknande problem skall lösas.<br />

2.4.1 Editorn för M-filer<br />

MATLAB har ett särskilt fönster som används för att skapa och ändra m-filer. Du kan hitta<br />

fullständig information om MATLABs editor vid<br />

?/MATLAB/Desktop Tools and Development Environment/ Editing and Debugging<br />

M-files , här ger vi den information som behövs för att komma ig˚ang och jobba.


16 KAPITEL 2. ATT KOMMA IG˚ANG<br />

Det finns m˚anga sätt att starta verktyget:<br />

• Om vi klickar p˚a ikonen som visar ett tomt vitt pappersark längst till vänster i verktygslisten<br />

öppnas editeringsfönstret och vi kan börja skriva in v˚ara kommandon. Startar<br />

vi editorn p˚a det här sättet finns inget filnamn definierat för den nya m-filen, s˚a när vi<br />

sparar filen kommer MATLAB att begära att vi anger ett namn.<br />

• I menyn ”File” klickar vi p˚a ”New” och sedan ”M-file” för att uppn˚a samma resultat.<br />

• I kommandofönstret skriver man ”Edit” för att f˚a upp ett fönster och en ny fil.<br />

• Alternativt kan man i kommandofönstret skriva ”Edit filnamn”. Om det existerar en<br />

fil med det namnet n˚agonstans inom MATLABs sökväg s˚a öppnas denna. Om inte s˚a<br />

presenterar MATLAB en dialogruta där vi f˚ar svara p˚a om vi vill skapa en ny fil med<br />

det namnet. Svarar vi nej s˚a öppnas inget editor-fönster.<br />

L˚at oss börja med att säga hej, öppna editorn för m-filer p˚a n˚agot av ovanst˚aende sätt. Skriv<br />

sedan in raden:<br />

disp (’Hello World’)<br />

2.4.2 Att spara en M-fil p˚a disk<br />

Hela poängen med att skapa en m-fil är ju att den skall sparas p˚a h˚arddisk. För att göra<br />

det g˚ar vi in i ”File” menyn och väljer ”Save”. Om filen vi vill spara är nyskapad och inte<br />

har n˚agot namn s˚a kommer MATLAB att öppna en dialogruta där vi kan ange filens namn<br />

och i vilken katalog den skall ligga. Har vi ändrat i en redan existerande fil s˚a sparas den<br />

ändrade versionen med samma namn som den ursprungliga. Observera att det här innebär<br />

att den ursprungliga versionen är förlorad för gott. Det kan därför vara klokt, särskilt om<br />

man vill ändra i en komplicerad redan fungerande fil, att istället för att spara den med samma<br />

namn som tidigare spara en kopia med ett annat namn s˚a att den ursprungliga, oförändrade<br />

versionen av filen finns kvar p˚a h˚arddisken. Detta gör man genom att istället för att ange<br />

”Save” väljer ”Save as...” under ”File”-menyn. Vi f˚ar även i det här fallet upp dialogrutan<br />

där vi kan välja namn och katalog för filen. När man väl har introducerat alla ändringar och<br />

f˚att dem att fungera som man önskar kan man slänga den gamla filen och döpa om den nya<br />

till det gamla namnet om man s˚a önskar.<br />

En genväg för att spara filen är att klicka p˚a diskett-symbolen i verktygsraden. För en ny<br />

fil f˚ar vi d˚a upp dialogrutan och kan välja namn och katalog, en gammal fil sparas med det<br />

gamla namnet.<br />

Ta nu och spara din första m-fil genom n˚agon av metoderna ovan. Lägg filen i en lämplig<br />

katalog (kanske ”MATLAB/pass2” ?) p˚a din afs-area. Ge filen namnet ”hej”. Du behöver<br />

inte själv lägga till ändelsen ”.m” det sköter MATLAB själv.<br />

2.4.3 Läsa in och köra en m-fil<br />

Enklaste sättet att köra en m-fil är att bara skriva dess namn i kommandofönstret. Om filen<br />

finns antingen i den aktuella katalogen eller i n˚agon katalog i sökvägen 2 (mer om “sökväg”<br />

2 Om det finns fler filer med samma namn i olika kataloger som finns i sökvägen s˚a väljer Matlab den som<br />

kommer först. Om resultatet inte blir vad man tänkt sig kan det bero p˚a att det finns en namne till den fil<br />

vi egentligen vill köra, och att den hamnar före i kön.


2.4. M-FILER 17<br />

kommer i avsnitt ?? s˚a kommer de kommandon som finns i filen att utföras. Prova:<br />

≫hej<br />

Hello World<br />

Du kan ocks˚a köra en m-fil direkt fr˚an editor-fönstret genom att antingen klicka<br />

p˚a symbolen till höger eller ocks˚a g˚a till menyn ”Debug” och välja ”Run”. Om<br />

det finns ändringar i editor-fönstret som inte är sparade till h˚arddisk<br />

s˚a sparas först filen till disk innan kommandona utförs. När man h˚aller p˚a och jobbar med<br />

en komplicerad m-fil som till exempel när man vill f˚a ett visst utseende p˚a en graf och h˚aller<br />

p˚a och provar sig fram s˚a är det bekvämt att köra filen fr˚an editor-fönstret p˚a det här sättet.<br />

2.4.4 Kommentarer<br />

I princip är det ingen skillnad p˚a hur MATLAB hanterar kommandon som skrivs in i kommandofönstret<br />

och kommandon som läses in via en m-fil. Det finns änd˚a ett antal kommandon<br />

som man knappast använder i kommandofönstret men som spelar en stor roll när vi<br />

jobbar med m-filer. Viktigast av dessa är ett av de allra viktigaste MATLAB kommandot -<br />

kommentarer.<br />

Kommentarer inleds med ett procenttecken ”%” och följs av godtycklig text. När MATLAB<br />

utför kommandon ignorerar programmet procenttecknet och vad som följer efter det. Syftet<br />

med kommentarer är att det skall göra det enklare att titta i en m-fil och kunna följa med vad<br />

programmet gör, och hur. Detta är användbart b˚ade om man använder program skrivna av<br />

andra, men ocks˚a när man ett ˚ar senare (kom ih˚ag att ni skall spara alla era gamla m-filer!)<br />

˚atervänder till filer man själv har skrivit, det kan vara nog s˚a sv˚art att minnas vad man själv<br />

tänkt och gjort! Kommentarer används<br />

1. som en varudeklaration i början av ett program (i det här sammanhanget är en m-fil<br />

att betrakta som ett program) för att beskriva vad programmet gör, vad det heter,<br />

vem som har skrivit det och när, samt om programmet behöver n˚agon speciell typ av<br />

indata eller levererar n˚agon speciell typ av ut-data.<br />

2. för att beskriva vad de viktigaste variablerna st˚ar för<br />

3. vad de olika programstegen utför<br />

Det g˚ar nästan alltid att med ett snabbt ögonkast skilja ett program skrivet av en van programmerare<br />

fr˚an ett skrivet av en nybörjare, även om man inte begriper ett skvatt av vad<br />

programmet gör. Eftersom en av skillnaderna ofta är mängden kommentarer - en duktig<br />

programmerare skriver mycket kommentarer - s˚a kan man ibland frestas att skriva en kommentar<br />

även för triviala steg, vilket inte underlättar läsningen. Exakt hur mycket och vilka<br />

avsnitt som skall kommenteras kan vara en smaksak, men ett exempel som författaren tycker<br />

är rimligt kan vara:


18 KAPITEL 2. ATT KOMMA IG˚ANG<br />

%--------------------------------------------------<br />

% Volume.m<br />

%<br />

% Beraknar volymen for cylindrar baserat pa<br />

% matt radie och angiven hojd<br />

% Sten Hellman 2002-03-03<br />

%--------------------------------------------------<br />

Radie = [10.2 14.5 17.6 25.3 30.6 43.5]<br />

Hojd = [12.5 22.4 44.5 47.6 54.4 88.4]<br />

Volym = pi*Radie.\^2 .* Hojd<br />

%<br />

% Felet i radien ar konstant 0.3, felet i hojden<br />

% ar 10% av matetalet<br />

%<br />

DeltaRadie = 0.3 * ones(1,6)<br />

DeltaHojd = 0.1 * Hojd<br />

DeltaVolym = Volym * sqrt( (DeltaRadie ./ ...<br />

(2*Radie) ).\^2 +(DeltaHojd ./ Hojd).\^2)<br />

Däremot vore till exempel<br />

%<br />

% Volymen ar pi * r-kvadrat * hojden<br />

%<br />

Volym = pi*Radie.\^2 .* Hojd\<br />

en överdrift som knappast gör det enklare att följa koden.<br />

2.4.5 In- och utmatning av data till M-filer<br />

En annan skillnad mellan att skriva m-filer och ge kommandon direkt i kommandofönstret<br />

är hur data matas in i MATLAB och hur de presenteras för den som utför ett kommando.<br />

Kommandot disp är ju till exempel oftast inte särskilt meningsfullt i kommandofönstret. Att<br />

f˚a MATLAB att skriva ”Hallo World” genom att själv skriva precis samma sak i argumentet<br />

till kommandot disp är ju m˚attligt intressant. I en m-fil som man kör är kommandot däremot<br />

mycket nyttigt eftersom det kan användas för att skriva information i kommandofönstret som<br />

kan ange resultat av beräkningar eller ange att vi skall mata in information till MATLAB.<br />

Vi kommer snart att märka att det finns ett behov av att kunna mata in data till en körande<br />

m-fil och att skriva ut data fr˚an filen till kommandofönstret. Man kan till exempel tänka<br />

sig att m-filen i föreg˚aende avsnitt istället för att beräkna volymen av ett antal cylindrar<br />

där vi skriver in radie och höjd i m-filen skriver en mer allmän m-fil som kan användas för<br />

att beräkna volymen av en godtycklig cylinder. En s˚adan m-fil behöver d˚a ha en metod<br />

för användaren att mata in ett godtyckligt värde p˚a radien och höjden, och en metod att<br />

mata ut resultatet fr˚an beräkningen i kommandofönstret. Vi kommer att lära oss hur det<br />

g˚ar till i avsnitt 8.2 nedan där vi g˚ar igenom s˚a kallad formaterad in- och utmatning. Men<br />

redan innan vi lärt oss detta kan vi kommunicera med m-filer genom att utnyttja att m-filer<br />

och kommandofönstret använder samma workspace. Om vi till exempel kör m-filen ovan för<br />

att beräkna cylindervolymer s˚a kommer variabeln Volym som inneh˚aller resultatet att finnas<br />

kvar i workspace. Vi kan allts˚a genom att skriva Volym i kommandofönstret se resultatet av<br />

beräkningen. Omvänt kan man tänka sig att ta bort raden<br />

Radie = [10.2 14.5 17.6 25.3 30.6 43.5]<br />

ur m-filen och istället innan vi kör m-filen tilldela värden i kommandofönstret. Eftersom<br />

Radie d˚a existerar i workspace kommer m-filen att fungera precis som vanligt. P˚a det sättet


2.4. M-FILER 19<br />

g˚ar det enkelt att köra om filen med olika värden p˚a radien, det är bara att skriva in nya<br />

värden p˚a Radie.<br />

2.4.6 Utskrift när M-filen kör - Echo kommandot<br />

När MATLAB kör en m-fil s˚a skriver programmet ut varje kommando i kommandofönstret,<br />

följt av svaret p˚a kommandot. Det här kan vara väldigt bra om vi sitter och jobbar med en<br />

m-fil som ännu inte fungerar som det var tänkt. Men för en fungerande och litet komplicerad<br />

m-fil kan det vara väldigt irriterande, kommandofönstret fylls av information som man ofta<br />

inte är intresserad av. För att styra detta kan man använda kommandot echo. Skriver vi<br />

echo off stängs repetitionen av varje kommando av, skriver vi echo on s˚a sätts den p˚a<br />

igen. Fullständig dokumentation av kommandot f˚ar du om du skriver help echo.<br />

Att sätta echo till off innebär att vi inte behöver se varje kommando upprepas p˚a skärmen,<br />

men fortfarande s˚a kommer MATLAB att visa resultaten, om vi till exempel kör en m-fil<br />

med kommandot Radie = [10.2 14.5 17.6 25.3 30.6 43.5] med echo on s˚a ser vi<br />

≫Radie = [10.2 14.5 17.6 25.3 30.6 43.5]<br />

Radie =<br />

10.2 14.5 17.6 25.3 30.6 43.5<br />

i kommandofönstret. Har vi däremot satt echo till off s˚a ser vi<br />

≫Radie = 10.2 14.5 17.6 25.3 30.6 43.5<br />

i kommandofönstret. Även för en fungerande m-fil kan det vara bra att se vilka värden de<br />

viktigaste variablerna har, men vi vill förmodligen inte se alla variabler och vilka värden de<br />

antar. För att slippa eko av dessa “oviktiga variabler” använder vi samma knep som när vi<br />

skrev in kommandon direkt i kommandofönstret - vi avslutar raden med semikolon.<br />

2.4.7 Paus i utskriften<br />

Ibland vill man att en m-fil som kör skall stanna upp s˚a att man hinner se delresultat.<br />

Speciellt om man visar fler plottar i samma figurfönster och vill hinna titta p˚a en plot innan<br />

programmet skriver över den med nästa. D˚a kan vi använda kommandot pause. Ger vi<br />

kommandot utan argument i en m-fil s˚a gör exekveringen av filen halt när den kommer till<br />

pause-kommandot och pekaren visas som ett stort “P”. Programmet fortsätter att köra när<br />

vi trycker ned en godtycklig tangent. Vi kan ocks˚a ge kommandot med ett sifferargument,<br />

programmet gör d˚a en paus i det antal sekunder som ges i argumentet.<br />

2.4.8 Namngivning av M-filer<br />

En viktig detalj att tänka p˚a är att en m-fil inte skall ha samma namn som en variabel som<br />

förekommer i filen. Det är lätt hänt att man ger b˚ade filen och den viktigaste variabeln<br />

ett namn - samma namn - som anknyter till den uppgift programmet skall lösa. Det här<br />

kan leda till mycket förvirrning. Antag till exempel att vi i avsnitt 2.4.4 hade kallat mfilen<br />

volym. Första g˚angen vi kör filen g˚ar allt väl, men om vi därefter ändrar n˚agon liten<br />

detalj i programmet och försöker köra om s˚a ser vi antagligen inte alls det vi förväntar oss.<br />

Orsaken är att programmet själv skriver in vektorn volym i MATLABS workspace. Nästa<br />

g˚ang vi försöker köra programmet med samma namn kommer matlab inte att tolka volym<br />

som en referens till programmet, utan till vektorn och som respons p˚a kommandot kommer<br />

den att skriva ut inneh˚allet i vektorn. Om ni n˚agon g˚ang sitter och försöker ändra i en m-fil<br />

men förändringarna inte sl˚ar igenom kan det därför vara idé att kontrollera om det finns en<br />

variabel med samma namn som m-filen.


20 KAPITEL 2. ATT KOMMA IG˚ANG<br />

2.5 Litet om vektorer<br />

I MATLAB definieras vektorer i stort sett som i matematiken: en ordnad följd av tal. Att<br />

vi skriver ”i stort sett” beror p˚a att en MATLAB-vektor utöver tal ocks˚a kan inneh˚alla textsträngar,<br />

vi ˚aterkommer senare till denna typ av vektorer och koncentrerar oss p˚a vektorer<br />

och matriser som endast inneh˚aller tal. När vi talar om vektorer i fysiken s˚a är vi ofta inte s˚a<br />

noga med distinktionen mellan radvektor och kolumnvektor (vi använder för det mesta bara<br />

radvektorer). I MATLAB kommer vi att göra skillnad mellan radvektorer och kolumnvektorer,<br />

liksom i fysiken är ”standard”-vektorn en radvektor. Kolumn-vektorer skapas genom<br />

att transponera en radvektor. MATLAB betraktar vektorer som specialfall av matriser, en<br />

radvektor med n element är en (1 × n) matris, en kolumnvektor är en (n × 1) matris.<br />

2.5.1 Skapa vektorer<br />

Det enklaste sättet att skapa en radvektor är genom direkt tilldelning, kommandot<br />

≫ x = [2.3 4.5 7.3 8.2];<br />

skapar en radvektor med fyra element och ger dem de angivna värdena. Tecknen [ och ]<br />

kallas hakparanteser, du skriver dem genom att samtidigt som du trycker ned tangenten ”Alt<br />

Gr” till höger om mellanslagstangenten trycka ned 8 resp 9.<br />

Vill vi se vilka värden vektorn har skriver vi som vanligt bara namnet p˚a vektorn i kommandofönstret.<br />

Ett alternativt sätt är att g˚a till workspace fönstret och klicka p˚a variabeln<br />

s˚a att ”array”-fönstret öppnas. Prova! Vi kan som vanligt adressera enskilda element i<br />

vektorerna genom att ge ett index som pekar p˚a ett av elementen i vektorn, x(1) är första<br />

elementet i vektorn x osv.<br />

Vektorer kan ocks˚a tilldelas värden som beräknas<br />

≫ y = 7.2;<br />

≫ clear x<br />

≫ x = [y y/2 y+4];<br />

≫ x<br />

x =<br />

7.2000 3.6000 11.2000<br />

Här ser vi hur MATLAB kan beräkna värden för enskilda vektorelement ur givna uttryck.<br />

Vill vi skapa en kolumnvektor s˚a gör vi det genom att transponera en radvektor med operatorn<br />

’ . 3<br />

≫ a = [ 1 2 4]<br />

a =<br />

1 2 4<br />

≫ b = a’<br />

b =<br />

1<br />

2<br />

4<br />

Alternativt kan man ge transponeringsoperatorn direkt i tilldelningssatsen: a = [ 1 2 4 ] ’<br />

markerar direkt att a skall vara en kolumnvektor.<br />

3 Det vinns tv˚a snarlika tecken p˚a tangentbordet, akut accent och enkelt citationstecken. Operatorn vi<br />

skall använda är det senare tecknet, som delar tangent med * nära retur-tangenten


2.5. LITET OM VEKTORER 21<br />

2.5.2 Räkna med vektorer<br />

Vektoralgebran i MATLAB fungerar som vi är vana vid fr˚an matematiken:<br />

≫ a = [1 2 5];<br />

≫ b = [2 -1 3];<br />

≫ 3*a<br />

ans =<br />

3 6 15<br />

≫ a + b<br />

ans =<br />

3 1 8<br />

≫ c = a(3) - 7*b(2)<br />

ans =<br />

12<br />

≫ a + 3<br />

ans<br />

4 5 8<br />

MATLAB klarar ocks˚a av skalärpodukt av vektorer, under förutsättning att man ställer upp<br />

det som en matrismultiplikation, det vill säga som en multiplikation av en (1 × n) matris<br />

med en (n × 1) matris för att f˚a en (1 × 1) matris:<br />

≫ c = a * b’<br />

c =<br />

15<br />

En annan litet speciell egenskap är att vi kan applicera vissa standardfunktioner p˚a en vektor<br />

och f˚a en ny vektor:<br />

≫ x = [ 0 pi/4 pi/2 3*pi/4 ];<br />

≫ y = sin(x)<br />

y =<br />

0 0.7071 1 0.7071<br />

2.5.3 Elementvisa operationer<br />

Ett begrepp som är nytt relativt matematikens vektoralgebra är de elementvisa operationerna.<br />

Detta är normala matematiska operationer som utförs p˚a varje element i vektorn<br />

i stället för p˚a vektorn själv. Ett exempel är kvadrering, om a är en vektor s˚a betecknar a 2<br />

skalärprodukten av vektorn med sig själv. M˚anga g˚anger vill vi dock göra saker som att fr˚an<br />

en vektor med x-värden skapa en vektor med motsvarande x 2 -värden. Det vi vill göra är ju<br />

d˚a inte att ta kvadraten av vektorn x, utan kvadraten av varje element i vektorn x och skapa<br />

en ny vektor med dessa som element. Detta gör man genom att använda elementvis exponentiering.<br />

Vi kan ocks˚a utföra till exempel elementvis multiplikation mellan tv˚a vektorer.<br />

En s˚adan produkt är inte detsamma som skalärprodukten av vektorerna, utan en ny vektor<br />

där varje element best˚ar av produkten av motsvarande element i de tv˚a ursprungliga vektorerna.<br />

Elementvisa operatorer har samma symbol som de vanliga operatorerna omedelbart


22 KAPITEL 2. ATT KOMMA IG˚ANG<br />

föreg˚anget av en punkt. Vi har t.ex.<br />

≫ clear x;<br />

≫ x = [1 2 -3 5];<br />

≫ y = x.∧2<br />

y =<br />

1 4 9 25<br />

≫ x .* y<br />

ans =<br />

1 8 -27 125<br />

≫ a = [4 -1.5 2 7];<br />

≫ a ./ y<br />

ans =<br />

4.0000 -0.3750 0.2222 0.2800<br />

≫ 1 ./ x<br />

ans =<br />

1 0.5000 -0.3333 0.2000<br />

2.5.4 Litet om matriser<br />

MATLAB har en väl utvecklad uppsättning specialfunktioner för matris-algebra. Vi kommer<br />

snart att ˚atervända till det, nu börjar vi med att lära oss att skapa matriser och göra n˚agra<br />

enkla beräkningar med dem.<br />

Skapa matriser<br />

Det enklaste (men ofta l˚angt ifr˚an minst arbetskrävande) sättet att skapa en matris är att<br />

skriva in data rad för rad, med hakparantes i början och slutet:<br />

≫ A = [1 2 4<br />

1 0 3<br />

2 -1 0]<br />

A =<br />

1 2 4<br />

1 0 3<br />

2 -1 0<br />

(Glöm inte bort att titta i workspace hur matriser representeras!). Ett enklare sätt att skriva<br />

in samma sak är att avgränsa rader med semikolon:<br />

≫ A = [1 2 4 ; 1 0 3 ; 2 -1 0];<br />

ger exakt samma resultat. Man kan ocks˚a skapa matriser ur vektorer:<br />

≫ b1 = [1 2 4]; b2 = [1 0 3]; b3 = [2 -1 0];<br />

≫ B = [b1 ; b2; b3 ]<br />

B =<br />

1 2 4<br />

1 0 3<br />

2 -1 0<br />

För att komma ih˚ag vilka element som hamnar var i matrisen kan det vara bra att se saken<br />

litet formellt: i raden där vi skapar matrisen B skapar vi rent formellt en 3 × 1 matris (eller<br />

om man s˚a vill en kolumnvektor) där varje rad best˚ar av ett element i sin tur är en vektor,


2.6. INBYGGDA FUNKTIONER 23<br />

tredje raden blir d˚a lika med vektorn b3 osv. Vi kan vända p˚a steken:<br />

≫ c1 = [1 ; 2 ; 4];<br />

≫ c2 = [1 ; 0 ; 3];<br />

≫ c3 = [2 ; -1 ; 0];<br />

≫ C = [c1 c2 c3 ]<br />

C =<br />

1 1 2<br />

2 0 -1<br />

4 3 0<br />

Här skapar vi formellt en 1×3 matris (en radvektor) där varje element i sin tur är en kolumnvektor.<br />

Om man tänker p˚a det sättet s˚a kan man nästan grafiskt se vad satsen C = [c1 c2<br />

c3 ] ger för resultat.<br />

2.5.5 Räkna med matriser<br />

Normal matrisalgebra fungerar i MATLAB, dessutom har vi tillg˚ang till de elementvisa<br />

operatorerna och vi kan ocks˚a applicera en mängd standardfunktioner som till exempel cos(x)<br />

ocks˚a p˚a matriser. N˚agra exempel:<br />

≫ clear all<br />

≫ a = [1 2 5 ; 2 -1 -3];<br />

≫ b = [ 2 -1; 5 2; -1 0];<br />

≫ a * b<br />

ans =<br />

7 3<br />

2 -4<br />

≫ 1./a<br />

ans =<br />

1.0000 0.5000 0.2000<br />

0.5000 -1.0000 -0.3333<br />

≫ b .∧2<br />

ans =<br />

4 1<br />

25 4<br />

1 0<br />

≫ a(1,2) + b(2,1)<br />

ans = 7<br />

Som vanligt gäller naturligtvis att matrisernas dimensioner m˚aste matcha varandra för att<br />

matrismultiplikationen skall fungera, annars erh˚aller vi felmeddelandet:<br />

??? Error using ==> mtimes<br />

Inner matrix dimensions must agree.<br />

2.6 Inbyggda funktioner<br />

Det finns ett mycket stort antal standardfunktioner inbyggda i MATLAB, man kan utg˚a<br />

ifr˚an att den funktion man vill använda ocks˚a finns inbyggd och bara mycket sällan bli man<br />

besviken. De vanligast förekommande är grupperade i tre sektioner, elementära funktioner,<br />

specialfunktioner och elementära matrisfunktioner. Det enklaste sättet att f˚a reda p˚a vilka<br />

funktioner som finns är att i kommandofönstret skriva help elfun, help specfun och<br />

help elmat. När man väl hittat den funktion man söker kan man f˚a mer detaljerade information<br />

om den genom att skriva help funktionsnamn. Observera att MATLAB skriver<br />

funktionsnamn med versaler i hjälpdokumentationen, men att du skall använda gemener<br />

(sm˚a bokstäver) när du ger kommandot i MATLAB.


24 KAPITEL 2. ATT KOMMA IG˚ANG<br />

2.6.1 Operationer p˚a skalärer<br />

Avrundning<br />

MATLAB har ett antal funktioner för att runda av decimaltal till heltal: floor som rundar<br />

av mot “minus oändligheten”, dvs mot närmast lägre tal vilket är detsamma som att bara<br />

droppa decimaldelen, round som rundar av mot närmaste heltal, ceil som rundar av mot<br />

“positiva oändligheten, dvs närmast större tal, och fix som rundar av mot noll, dvs ned˚at<br />

för positiva tal och upp˚at för negativa tal.<br />

2.6.2 Operationer p˚a vektorer<br />

MATLAB har ett antal inbyggda funktioner som opererar p˚a vektorer. Vi har redan sett<br />

ett exempel p˚a en s˚adan, nämligen transponering ’, som applicerad p˚a en vektor gör om en<br />

radvektor till en kolumnvektor och vice versa.<br />

Andra funkioner är:<br />

zeros, ones, rand, randn<br />

Dessa operatorer kan användas för att skapa vektorer och matriser utan att man behöver<br />

tilldela elementen sina värden ett och ett.<br />

zeros(n,m) skapar en n × m matris där alla element är satta till noll. Som ett specialfall<br />

kan n eller m vara 1, i vilket fall en radvektor repektive kolumnvektor skapas.<br />

ones (n,m) skapar en n × m matris där alla element är satta till 1.<br />

rand (n,m) och randn (n,m) skapar matriser där elementen är slumpvis fördelade, rand<br />

producerar tal som är jämnt fördelade mellan 0 och 1, randn producerar slumptal som är<br />

normalfördelade kring 0 med standardavvikelse lika med 1.<br />

För alla dessa gäller att om du bara ger en siffra som argument s˚a skapas en kvadratisk<br />

matris.<br />

linspace<br />

Kommandot linspace(x1, x2, N)skapar en vektor som har N element, x1 som första<br />

element och x2 som sista element. Avst˚andet mellan elementen beräknas automatiskt s˚a att<br />

de blir lika stora. Till exempel ger y = linspace(0,1,5) resultatet [0 0.2500 0.5000 0.7500<br />

1.0000] medan y=linspace(0,1,4) ger [0 0.3333 0.666 1.0000]<br />

length(vektor)<br />

Kommandot length(vektor) returnerar längden av vektorn x, man kan spara resultatet<br />

i en variabel genom att ge kommandot langd = length(vektor).<br />

sum (vektor)<br />

beräknar summan av alla element i vektorn.<br />

”kolon” - operatorn<br />

”kolon” operatorn är en mycket användbar operator i MATLAB, b˚ade när vi arbetar med<br />

vektorer och matriser. Den förekommer i fler olika versioner, vilket i början kan göra det<br />

litet förvirrande. Den enklaste formen är a : b viket helt enkelt motsvarar serien av tal fr˚an<br />

a till b med steget 1 mellan varje tal. Vi kan definiera steget till att vara n˚agot annat tal än


2.6. INBYGGDA FUNKTIONER 25<br />

1, kolon operatorn ser d˚a ut s˚a här: a : c : b, vilket ger oss en serie tal mallan a och b, med<br />

steget c. N˚agra exempel:<br />

≫ vektor1 = [ 2 : 6];<br />

vektor1 =<br />

2 3 4 5 6<br />

≫ vektor2 = [ 1 : -0.5 : -4];<br />

vektor2 =<br />

1 0.5000 0 -0.5000 -1 -1.5000 -2 -2.5000 -3 -3.5000 -4<br />

kolonoperatorn är uppenbarligen ett utmärkt verktyg för att skapa vektorer med regelbundna<br />

intervall mellan elementet. Vi kommer snart att se att när vi skall producera grafer s˚a är det<br />

just precis s˚adana vektorer som vi kommer att skapa om och om igen.<br />

N˚agot annat som blir väldigt behändigt med hjälp av kolonoperatorn är att adressera en<br />

serie element i en vektor:<br />

≫ d = [ 11 12 13 14 15 16];<br />

≫ d(2:4)<br />

ans =<br />

12 13 14<br />

2.6.3 Operationer p˚a matriser<br />

De flesta av vektorfunktionerna opererar ocks˚a p˚a matriser, men ibland med litet oväntade<br />

resultat. Dessutom finns ett antal funktioner som är specifika för matriser. N˚agra av de<br />

viktigaste är:<br />

sum(matris)<br />

Det är l˚ang ifr˚an uppenbart vad vi kan förvänta oss här. Funktionen ger inte summan av<br />

alla element i matrisen, l˚at oss prova oss fram:<br />

≫ A = [ 1 2 3 ; 4 5 6 ; 7 8 9];<br />

≫ sum (A)<br />

ans =<br />

12 15 18<br />

sum (A) ger oss allts˚a tydligen en radvektor vars element är summan av kolumnerna i matrisen<br />

A. Detta beteende är n˚agot som kommer att ˚aterkomma, MATLAB arbetar ofta med<br />

kolumnerna i en matris. Hur skall vi göra för att beräkna summan av raderna? Det enklaste<br />

är att anpassa sig till MATLABs preferenser, om MATLABs funktioner arbetar med<br />

kolumner och vi är intresserade av rader, l˚at oss transponera matrisen och sedan applicera<br />

funktionen p˚a den transponerade matrisen. I det här fallet ger oss sum(A’) en radvektor<br />

vars element är summan av kolumnerna av den transponerade matrisern, vilket ju är samma<br />

sak som summan av raderna i den ursrpungliga matrisen. Vill vi sedan f˚a det att se litet<br />

snyggt ut s˚a transponerar vi resultatet, som ju är en radvektor, till en kolumnvektor. Hängde<br />

ni med? Det är nog enklare att bara göra det hela än att försöka läsa den här beskrivningen,


26 KAPITEL 2. ATT KOMMA IG˚ANG<br />

allts˚a:<br />

≫ A’<br />

ans =<br />

1 4 7<br />

2 5 8<br />

3 6 9<br />

≫ sum(A’)<br />

ans =<br />

6 15 24<br />

≫ sum(A’)’<br />

ans =<br />

6<br />

15<br />

24<br />

Kommandot sum(A’)’ ger oss en kolumnvektor där varje element är summan av raden i<br />

den ursprungliga matrisen. G˚a igenom exemplet ovan och se till att du först˚ar alla led i<br />

operationerna!<br />

eye(N)<br />

Eye(N) producerar en N × N enhetsmatris.<br />

diag(A)<br />

Om A är en matris resulterar diag(A) i en kolumnvektor där elementet i raden n motsvarar<br />

elementet i diagonalen av matrisen p˚a rad n och i kolumn n.<br />

Om A är en vektor, resulterar M=diag(A) i en matris där diagonalelementen är de samma<br />

som elementen i vektorn, allts˚a M(i,i) = A(i). Detta kommando är väldigt användbart när<br />

vi senare vill skapa kovariansmatriser.<br />

kolon operatorn<br />

Precis som för vektorer är kolonoperatorn ett bekvämt sätt att adressera delar av en matris:<br />

A(1:4,3) adresserar elementen som finns i rad 1 till och med fyra i den tredje kolumnen<br />

i matrisen A. Ett specialfall är när vi skriver : utan n˚agra omgivande siffror, operatorn<br />

resulterar d˚a i alla element i en kolumn eller rad: A(:,3) ger alla element i tredje kolumnen<br />

av A.


2.7.<br />

ÖVNINGSUPPGIFTER 27<br />

2.7 Övningsuppgifter<br />

1. Skapa en vektor med x-värden: x = (1, 3, 5, 7). Skapa sedan, genom beräkningar<br />

p˚a x-vektorn där du använder de elementvisa operationerna, en vektor y där varje<br />

element uppfyller y = 3 ∗ x 2 + 4x för motsvarande element i x-vektorn. Skapa därefter<br />

vektorn yPrim, där varje element är lika med derivatan av ekvationen ovan, beräknade<br />

för x-värden ur vektorn x.<br />

2. Givet vektorn x = [1 2.75 3.9 4.6], skapa (använd elementvis operation) y, där varje<br />

element ges av yi = 2x 3 i + 4xi − 3<br />

3. Konstruera tre kolumnvektorer:<br />

⎛<br />

⎜<br />

⎝<br />

2<br />

−5<br />

2<br />

⎞ ⎛<br />

⎟<br />

⎠<br />

⎜<br />

⎝<br />

3<br />

2<br />

−4<br />

⎞ ⎛<br />

och skapa en matris med hjälp av dessa, vars första rad är (2 3 1).<br />

vektorerna för att skapa matrisen<br />

⎛<br />

⎞<br />

3 2 −4<br />

⎜<br />

⎟<br />

⎝ 1 0 2 ⎠<br />

Använd sedan<br />

2 −5 2<br />

4. Konstruera tv˚a (3 x 4) matriser A och B: A =<br />

och B =<br />

⎛<br />

⎜<br />

⎝<br />

3 −4 2 2<br />

−3 −1 0 1<br />

3 −2 3 7<br />

⎞<br />

⎟<br />

⎠<br />

⎛<br />

⎜<br />

⎝<br />

⎜<br />

⎝<br />

1<br />

0<br />

2<br />

⎞<br />

⎟<br />

⎠<br />

1 −3 7 0<br />

2 −4 −1 6<br />

−2 0 3 5<br />

⎟<br />

⎠ beräkna sedan A+B, A-B, A’*B<br />

5. Utg˚a fr˚an vektorn alfa = [ 0 30 60 90 ] som betecknar fyra vinklar i grader.<br />

Skapa sedan vektorn x där elementen är samma vinklar uttryckta i radianer.<br />

Skapa därefter vektorn s där elementen är sinus för de givna vinklarna.<br />

Skapa slutligen vektorn c, där elementen är cosinus för de givna vinklarna. Använd<br />

inte funktionen cos, utan beräkna värdet genom formeln cos α = √ 1 − sin 2 α. Använd<br />

dessa vektorer för att skapa matrisen A med fyra rader och tre kolumner, varje rad<br />

skall best˚a av vinkel, sinus för vinkeln och cosinus för vinkeln<br />

6. Fem bollar med olika massor m rullar p˚a rad med varsin konstant hastighet v. Bollarnas<br />

massor och hastigheter ges av följande tabell:<br />

m (kg) v (m/s)<br />

2.0 2.0<br />

1.5 4.0<br />

3.0 -3.0<br />

2.0 1.0<br />

2.5 6.0<br />

Gör en vektor för samtliga massor och en vektor för samtliga hastigheter och beräkna<br />

därefter varje bolls rörelseenergi med ett enda kommando. Räkna ut totala rörelseenergin<br />

med ytterligare ett kommando.<br />

⎞<br />

⎟<br />


28 KAPITEL 2. ATT KOMMA IG˚ANG<br />

7. Skapa en vektor med tio element som best˚ar av likformigt fördelade slumptal som antar<br />

heltalsvärden fr˚an 1 till 6.


Kapitel 3<br />

Hitta p˚a datorn. Börja<br />

programmera<br />

I det här passet skall vi lära oss litet allmänt om hur datorprogram i datorn fungerar och<br />

hanterar data p˚a h˚arddisk och i minnet. Men framför allt skall vi lära oss att<br />

• använda M-filer och spara dessa p˚a disk.<br />

• hur man gör för att skriva program som utför monotona upprepade arbetsuppgifter<br />

med enkla kommandon.<br />

• hur man skriver program som kan utföra olika operationer beroende p˚a värdet p˚a vissa<br />

kontrollparametrar.<br />

3.1 Att navigera p˚a datorn<br />

Att h˚alla ordning p˚a alla filer som skapas under ett projekt, som till exempel en laboration<br />

eller en MATLAB övning kräver litet disciplin. Det är naturligtvis extra viktigt att man<br />

tänker sig för i en miljö som den p˚a övningslab, där m˚anga användare använder samma<br />

dator. Innan vi g˚ar igenom hur man bör arbeta gör vi först en allmän genomg˚ang över hur<br />

program p˚a en dator hanterar disk och minne.<br />

3.1.1 Minne och h˚arddisk p˚a en dator<br />

Ett program som kör p˚a en dator hanterar tv˚a typer av information, dels ”instruktioner”<br />

- det vi i dagligt tal kallar programmet, som styr datorn och p˚a lägsta niv˚an talar om för<br />

datorn hur den skall utföra olika kommandon, dels ”data” som är vad programmet opererar<br />

p˚a. Sett ur det här perspektivet h˚aller ett program som MATLAB när vi till exempel skriver<br />

”2 + 2” reda p˚a tv˚a saker: dels vad instruktionen ”x + y” innebär och hur MATLAB skall<br />

genomföra den operationen, denna information är det vi kallar instruktioner. Sedan m˚aste<br />

programmet ocks˚a h˚alla reda p˚a vad ”x” och ”y” är i just den aktuella beräkningen, och spara<br />

svaret n˚agonstans, den typen av information kallas ”data”. Den här informationslagringen<br />

kan ske p˚a tv˚a ställen, antingen p˚a h˚arddisken eller i datorns internminne. Det finns n˚agra<br />

skillnader i egenskap hos dessa tv˚a lagringsmedia: h˚arddisken är permanent, i betydelsen att<br />

s˚a länge allting fungerar som det skall s˚a finns all information som lagras p˚a h˚arddisken kvar<br />

s˚a länge som man inte uttryckligen raderar den. 1 Internminnet ˚a andra sidan är temporärt i<br />

tv˚a avseenden, dels s˚a ”överlever” ingen information i internminnet att datorn stängs av, dels<br />

är det till och med s˚a att d˚a ett program som MATLAB avslutas s˚a raderas all information<br />

1 Kom ih˚ag dock att datorerna p˚a övningslabb regelbundet “städas” och att alla användarfiler tas bort.<br />

Det enda ställe där du kan vara säker p˚a att spara dina filer är p˚a ditt afs-konto<br />

29


30 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

som programmet sparat i minnet. En annan skillnad mellan h˚arddisk och internminne är<br />

att det g˚ar mycket snabbare att komma ˚at data som finns i minnet (oftast talar man om<br />

internminnet som bara ”minnet”) än p˚a disken.<br />

Med det här som bakgrund kan vi nu först˚a litet bättre vad som händer när vi kör MATLAB.<br />

Eftersom MATLAB m˚aste finnas kvar varje g˚ang vi startar datorn s˚a m˚aste själva programmet<br />

finnas lagrat p˚a h˚arddisken. Eftersom det tar l˚ang tid att hämta instruktioner som finns<br />

lagrade p˚a h˚arddisken s˚a vill man inte att programmet skall g˚a och hämta varje instruktion<br />

för sig fr˚an h˚arddisken, det skulle dels göra programmet mycket l˚angsamt och dels skulle<br />

datorns disk st˚a och surra hela tiden. Ett program som startar reserverar därför ett stycke<br />

minne för instruktioner och kopierar in de mest centrala dit och läser dem direkt därifr˚an.<br />

Skulle MATLAB träffa p˚a en instruktion som inte finns inkopierad till minnet s˚a g˚ar den ut<br />

p˚a h˚arddisken och läser in denna instruktion, men inte bara en enstaka instruktion, utan ett<br />

block med instruktioner som ofta används tillsammans. Ett välkonstruerat program behöver<br />

därför inte g˚a ut och läsa fr˚an den l˚angsamma disken särskilt ofta, utan h˚aller sig för det<br />

mesta till den kopia av instruktionerna som finns i minnet. 2<br />

Samtidigt reserverar programmet en annan del av minnet för att lagra data. Allt som finns<br />

i MATLABs workspace lever till exempel i internminnet, när vi skriver klubba = 0.5 s˚a<br />

reserveras ett litet omr˚ade i internminnet för variabeln klubba, och värdet 0.5 lagras där.<br />

Kommandot clear klubba instruerar MATLAB att vi inte längre är intresserade av klubba,<br />

den delen av minnet flaggas d˚a som ledigt och kan användas av MATLAB för att spara en<br />

ny variabel.<br />

Eftersom instruktionerna bara är en kopia av det som finns lagrat p˚a h˚arddisken s˚a p˚averkas<br />

inte programmets funktion av en eventuell krasch med efterföljande omstart, det är ju bara att<br />

skapa en ny kopia av instruktionerna fr˚an h˚arddisken. Data däremot flyger all sin väg. När<br />

programmet avslutas, frivilligt eller ofrivilligt, s˚a är all information som lagrats i workspace<br />

borta. Om man nu har lagrat priserna för ett stort antal olika sorters godis i MATLABs<br />

workspace och räknar med att behöva använda den listan igen vid ett senare tillfälle s˚a<br />

vill man naturligtvis kunna spara listan även efter det att MATLAB avslutats för den här<br />

g˚angen. Det g˚ar att göra, vi kan fr˚an MATLAB spara inneh˚allet i workspace p˚a h˚arddisken,<br />

vi kan ocks˚a skapa separata filer med data och/eller MATLAB kommandon som sparas p˚a<br />

h˚arddisk och som vi sedan läser tillbaks, sk M-filer. Detta kommer att bli det sätt vi normalt<br />

arbetar med MATLAB. Genom att spara allt p˚a h˚arddisk är det enkelt att g˚a tillbaks och<br />

göra smärre korrektioner och modifieringar och framför allt: vi kommer att spara mycket<br />

arbete genom att vi kan ˚ateranvända kod-snuttar fr˚an tidigare övningar.<br />

3.1.2 Filnamn och Sökvägar<br />

Varje fil p˚a en dator m˚aste ha ett unikt namn som fungerar som en sorts adresslapp. Precis<br />

som när vi identifierar personer genom namn och en hirearki av adresser alltifr˚an gata med<br />

portnummer upp till städer och länder s˚a har en datoradress flera niv˚aer. P˚a den lägsta<br />

niv˚an talar vi om filnamn, som till exempel rapport2.text, laboration4.m osv. Varje fil m˚aste<br />

vara placerad i en katalog (engelskans directory, p˚a svenska kan vi ocks˚a kalla det ”mapp”).<br />

2 När vi lärt oss det här om hur datorer fungerar kan vi först˚a tv˚a saker: Dels varför vissa program ibland<br />

kan g˚a s˚a sagolikt l˚angsamt. Om minnet ”börjar ta slut”, det vill säga om det inte finns n˚agot ledigt minne<br />

kvar att reservera, vilket kan hända när vi kör m˚anga program samtidigt, s˚a kan ett program inte reservera<br />

tillräckligt stora delar av minnet för att lagra s˚a m˚anga instruktioner s˚a att det kan köra effektivt. Istället<br />

m˚aste programmet ut och titt som tätt läsa instruktioner fr˚an den l˚angsamma disken. Det här leder till ”sega”<br />

program som svarar l˚angsamt p˚a v˚ara kommandon. Vi först˚ar nu ocks˚a varför program ”kraschar”. I nio fall<br />

av tio (minst) beror det p˚a att program A (ofta tillverkat av Microsoft) har skrivit till exempel data i en del<br />

av minnet som program B reserverat för sina instruktioner. I stället för instruktioner om hur programmet<br />

skall hantera ”x + y” st˚ar det n˚agonting helt annat, som programmet helt oskyldigt försöker genomföra med<br />

resultatet att allting hänger sig. Ibland är program A och B identiska, ett program kan skriva över sina egna<br />

instruktioner. Det här kallas ibland med datorjargon ”minnesläcka”.


3.1. ATT NAVIGERA P˚A DATORN 31<br />

Katalogen kan i sin tur vara inplacerad i en annan katalog, och s˚a vidare. Det är klokt att<br />

försöka organisera en trädstruktur av kataloger som logiskt delar upp de filer man äger i<br />

avgränsade undergrupper som i exemplet nedan.<br />

labbar<br />

lab1 lab2 lab3<br />

Rapport Rådata<br />

utkast1<br />

Rapport<br />

utkast1<br />

Vi ser hur det finns en textfil som heter ”utkast1” i katalogen ”rapport”. Katalogen ”rapport”<br />

ligger i sin tur i katalogen ”lab1”, som ligger i katalogen ”labbar” och s˚a vidare. I en given<br />

katalog kan det bara finnas en fil med samma namn, vilket inte är s˚a konstigt, hur skulle<br />

datorsystemet annars först˚a t ex vilken fil vi ville skriva ut när vi ger ett print kommando.<br />

Men precis som brevbärarna inte bara kan hantera en ”Sven Andersson” utan kan h˚alla isär<br />

Sven Anderson p˚a Linnégatan fr˚an Sven Andersson p˚a Kungsgatan, och Sven Andersson p˚a<br />

Linnégatan i Göteborg fr˚an Sven Andersson p˚a Linnégatan i Stockholm s˚a kan datorn, om vi<br />

bara ger hela adressen, h˚alla isär en fil som heter ”utkast1” i katalogen ”rapport” i katalogen<br />

”lab2” fr˚an en fil som heter ”utkast1” i katalogen ”rapport” i katalogen ”lab1”.<br />

För att vara säkra p˚a att vi och datorn först˚ar varandra när vi refererar till filer s˚a m˚aste vi<br />

reda ut tv˚a saker. Dels hur man anger att det är filen utkast1 som finns i trädet under ”lab1”<br />

och inte filen med samma namn i trädet under ”lab2”, det vill säga hur bär vi oss ˚at för<br />

att skriva en fils fullständiga namn, inklusive katalogtillhörigheten (detta kallas p˚a engelska<br />

path). Den andra saken vi m˚aste först˚a är n˚agot som kallas ”den aktuella katalogen” och som<br />

avgör hur datorn tolkar v˚ara kommandon när vi bara ger filnamnet och ingen information<br />

om katalogtillhörigheten.<br />

3.1.3 Fullständiga filnamn<br />

Ett fullständigt filnamn i operativsystemet Windows börjar med namnet p˚a h˚arddisken. Den<br />

dator du arbetar p˚a kan nämligen ha mer än en h˚arddisk, 3 och det kan ocks˚a vara s˚a att<br />

du över nätverket kan ha tillg˚ang till h˚arddiskar som inte fysiskt finns p˚a just den datorn<br />

du arbetar vid, som till exempel de filer du lagrar ”p˚a ditt AFS konto”. När du loggat in<br />

p˚a ditt AFS konto (se intstruktioner p˚a http://www.physto.se/afs/konton windows.html) s˚a<br />

kommer det att se ut som om de filer du lagrat där ligger p˚a en disk p˚a den dator du jobbar<br />

vid med namnet J. (Observera att vilken bokstav som AFS-disken f˚ar kan variera fr˚an<br />

g˚ang till g˚ang, beroende p˚a “historien” p˚a den dator där du jobbar. Du kan lätt kontrollera<br />

vad som gäller i ditt fall genom att klicka p˚a det lilla hängl˚aset längst ned till höger p˚a<br />

3 Rent fysiskt är det ofta s˚a att p˚a datorer med mer än en h˚arddisk s˚a finns det egentligen inte mer än en<br />

disk, men den är uppdelad i fler avgränsade avdelningar som för datorn ser ut som om de vore helt skilda<br />

enheter.


32 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

skärmen. I fönstret som d˚a kommer upp väljer du “Drive Letters”. I den lista som d˚a<br />

kommer upp kommer den Drive som svarar mot \afs\su.se\home\student.su.se vara den du<br />

skall jobba mot) I filnamnet följs disknamnet av kolon, därefter \ (”backslash”) och sedan<br />

namnen p˚a katalogerna, separerade med backslash. Om vi till exempel antar att katalogen<br />

”Sten” i exemplet ovan ligger i en katalog ”USERS” som inte har n˚agon katalog över sig<br />

p˚a D-disken s˚a blir den fullständiga adressen till filen utkast1: D:\USERS\Sten\Expkursen<br />

\labbar\lab1\rapport\utkast1 . Även kataloger kan adresseras p˚a detta sätt, katalogen för<br />

lab1 har adressen D:\USERS\Sten\ Expkursen\labbar\lab1 .<br />

3.1.4 Aktuell katalog<br />

Varje g˚ang vi vill spara en fil fr˚an ett program s˚a finns det ett förstahandsalternativ, en<br />

katalog där programmet vi arbetar i sparar filer om inte användaren aktivt väljer en annan<br />

katalog. Denna katalog kallas ”aktuell katalog” (engelska ”current directory”). Det är allts˚a<br />

här filer hamnar om vi inte aktivt anger en annan katalog. Exakt vilken katalog som är den<br />

aktuella kan variera fr˚an fall till fall. De flesta program har en katalog n˚agonstans i den<br />

katalogstruktur som hör till programmet som används i standardfallet.<br />

Öppnar vi Microsoft<br />

Word och skapar ett nytt textdokument s˚a sparas det i en katalog som hör till programmet,<br />

snarare än i en katalog som hör till dig som användare. Om vi däremot öppnar ett redan<br />

existerande dokument genom att dubbelklicka p˚a det, gör n˚agra ändringar och sparar det<br />

under ett nytt namn s˚a hamnar det i samma katalog som det ursprungliga dokumentet<br />

l˚ag. Oftast bereder det oss inte n˚agon större möda att h˚alla rätt p˚a detta, när vi sparar<br />

ett dokument s˚a öppnas ju en dialogruta där vi tydligt kan se i vilken katalog dokumentet<br />

hamnar, och vi kan välja en annan katalog. Men om vi till exempel sparar MATLABs<br />

workspace genom att ge kommandot save i kommandofönstret s˚a f˚ar vi inte upp n˚agon<br />

dialogruta utan MATLAB sparar direkt i det som är den aktuella katalogen.<br />

I MATLAB finns det en liten ruta högst upp i desktopen som anger vilket som är den aktuella<br />

katalogen. Om vi skriver in adressen till n˚agon annan katalog i rutan s˚a ändras den aktuella<br />

katalogen till den nya adress vi skrivit in. Vi kan ocks˚a genom att klicka p˚a pilen till höger<br />

om textraden f˚a upp en meny där vi kan välja att g˚a tillbaka till n˚agon av de kataloger som<br />

tidigare under v˚ar session varit den aktuella.<br />

Trycker vi p˚a knappen med de tre punkterna strax till höger om namn-rutan f˚ar vi upp en<br />

dialogruta där vi kan navigera oss fram p˚a datorns disk för att välja den katalog vi vill göra<br />

till aktuell.<br />

3.1.5 ”Current directory browser”<br />

Det finns en pann˚a i MATLABs desktop som används för att navigera bland filer, den<br />

heter ”Current Directory Browser”, och aktiveras p˚a samma sätt som de andra pann˚aerna<br />

i desktopen genom att g˚a in i ”View” menyn och klicka p˚a ”Current Directory Browser”. I<br />

den pann˚a som d˚a öppnas har vi m˚anga möjligheter, vi kan bland annat


3.1. ATT NAVIGERA P˚A DATORN 33<br />

• f˚a en överblick över vilka filer som finns i den aktuella katalogen<br />

• öppna en godtycklig fil i det program den skapades genom att dubbelklicka p˚a ikonen<br />

för filen<br />

• ändra aktuell katalog. Vill vi flytta oss ned˚at i strukturen s˚a dubbelklickar vi p˚a<br />

ikonen för den katalog vi vill flytta oss till, vill vi flytta oss upp˚at s˚a dubbelklickar vi<br />

p˚a symbolen uppe p˚a fönstrets list.<br />

Genom att upprepa detta kan vi flytta oss godtyckligt l˚angt upp i katalogträdet och<br />

sedan flytta oss ned genom en annan gren genom att dubbelklicka p˚a de kataloger<br />

som syns i pann˚an. Lägg märke till att ”aktuell katalog” ändras vartefter vi väljer en<br />

katalog i denna pann˚a.<br />

En detaljerad beskrivning av ”Current Directory Browser” ges i hjälpsektionen: ?/MAT-<br />

LAB/Getting Started/Desktop Tools and Development Environment/Current<br />

Directory Browser and Search Path<br />

3.1.6 Var söker MATLAB efter filer<br />

MATLAB har ett antal kommandon som innebär att programmet skall ladda in inneh˚allet<br />

i en fil till workspace. Man kan till exempel genom att skriva load filnamn läsa in hela<br />

inneh˚allet i filen med namn filnamn in i MATLABs workspace, man kan ocks˚a genom att<br />

bara skriva filnamn.m instruera MATLAB att läsa in och utföra de kommandon som finns<br />

sparade i filen filnamn.m . För att detta skall fungera krävs givetvis att MATLAB hittar<br />

filen i fr˚aga. Det fungerar om den fil vi anger ligger i den aktuella katalogen, men dessutom<br />

har MATLAB en lista med kataloger där den söker efter de filer vi anger i v˚ara kommandon.<br />

En s˚adan lista kallas sökväg (eng. search path). När vi skriver in ett filnamn s˚a kommer<br />

MATLAB att först leta efter filen i den aktuella katalogen, därefter söks filen i alla kataloger<br />

som finns med i sökvägen, i den ordning som katalogerna st˚ar i sökvägen. Det kan allts˚a vara<br />

viktigt i vilken ordning katalogerna är listade i sökvägen, om det finns flera filer med samma<br />

namn. MATLAB har en meny där man kan se vilka kataloger som finns med i sökvägen (se<br />

nästa sida). Man kan ocks˚a lägga till eller ta bort kataloger, och även ändra ordningsföljden.<br />

För att f˚a fram den dialogruta där det sker g˚ar vi till menyn ”File” och klickar p˚a ”set<br />

path”. Efter att ha valt 4 en av katalogerna i fönstret till höger kan vi sedan med hjälp av<br />

knapparna till vänster flytta den valda katalogen upp och ner i listan för att p˚a s˚a sätt ändra<br />

ordningsföljden mellan dem. Vi kan ocks˚a ta bort en vald katalog och med n˚agon av de tv˚a<br />

översta knapparna lägga till en katalog till sökvägen. Använder vi den övre knappen när vi<br />

lägger till en katalog kommer endast den katalog vi valt att läggas till sökvägen, använder<br />

vi den andra knappen lägger vi till en katalog och alla dess underkataloger till sökvägen.<br />

Observera att det är nödvändigt att klicka p˚a ”Save” när vi är klara för att v˚ara sökvägar<br />

skall sparas. Notera ocks˚a att de ändringar du gör till MATLABs sökväg kommer att gälla<br />

för alla andra som ocks˚a använder denna dator, precis som du kommer att kunna ha ”glädje”<br />

av alla sökvägar som n˚agon annan lagt in.<br />

4 Att ”välja” i en meny som den ovan innebär att vi klickar en g˚ang p˚a den rad vi vill välja. Om all g˚ar<br />

som det ska visas den valda raden mot en mörk bagrund.


34 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

3.1.7 Var skall jag spara filer<br />

Eftersom vi arbetar p˚a datorer som används av m˚anga personer m˚aste vi vara noggranna<br />

med var p˚a h˚arddisken vi sparar data s˚a att vi inte lämnar efter oss en massa ”skräp” som<br />

andra inte är intresserade av. Likaledes är det kanske inte särskilt attraktivt att behöva<br />

˚atervända till exakt samma dator vid nästa arbetspass. Det finns egentligen bara tv˚a areor<br />

som inte är ”allmänna”, det vill säga som används av alla som använder datorn. Den ena är<br />

katalogen USERS som ligger p˚a D disken p˚a datorn. För tillfälligt sparande av personliga<br />

filer kan man skapa en underkatalog till denna katalog med sitt eget namn. Men kom ih˚ag<br />

att denna katalog bara kan ses p˚a just denna dator. Använd därför den katalogen bara för<br />

temporär lagring under ett arbetspass. Filer som man vill spara för längre tid och kunna<br />

komma ˚at oavsett vilken dator man sitter vid skall sparas p˚a AFS-disken.<br />

För att ha en rimlig chans att hitta sina sparade data bör man ha en tydlig indelning i<br />

olika kataloger som var och en hör samman med ett tydligt ”delprojekt”. När vi kommit<br />

ig˚ang med labbandet är det till exempel naturligt att ha en katalog som heter ”Laboration<br />

1” exempelvis med underkataloger ”r˚adata”, ”m-filer”, ”rapport” mm. Under övandet med<br />

MATLAB bör man därför skaffa sig kataloger som t.ex ”pass 1” och sedan lägga dem i en<br />

katalog som kallas ”MATLABövningar”. Namn p˚a katalogerna är givetvis helt fritt att välja,<br />

men det bör vara en logisk struktur där alla filer i en given katalog ”hör ihop”, och har namn<br />

som gör att man först˚ar vad det är för fil utan att behöva öppna den och titta efter.<br />

Vartefter som du börjar bygga upp ett bibliotek av standardfiler (t ex s˚adana som beräknar<br />

normalfördelningen) som du tror att du kan komma att använda i olika projekt s˚a bör du<br />

kanske spara dessa i en ”bibliotekskatalog” som inte är direkt associerad med en specifik kurs


3.2. ATT SPARA OCH L ÄSA TILLBAKS INNEH˚ALLET I WORKSPACE 35<br />

eller laboration.<br />

Observera att alla filer som sparas p˚a ”allmänna” omr˚aden riskerar att raderas, antingen<br />

av misstag av n˚agon av dina kollegor, eller ocks˚a av systemansvariga när de städar upp p˚a<br />

datorns h˚arddisk.<br />

3.2 Att spara och läsa tillbaks inneh˚allet i workspace<br />

Om man sitter mitt i en komplicerad beräkning i MATLAB kan det vara väldigt besvärligt<br />

att avbryta arbetet eftersom MATLABs workspace som inneh˚aller alla definierade variabler<br />

och deras värden i s˚a fall g˚ar förlorat. Har vi knappat in priserna för femton olika godissorter<br />

s˚a vill man inte gärna ha det arbetet ogjort och börja om igen bara för att kompisen vill<br />

att man skall logga ut och följa med och fika. I dylika nödsituationer kan man spara hela<br />

inneh˚allet i MATLABs workspace till en diskfil. När man sedan vill ˚ateruppta arbetet kan<br />

man läsa in filens inneh˚all till MATLABs workspace och enkelt fortsätta med precis samma<br />

omgivning som man hade innan man gjorde paus. Sparar man workspace i en AFS-monterad<br />

katalog som kan n˚as fr˚an alla datorer s˚a kan man till och med fortsätta p˚a vilken dator som<br />

helst.<br />

För att spara inneh˚allet i workspace ger man helt enkelt kommandot save filnamn i kommandofönstret.<br />

Inneh˚allet i workspace sparas d˚a till en fil med namnet ’’filnamn.m’’ i<br />

den aktuella katalogen (MATLAB lägger automatiskt till ändelsen ”.m”). För att läsa tillbaks<br />

inneh˚allet i filen till workspace ger man kommandot load filnamn (utan ändelse).<br />

För att detta skall fungera m˚aste filen ”filnamn” finnas antingen i den aktuella katalogen<br />

eller i n˚agon av de kataloger som ing˚ar i MATLABs sökväg. Ett bättre sätt att göra dessa<br />

operationer, bättre för att det är lättare att kontrollera i vilken katalog filen hamnar, är att<br />

i ”File” menyn välja ”Save workspace as”. I den dialogrutan som d˚a kommer upp kan man<br />

välja b˚ade vilket namn man vill ge filen och i vilken katalog den skall sparas. Det omvända<br />

kommandot är ”Import Data” i file menyn som öppnar en dialogruta där man kan ange<br />

vilken fil som skall laddas in i workspace.<br />

3.3 Villkorssatser<br />

Det är mycket vanligt att ett program skall utföra olika saker beroende p˚a om vissa villkor<br />

är uppfyllda eller inte. Den enklaste formen av en villkorssats har formen:<br />

if (test)<br />

....<br />

end<br />

där test är en logisk test som är sann eller falsk. Om test är sann utförs koden mellan if och<br />

end, annars hoppas det avsnittet över. Enklare villkorssatser kan skrivas p˚a bara en rad om<br />

man s˚a önskar, med komma emellan kommandona:<br />

if (test), ...... , end ;<br />

Man kan även specificera vad som skall hända om test är falsk genom konstruktionen<br />

if (test)<br />

... kod 1<br />

else<br />

... kod 2<br />

end<br />

i det fallet utförs ...kod 1 om test är sann, annars ...kod 2. Slutligen kan man utföra fler


36 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

tester med konstruktionen<br />

if (test1)<br />

... kod 1<br />

elseif(test2)<br />

... kod 2<br />

elseif(test3)<br />

... kod 3<br />

else<br />

... kod 4<br />

end<br />

I en s˚adan konstruktion utförs den kod som följer efter den första test som är sann, är<br />

test1 falsk men test2 sann utförs ...kod 2 och s˚a vidare. Om ingen av testerna är sann<br />

utförs ...kod 4. En viktig sak att komma ih˚ag är att endast ett kodparti utförs, om fler<br />

av testerna är sanna s˚a utförs det kodparti som svarar mot den av de sanna testerna som<br />

kommer först i konstruktionen. Är b˚ade test1 och test3 sanna i exemplet ovan s˚a utförs<br />

bara ...kod 1, inte ...kod 3.<br />

Ett test byggs upp av n˚agon av 6 relationsoperatorer:<br />

a < b är sann om a är mindre än b<br />

a ≤ b är sann om a är mindre än, eller lika med b<br />

a == b är sann om a är lika med b (notera att vi inte kan skriva a = b,<br />

det kommandot sätter a till samma värde som b här)<br />

a ≥ b är sann om a är större än eller lika med b (kodas “>=”)<br />

a > b är sann om a är större än b<br />

a ∼= b är sann om a inte är lika med b (kodas “0)<br />

disp(’x är större än noll’)<br />

elseif(x


3.4. SLINGOR 37<br />

summa p˚a ett s˚a regelbundet sätt som den här formeln kan ocks˚a kodas p˚a ett enkelt sätt i<br />

datorprogram genom att använda s˚a kallade slingor (engelska loop). Det finns tv˚a typer av<br />

slingor i MATLAB: for-slingor och while-slingor.<br />

3.4.1 for-slingor<br />

For-slingor har formen<br />

for index=start:stop<br />

....<br />

....<br />

end<br />

Namnet p˚a den variabel som man använder som loop-index, i exemplet ovan index är<br />

godtyckligt. Dock bör man kanske undvika att använda i eftersom det är namnet p˚a en<br />

inbyggd funktion. Koden mellan första och sista raden utförs en g˚ang för varje värde p˚a<br />

index som anges i första raden. Ett mycket enkelt exempel som visar principen är följande<br />

lilla loop som ger oss 7:ans multiplikationstabell:<br />

for index = 1:10 k = index * 7 ; disp(k); end<br />

En uträkning av de första tio termerna i serieutvecklingen av cosinus kan skrivas som:<br />

x=pi/4;<br />

cosinus=0;<br />

for index=0:9<br />

cosinus = cosinus + (-1)∧index * x∧(2*index) / prod(1:2*index);<br />

end<br />

(För att beräkna fakulteten använder vi funktionen prod(x) som beräknar produkten av<br />

alla element i en vektor x. Som ett för oss lycklig specialfall gäller prod(1:0)=1). Att det<br />

här är ett fantastiskt ekonomiskt sätt att koda framg˚ar av att det enda vi behöver göra om vi<br />

vill tiofaldiga antalet termer i summan är att ändra index=0:9 till index=0:99. Variabeln<br />

i slingan, i det här fallet ”index”, behöver inte delta i de matematiska operationerna, man<br />

kan till exempel räkna till tio genom att använda slingan<br />

summa = 0;<br />

for index=1:10<br />

summa = summa + 1;<br />

end<br />

En annan sak vi noterar är att variabeln behöver inte räknas upp med ett för varje varv<br />

i slingan, index=0:2:10 är en legitim konstruktion. Vi behöver inte ens använda heltal,<br />

index=0.2:0.1:0.7 är ocks˚a en möjlig sling-variabel.<br />

3.4.2 while-slingor<br />

While slingor har formen<br />

while (test)<br />

....<br />

....<br />

end<br />

Där test är n˚agot villkor som kan utvärderas, som till exempel isin(x) osv.<br />

Koden i en while-slinga utförs s˚a länge villkoret i test är sant. Det här betyder för det första<br />

att vi m˚aste initialisera de variabler som ing˚ar i testen innan while-slingan startar, och för


38 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

det andra att det är v˚art eget ansvar att de variabler som ing˚ar i testen förändras inuti den<br />

kod som utförs mellan while och end. Tag till exempel slingan<br />

clear all;<br />

x=2;<br />

sum=0<br />

while (x epsilon)<br />

cosinus = cosinus + (-1)∧index * x∧(2*index) / prod(1:2*index);<br />

index=index;<br />

end<br />

out= ’Serien konvergerade efter’;<br />

disp(out); index<br />

disp(’ termer’)<br />

3.4.3 Att hoppa ut ur en slinga - kommandot break<br />

Ibland vill man hoppa ur en slinga innan den n˚att det slut som angivits. Antag till exempel<br />

att vi skriver en rutin som skall kontrollera om ett tal är primtal eller inte. Vi vet att den<br />

minsta faktorn inte kan vara större än roten ur talet självt. Vi behöver därför bara testa att<br />

dividera med alla heltal upp till roten ur talet om ingen division g˚ar jämnt upp är talet ett<br />

primtal. Men om vi n˚agonstans p˚a vägen hittar en primfaktor s˚a behöver vi ju inte fortsätta<br />

till det bittra slutet, finns det en faktor s˚a är talet i fr˚aga inte ett primtal. Att dividera med<br />

alla heltal upp till det tal som är kvadratroten ur talet är urtypen för en uppgift som vi löser<br />

i en slinga. Men om vi hittar en faktor vill vi hoppa ur slingan med en g˚ang istället för att<br />

utföra en massa onödiga divisioner och tester. Här kan vi använda kommandot break, som<br />

när det utförs hoppar till den del av koden som st˚ar efter ”end” kommandot för slingan. En<br />

s˚adan kod kan se ut s˚a här (vi bortser här ifr˚an att vi egentligen inte behöver testa andra


3.5. FUNKTIONER 39<br />

jämna tal än 2):<br />

index=2;<br />

primtal=1;<br />

while (index


40 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

m˚aste dock se till att spara den fil som inneh˚aller funktionen med samma namn som vi ger<br />

i första raden, med tillägget (engelska extension) .m .<br />

3.5.2 help för en funktion<br />

En speciell sak med en funktion är att om vi skriver ett block med kommentarer efter första<br />

raden s˚a kommer dessa att skrivas ut i kommandofönstret när vi skriver help funktionsnamn.<br />

Detta gäller bara det första blocket av kommentarer, ingen av de kommentarer som kommer<br />

längre ned i koden syns. Här skall vi allts˚a skriva in den information som kan behövas för att<br />

först˚a hur man skall använda funktionen. Vi kan se massor av exempel p˚a hur det kan göras,<br />

i själva verket är det precis det som händer varje g˚ang vi skriver help i kommandofönstret,<br />

vi läser d˚a helt enkelt det första blocket med kommentarer i den fil som utför funktionen.<br />

V˚ar funktion för normalfördelningen bör d˚a börja n˚agonting i stil med<br />

% NORMAL Normalf\"ordelningsfunktionen<br />

% y=normal(x,m,s)<br />

% Indata: x av typ vektor<br />

% m medelv\"ardet<br />

% s varians<br />

%<br />

% om m utel\"amnas s\"atts m=0<br />

% om s utel\"amnas s\"atts s=1<br />

%<br />

prova att koda detta och sedan skriva help normal (normal.m m˚aste sparas n˚agonstans i<br />

MATLABs sökväg).<br />

3.5.3 Testa antalet argument<br />

Vi har sett fler exempel p˚a funktioner som accepterar olika antal argument, och som ocks˚a<br />

levererar litet olika resultat beroende p˚a hur m˚anga utvariabler man anger, ett exempel p˚a<br />

det är kommandot hist (se avsnit 6.3.2) som kommer att bli en av v˚ara favoriter. Det här<br />

är ett sätt att inte behöva introducera ett stort antal funktioner som gör nästan samma sak,<br />

men inte riktigt. Det är mer ekonomiskt att i stället l˚ata en funktions beteende variera litet<br />

beroende p˚a hur man anropar den, och hur man formaterar resultaten fr˚an funktionen.<br />

Rent tekniskt är det ju inte s˚a sv˚art att l˚ata en funktion göra litet olika saker med hjälp<br />

av villkors-satser, det gäller bara att veta hur funktionen har blivit kallad. För detta finns<br />

kommandona nargin och nargout som talar om hur m˚anga argument som gavs när funktionen<br />

anropades, och hur m˚anga ut-argument som angavs i anropet. Genom att testa p˚a<br />

antalet argument kan vi styra villkoren för hur funktionen skall bete sig.<br />

if nargin < 3, s=1; end<br />

if nargin < 2, m=0; end<br />

en svaghet i denna konstruktion är att man m˚aste utesluta argument ”bakifr˚an”, dvs vi<br />

förutsätter att om ett argument är utelämnat s˚a är det standardavvikelsen, och inte medelvärdet<br />

i exemplet ovan. Det finns vägar runt detta 5 men det kräver en hel del arbete och komplicerad<br />

kodning, s˚a det lämnar vi till den som är speciellt intresserad.<br />

P˚a motsvarande sätt kan man testa hur m˚anga ut-argument som gavs i anropet, i v˚art fall<br />

om normal kallades med y=normal(x,m,s) eller med normal(x,m,s). Att kommandot som gör<br />

det heter nargout kommer väl knappast som en överraskning?<br />

5 Man använder kommandot varargin och tänker ut tester som kan avgöra vilka argument som faktiskt<br />

lämnades.


3.5. FUNKTIONER 41<br />

Exempel p˚a funktion<br />

Vi visar här ett exempel p˚a hur en funktion kan användas. Funktionen total räknar ut hur<br />

stor summa man m˚aste betala för ett l˚an taget till olika räntor:<br />

function total=interest(belopp, rantesats, manader, period)<br />

%<br />

% total beräknar totalt ˚aterbetalat belopp.<br />

%<br />

% utdata total - total skuld<br />

%<br />

% indata belopp - l˚anat belopp<br />

% rantesats - räntesatsen i procent<br />

% manader - l˚anets löptid i m˚anader<br />

% period [’m’/’y’] - period<br />

% för vilken räntesatsen gäller<br />

% m˚aste vara antingen ’m’ för m˚anad<br />

% eller ’y’ för ˚ar.<br />

% om period utlämnas antas ˚ar<br />

%<br />

% Sten Hellman 030211<br />

if (nargin == 3); period=’y’; end;<br />

if (period == ’y’)<br />

total = belopp * (1 + rantesats/100) ∧ (manader / 12);<br />

elseif (period == ’m’)<br />

total = belopp * (1 + rantesats/100) ∧ (manader);<br />

else<br />

disp(’ perioden m˚aste anges som m eller y’);<br />

total = -99;<br />

end<br />

Denna funktion kan man sedan kalla fr˚an ett program där man lägger in olika möjliga alternativ<br />

för att kunna bestämma vilket som är mest förm˚anligt:<br />

% kreditkort ett ˚ar till 4.3% i m˚anaden<br />

kredit = interest(10000, 4.3, 12, ’m’)<br />

% bank ett ˚ar till 23% per ˚ar<br />

bank = interest(10000, 23, 12)


42 KAPITEL 3. HITTA P˚A DATORN. BÖRJA PROGRAMMERA<br />

3.6 Övningsuppgifter<br />

1. Skriv en funktion som returnerar ett slumptal mellan 1 och 100. Talet skall vara ett<br />

heltal, dvs inga decimaler skall finnas med. Första raden i filen kan se ut s˚a här:<br />

function y = slumptal()<br />

2. Skriv ett program som genererar en slumpmässig tipsrad. Anta att sannolikheten för<br />

1, x och 2 alla är 1/3, och l˚at programmet skriva ut tipsraden (en tipsrad best˚ar av<br />

tretton stycken tecken). Ett exempel p˚a en körning kan se ut s˚a här:<br />

>> tipsrad<br />

2<br />

x<br />

2<br />

1<br />

2<br />

1<br />

2<br />

x<br />

2<br />

1<br />

x<br />

2<br />

2<br />

3. En metod för att approximera kvadratroten av ett tal är Newtons metod som ger<br />

√<br />

x ≈ yk med yk+1 = 1<br />

<br />

2<br />

yk + x<br />

<br />

och y1 = 1. Skriv en funktion y=Newton(x) som<br />

yk<br />

använder denna metod för att beräkna kavdratroten ur ett godtyckligt positivt tal.<br />

Kadratroten skall anges korrekt avrundad med tre decimalsiffrors noggrannhet.<br />

Ledning: eftersom vi inte har n˚agot facit m˚aste vi i funktionen själva avgöra när serien<br />

har konvergerat tillräckligt för att vi skall ha den sökta noggrannheten.<br />

Vi m˚aste dessutom hitta p˚a ett trick för att runda av korrekt, de rutiner vi har till<br />

hands rundar ju bara av heltal. Detta kan vi komma runt genom att transformera v˚art<br />

decimaltal till ett lämpligt heltal som vi sedan rundar av och därefter transformerar<br />

tillbaks till ett decimaltal.


Kapitel 4<br />

Ordbehandling med Microsoft<br />

Word<br />

4.1 Allmänna kommentarer<br />

Du startar Word genom att först trycka p˚a knappen som det st˚ar ”Start” p˚a, och som har<br />

Windows-loggan p˚a sig, som sitter i nedre vänstra hörnet. I den meny som sedan kommer<br />

upp trycker du p˚a alternativet ”Programs”, och till sist ”Microsoft Word” i den meny som<br />

d˚a kommer upp. Oftast ligger det även en ikon märkt ”MicroSoft Word” p˚a skrivbordet, i s˚a<br />

fall är det naturligtvis enklare att bara dubbelklicka p˚a den. Längst upp p˚a Word-fönstret<br />

som öppnas finns en bl˚a list. Om du tar musen och trycker med vänsterknappen p˚a listen och<br />

h˚aller den nedtryckt s˚a kan du flytta runt fönstret tills det att du släpper knappen. Under<br />

listen finns Words menyer som heter ”Arkiv”, ”Redigera”, ”Visa” och s˚a vidare. Om du<br />

trycker p˚a ett av dessa ord kommer en meny att öppna sig där du kan välja mellan menyns<br />

alternativ. Under raden med menyer finns det som kallas ”verktygsfältet”. I verktygsfältet<br />

finns en mängd knappar och vi kommer att nämna de viktigaste som du bör känna till i<br />

detta dokument. Om du för musen över en knapp och h˚aller den still där utan att trycka<br />

p˚a n˚agon musknapp s˚a kommer en liten gul hjälpruta att visa sig där det st˚ar vad knappen<br />

gör. Testa detta! Under verktygsfältet sitter n˚agot som ser ut som en linjal, denna används<br />

för att sätta bredden p˚a marginalerna p˚a det dokument du ska skriva. Under denna ”linjal”<br />

finns slutligen själva fönstret där du kan skriva in din text. När du startar Word ser det bara<br />

ut som ett tomt papper. P˚a det tomma pappret kan du se ett blinkande vertikalt streck ”|”<br />

som kallas för ”markör”. Markören talar om var den text du skriver in kommer att hamna.<br />

Du kan flytta runt markören med hjälp av piltangenterna, eller genom att klicka med musen<br />

p˚a det ställe du vill att markören ska flytta sig till.<br />

4.2 Textbehandling<br />

När du startat Word är det bara att börja skriva in text direkt. Man kan ändra utseendet<br />

p˚a den text man skriver p˚a m˚anga olika sätt. De vanligaste sakerna man kan vilja ändra p˚a<br />

själva texten är vilket typsnitt (p˚a engelska ”font”) man använder, vilken storlek texten har,<br />

om texten är fet, kursiv, eller understruken och hur texten är justerad (vilket vi visar lite<br />

senare).<br />

Att markera text<br />

Flera g˚anger i de här instruktionerna kommer vi att uppmana dig att ”markera” n˚agon<br />

textsnutt. Du markerar text genom att klicka med musen (vänster musknapp, när vi skriver<br />

”klicka med musknappen” avses alltid vänster musknapp om inget annat sägs) framför det<br />

43


44 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD<br />

första ordet i stycket du vill markera och sedan h˚alla nere musknappen medan du drar musen<br />

till det sista ordet du vill markera och sedan släpper musknappen. Testa att skriva in n˚agra<br />

ord i Word och att sedan markera dem. Man kan ocks˚a markera ett helt ord genom att först<br />

klicka n˚agonstans i ordet och sedan dubbelklicka med musen. Klickar man tre g˚anger i snabb<br />

följd markeras hela stycket.<br />

Klippa ut, Kopiera och Klistra in text<br />

Det är ofta man vill flytta runt saker man skrivit i ett dokument och d˚a gör man det enklast<br />

genom att kopiera eller klippa ut den text man vill flytta och sedan klistra in den p˚a det nya<br />

stället där man vill ha texten. Skillnaden mellan att kopiera och att klippa ut en bit text är<br />

att om du kopierar den s˚a finns texten kvar där den st˚ar fr˚an början medan om du klipper<br />

ut den s˚a försvinner den (men du kan alltid klistra in den igen).<br />

För att kopiera en bit text markerar du först texten. Sedan finns det fyra alternativa sätt<br />

att g˚a till väga och du ska använda det sätt du tycker är bekvämast.<br />

Det första sättet är att öppna menyn ”Redigera” genom att klicka p˚a den, och<br />

sedan klicka p˚a ”Kopiera”. Ett annat sätt är att klicka p˚a knappen i verktygsfältet.<br />

Det tredje sättet är att trycka p˚a Ctrl-C (tryck ner tangenten som heter Ctrl i<br />

nedre vänstra hörnet p˚a tangentbordet och h˚all den nedtryckt samtidigt som du trycker p˚a<br />

tangenten för bokstaven C). Det fjärde sättet är att h˚alla ned Ctrl-knappen samtidigt som<br />

du trycker ned musknappen och drar iväg till det ställe dit du vill kopiera texten. När du<br />

släpper upp musknappen kopieras texten till det ställe där du är. Den här tekniken kallas<br />

”Klicka och dra”. Att klippa ut en bit text g˚ar till p˚a ett väldigt likartat sätt som att<br />

kopiera text. Först m˚aste du markera den textsnutt som du vill klippa ut. Sedan finns det<br />

igen fyra sätt att g˚a till väga. Det första är att öppna menyn ”Redigera” och sedan välja<br />

”Klippa ut”.<br />

Det andra är att klicka p˚a knappen i verktygsfältet och det tredje är att trycka<br />

p˚a Ctrl-X. Slutligen kan du helt enkelt trycka p˚a ”delete” tangenten.<br />

Efter att du har klippt ut eller kopierat en snutt text är nästa steg att klistra in texten igen<br />

där du vill ha den. Detta gör du genom att flytta markören till det ställe där du vill att<br />

texten ska ligga, och sedan finns det fyra sätt (blev du förv˚anad?) att klistra in texten. Det<br />

första är att öppna menyn ”Redigera” och välja ”Klistra in”, det andra<br />

är att klicka p˚a symbolen i verktygsfältet och det tredje är att trycka p˚a Ctrl-V.<br />

Det fjärde sättet är att helt enkelt markera den textsnutt du vill flytta och sedan<br />

”klicka och dra” utan att trycka ned n˚agon tangent.<br />

Detta sammanfattas i tabellen nedan:<br />

Kopiera Klippa ut Klistra in<br />

Sätt nummer 1 Välj ”Kopiera” i Välj ”Klippa ut” i Välj ”Klistra in” i<br />

menyn ”Redigera” menyn ”Redigera” menyn ”Redigera”<br />

Sätt nummer 2 Tryck p˚a Tryck p˚a Tryck p˚a<br />

Sätt nummer 3 Tryck Ctrl-C Tryck Ctrl-X Tryck Ctrl-V<br />

Sätt nummer 4 Klicka och dra med Tryck p˚a ”delete” Klicka och dra<br />

Ctrl nedtryckt<br />

Tabell 4.1: Kopiera, Klippa ut och Klistra in text.


4.2. TEXTBEHANDLING 45<br />

4.2.1 Typsnitt<br />

Word har flera typsnitt fördefinierade som du lätt kan välja mellan. I övre högra hörnet<br />

finns en ruta där det st˚ar ”Times New Roman” som p˚a bilden här intill,<br />

och bredvid finns en ned˚atpil. Om du klickar p˚a ned˚atpilen s˚a öppnas<br />

en meny där du kan se Words alla typsnitt (eng. font) och du väljer det du vill ha genom att<br />

klicka p˚a det. Om du nu skriver in lite text ser du att den ser ut som det typsnitt du valt.<br />

Om man redan har skrivit in text och man i efterhand vill ändra typsnittet, eller om man<br />

bara vill ändra typsnittet p˚a ett ord mitt i ett stycke text (som med engelskans font här ovan)<br />

gör man det lättast genom att markera den text man vill ändra och sedan välja typsnitt i<br />

menyn. D˚a kommer bara typsnittet p˚a den markerade texten att ändras.<br />

4.2.2 Storlek p˚a texten<br />

Bredvid rutan där du väljer typsnitt finns en ruta där du väljer storlek p˚a texten. När du<br />

startar Word s˚a st˚ar det säkert antingen 10 eller 12 i den här rutan, och bredvid rutan med<br />

siffran finns en ned˚atpil. Om du trycker p˚a den s˚a f˚ar du upp en meny med de alternativ som<br />

finns att välja mellan för storleken p˚a texten. Det här är inget konstigt och du kan säkert<br />

prova dig fram själv.<br />

4.2.3 Fet, kursiv och understruken text<br />

Du kan välja att skriva med fet text, kursiv text, eller understruken text,<br />

genom att trycka p˚a n˚agon av knapparna .<br />

Testa att trycka in en eller flera av dessa knappar och skriv sedan lite text. Om du vill<br />

ändra p˚a en redan inskriven text kan du markera texten du vill ändra och sedan trycka p˚a<br />

knapparna s˚a ändras utseendet p˚a den markerade texten. Testa även detta.<br />

Fet text är användbar när du skriver rubriker och när du skriver undertexter till tabeller<br />

och figurer i dina labrapporter. Kursiv text används när man vill betona n˚agot, men man<br />

bör använda detta sparsamt. Vidare använder man kursiv text när man skriver ekvationer<br />

(Equation Editor använder automatiskt kursiv text) och det är ocks˚a snyggt att använda det<br />

när man pratar om variabler i en text, till exempel: ”Vi mätte längden x till värdet 10, och<br />

tiden t till värdet 5, och beräknade hastigheten v till v = x/t”. Kursiv text används ocks˚a<br />

ibland när man presenterar termer p˚a andra sp˚ak. Understruken text används sällan och är<br />

dessutom ganska jobbig att läsa. Nuförtiden används ocks˚a understruken text ofta för att<br />

indikera länkar, man bör därför vara försiktig med att använda understruken text där det<br />

kan missförst˚as.<br />

4.2.4 Att justera texten<br />

Med att justera texten menar man att bestämma längs vilken kant texten ska ligga, alternativt<br />

om den ska ligga i mitten (vara centrerad). N˚agra exempel:<br />

Vanlig text är vänsterjusterad.<br />

Den här texten är centrerad.<br />

Är mer användbart än högerjusterad text.<br />

Det här är högerjusterad text.<br />

Den ligger till höger.<br />

Den här texten är ”marginaljusterad”<br />

vilket som syns p˚a raden ovanför kan se ganska bedrövligt ut om raderna blir korta, men


46 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD<br />

som ibland används i löpande text för att f˚a b˚ade rak vänstermarginal och högermarginal.<br />

Använder man marginaljusterad text och vill ha en enstaka kort rad s˚a avslutar man den<br />

med return varvid den korta raden blir normalt vänsterjusterad<br />

Man justerar texten genom att trycka p˚a knapparna .<br />

Vanligtvis är knappen för vänstercentrerad text intryckt.<br />

Naturligt nog kan bara en av knapparna vara intryckt<br />

˚at g˚angen, s˚a om du trycker p˚a knappen för högerjustering s˚a kommer den att tryckas in<br />

och knappen för vänsterjustering kommer att ˚aka ut. Om du vill ändra justeringen p˚a en<br />

redan inskriven text kan du som vanligt markera texten och sedan trycka p˚a knappen för<br />

den justering som du vill byta till.<br />

4.2.5 Att göra en rubrik<br />

Under Normal (i övre vänstra hörnet, se bilden här bredvid)<br />

finns ett antal fördefinierade rubriktyper som ni<br />

väljer genom att trycka p˚a ned˚atpilen till höger om ordet<br />

Normal och sedan klicka p˚a den rubriktyp som ni vill ha. Som ni ser finns det tre rubriktyper<br />

att välja mellan. Oftast är de fördefinierade rubriktyperna inte av s˚a stort intresse men man<br />

kan definiera egna typer som man sedan kan spara p˚a de tre platserna i menyn. När man<br />

skriver en labrapport är detta praktiskt, eftersom man nu lätt f˚ar samma utseende p˚a alla<br />

rubriker i rapporten.<br />

För att definiera din egen rubriktyp gör du s˚a här:<br />

•<br />

Öppna menyn under ”Normal” (klicka p˚a ned˚atpilen).<br />

• Klicka p˚a den rubriktyp-plats som du vill spara din rubriktyp p˚a, om du vill att din<br />

egendefinierade rubriktyp ska vara Rubrik 2 i fortsättningen s˚a klickar du p˚a ”Rubrik<br />

2”.<br />

• Skriv in en textsnutt och markera den.<br />

• Formatera texten s˚a att den ser ut som du vill ha den, det vill säga välj storlek p˚a<br />

texten, välj det typsnitt du vill ha, välj fet stil och om du vill kan du ocks˚a välja<br />

kursiverad stil samt vilken justering texten ska ha.<br />

•<br />

Öppna ˚aterigen menyn under ”Normal”.<br />

• Klicka p˚a den rubriktyp-plats som du vill spara din rubriktyp p˚a igen (det vill säga<br />

klicka p˚a ”Rubrik 2” igen). Du kommer d˚a att denna g˚ang f˚a upp en dialogruta.<br />

• I dialogrutan markerar du alternativet ” Ändra formatmallen för att˚aterspegla förändringen”<br />

och klickar p˚a ”OK”-knappen.<br />

Om man i ett dokument har underavsnitt till ett avsnitt bör man ha en annan rubriktyp<br />

för underavsnitten som är n˚agot mindre. Man kallar detta att man har olika rubriktyper<br />

för olika niv˚aer i dokumentet, eller helt enkelt att det finns olika niv˚aer av rubriker. Därför<br />

är det praktiskt att du kan spara mer än en rubriktyp som du har definierat, det kan vara<br />

bra att spara en för varje niv˚a som behövs. Som ett exempel kan vi titta p˚a avsnittet<br />

”Textbehandling” i detta dokument som har flera underavsnitt ”Att markera text”, ”Klippa<br />

ut, Kopiera och Klistra in text” och s˚a vidare. För rubriken ”Textbehandling” användes<br />

typsnittet Arial, fet stil och storleken 16 punkter. För rubriken ”Att markera text” användes<br />

typsnittet Arial, fet stil och storleken 12 punkter. Oftast är det snyggast att använda samma<br />

typsnitt för alla rubriker och bara variera storleken p˚a texten. För att skriva detta dokument<br />

sparade jag därför tv˚a olika rubriktyper som jag definierade själv.


4.3. EGNA FORMATMALLAR 47<br />

4.3 Egna formatmallar<br />

Egna definitioner av t ex rubriker sparas i n˚agot som kallas “formatmall” i Word. Men<br />

eftersom datorerna i datorsalarna regelbundet städas s˚a kommer words formatmallar med<br />

jämna mellanrum ˚aterställas till sina standardvärden. Dessutom är ju de mallar som lagras<br />

internt i Word bara ˚atkomliga just p˚a den dator där de skapades. Men det g˚ar att spara<br />

och komma ˚at egendefinierade formatmallar: I menyn “Format” väljer du “Formatmall”, i<br />

det fönster som d˚a kommer upp väljer du mallhanteraren. Du f˚ar d˚a möjlighet att spara<br />

den aktuella formatmallen till disk, för att du skall kunna n˚a mallen fr˚an vilken dator som<br />

helst skall du spara mallen p˚a din AFS-disk. För att kunna använda mallen när du arbetar<br />

p˚a en annan dator f˚ar du i Word öppna mallhanteraren och läsa in formatmallen fr˚an din<br />

AFS-disk.<br />

4.4 Lägga till knappar till verktygsfältet<br />

I verktygsfältet har Word en mängd knappar, de flesta behöver man inte särskilt ofta och<br />

de viktigaste knapparna saknas! Lyckligtvis kan man själv lägga till de viktiga knapparna<br />

till de funktioner man använder ofta. När du skriver labrapporter kommer du speciellt att<br />

behöva knapparna för ”Equation Editor”, för ”Speciella Symboler” och för ”Nedsänkt” och<br />

”Upphöjd” text väldigt ofta.<br />

Equation Editor<br />

Special Symbols<br />

Nedsänkt text<br />

Upphöjd text<br />

Om dessa inte redan finns i ditt verktygsfält ska du nu f˚a lära dig hur du lägger dit dem.<br />

• Klicka p˚a menyn ”Verktyg”.<br />

• Välj ”Anpassa”.<br />

• Klicka p˚a fliken ”Kommandon”.<br />

• Markera den ”kategori” där kommandot du vill ha en knapp för finns. ”Equation Editor”<br />

och ”Special Symbols” ligger under kategorin ”Infoga”. Knapparna för nedsänkt<br />

och upphöjd text hittar du under kategorin ”Format”.<br />

• Leta reda p˚a kommandot du vill lägga till. Klicka p˚a kommandot och dra det upp p˚a<br />

verktygsfältet och släpp det p˚a den plats du vill att knappen ska ligga.<br />

• Om du vill ta bort en knapp fr˚an verktygsfältet sa drar du bara bort den med musen<br />

och släpper den i ruten för ”Anpassa”.<br />

• När du har lagt till alla knappar du vill ha s˚a stänger du bara fönstret för ”Anpassa”.<br />

4.5 Sidbrytning<br />

Ibland kan man vilja göra en framsida till det dokument man skriver, även om en framsida<br />

inte är nödvändig för kortare dokument som labrapporter. Om man vill tvinga Word att


48 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD<br />

byta sida och lämna resten av sidan tom s˚a är det bästa sättet att infoga en sidbrytning<br />

(istället för att bara trycka ”Enter” en massa g˚anger). En sidbrytning hindrar texten att<br />

flyta ner under det ställe där du sätter din sidbrytning. Du inför en sidbrytning genom att<br />

först öppna menyn ”Infoga” och sedan välja alternativet ”Brytning”. Du f˚ar d˚a upp ett litet<br />

fönster där du kan markera vilken typ av textbrytning du vill införa, välj ”Sidbrytning” och<br />

tryck p˚a ”OK”-knappen.<br />

4.6 Sidnumrering<br />

Om du vill att Word ska numrera sidorna i dokumentet du skriver öppnar du menyn ”Infoga”<br />

och väljer alternativet ”Sidnummer”. Du f˚ar d˚a upp ett litet fönster där du kan välja i vilket<br />

läge numren ska ligga (brukar vara längst ner p˚a sidan) och vilken justering du vill ha, till<br />

exempel centrerad.<br />

4.7 Stavningskontroll<br />

Om du skriver in ett ord i Word som Word anser vara felstavat s˚a markerar Word det ordet<br />

genom att stryka under ordet med en röd v˚agig linje. Det här kan vara b˚ade praktiskt och<br />

irriterande. Det största problemet med stavningskontrollen är att Word inte känner till alla<br />

ord, speciellt om man skriver facktermer fr˚an fysiken s˚a brukar Word tolka det som felstavade<br />

ord eftersom Word inte känner till ordet. Om du har ett felstavat ord s˚a kan du alltid klicka<br />

p˚a ordet med högerknappen, Word ger d˚a kanske n˚agra förslag i fet stil p˚a ord som den tror<br />

att du menar. Vidare finns det ett alternativ ”Ignorera alla” vilket betyder att du instruerar<br />

Word att ignorera alla instanser av det ordet vilket är praktiskt om du vet att ordet är<br />

rättstavat men att Word inte känner till det. Ett alternativ till att välja ”Ignorera alla” är<br />

att välja alternativet ”Lägg till” som betyder att Word lägger till det ordet i sin ordlista och<br />

därmed ocks˚a betraktar det som rättstavat. Denna möjlighet skall du dock ej använda dig<br />

av p˚a fysikums datorer där m˚anga användare delar p˚a samma stavningslistor.<br />

Om du irriterar dig p˚a att Word titt som tätt markerar ord när du skriver s˚a kan ett alternativt<br />

sätt att arbeta vara att helt stänga av stavningskontrollen och sedan köra en stavningskontroll<br />

när du skrivit klart det du skriver. Att stänga av stavningskontrollen gör du<br />

s˚a här:<br />

•<br />

Öppna menyn ”Verktyg”.<br />

• Välj alternativet ”Alternativ” längst ner i menyn.<br />

• Klicka p˚a fliken ”Spr˚akkontroll”.<br />

• Avmarkera alternativet ”Kontrollera stavning medan du skriver”.<br />

• Klicka p˚a ”OK”-knappen.<br />

För att köra en stavningskontroll kan du göra p˚a tre alternativa sätt.<br />

Det första är att öppna menyn ”Verktyg” och välja det översta alternativet ”Stavning<br />

och grammatik...”. Det andra sättet är att trycka p˚a knappen i verktygsfältet<br />

och det tredje sättet är att trycka p˚a ”F7”-tangenten.<br />

När du har startat stavningskontrollen öppnar Word ett nytt fönster där den stegar igenom<br />

texten och stannar p˚a alla ord Word anser vara felstavade. Du kan se den text du skrivit<br />

in till höger i fönstret där Word markerar det felstavade ordet med rött typsnitt. För varje<br />

felstavat ord kan du välja att instruera Word att ”Ignorera”, ”Ignorera alla” (d˚a ignorerar<br />

Word även efterföljande kopior av ordet), ”Lägg till” eller s˚a kan du välja att ” Ändra” ordet.<br />

När du väl har kommit s˚a här l˚angt bör det vara ganska enkelt.


4.8. FOTNOTER 49<br />

4.8 Fotnoter<br />

Om du vill införa en fotnot i din text gör du s˚a här 1 :<br />

• Ställ markören där du vill att den lilla siffran som visar att det finns en fotnot ska<br />

finnas (det vill säga den lilla ettan i meningen ovan).<br />

•<br />

Öppna menyn ”Infoga”.<br />

• Välj alternativet ”Fotnoter och slutkommentarer...”<br />

• Word kommer d˚a att öppna ett litet fönster där du väljer att markera alternativen ”Fotnot”<br />

och ”Numrera automatiskt” (b˚ada bör vara markerade fr˚an början när fönstret<br />

öppnas).<br />

• Tryck p˚a ”OK”-knappen.<br />

• Markören flyttas nu längst ner p˚a sidan där du kan skriva in det du vill att fotnoten<br />

ska säga 2 .<br />

• För att komma tillbaka till texten där du införde din fotnot räcker det att trycka p˚a<br />

upp˚atpilen n˚agra g˚anger.<br />

4.9 Numrerade listor<br />

Om man vill göra en punktlista som ser ut s˚a här:<br />

• Första saken...<br />

• Andra saken...<br />

eller en numrerad lista som ser ut s˚a här:<br />

1. Första saken...<br />

2. Andra saken...<br />

s˚a finns det tv˚a knappar i verktygsfältet som du kan använda, för att göra en<br />

punktlista och för att göra en numrerad lista. När du valt vilken typ av lista du<br />

vill göra är det bara att börja skriva in texten för första punkten. När du trycker<br />

p˚a ”Enter” s˚a kommer du till nästa punkt i listan, s˚a om en punkt best˚ar av en<br />

text med flera meningar ska du inte trycka ”Enter” efter första meningen utan<br />

bara fortsätt att skriva.<br />

Listan avslutas om du trycker p˚a ”Enter” tv˚a g˚anger i följd (det vill säga du lämnar en punkt<br />

tom).<br />

• Ibland<br />

Vill man kunna lägga in en radbrytning i en lista utan att skapa en ny punkt. Detta<br />

gör man genom att h˚alla ned skift-tangenten när man trycker p˚a ”Enter”<br />

Om du vill kunna välja mellan alla typer av listor som Word har att erbjuda öppnar du<br />

menyn ”Format” och väljer alternativet ”Punkter och numrering”. Här kan du välja mellan<br />

flera olika utseenden för din punktlista eller numrerade lista och du kan ocks˚a välja att göra<br />

en lista med flera niv˚aer. För finliraren kan ocks˚a nämnas att du själv kan byta ut de objekt<br />

som används ”punkter” i punktlistan till nästan vilken bild som helst.<br />

1 Det här är ett exempel p˚a en fotnot<br />

2 Det vill säga den här texten


50 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD<br />

4.10 Tabeller<br />

Att göra tabeller är en viktig del av att skriva en bra rapport. I Word kan man göra ganska<br />

snygga tabeller och det finns en hel del finlir man kan göra med tabeller som kan vara bra<br />

att kunna. När du gör en tabell är oftast den bästa taktiken först fylla i dina data i tabellen<br />

och sedan bekymra sig om tabellens utseende.<br />

För att skapa en tabell gör du s˚a här:<br />

•<br />

Först m˚aste du tala om för Word att du vill göra en tabell. Det enklaste<br />

sättet om du bara vill göra en liten tabell är att klicka p˚a och sedan dra<br />

med musen s˚a att rätt antal rader och kolumner markeras. Det mer generella sättet<br />

att infoga en tabell är att öppna menyn ”Tabell” och välja alternativet ”Infoga” och<br />

sedan klicka p˚a ”Tabell”. Du f˚ar d˚a upp ett nytt fönster där du kan fylla i hur m˚anga<br />

rader och kolumner du vill att din tabell ska ha.<br />

• Du f˚ar nu upp ett tomt rutnät där du kan börja fylla i dina uppgifter. Klicka med<br />

musen i den ruta du vill börja skriva in dina uppgifter och skriv in det som ska st˚a där.<br />

Du kan sedan flytta dig runt i tabellen genom att trycka p˚a ”Tab”-tangenten för att<br />

komma till nästa ruta i tabellen, alternativt kan du klicka med musen i den ruta du<br />

vill till.<br />

•<br />

Genom att öppna menyn ”Tabell” och välja alternativet ”Rita tabell” f˚ar du<br />

upp ett litet fönster som heter<br />

”Tabeller och kantlinjer” med alla funktioner för att göra sm˚ajusteringar till<br />

din tabell. En sak du kan göra är att markera en cell och sedan trycka p˚a<br />

ikonen<br />

för att dela upp cellen i flera mindre celler. En annan sak är att markera fler<br />

än en cell och trycka p˚a knappen till höger för att sammanfoga cellerna till<br />

en cell. Du kan ocks˚a markera alla celler i en kolumn eller rad och<br />

sedan öppna menyn ”Tabell” och välja alternativet ”Ta bort” och sedan ”Rader” eller<br />

”Kolumner” för att ta bort de cellerna. P˚a samma sätt kan du markera en rad eller<br />

kolumn där du vill infoga nya celler och sedan öppna menyn ”Tabell” och välja ”Infoga”<br />

och sedan ”Rader till höger” (respektive till vänster) eller ”Kolumner till höger”<br />

(respektive till vänster). När tabellen ser ut som du vill ha den och du har fyllt i allt<br />

du vill ska st˚a i tabellen g˚ar du till nästa punkt.<br />

• När du skrivit in allt du vill ska st˚a i tabellen s˚a markerar du hela tabellen, öppnar<br />

menyn ”Tabell” och väljer alternativet ”Tabellformat” alternativt trycker p˚a<br />

i fönstret ”Tabeller och kantlinjer”. Du f˚ar d˚a upp ett nytt fönster där du<br />

kan välja mellan de olika stilar som finns för tabeller och väljer den som du<br />

vill ha och klickar p˚a ”OK”-knappen.<br />

•<br />

I ”Tabeller och kantlinjer” kan du ocks˚a välja att fylla i n˚agra linjer i din<br />

tabell s˚a att de blir tjockare genom att trycka in knappen till höger och<br />

sedan ställa in vilken tjocklek du vill att strecken ska ha i fönstret med<br />

en siffra, varefter du kan rita i din tabell med musen. Du kan ocks˚a trycka in<br />

och sedan sudda ut en linje som du inte är nöjd med.<br />

• Slutligen skriver du en tabelltext och justerar tabellen (i meningen lägger den där du<br />

vill ha den p˚a sidan). Oftast vill man ha centrerade tabeller. Det är i alla fall lättast<br />

att f˚a tabelltexten under tabellen p˚a ett snyggt sätt för centrerade tabeller. För att<br />

centrera en tabell markerar du hela tabellen och trycker p˚a knappen för centrering.


4.11. FIGURER 51<br />

Precis som när du skriver vanlig text kan du bestämma hur texten i din tabell ska se ut, det<br />

vill säga vilket typsnitt, vilken storlek och s˚a vidare.<br />

4.10.1 Tabelltext<br />

Alla tabeller ska ha en tabelltext där tabellen numreras och det st˚ar en kort beskrivning av<br />

vad tabellen inneh˚aller.<br />

I stycket för ”Textbehandling” fanns till exempel en tabell med följande tabelltext:<br />

Tabell 4.1: Kopiera, Klippa ut och Klistra in text.<br />

Tabelltexten skrivs med ett lite mindre typsnitt än den vanliga texten, vanligtvis tv˚a punkter<br />

mindre. Den inleds med tabellens namn, i det här fallet Tabell 4.1 som ska vara i fet stil.<br />

När du refererar till din tabell i texten sedan är det till det här namnet du refererar. Efter<br />

tabellnamnet kan du skriva in en kort beskrivning av vad tabellen inneh˚aller. Det är klart<br />

snyggast om tabelltexten st˚ar centrerad under tabellen.<br />

4.11 Figurer<br />

Det kommer ofta behov av att du vill inkludera bilder i dina dokument, framför allt plottar<br />

du gjort i Matlab. Det finns tv˚a sätt att f˚a in bilder i ditt Word-dokument, antingen kopierar<br />

du bilden i det program bilden finns och klistrar sedan in det i Word, eller s˚a har du bilden<br />

sparad som en fil och inkluderar filen i Word. Att kopiera och klistra in bilder g˚ar till p˚a<br />

samma sätt som att kopiera och klistra in text. Om du vill föra in en bild fr˚an Matlab<br />

kopierar du den i Matlab, g˚ar till ditt Word-dokument och ställer markören där du vill att<br />

bilden ska vara och klistrar in den (genom att använda n˚agon av de första tre av de metoder<br />

som beskrivits). Om du har bilden sparad som en fil s˚a öppnar du menyn ”Infoga”, väljer<br />

alternativet ”Bildobjekt” och ”Fr˚an fil”. Sedan f˚ar du leta reda p˚a den bildfil du vill infoga<br />

p˚a h˚arddisken, markera den och trycka p˚a ”OK”-knappen. När din bild väl är inne i Word<br />

kan du flytta runt den genom att klicka p˚a bilden, h˚alla nere musknappen och flytta runt<br />

bilden med musen tills det att du släpper musknappen. Att f˚a bilder att hamna p˚a rätt plats<br />

kan ibland vara lite sv˚art.<br />

4.11.1 Ankra bilder<br />

Om du skriver in text ovanför bilden kommer bilden att flyta med texten ned˚at, och du kan<br />

inte skriva n˚agot p˚a sidorna av bilden. Ofta vill man ha bilden kvar p˚a det ställe du har<br />

bestämt och sedan vill man att texten ska flyta runt bilden (om bilden är liten, är bilden<br />

stor är det bättre att l˚ata texten fortsätta under bilden). För att f˚a bilden att ligga still och<br />

f˚a möjligheten att l˚ata texten flyta runt bilden s˚a m˚aste du ankra bilden. Det gör du s˚a här:<br />

• Markera bilden. Det gör du genom att klicka en g˚ang p˚a bilden.<br />

•<br />

Öppna menyn ”Format” och välj alternativet ”Bild”.<br />

• Klicka p˚a fliken ”Layout”.<br />

• Klicka p˚a knappen där det st˚ar ”Inställningar”.<br />

• Klicka p˚a den figursättning som du vill ha. Om du har valt att texten ska flyta runt<br />

bilden s˚a ska du ocks˚a markera p˚a vilken sida om bilden du vill att Word ska bryta<br />

raderna.<br />

• När du är nöjd klicka p˚a ”OK”-knappen.


52 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD<br />

Nu ligger bilden fast i dokumentet och du kan skriva din text hur du vill utan att bilden<br />

flyttar sig.<br />

4.11.2 Figurtext<br />

Precis som med tabeller ska varje figur ha en figurtext. En figurtext följer samma regler<br />

som en tabelltext förutom att namnet ska vara Figur 1 s˚aklart. Figurer brukar ofta vara<br />

centrerade automatiskt s˚a d˚a ska figurtexten givetvis ocks˚a vara centrerad.<br />

4.12 Speciella symboler<br />

Om du vill skriva en grekisk bokstav, ett æ eller ç eller n˚agot annat tecken som inte finns p˚a<br />

tangentbordet s˚a kallas det att infoga en speciell symbol. För att göra detta kan du öppna<br />

menyn ”Infoga” och välja alternativet ”Symbol”.<br />

Det här är n˚agot man gör s˚a ofta att man vill ha en knapp i verktygsfältet för<br />

detta, och den ser ut s˚a här . Om den inte redan finns i ditt verktygsfält bör du<br />

lägga till den själv (se avsnittet om att ”Lägga till knappar till verktygsfältet”). När du<br />

trycker p˚a knappen f˚ar du upp ett fönster med massor av symboler. Leta reda p˚a den du är<br />

ute efter och markera den (tryck p˚a den) och tryck sedan p˚a knappen ”Infoga” i nedre högra<br />

hörnet.<br />

4.13 Ekvationer<br />

Att skriva ekvationer är tyvärr inte Words starka sida men eftersom det är n˚agot man behöver<br />

göra väldigt ofta är det bra att träna en del p˚a det.<br />

Ekvationer skrivs in i ”Equation Editor” som du startar genom att trycka p˚a<br />

symbolen i verktygsfältet. Du kan ocks˚a starta ”Equation Editor” genom att<br />

öppna menyn ”Infoga” och välja alternativet ”Objekt”. Du f˚ar d˚a upp ett nytt<br />

fönster där du markerar ”Microsoft Equation 3.0” och trycker p˚a<br />

”OK”-knappen. P˚a den plats där markören var kommer nu upp en<br />

liten ruta som visar var ekvationen kommer att hamna, samtidigt som<br />

ett nytt fönster som heter ”Formler” öppnas med menyer vilka inneh˚aller matematiska tecken.<br />

Du bygger upp din ekvation genom att välja tecken ur menyerna som kommer att komma<br />

upp i din lilla ekvationsruta när du valt dem. Du kan ocks˚a mata in siffror och bokstäver<br />

med tangentbordet (observera att ”Equation Editor” använder kursiv stil som är brukligt i<br />

matematiska formler). Du kan dock inte mata in mellanslag fr˚an tangentbordet, utan även<br />

detta m˚aste väljas fr˚an menyerna (du hittar mellanslag i andra menyn och det ser<br />

ut s˚a här).<br />

Om du vill skriva in integraler, kvoter, summor, parenteser och dylikt m˚aste du först infoga<br />

symbolen för denna och sedan fylla i index och s˚adant som hör till. Om du vill skriva in<br />

∞i=1 ni s˚a börjar du med att införa summatecknet med index b˚ade uppe och nere. Summatecknet<br />

kommer d˚a upp i din ekvationsruta med tomma rutor där du kan fylla i index och<br />

formler. Du kan flytta dig till de tomma rutorna genom att klicka i dem med musen eller att<br />

använda piltangenterna.<br />

Menyraden överst i Word ändras när du g˚ar in i ”Equation Editor”. I ”Format” kan man till<br />

exempel ställa in om en matris ska vara höger- eller vänsterjusterad alternativt centrerad.<br />

I ”Formatmall” kan du välja vilken texttyp du ska använda, här kan du till exempel välja<br />

”Text” för att kunna skriva bokstäver som inte är kursiva. Ett annat användbart format är<br />

”Matriser och vektorer” som ger fet normal text som används för just matriser och vektorer.


4.14. SPARA DOKUMENT 53<br />

För att avsluta ”Equation Editor” s˚a klickar du var som helst i dokumentet utanför ekvationsrutan.<br />

Den färdiga ekvationen behandlas som en bild, du kan flytta runt den med musen och<br />

placera den där du vill ha den. Om du vill redigera en formel i efterhand kan du dubbelklicka<br />

p˚a formeln s˚a kommer du tillbaka till ”Equation Editor” och kan göra de ändringar du vill.<br />

Ekvationer kan antingen st˚a p˚a en egen rad<br />

3(2x+5) - 5(2x-3) = -4x<br />

eller vara en del av texten (∇ × A)da = A · dl som här. Man bör endast l˚ata korta<br />

ekvationer vara en del av texten. Pröva gärna att skriva in de ekvationer som vi visade här<br />

själv!<br />

4.14 Spara dokument<br />

När du vill spara n˚agot du skrivit i Word s˚a g˚ar det till p˚a samma sätt som i de flesta andra<br />

Windows-program. Du kan antingen klicka p˚a eller öppna menyn ”Arkiv” och välja<br />

n˚agot av alternativen ”Spara” eller ”Spara som”. Ett snabbalternativ till ”Spara” är att<br />

trycka p˚a ”Ctrl-s” p˚a tangentbordet. Om du inte har sparat ditt dokument förut, eller om<br />

du väljer alternativet ”Spara som”, kommer det upp ett nytt fönster där du kan välja vilket<br />

namn du vill att filen ska ha och var p˚a h˚arddisken du vill spara filen (kom ih˚ag att välja<br />

din hemkatalog om du vill hitta filen igen!). När man sitter och skriver länge p˚a en l˚ang<br />

labrapport är det en bra vana att trycka p˚a ”Ctrl-s” lite d˚a och d˚a!<br />

Om du har öppnat Word och vill fortsätta skriva p˚a ett dokument som du har skrivit tidigare<br />

och sedan sparat, s˚a m˚aste du öppna dokumentet först. Det gör du genom att antingen klicka<br />

p˚a eller genom att öppna menyn ”Arkiv” och välja alternativet ” Öppna” (snabbalternativ<br />

”Ctrl-o”). Du f˚ar d˚a upp ett nytt fönster där du kan leta reda p˚a ditt dokument p˚a<br />

h˚arddisken.<br />

Word sparar ocks˚a automatiskt med jämna mellanrum en kopia av vad du har ändrat sedan<br />

filen sist sparades p˚a disk. Kontrollera att detta är p˚aslaget genom att g˚a in i Verktygsmenyn,<br />

välj “Alternativ” och klicka p˚a fliken “Spara”. Se till att rutan vid “Spara information för<br />

˚aterskapning var 10 min” är fylld, och att det är 10 (eller n˚agon annan lämplig tidsrymd<br />

som är ifylld). Med detta läge aktivt kommer word att spara ned dina ändringar var tionde<br />

minut, skulle programmet krascha g˚ar det - oftast - att ˚aterskapa ändringarna fram till den<br />

tidpunkt du word senast gjorde detta. Säkrast är dock att ta för vana att trycka p˚a “Spara”<br />

med jämna mellanrum.


54 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD<br />

4.15 Övningsuppgifter<br />

1. Försök att göra följande tabell (inklusive tabelltext):<br />

Tabell 1. Det här är den första testtabellen.<br />

(den här tabellen är gjord med 5 kolumner och fem rader, centrerad text, fet text i<br />

första kolumnen och Tabellformatet ”Rutnät 8”. För att flytta tabellen till mitten av<br />

sidan kan du flytta vänstermarginalen (det som ser ut som ett timglas p˚a ”linjalen”<br />

under Verktygsfältet) tills den hamnar ungefär under knappen för ”Fet text”.)<br />

2. Försök att göra följande tabell (inklusive tabelltext):<br />

Tabell 2. Det här är den andra testtabellen.<br />

(i den här tabellen har jag använt ”Lista 3” och sedan fyllt i de flesta linjerna för hand<br />

med verktygen fr˚an fönstret ”Rita tabeller”. Jag använde 1,5 punkters bred linje för<br />

de tjocka strecken och 1 punkt bred linje för de smala strecken.)<br />

3. Försök att göra följande tabell (inklusive tabelltext):<br />

Tabell 3. Det här är den tredje testtabellen.<br />

4. Här kommer lite fler ekvationer att träna p˚a:<br />

Rab − R gab = 8π Tab


4.15.<br />

ÖVNINGSUPPGIFTER 55<br />

− dP<br />

dz =<br />

<br />

n+ → j + m, n− → j − m<br />

K0<br />

x<br />

2 =<br />

2 −1<br />

4 6<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

∞<br />

J0<br />

0<br />

<br />

x<br />

y<br />

3x − 5y − z = 7<br />

x + 7y + 4z = 1<br />

2x − 6y − z = 6<br />

xt t<br />

dt<br />

2 1 + t2 <br />

15.1<br />

=<br />

−3.15<br />

<br />

(σkxσk´x + σkyσk´y) = S 2 − S 2 z<br />

k,k´<br />

c2 32π2 2 <br />

ω<br />

σ δ ωλ C<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

f(x) =<br />

n=1<br />

<br />

∞<br />

c 2<br />

µω 2 <br />

λɛ<br />

<br />

1 − ω2 λ<br />

ω 2<br />

c2 <br />

<br />

µω <br />

λ<br />

∂Ψ<br />

<br />

<br />

∂n 2<br />

3x for x ≤ 0<br />

3√ x for x > 0<br />

Grn = (−∞, ∞)<br />

〈x|E, l, m〉 = il<br />

<br />

2mk<br />

¯h π jl (kr)Y l m (r)<br />

<br />

|n × ∇tΨ| 2 + ω ωλ |Ψ|2<br />

⎫<br />

⎪⎬<br />

dl<br />

⎪⎭


56 KAPITEL 4. ORDBEHANDLING MED MICROSOFT WORD


Kapitel 5<br />

Felsökning - Debuggning.<br />

Nästan inga program blir helt rätt fr˚an början. När det uppst˚ar fel i enklare program kan<br />

man ofta hitta orsaken bara genom att g˚a igenom programmet en g˚ang till med vetskap om<br />

vad som gick fel. Men i takt med att programmen blir större och mer komplicerade blir<br />

denna procedur mer och mer besvärlig och tidskrävande.<br />

Ett fel i ett datorprogram kallas p˚a engelska ”bug”. Detta uttryck sägs härstamma fr˚an<br />

datorernas barndom. Vid ett tillfälle hade ett team som jobbade med en av de första stora<br />

beräkningsmaskinerna (rörbestyckad) länge försökt att ta reda p˚a vad som gick fel i ett<br />

program. Till slut upptäckte man att orsaken inte l˚ag i programmet utan att en död insekt<br />

inuti maskinen hade orsakat en kortslutning. Denna historia m˚a vara sann eller inte, men<br />

ett fel i ett datorprogram heter p˚a engelska ”bug”, och processen att hitta och korrigera fel<br />

heter de-bugging. P˚a svenska säger man oftast bugg och debugga, men ibland kan man möta<br />

termen ”avlusa”.<br />

För att underlätta denna process finns i de flesta datormiljöer n˚agot som kallas debugger.<br />

Det är ett verktyg som p˚a olika sätt underlättar felsökningen i program. Vi skall i det här<br />

kapitlet illustrera hur man kan arbeta med en debugger genom att korrigera ett felaktigt<br />

program för att beräkna primtalsfaktorer.<br />

AntalFaktorer=0;<br />

i=2;<br />

while (i < x)<br />

kvot = x/i;<br />

rest = i*floor(kvot) - x;<br />

% om rest är noll g˚ar divisionen jämnt ut<br />

if(rest==0)<br />

AntalFaktorer = AntalFaktorer +1;<br />

Faktor(AntalFaktorer) = i;<br />

end<br />

if(i==2)<br />

i=i+1;<br />

else<br />

i=i+2;<br />

end<br />

end<br />

AntalFaktorer<br />

Faktor<br />

Lägg märke till att det inte räcker att g˚a upp till i < sqrt(x), om talet har primfaktorer<br />

s˚a m˚aste minst en av dem vara lägre än roten ur talet, men andra faktorer kan vara större.<br />

Det räcker allts˚a att loopa upp till roten ur x om vi bara vill veta om x är ett primtal eller<br />

57


58 KAPITEL 5. FELSÖKNING - DEBUGGNING.<br />

inte, men om vi vill hitta alla primfaktorer s˚a m˚aste vi g˚a hela vägen.<br />

5.1 MATLABs debugger<br />

L˚at oss illustrera processen med hjälp av programmet p˚a föreg˚aende sida för att beräkna<br />

primtalsfaktorer. Skriv in koden i matlab i editor-fönstret.<br />

Om vi nu i kommandofönstret skriver x=9 för att ladda ned det värdet i<br />

workspace och sedan kör programmet, enklast genom att trycka p˚a ”save and<br />

run”-knappen s˚a ser vi att programmet uppenbarligen inte fungerar som det<br />

var tänkt, AntalFaktorer är lika med noll. För att undersöka vad som händer sätter vi<br />

en s˚a kallad ”break-point” p˚a n˚agot lämpligt ställe. En break-point är ett ställe i koden vid<br />

vilket programmet stannar upp när det kommit dit (programmet stannar innan det genomför<br />

den instruktion vi satt break-point vid). När vi trycker p˚a ”save and run” s˚a startar programmet,<br />

men kör inte till slutet, utan gör en paus vid v˚ar definierade “break-point”. Vi har<br />

d˚a möjlighet att via kommandon i kommandofönstret undersöka, eller till och med ändra,<br />

värdet p˚a parametrar i programmet, och kan sedan köra vidare genom att trycka p˚a ”save<br />

and run”. L˚at oss börja v˚ar undersökning genom att sätta en break-point omedelbart inuti<br />

while-loopen, vid raden kvot = x/i;.<br />

Det finns tv˚a sätt att sätta en break-point. Du kan antingen markera raden i<br />

editor-fönstret och tryck p˚a ”set break-point” knappen. Ett enklare sätt är att<br />

bara klicka p˚a det lilla minustecknet till höger om radnumret. Vi ser att raden<br />

markeras med en röd punkt som anger att en<br />

”break point” är satt just här. Tryck nu p˚a<br />

”save and run” s˚a kör programmet fram till denna rad, vilket visas genom en liten grön pil<br />

vid raden. När programmet stannar s˚a ändras prompten i kommando-fönstret till K>> för<br />

att visa att vi är i debug-mode. Vi kan nu undersöka värdet p˚a v˚ara variabler genom att<br />

t.ex. skriva x eller i i kommandofönstret. Gör vi det ser vi att allt verkar normalt, x är 9<br />

och i är 2, precis som förväntat. Vi trycker därför p˚a ”save and run” en g˚ang till för att se<br />

vad som händer nästa varv i loopen. Hoppsan - vi kom aldrig tillbaks till v˚ar break-point!<br />

Varför?<br />

Detta kan vi undersöka med hjälp av en annan av metoderna i debuggern. Starta om programmet<br />

fr˚an början s˚a att vi stannar vid v˚ar break-point igen.<br />

Vi kan nu fortsätta härifr˚an en rad i taget genom att trycka p˚a ”step”-knappen<br />

(stegningsknappen):. När vi gör det ser vi hur markeringen stegvis flyttas genom<br />

programmet. P˚a s˚a sätt kan vi se exakt i vilken ordning raderna i programmet utförs, vilka<br />

delar av villkorssatser som utförs och hur loopar genomförs. Vid varje punkt kan vi undersöka/sätta<br />

värdet p˚a variabler i programmet. Genom att stega oss fram fr˚an v˚ar breakpoint<br />

kan vi se hur programmet korrekt detekterar att 2 inte är en faktor i 9, hur i stegas<br />

upp fr˚an 2 till 3 och hur vi sedan testar om 3 är mindre än roten ur 9. Och sedan stegar<br />

vi ner till slutet av while-loopen istället för att testa om 9 är delbart med 3. Där har vi<br />

felet: villkoret i while-loopen skall vara ”


5.1. MATLABS DEBUGGER 59<br />

Tydligen är programmet inte helt avlusat ännu: kör vi f˚ar vi svaret:<br />

AntalFaktorer =<br />

1<br />

Faktor =<br />

3<br />

För att reda ut var problemet ligger denna g˚ang sätter vi igen en break-point vid<br />

kvot = x/i;<br />

och undersöker x och i när programmet stannar. Vi ser d˚a genast att variabeln i stegas upp<br />

genom 2, 3 och sedan kommer vi inte tillbaka till v˚ar break-point. Tydligen händer n˚agot<br />

efter i=3 som vi inte önskar. För att f˚a reda p˚a vad kan vi köra ig˚ang programmet igen<br />

och när vi stannar vid v˚ar break-point s˚a sätter vi i kommandofönstret K≫ i=3 för att se<br />

hur programmet fortsätter genom att stega oss fram. Vi ser d˚a genast problemet: variabeln<br />

stegas upp till 5 utan att testa om 3 förekommer som faktor mer än en g˚ang. Vi m˚aste allts˚a<br />

l˚ata bli att stega upp i när divisionen g˚ar jämnt upp för att testa om samma faktor finns<br />

mer än en g˚ang. Vi ändrar i v˚ar kod, fr˚an:<br />

if(rest==0)<br />

AntalFaktorer = AntalFaktorer +1;<br />

Faktor(AntalFaktorer) = i;<br />

end<br />

if(i==2)<br />

i=i+1<br />

else<br />

i=i+2<br />

end<br />

till<br />

if(rest==0)<br />

AntalFaktorer = AntalFaktorer +1;<br />

Faktor(AntalFaktorer) = i;<br />

else<br />

if(i==2)<br />

i=i+1<br />

else<br />

i=i+2<br />

end<br />

end<br />

s˚a att inte i stegas upp om den är en faktor i x. Vi tar bort alla break-points och prövar.<br />

När vi gör det inträffar n˚agot som händer litet d˚a och d˚a: när vi trycker p˚a ”return” försvinner<br />

prompten och ingenting händer, ingen output, och ingenting händer om vi försöker skriva<br />

in kommandon. Oftast är det här beteendet förorsakat av att programmet har hamnat i en<br />

oändlig loop där villkoret för att loopen skall avbrytas aldrig blir sant.<br />

För att kunna ˚atgärda felet m˚aste vi först och främst f˚a MATLAB att sluta med loopandet,<br />

det ˚astadkommer vi genom att klicka i kommandofönstret och trycka ctrl-C, dvs vi trycker<br />

samtidigt in control-tangenten och c. Som svar p˚a ctrl-C avbryter MATLAB utförandet av<br />

det program som kör och lämnar tillbaka kontrollen till kommandofönstret. Vi kan nu med<br />

hjälp av debuggern ge oss i kast med övningsuppgift 1 där uppgiften är att dels finna orsaken<br />

till den oändliga loopen, dels försöka korrigera det ganska grova felet i programmet.<br />

Mer hjälp om debuggern kan du f˚a i on-line hjälpen via ?/MATLAB/Desktop Tools and<br />

Development Environment/Editing and Debugging M-files/Debugging M-Files


60 KAPITEL 5. FELSÖKNING - DEBUGGNING.<br />

5.2 Övningsuppgifter<br />

1. Använd Matlabs debugger för att först˚a hur den oändliga loopen uppst˚ar och korrigera<br />

programmet s˚a att det p˚a ett korrekt sätt beräknar primtalsfaktorerna i godtyckliga<br />

tal.


Kapitel 6<br />

2D-Grafik<br />

I det här passet kommer vi att koncentrera oss p˚a att skapa grafik: histogram, plottar och<br />

annat som kan användas för att ˚ask˚adliggöra experimentella resultat. Vi skall försöka avst˚a<br />

fr˚an frestelsen att komma med pekpinnar om hur grafik skall utformas för att vara bra, utan<br />

i stället koncentrera oss p˚a att g˚a igenom tekniken, s˚a att vi kan ˚astadkomma grafik som ser<br />

ut som vi vill.<br />

Efter att ha g˚att igenom det här passet skall du själv kunna producera en plot som den ovan<br />

och ocks˚a kunna b˚ade skriva ut den och kopiera in den i ett word-dokument för att bifogas<br />

i en lab-rapport.<br />

61


62 KAPITEL 6. 2D-GRAFIK<br />

6.1 Kurvor i tv˚a dimensioner<br />

Att skapa enklare tv˚a-dimensionella plottar i MATLAB är relativt enkelt. En skillnad mellan<br />

MATLAB och en del andra grafikprogram är att vi inte kan instruera MATLAB att till<br />

exempel rita kurvan y=sin(x). Istället m˚aste vi ge MATLAB en uppsättning punkter med<br />

en x-koordinat och en y-koordinat. MATLAB ritar sedan upp en mjuk kurva som förbinder<br />

punkterna. Vill vi rita upp y = sin(x) m˚aste vi därför först själva skapa en x-vektor och<br />

sen en y-vektor 1 där y=sin(x) och instruera MATLAB att rita en kurva mellan de punkter<br />

som beskrivs av dessa vektorerna. L˚at oss börja med n˚agot enkelt som att rita grafen för y<br />

= 2x + 3.<br />

≫x = [1 8];<br />

≫ y = 2*x + 3;<br />

≫ plot (x,y)<br />

6.1.1 Att växla mellan fönster, och städa i fönster.<br />

När vi trycker p˚a return efter att ha givit plot kommandot öppnas ett nytt fönster,<br />

MATLABs grafikfönster där plotten visas. När vi jobbar med grafik kommer vi att vilja<br />

pendla mellan m˚anga fönster. Ofta kommer vi att utföra samma lunk mellan m-fil editorns<br />

fönster där vi just ändrat n˚agon detalj i en m-fil till kommandofönstret för att köra filen till<br />

grafikfönstret för att se hur det blev. Det finns flera metoder för att snabbt växla mellan<br />

fönster, vilken som passar bäst just för stunden beror litet p˚a exakt vad man h˚aller p˚a med<br />

och hur man föredrar att jobba.<br />

• Det kanske enklaste sättet är att helt enkelt lägga fönstren bredvid varandra, eller i<br />

alla fall se till inget fönster ligger helt bakom de andra. Genom att klicka och dra p˚a<br />

kanten av ett fönster kan du flytta det vart du vill p˚a datorns skrivbord, och genom<br />

att klicka och dra i ett aktivt fönsters nedre högra hörn kan du ändra dess storlek. Om<br />

du lägger upp de fönster du jobbar i s˚a att det alltid sticker fram n˚agon bit av fönstret<br />

även när det är de andra fönstren som är aktiva s˚a kan du enkelt byta fönster bara<br />

genom att klicka med musen i det fönster du vill skall bli det aktiva.<br />

• Ett annat sätt att vandra mellan fönstren är att g˚a in i MATLABs meny ”Windows”<br />

och välja det fönster man vill göra aktivt.<br />

• I windows finns det en funktion för att bläddra mellan alla fönster som är öppna p˚a<br />

datorns skrivbord. H˚all ”alt”-tangenten nedtryckt och tryck p˚a TAB tangenten. Varje<br />

g˚ang du trycker ned TAB bläddras ett nytt fönster fram som aktivt, vilket fönster som<br />

görs aktivt visas i en liten ruta. Befinner du dig i MATLABs kommandofönster och vill<br />

till grafikfönstret kan du skriva ”figure(1)” i kommandofönstret, d˚a blir fönstret med<br />

det namnet aktivt. Vill du tillbaks fr˚an grafikfönstret till kommandofönstret trycker<br />

du bara p˚a return.<br />

Vill du städa upp i grafikfönstret skriver du (i kommandofönstret) clf (CLear Figure window),<br />

vill du städa upp i kommandofönstret ger du kommandot clc (CLear Command window).<br />

Du kan stänga grafikfönstret genom att ge kommandot close.<br />

1 Eftersom det MATLAB använder i plottandet är punkter, vars x- och y-koordinater kommer fr˚an vektorerna<br />

x och y s˚a m˚aste vektorerna ha samma antal element.


6.1. KURVOR I TV˚A DIMENSIONER 63<br />

6.1.2 plot-kommandot<br />

L˚at oss prova att plotta en litet mer komplicerad kurva, y = x 2 . Pröva<br />

≫ x = [1 4];<br />

≫ y = x.∧2;<br />

≫ plot(x,y)<br />

Resultatet blir inte direkt vad vi väntat oss, men egentligen är det inte s˚a märkligt: plot<br />

kommandot ser ju bara de punkter vi vill rita en graf mellan och har ingen aning om huruvida<br />

de tv˚a punkterna (1,1) och (4,16) är tv˚a punkter p˚a kurvan y=x 2 , eller om de ligger<br />

p˚a kurvan y = 5x-4. Mer information m˚aste allts˚a till, pröva att lägga till punkten (<br />

x,y) = (2,4). Inte heller särskilt imponerande. För att kurvan skall bli jämn och fin och<br />

följa det funktionssamband vi önskar m˚aste vi ge MATLABs plot kommando vektorer där<br />

punkterna ligger ganska tätt. Det görs enklast om vi använder oss av MATLABs vektorfunktioner.<br />

Antag till exempel att vi vill plotta y=x 2 mellan 0 och 4.5. Vi kan d˚a antingen<br />

använda kolonoperatorn för att skaffa oss en x-vektor där elementen har värden fr˚an 0 till<br />

4.5 med vilket avst˚and vi vill, till exempel 0.1: x = (0:0.1:4.5); (när vektorerna f˚ar s˚a här<br />

m˚anga element vill man gärna stänga av ekot genom att ge semikolon efter kommandot).<br />

Alternativt kan vi använda linspace för att skapa 50 punkter mellan 0 och 4.5: x =<br />

linspace(0,4.5,50); ger oss ocks˚a en användbar x-vektor. När x-vektorn är klar skapar<br />

vi en y-vektor med y = x.∧2 och plottar resultatet.<br />

Prova nu att plotta n˚agra andra funktioner som polynom och sin(x) för att se att resultatet<br />

blir som du förväntar dig.<br />

6.1.3 Styra utseendet p˚a grafiken<br />

Det mesta av den tid man spenderar p˚a att göra grafer tenderar att läggas p˚a att f˚a lay-outen<br />

att bli vad man har tänkt sig. Eftersom korrekt och tydlig lay-out är ett viktigt verktyg för<br />

att ˚astadkomma grafik av hög kvalitet kan det vara värt besväret att redan fr˚an början<br />

försöka lära sig de kommandon som krävs för att man skall kunna styra programmet dit man<br />

vill.<br />

bakgrundsfärg<br />

Kommandot whitebg(c) ger dig möjlighet att ändra färgschemat p˚a din plot. Prova till<br />

exempel att ge kommandot whitebg(’g’) och se vad det f˚ar för resultat. Argumentet till<br />

kommandot kan vara antingen en förkortning som ovan, ett färgnamn i klartext till exempel<br />

whitebg(’blue’) 2 . Exempel p˚a vilka färgkoder som finns kan du se om du ger kommandot<br />

help plot. Kommandot whitebg ändrar inte enbart färgen för plottens bakgrund, även<br />

färgen p˚a den omgivande ramen, axlar och kurvor ändras p˚a ett sätt som skall ge god kontrast<br />

och läsbarhet för hela grafen.<br />

Linjefärg, linjetyp och markörer<br />

Kommandot plot kan ges med tre argument: plot(x,y,S). Argumentet S är en textsträng som<br />

anger hur linjen som ritas skall formateras. Det finns tre typer av information att styra,<br />

färgen p˚a linjen, hur linjen dras (heldragen, prickad mm), och slutligen markör, eller vilken<br />

symbol som skall ritas ut i de punkter som anges av vektorerna. Skriver du help plot kan<br />

du bland annat hitta följande lista p˚a vilka möjligheterna är:<br />

2 För experter kan nämnas att argumentet till whitebg ocks˚a kan vara en s˚a kallad RGB kod, vilket ger<br />

möjlighet att välja exakt den nyans man vill.


64 KAPITEL 6. 2D-GRAFIK<br />

Linjefärg Markör Linjetyp<br />

y yellow . point - solid<br />

m magenta o circle : dotted<br />

c cyan x x-mark -. dashdot<br />

r red + plus - - dashed<br />

g green * star (none) ingen linje<br />

b blue s square<br />

k black d diamond<br />

v triangle (down)<br />

∧ triangle(up)<br />

< triangle(left)<br />

> triangle(right)<br />

p pentagram<br />

h hexagram<br />

Man kan i plot kommandot använda en godtycklig kombination av dessa (men bara ett val<br />

för varje kategori!). Prova med litet olika kombinationer för att se hur det fungerar, en gul<br />

kurva med heldragen linje mellan sm˚a cirklar ges t.ex av plot(x,y,’yo-’). Märk att om<br />

man ger formatkommandot för linjefärg och markör men inte n˚agon kod för linjetyp som<br />

t.ex. plot(x,y,’bo’) s˚a ritas endast punkterna ut utan n˚agon sammanbindande linje.<br />

Rutnät<br />

Ibland vill man lägga in ett rutnät över grafen för att underlätta avläsningen av koordinater.<br />

Detta görs med kommandot grid on. För att sl˚a av ett rutnät använder du grid off.<br />

Ger man bara kommandot grid s˚a växlar man mellan dessa tillst˚and (engelskans toggle).<br />

6.1.4 Koordinataxlar<br />

Om vi inte ger n˚agot kommando för att speciellt formatera koordinataxlarna väljer MATLAB<br />

axlar s˚a att hela grafen lagom ryms i grafikfönstret. M˚anga g˚anger vill man själv bestämma<br />

hur koordinataxlarna läggs ut, antingen för att man vill zooma in ett intressant omr˚ade,<br />

eller för att man vill lägga in litet luft, plotta till exempel y=x 2 mellan -2 och 3, det ser inte<br />

snyggt ut just kring origo. För att styra detta ger vi kommandot axis([xmin xmax ymin<br />

ymax]) där xmin är minimivärdet p˚a x-axeln och s˚a vidare. Kommandot axis skall ges efter<br />

plot-kommandot, testa med axis ( [-2 3 -.5 10] ) p˚a v˚ar andragradskurva! Det kan<br />

verka en smula omständigt att axis kommandot tar sitt argument i formen av en vektor,<br />

vilket gör att vi m˚aste skriva in tv˚a omg˚angar parantestecken när vi skriver in kommandot.<br />

Rätt använt kan dock just detta faktum spara mycket arbete särskilt när vi skriver m-filer<br />

som skall producera grafik. Den enklaste varianten är att vi istället för att ange siffervärden<br />

lagrar siffrorna i en vektor och ger den som argument till axis kommandot. Prova till exempel<br />

≫ stor = [-5 10 -5 25];<br />

≫ axis(stor);<br />

≫ figure(1)<br />

≫ liten = [-0.5 2.1 0 3.1];<br />

≫ axis(liten);<br />

≫ figure(1)<br />

Tappar vi tr˚aden kan vi se vilken inställning som för ögonblicket gäller genom att ge kommandot<br />

axis utan argument. MATLAB skriver d˚a ut den aktuella vektorn. Vi kan även<br />

spara en inställning genom att ge kommandot vektor = axis, där vektor är ett godtyckligt


6.1. KURVOR I TV˚A DIMENSIONER 65<br />

namn p˚a en vektor i vilken de aktuella värdena sparas. Ett användningsomr˚ade för detta<br />

trick är om vi skriver en allmän m-fil för att plotta data och allts˚a inte i förväg vet vilka xoch<br />

y-värden som blir aktuella. Om vi änd˚a vill plotta kurvan med litet luft ikring kan vi<br />

använda en variant av följande sekvens:<br />

≫ x = -1.5: .05 : 1.5;<br />

≫ y = sin(x);<br />

≫ plot(x,y)<br />

≫ current=axis;<br />

≫ mellanrum=0.3<br />

≫ ny(1) = current(1) - mellanrum;<br />

≫ ny(2) = current(2) + mellanrum;<br />

≫ ny(3) = current(3) - mellanrum;<br />

≫ ny(4) = current(4) + mellanrum;<br />

≫ axis(ny);<br />

≫ figure(1)<br />

Axis har en hel del special-argument, för en fullständig lista skriv help axis, n˚agra av de<br />

mer användbara är:<br />

• axis equal som ger lika skalindelning p˚a x- och y-axeln.<br />

• axis image ger lika skalindelning p˚a x- och y-axeln, men krymper bildytan s˚a att alla<br />

datapunkter precis ryms.<br />

• axis square gör bildytan kvadratisk<br />

• axis tight krymper bildytan s˚a att alla datapunkter precis ryms.<br />

• axis normal ˚aterställer omskalningar till standardläge<br />

• axis off ritar grafen utan axlar<br />

För att skriva ut beteckningar p˚a x- och y-axeln använder vi kommandona xlabel(’text’)<br />

respective ylabel(’text’), där text är den sträng vi vill skriva ut som beteckning p˚a axeln.<br />

Prova att skriva in beteckingar p˚a bägge axlarna! Man kan p˚averka utformningen av etiketterna<br />

p˚a m˚anga vis genom MATLABs s.k. ”property editor”. Vi kommer att ˚aterkomma<br />

till det i kapitel 9, men om du redan nu är nyfiken s˚a g˚ar det att läsa mer om detta i hjälpavsnittet<br />

?/Functions Categorical List/Graphics/Basic Plots and Graphs<br />

6.1.5 Text<br />

Titel-text<br />

Ofta kommer vi att vilja lägga till text i graferna för att till exempel visa vilka parametervärden<br />

som använts. Det första vi gör är att lägga till en titel högst upp i bildytan, med<br />

kommandot title(’text’), prova med title(’Sinuskurvan’)! Man kan även lägga<br />

till en titel ifr˚an MATLABs desktop, men eftersom vi koncentrerar oss p˚a kommandon som<br />

kan utföras fr˚an en m-fil s˚a g˚ar vi inte in p˚a det här, vill du veta mer om det s˚a kan du<br />

läsa hjälptexten under ?/MATLAB/Graphics/Annotating Graphs/Adding a Title<br />

to a Graph. Även för title kommandot ˚aterkommer vi i avsnitt 7.2 till hur man kan styra<br />

egenskaperna hos titeltexten mer i detalj.


66 KAPITEL 6. 2D-GRAFIK<br />

Fri text<br />

Vi kan ocsk˚a lägga till text p˚a godtyckligt ställe i grafen genom att använda kommandot<br />

text(x,y,’sträng’) som skriver in texten sträng vid punkten (x,y). Prova att placera<br />

in en textsträng p˚a rätt ställe i grafen, det kan ta ett tag innan man f˚ar koordinaterna<br />

rätt. Du ser att textsträngens nedre vänstra hörn placeras vid den koordinat som anges.<br />

Om man ger fler textkommandon i följd s˚a försvinner inte de gamla textsträngarna. Även<br />

för fri text finns det verktyg som enkelt placerar in och formaterar text i MATLABs desktop,<br />

inte heller dessa beskriver vi i detalj här, men de finns dokumenterade i ?/ MAT-<br />

LAB/Graphics/Annotating Graphs/Adding Text Annotations to a Graph.<br />

Kurvbeskrivningar<br />

Vi kommer snart att börja plotta mer än en kurva i varje graf. Det kan d˚a vara bra att ha en<br />

beskrivning över vilken kurva som visar vilken storhet. En s˚adan läggs in med kommandot<br />

legend(’beskrivning 1, beskrivning 2, ....) där beskrivning 1 är den textsträng som<br />

beskriver den kurva som ritades med det första plot kommandot, beskrivning 2 den som<br />

ritades med det andra plot kommandot osv.<br />

6.2 Plotta punkter med fel<br />

Om du gjort en serie mätningar av en variabel y som funktion av x, och y-värdena har ett fel<br />

dy s˚a vill man ofta visa mätserien i en plot med felstaplar angivna. För detta kan vi använda<br />

kommandot errobar(x,y,dy). Prova till exempel:<br />

≫x =[1 2 3 4 5 6];<br />

≫y =[1.5 2.4 4.7 7.2 9.3 10.2];<br />

≫dy = [0.3 0.4 0.3 0.2 0.3 0.5];<br />

≫plot(x,y)<br />

≫errorbar(x,y,dy)<br />

Ofta vill vi inte ha n˚agon linje som förbinder punkterna, det blir tydligare att bara plotta<br />

punkterna med till exempel en ring. Prova t.ex. errorbar(x,y,dy,’o’), kommandot<br />

errorbar accepterar samma parametrar för att styra linjefärg mm som plot gör. Man kan<br />

ocks˚a plotta asymmetriska fel genom att ge tv˚a vektorer med fel, den första ger d˚a felet<br />

i positiv riktning, den andra felet i negativ riktning, ett fullständigt kommando blir i det<br />

fallet errobar(x,y,dyplus,dyminus,’sträng’). Vill vi rita felstaplar i b˚ade x- och yriktning<br />

kan vi inte använda inbyggda funktioner. Vi f˚ar istället själva först beräkna x- och<br />

y-koordinater för felstaplarna och använda kommandot line för att rita linjer i grafen.<br />

Detta är inte s˚a sv˚art, vi kommer senare att titta p˚a det som en övning i att programmera.<br />

6.3 Histogram<br />

Förutom kurvor och punkter med felstaplar kommer vi ofta vilja producera stapelhistogram.<br />

Det finns flera varianter att välja p˚a som producerar litet olika typer av grafer. För att kunna<br />

pröva oss fram skapar vi först en vektor med data som vi vill stoppa in i histogrammet: x<br />

= rand(1,20); ger oss en vektor med 20 tal, vart och ett slumpvis draget mellan 0 och 1.<br />

6.3.1 Kommandot bar - stapeldiagram<br />

Kommandot bar(x) ger oss ett stapeldiagram med de 20 talen. Vi kan själva styra bredden<br />

av staplarna genom ett andra argument, prova bar(x,0.2)! Som ett tredje argument ac-


6.3. HISTOGRAM 67<br />

cepterar bar-kommandot en textsträng som anger vilken färg staplarna skall ha, här använder<br />

vi samma kod som för plot-kommandot som t ex bar(x, 1.4,’r’).<br />

6.3.2 Kommandot hist - histogram<br />

Oftast vill vi nog inte bara plotta värdet för v˚ara 20 tal. Vanligare är att vi vill visa ett<br />

histogram som visar till exempel hur m˚anga av talen som ligger mellan 0.0 och 0.2 och s˚a<br />

vidare. För att göra detta ger vi kommandot hist(x). Om vi inte anger annat delas data<br />

upp i 10 binnar, men vi kan ange hur m˚anga binnar vi vill visa i ett andra argument till<br />

exempel hist(x,5).<br />

Tänker vi efter litet inser vi att kommandot hist egentligen utför tv˚a ganska olika uppgifter:<br />

I det första steget delas data in i binnar (10 binnar eller det antal som vi anger) som sträcker<br />

sig mellan det minsta och högsta värdet. I det andra steget plottas sedan stapeldiagrammet<br />

i grafen. Ibland kommer vi att vilja använda bara det första steget för att sedan själva<br />

plotta data - eller använda dem i beräkningar. Det g˚ar om vi ger kommandot som antal<br />

= hist(x,8) s˚a skapas vektorn antal vars element anger hur m˚anga av elementen i x som<br />

faller inom vart och ett av 8 intervall mellan det lägsta och högsta värdet som förekommer<br />

i x. Vi kan även skapa en vektor med mittpunkterna i varje interval genom kommandot<br />

[antal mitt] = hist(x,8). Vektorn antal inneh˚aller d˚a frekvensen och vektorn mitt<br />

interval-mitten för de 8 intervallen. De vektorerna kan sedan till exempel användas för att<br />

plotta punkter istället för histogram med plot(mitt, antal).<br />

När du prövade hist(x,8) fick du antagligen ganska konstiga värden p˚a intervallbredden<br />

(och en smal glipa i histogrammets vänsterkant). Detta beror p˚a att hist-kommandot<br />

beräknar intervallbredden genom att dela avst˚andet mellan högsta x-värdet och lägsta xvärdet<br />

med 8, istället för att beräkna intervallbredden som (Xmax−Xmin)/8 (det vill säga det<br />

högsta möjliga värdet minus det minsta möjliga, delat med antalet binnar) vilket hade varit<br />

mer naturligt för den här typen av data. För att kunna rätta till s˚adana skönhetsfläckar kan vi<br />

istället för antalet binnar ange var vi vill ha klassmitten i anropet till hist. Vi kan till exempel<br />

sätta mycenter = 0.1 : 0.2 : 0.9 följt av hist(x,mycenter). Ett mer allmänt sätt<br />

att skapa ett histogram fr˚an minvalue till maxvalue med binvidd vidd är att skapa mycenter<br />

genom kommandot mycenter = [minvalue+vidd/2 : vidd : maxvalue-vidd/2]<br />

följt av hist(x,mycenter). Vi kan lägga till luft runt plotten genom att använda axis kommandot<br />

även för den här typen av grafer.<br />

6.3.3 Kommandot stairs - konturdiagram.<br />

Kommandot stairs(x) drar en öppen kontur över elementen i vektorn x. Vi kan ange vid<br />

vilket värde det horisontella strecket skall börja med en andra vektor startx: prova startx=<br />

0.05:0.05:1 följt av stairs(startx,x). Vi kan ange linjetyp som en sträng som vi skickar<br />

med som tredje argument p˚a samma sätt som för plot-kommandot.<br />

Använt direkt p˚a v˚ar datavektor är stairs ett alternativ till bar-kommadot, men vill vi rita<br />

ett histogram med den här tekniken g˚ar det ocks˚a bra, vi m˚aste bara först skapa vektorn<br />

antal med hjälp av hist-kommandot som ovan, och sedan ge stairs(antal).<br />

Ett annat nyttigt knep om vi vill att stairs skall dra en linje fr˚an nollvärdet upp till första<br />

värdet är att lägga till ett element som vi sätter lika med noll först i den vektor vi ger som<br />

argument för stairs. P˚a motsvarande sätt kan vi ibland vilja lägga till ett noll-element sist i<br />

en vektor för att f˚a ner grafen till noll.<br />

6.3.4 Kommandot stem - stolpdiagram.<br />

Diskreta variabler, som till exempel antal studenter med vissa poäng p˚a tentan kan man rita<br />

med kommandot stem. Prova dig fram med hjälp av help stem.


68 KAPITEL 6. 2D-GRAFIK<br />

6.4 Utskrifter av grafik<br />

Det enklaste sättet att skriva ut en graf p˚a en printer är att ge kommandot print. Filen<br />

kommer d˚a att skrivas ut p˚a default printern 3 för datorn. Om du vill ha möjlighet att<br />

välja en annan printer s˚a är det enklaste att bara klicka p˚a printersymbolen i grafikfönstret<br />

(man kan ocks˚a välja “print” under menyn “file” i grafikfönstret). Du f˚ar d˚a upp en dialogruta<br />

där du kan välja printer. Om det inte kommer ut n˚agra plottar, utan printern istället visar<br />

ett meddelande om att man skall ladda papper i n˚agot skumt format i fack 2 s˚a beror det<br />

p˚a att MATLAB är inställd med felaktig pappersstorlek, printern skriver d˚a inte ut plotten<br />

utan ber oss ladda det felaktiga pappersformatet först. Det här fixar du genom att i ”File”<br />

i grafikfönstret välja ”Page Setup”, sedan ”Paper” och därefter klicka i ”A4”.<br />

Man kan ocks˚a använda kommandot print för att ”skriva ut till h˚arddisken”, det vill säga<br />

skapa en PostScript fil som inneh˚aller v˚ar plot. Detta görs genom att skriva önskat filnamn<br />

efter printkommandot. Filen hamnar d˚a i den aktuella katalogen med det namn som ges i<br />

print-kommandot. Det finns en mängd tillägg till print-kommandot som kan användas för<br />

att bestämma hur denna fil skall formateras, skriv help print för att f˚a en översikt. Vissa<br />

av tilläggen kan kombineras med varandra, man skriver d˚a helt enkelt in fler tillägg (alla med<br />

sitt inledande “-” tecken) efter varandra. Men det är inte alla kombinationer som är möjliga<br />

samtidigt, MATLAB kommer i s˚a fall att generera ett felmeddelande.<br />

Även de kombinationer<br />

som är till˚atna kan ibland ge överraskande resultat. Man f˚ar allts˚a pröva sig fram om man<br />

vill använda print p˚a ett mer avancerat sätt.<br />

6.5 Spara grafer och flytta till andra program<br />

Ofta kommer vi att behöva kopiera in en graf vi har producerat i MATLAB i en rapport.<br />

Använder vi till exempel Microsoft Word som ordbehandlingsprogram kan vi välja tv˚a vägar:<br />

• Om vi i MATLAB väljer det fönster som inneh˚aller grafen s˚a kan vi i menyn ”Edit”<br />

välja ”Copy”. G˚ar vi sedan till v˚art ordbehandlingsprogram s˚a kan vi klistra in bilden<br />

där vi placerat markören genom att (i ordbehandlingsprogrammet) g˚a till menyn Edit<br />

och välja Paste (eller p˚a svenska Redigera och Klistra in). Bilden kopieras d˚a in i<br />

ordbehandlingsprogrammet. En viktig detalj att tänka p˚a är att kvaliteten p˚a grafen<br />

oftast blir bättre om man inte ändrar storleken p˚a den efter det att den har klistrats<br />

in i det nya dokumentet. Man bör därför se till att den har rätt storlek redan när man<br />

klipper ut den, genom att klicka och dra i hörnet av MATLABs grafikfönster till dess<br />

att grafen är lagom stor.<br />

• Alternativt kan vi i MATLAB när grafikfönstret är aktivt g˚a in i menyn ”File” och<br />

välja ”Save as...”. Vi f˚ar d˚a upp en dialogruta där vi kan välja katalog och filnamn,<br />

men ocks˚a filformat samt format för preview. För det mesta fungerar ”EPS Level 2<br />

Color” som filformat och ”bitmap” för preview bra. Den sparade filen kan sedan läsas<br />

in till dokument som vi skapar i andra program. Skall du använda bilden i Word är<br />

det dock bättre att g˚a in i menyn “File” och där välja “Export”. I den menyn som<br />

kommer upp väljer du “Enhanced metafiles” under “Save as type”. P˚a det här sättet<br />

f˚ar du med mer information med bilden, vilket gär att du kan skala om storleken p˚a<br />

bilden i Word med ett bättre resultat än om du bara kopierar och klistrar in den.<br />

Den första metoden är givetvis snabbast, men den andra har en del som talar för sig. Framför<br />

allt givetvis om man inte använder MS Word eller motsvarande program för ordbehandling<br />

utan i stället jobbar med ett s˚a kallat ”markup language” som till exempel LaTex (ett mycket<br />

vanligt system för att producera vetenskapliga texter). I s˚adana program fungerar helt enkelt<br />

3 Se help printopt för att se hur du kan ändra viken printer som används.


6.6. FLER KURVOR I SAMMA GRAF - KOMMANDOT HOLD. 69<br />

inte metod ett (och om du använder metod tv˚a m˚aste du använda eps-formatet!), man kan<br />

inte klippa in grafik direkt i texten. I stället m˚aste den inkluderas genom att man läser in en<br />

fil i eps-format 4 . Men även om man arbetar med Word s˚a kan det vara en fördel att ha all<br />

grafik sparad i separata filer s˚a att man vid behov kan läsa in dem igen i Word-dokumentet,<br />

man kan ju av misstag förstöra bilden eller man kan ibland vilja använda samma bild p˚a fler<br />

ställen.<br />

6.5.1 Lägga in bilder i Word<br />

När vi vill använda bilder i Word placerar vi pekaren där vi vill ha bilden. För att läsa in<br />

bilden s˚a<br />

• g˚ar vi in i ”Redigera” och väljer ”Klistra in” om vi använder den första metoden.<br />

• g˚ar vi in i ”Infoga” och väljer ”Bildobjekt” och sedan ”Fr˚an fil” om vi använder den<br />

andra metoden. Vi f˚ar d˚a upp en dialogruta där vi kan välja vilken fil vi vill inkludera.<br />

När grafen väl kommit in i v˚art dokument blir den ett objekt som vi kan välja. Klickar vi<br />

en g˚ang p˚a bilden s˚a kommer det fram ˚atta sm˚a fyrkanter runt grafen. Dessa kan användas<br />

för att ändra bildens storlek genom att placera pekaren i en av rutorna, h˚alla musknappen<br />

nertryckt och dra ˚at det h˚all vi vill flytta grafens kant. Om vi använder rutorna i n˚agot av<br />

hörnen för detta s˚a ändras bredd och höjd proportionerligt. Man skall bara i undantagsfall<br />

ändra en grafs storlek genom att ändra bredd eller höjd separat eftersom b˚ade siffror och text<br />

d˚a blir mer eller mindre distorderade. Om man vill flytta bilden i texten s˚a kan man dra den<br />

genom att flytta pekaren s˚a att den ligger p˚a bilden, h˚alla musknappen nere och dra. När vi<br />

väl placerat in bilden där vi vill ha den s˚a kommer den att flyta runt litet när vi introducerar<br />

mer text. Vill man ”l˚asa fast bilden” s˚a att den inte flyttar sig ned˚at sidan om vi skriver in<br />

mer text s˚a klickar men en g˚ang p˚a bilden s˚a att den markeras. Sedan g˚ar man in i ”Format”<br />

väljer ”Bild” och f˚ar upp en dialogruta. Klicka p˚a fliken ”Placering” och markera boxen<br />

”L˚as fästpunkten” och avmarkera ”L˚at bilden följa texten”. Grafens placering fryses d˚a s˚a<br />

att även om vi skriver in mer text ovanför bilden s˚a ligger den kvar, det är texten som flyter<br />

runt. Med standardinställningar kommer det att vara ”textfritt” p˚a bägge sidor om grafen.<br />

Ibland när man visar en liten bild, som här, s˚a kan man vilja l˚ata texten fylla upp utrymmet<br />

vid sidan om bilden.<br />

Detta kan vi ordna genom att igen g˚a in i formatteringsrutan,<br />

klicka ”Layout” och sedan p˚a fliken ”Figursättning”. I den<br />

övre raden klickar vi p˚a den vänstra bilden ”Rektangulärt”.<br />

I den andra raden väljer vi hur texten skall läggas<br />

ut runt bilden. Som framg˚ar av det här exemplet är det<br />

oftast inte s˚a snyggt att lägga texten p˚a bägge sidor om<br />

bilden, dels eftersom text- raderna ofta blir för korta<br />

för att brytas p˚a ett vettigt sätt, dels för att det kan vara sv˚art att följa en rad tvärs över<br />

grafen när man läser. Oftast är det därför bättre att flytta bilden till ena sidan och l˚ata<br />

texten löpa bara p˚a en sida.<br />

6.6 Fler Kurvor i samma graf - kommandot hold.<br />

Det är ganska vanligt att vi vill rita mer än en kurva i samma graf. För att undvika att<br />

MATLAB hela tiden suddar den gamla plotten när vi ger ett nytt plot-kommando s˚a kan vi<br />

4 eps st˚ar för ”Encapsulated Post Script” ett utvidgat PostScript format som tagits fram just för att<br />

användas för grafik-filer som skall inkluderas i text-filer.


70 KAPITEL 6. 2D-GRAFIK<br />

använda kommandot hold on. Prova till exempel:<br />

≫ x= -2*pi:0.05:2*pi;<br />

≫ y=sin(x);<br />

≫ plot(x,y)<br />

≫ hold on<br />

≫ z=cos(x);<br />

≫ plot(x,z,’r’)<br />

Det är nu vi kan börja f˚a användning för legend-kommandot, prova: ≫legend(’Sinus<br />

x’,’Cosinus x’) En sv˚arighet med hold-kommandot är att det inte g˚ar att ge kommandot<br />

axis efter att hold on är givet. Det gäller allts˚a att formattera axlarna innan man ger<br />

hold on. Det här betyder att komplicerade grafer, som allt annat i MATLAB, m˚aste göras<br />

via m-filer eftersom man säkert kommer att behöva g˚a in och ändra m˚anga detaljer i graferna<br />

innan man f˚ar det helt rätt.<br />

När man vill börja p˚a ny kula s˚a ger man kommandot hold off.<br />

Notera att det som fryses är grafikfönstret i sig, vilket inte är specifikt för just plot-kommandot.<br />

Vi kan allts˚a överlagra allt som man kan visa i grafikfönstret, till exempel histogram, kurvor<br />

och mätpunkter med felstaplar i samma fönster.<br />

6.7 Fler grafer i samma fönster - kommandot subplot<br />

För att rita mer än en graf i samma fönster kan vi<br />

avända oss av kommandot subplot som delar in<br />

(2,3,1)<br />

(2,3,4)<br />

(2,3,2)<br />

(2,3,5)<br />

2,3,3)<br />

(2,3,6)<br />

grafikfönstret i ett antal rader och kolumner (max 9 rader och 9 kolumner) och l˚ater oss<br />

adressera ett s˚adant ”delfönster” med v˚ara grafikkommandon. Kommandot har syntaxen<br />

subplot(AntalRader, AntalKolumner, Rutnummer). Rutnumreringen görs löpande med<br />

övre vänstra hörnet som nummer 1 och hörnet längst ned till höger som nummer AntalRader<br />

× AntalKolumner, se figuren härintill. S˚a snart vi har gett kommandot subplot(x,y,z)<br />

s˚a kommer de följande grafik-kommandona att hänföra sig till enbart den lilla rutan. De<br />

andra rutorn förblir tomma tills vi ger ett nytt subplotkommando vartefter alla kommandon<br />

hänför sig till det nya delfönstret. I det läget är det ganska kr˚angligt att ”komma tillbaka”<br />

till ett del-fönster vi tidigare ritat i. Kommandon som title, xlabel mm m˚aste allts˚a ges<br />

innan vi med ett nytt subplot kommando tar oss vidare till nästa delfönster. Ytterligare<br />

ett skäl till att jobba med m-filer och inte direkt i kommandofönstret - det här blir nästan<br />

aldrig rätt första g˚angen!<br />

S˚a länge vi inte definierar delfönster som överlappar s˚a behöver vi inte ge alla delfönster<br />

samma storek, vi kan till exempel göra som i exemplet:<br />

≫x= -2*pi:0.05:2*pi;<br />

≫y=sin(x);<br />

≫subplot(2,2,1)<br />

≫plot(x,y)<br />

≫title(’Sinus x’)<br />

≫subplot(2,2,2)<br />

≫z=cos(x);<br />

≫plot(x,z)<br />

≫title(’Cosinus x’)<br />

≫subplot(2,1,2)<br />

≫diff =y-z;<br />

≫plot(x,diff);<br />

≫title(’sinus - cosinus’)


6.8. RITA I GRAFER 71<br />

6.8 Rita i grafer<br />

Ibland vill vi kunna rita i grafer, som till exempel när vi vill rita ut felstaplar i b˚ade x<br />

och y. För detta använder vi kommandot line(x,y) där x och y är vektorer med samma<br />

dimension. Kommandot ritar linjer mellan punkterna med koordinater ( x(i), y(i) ). Prova<br />

≫ x=[1 3 1 3]<br />

≫ y=[3 3 1 1]<br />

≫ line(x,y)<br />

≫ axis([0 4 0 4])<br />

% för att inte linjen skall överlappa bildkanten.<br />

Om grafikfönstret är tomt innan vi kallar line s˚a kommer MATLAB att skapa ett fönster<br />

där de linjer vi ritar upp nätt och jämnt f˚ar plats. Vill vi frilägga strecken f˚ar vi använda<br />

axis kommandot. Normalt ritar man dock i ett fönster där det redan finns en graf, s˚a detta<br />

brukar inte vara ett problem. kommandot line accepterar ocks˚a matriser som argument, om<br />

x och y är 2×n matriser s˚a behandlar line varje kolumn som ett punktpar. Detkan vara<br />

enlare att skriva in koordinatparen i en nx2 matris och sedan transponera i line-kommandot:<br />

x=[1 1 ; 2 2 ;3 3.5]<br />

y = [2.5 2 ; 2 1.5; 1.5 1]<br />

line(x’,y’)<br />

Kommandot line kan användas för att rita felstaplar i x- och y-led:<br />

x = [1.2 3.4 7.9];<br />

y = [4.9 5.2 6.6];<br />

deltax = 0.2*ones(1,3); deltay= 0.08 * y; plot(x,y,’ob’)<br />

axis([min(x)-0.5 max(x)+0.5 ...<br />

min(y)-0.5 max(y)+0.5]);<br />

%frilägger punkterna<br />

hold on<br />

% plotta först felet i x-led<br />

xline(1,1) = x(1)-deltax(1);<br />

xline(2,1) = x(1)+deltax(1);<br />

yline(1,1) = y(1);<br />

yline(2,1) = y(1);<br />

xline(1,2) = x(2)-deltax(2);<br />

xline(2,2) = x(2)+deltax(2);<br />

yline(1,2) = y(2);<br />

yline(2,2) = y(2);<br />

xline(1,3) = x(3)-deltax(3);<br />

xline(2,3) = x(3)+deltax(3);<br />

yline(1,3) = y(3);<br />

yline(2,3) = y(3);<br />

line(xline, yline)<br />

hold off<br />

Konstruktionen<br />

xline(1,1) = x(1)-deltax(1);<br />

xline(2,1) = x(1)+deltax(1);<br />

yline(1,1) = y(1); yline(2,1) = y(1);<br />

tillsammans med användandet av matriser i line-kommandot gör det enkelt att generalisera<br />

tilldelningen av värden till en slinga. Använder vi en s˚adan behöver vi inte upprepa koden


72 KAPITEL 6. 2D-GRAFIK<br />

för varje punkt utan kan istället skriva:<br />

for i=1:max<br />

xline(1,i) = x(i)-deltax(i);<br />

xline(2,i) = x(i)+deltax(i);<br />

yline(1,i) = y(i);<br />

yline(2,i) = y(i);<br />

end<br />

I slingan (koden mellan for... och ...end) kommer alla värden mellan 1 och max att användas.<br />

Har vi organiserat v˚ara data i vektorer s˚a kan vi allts˚a spara in mycket kod genom att använda<br />

en slinga istället för att upprepa denna kodsekvens en g˚ang för varje värde p˚a i. Genom att<br />

ha felen i vektorer som har samma dimension som vektorn som h˚aller mätpunkterna kan<br />

man ocks˚a enkelt behandla fel som är olika stora i de olika punkterna.<br />

Pröva nu att introducera koden för att rita felstaplar i y-led. Vill man finlira s˚a kan man<br />

ocks˚a definiera en variabel epsilon som sätts till ett s˚adant värde att felstrecken inte g˚ar<br />

igenom ringen kring data punkten utan stannar vid ringen. Varje felstapel f˚ar d˚a ritas som<br />

tv˚a separata streck, det vänstra mellan (x - deltax) och (x-epsilon), det högra mellan (x +<br />

epsilon) och (x + deltax).<br />

6.9 Logaritm-skalor<br />

För att plotta med logskalor p˚a en eller bägge axlar finns tre kommandon att tillg˚a: semilogy,<br />

semilogx och loglog som fungerar exakt som plot kommandot bortsett fr˚an att logaritmisk<br />

skala (bas 10) används för x-axeln, y-axeln och bägge axlarna.


6.10.<br />

ÖVNINGSUPPGIFTER 73<br />

6.10 Övningsuppgifter<br />

1. (Uppgift 5.4 ur Taylor) A student makes 20 measurements of the time for a ball bearing<br />

to fall from the top to the bottom of a vertical cylinder of oil. She arranges her results<br />

in increasing order and counts how many times she got each different value, as follows<br />

(with the times in tenths of a second):<br />

Time, t: 71 72 73 74 75 76 77 78 79 80<br />

Occurences 2 0 3 5 4 1 3 1 0 1<br />

a) Draw a bin histogram of these results using bins of width 1, starting at 70.5. (Notice<br />

that, with bins of width 1, this bin histogram gives essentially the same result as a bar<br />

histogram.)<br />

b) Redraw the histogram with a bin width of 2, again starting at 70.5.<br />

c) Notice how the wider bins in part b) give a smoother histogram. If the chosen bins<br />

are too wide, however, information starts to be lost. To illustrate this loss, redraw the<br />

histogram with a bin width of 10, again starting at 70.5.<br />

2. Betrakta följande polynom av stigande grad:<br />

x<br />

x - x 3 /3!<br />

x - x 3 /3! + x 5 /5!<br />

x - x 3 /3! + x 5 /5! - x 7 /7!<br />

x - x 3 /3! + x 5 /5! - x 7 /7! + x 9 /9!<br />

Plotta dessa polynom i en och samma graf tillsammans med funktionen sin(x). Ta med<br />

cirka en period av sinus i x-led. H˚all reda p˚a vilken kurva som hör till vilken funktion<br />

genom att t ex plotta dem med olika färger eller symboler. Vad är det som sker och<br />

varför? Ta en liten funderare!


74 KAPITEL 6. 2D-GRAFIK


Kapitel 7<br />

Gränssnitt, text-strängar,<br />

beräkningar och anpassningar<br />

7.1 MATLABs Workspace Browser<br />

En MATLAB-session resulterar oftast i en workspace fylld av temporära variabler som det<br />

till slut kan bli ganska besvärligt att h˚alla reda<br />

p˚a. MATLAB har ett<br />

verktyg -Workspace<br />

Browser - som enkelt<br />

ger en god överblick av<br />

vilka variabler som finns<br />

i workspace, vilka värden<br />

de har för tillfället och<br />

som dessutom ger oss<br />

möjlighet att manipulera<br />

dessa variabler.<br />

Vi startar Workspace<br />

Browser antingen genom<br />

att skriva workspace i<br />

kommandofönstret, eller<br />

genom att g˚a in i meny<br />

”View” i MATLABs desktop och klicka för ”workspace” som d˚a kommer upp som en pann˚a i<br />

desktopen. Workspace Browsern öppnar d˚a sitt fönster där vi kan se alla variabler som finns<br />

i MATLABs workspace, vi ser namnet p˚a variabeln, vilka dimensioner (rad × kolumn) den<br />

har och vilken typ av variabel det är. Om man tycker att n˚agon av dessa kolumner är helt<br />

ointressant kan man i menyn ”Workspace View Options” under ”View” styra utseendet av<br />

detta fönster. En ändring som kan vara bra är att lägga till den kolumn som visar vilken<br />

dimension matriser har, det gör du genom att under “View” välja “Choose columns” och<br />

lägga till den kolumnen. I work space browsern kan vi utföra ett antal operationer:<br />

Spara workspace eller variabler.<br />

Om vi trycker p˚a ”spara-ikonen”, den som ser ut som en liten diskett s˚a sparas hela inneh˚allet<br />

i workspace i en fil som vi senare kan läsa in. Alternativt kan vi i ”File” menyn välja ”Save<br />

As”. Detta sätt att spara är nödvändigt om vi redan har sparat workspace men vill spara<br />

en annan kopia under annat namn. Trycker vi p˚a ikonen används det gamla namnet om<br />

det är definierat, och den gamla versionen skrivs över. Vi kan ocks˚a välja att spara enskilda<br />

variabler. För att göra detta väljer vi variablerna genom att klicka p˚a dem i browserfönstret<br />

75


76KAPITEL 7. GRÄNSSNITT, TEXT-STRÄNGAR,BERÄKNINGAR OCH ANPASSNINGAR<br />

Vill du välja mer än en och dessa följer efter varandra i listan s˚a klickar du först p˚a den första<br />

och sedan klickar du p˚a den sista variabeln samtidigt som du h˚aller nere skift-tangenten. D˚a<br />

väljs alla variabler mellan den första och sista. Vill du välja ett antal variabler som inte ligger<br />

bredvid varandra i listan s˚a h˚aller du nere kontroll-tangenten samtidigt som du klickar. När<br />

du valt alla variabler du vill spara s˚a ”högerklickar” (klickar med den högra musknappen)<br />

n˚agonstans i det markerade omr˚adet. I den menyn som d˚a kommer upp väljer du ”Save as”<br />

och väljer sedan en katalog och filnamn där variablerna sparas.<br />

Läsa in variabler som tidigare sparats fr˚an en fil in i din workspace.<br />

Klicka antingen p˚a mapp-ikonen p˚a verktygslisten eller högerklicka i fönstret och välj ”Import<br />

Data”.<br />

Rensa bort variabler fr˚an workspace<br />

gör du genom att först välja dem p˚a samma sätt som när du vill spara variabler och sedan<br />

antingen<br />

• Klicka p˚a symbolen för “delete” i verktygslisten, den ser ut som ett gult rutmönster<br />

med ett rött “X”.<br />

• Välja ”Delete” i ”Edit” menyn.<br />

• Högerklicka i fönstret och sedan välja ”Delete Selection”.<br />

7.1.1 Array Editorn<br />

Vi kan g˚a in och studera en variabel i detalj genom att öppna ett fönster som kallas ”Array<br />

Editor”. Om du vill undersöka en enda variabel s˚a kan du öppna den i ”Array Editorn”<br />

genom att dubbelklicka p˚a den i ”Workspace Browser”-fönstret. Vill du arbeta med fler än<br />

en variabel f˚ar du i tur och ordning dubbelklicka p˚a alla variabler du vill studera. Längst<br />

ned i “Array Editor”-fönstret dyker det upp en flik för varje variabel som är vald. Du kan<br />

ocks˚a välja att dela upp editorns fönster i fler sm˚a fönster s˚a att du samtidigt kan titta<br />

p˚a mer än en variabel. Det gör du genom att klicka p˚a symbolerna längst upp till höger i<br />

fönstret - prova! I fönstret som öppnas kan du se vilket värde varje element i variabeln har.<br />

Du kan ocks˚a g˚a in och ändra enstaka värden. Det gör du genom att klicka i motsvarande<br />

ruta, skriva in det nya värdet och trycka p˚a ”Return”. Du kan ocks˚a ändra variabelns<br />

dimensioner (rad × kolumn) genom att lägga till nya värden i celler som finns i andra<br />

rader eller kolumner n de som ursprungligen finns med. Du kan ocks˚a ändra med vilken<br />

numerisk precision värdena visas. Mer information om möjligheterna i detta fönster f˚ar<br />

du i hjälpavsnittet ?/MATLAB/Getting Started/Desktop Tools and Development<br />

Environment/Workspace Browser and Array Editor/Array Editor.<br />

7.1.2 Anpassa MATLABs Desktop<br />

Vartefter vi börjar använda fler och fler av MATLABs fönster s˚a kan vi vilja ställa in<br />

MATLABs desktop s˚a att vad vi ser p˚a skärmen är det vi tycker är mest bekvämt att<br />

jobba med. Vilka fönster som skall finnas öppna väljer vi i menyn ”Desktop”, de fönster<br />

som är förbockade i nedre delen av menyn kommer att öppnas. Storleken p˚a desktop, eller<br />

andra fönster, kan vi reglera genom att peka p˚a fönstrets nedre högra hörn, det omr˚ade<br />

som är räfflat. Om vi trycker ned musknappen där och h˚aller den nedtryckt medan vi drar<br />

musen s˚a kommer fönstrets storlek att ändras, det hörn vi klickat p˚a ”följer med” medan det<br />

motst˚aende hörnet ligger still. Vi kan sedan växla mellan denna storlek och full skärm genom


7.2. TEXT-STRÄNGAR 77<br />

att trycka p˚a den mittersta av det tre symbolerna som finns längst upp till höger. Trycker<br />

du p˚a den vänstra av de tre symbolerna s˚a förminskas fönstret till en liten ikon längst ned p˚a<br />

skärmen. Du kan genom att klicka p˚a ikonen f˚a upp fönstret igen. Klickar du p˚a symbolen<br />

längst till höger som ser ut som ett kryss s˚a stängs fönstret. Förutom ett kryss för själva<br />

desktop s˚a finns det ett kryss för varje fönster i desktop, du kan allts˚a välja om du skall<br />

stänga hela desktopen eller ett enskilt fönster i denna.<br />

Om du vill ändra p˚a den relativa storleken p˚a de olika pann˚aer som visas i MATLABs desktop<br />

s˚a g˚ar det att göra genom att föra pekaren till gränsen mellan de olika pann˚aerna och trycka<br />

ned musknappen. Pekaren förvandlas d˚a till en dubbelpil. Om du d˚a drar pekaren s˚a följer<br />

gränsen mellan pann˚aer med, du kan p˚a s˚a sätt göra en del av MATLABs desktop större p˚a<br />

bekostnad av andra pann˚aer. P˚a samma sätt kan man ändra bredden av enskilda kolumner,<br />

t ex i workspace fönstret<br />

Det g˚ar att flytta runt de olika fönstren inom MATLABs desktop. Det gör man genom<br />

att klicka p˚a ett fönsters titel-list (högst upp) och h˚alla musknappen nedtryckt. Om du<br />

nu flyttar pekaren s˚a kommer en ram runt fönstret att röra sig med pekaren, och när den<br />

kommer till ett ställe i desktop där den kan förankras s˚a kommer den att ”snäppa till”.<br />

Om du d˚a släpper upp musknappen s˚a har fönstret flyttat till den nya platsen. Prova!<br />

Ett fönster som ligger i desktopen (är ”dockat”) kan flyttas ut fr˚an denna till att<br />

bli ett fritt fönster, som s˚a ofta s˚a finns det fler sätt att göra detta p˚a, du kan<br />

antingen klicka p˚a pil-symbolen som syns här till höger, du kan ocks˚a dra fönstret som när<br />

du vill flytta det inom desktopen, men inte släppa musknappen förrän fönstret är utanför<br />

desktopen. Slutligen kan du, om fönstret är det aktiva, g˚a in i ”Desktop” menyn och välja<br />

”Undock”. Vill man istället ”docka” ett fönster som flyter fritt till MATLABs desktop gör<br />

man det fönstret aktivt och väljer sedan ”Dock” i ”Desktop” menyn. Som vi redan sett<br />

exempel p˚a s˚a kan flera fönster dela samma del av MATLABs desktop, i det läget finns det<br />

sm˚a flikar med respektive fönsters namn p˚a i underkant av det fönster. Genom att klicka p˚a<br />

flikarna kan man växla mellan de fönster som delar p˚a den delpann˚an. Om man vill gruppera<br />

fönster inom desktop s˚a klickar man med musknappen p˚a ett av fönstrens titellister, drar den<br />

p˚a det andra fönstrets titellist och släpper musknappen när konturen överlappar och flikarna<br />

dyker upp i underkant. Det finns ett antal standardkonfigurationer för desktop, du kan välja<br />

bland dessa genom att g˚a in i ”Desktop” menyn och välja ”Desktop Layout”. Mer komplett<br />

information MATLABs desktop f˚ar du i ?/MATLAB/Getting Started/Desktop Tools<br />

and Development Environment/Desktop Overview/Arranging the Desktop<br />

7.2 Text-strängar<br />

Vi har hitills endast sett den enklaste formen av en text-sträng: a = ’Detta är en<br />

textsnutt’. Det finns m˚anga kommandon som kan användas för att omvandla numeriska<br />

variabler till strängar och utföra andra operationer p˚a strängvariabler. Här kommer vi<br />

bara att g˚a in p˚a n˚agra f˚a av dessa som utför lite enklare manipulationer av strängar. I<br />

nästa avsnitt skall vi lära oss hur vi formaterar in- och utmatning, vill du lära dig mer om<br />

stränghantering kan du läsa hjälpavsnittet:<br />

?/MATLAB/Programming /Data Types/Characters and Strings i hjälpavsnittet.<br />

7.2.1 Manipulera textsträngar<br />

Det är möjligt att lägga ihop tv˚a text-strängar till en längre sträng, men kanske inte riktigt<br />

som man först kan tro. Tag till exempel a = ’detta är ’ och b = ’en textsträng’. Lägger<br />

vi dem bredvid varandra som i kommandot c = ’detta är ”en textsträng’ (inget mellanslag<br />

mellan ) händer n˚agot intressant, prova! Det här illustrerar en annan sak vi kan behöva tänka<br />

p˚a: eftersom enkelt citationstecken utgör start- och sluttecken för en sträng s˚a m˚aste vi göra


78KAPITEL 7. GRÄNSSNITT, TEXT-STRÄNGAR,BERÄKNINGAR OCH ANPASSNINGAR<br />

n˚agot särskilt för att kunna skriva ut det tecknet i en text-sträng. Detta ”n˚agot särskilt”<br />

är att vi skriver tv˚a tecken efter varandra. Prova att skriva ut strängen ’För att skriva ut<br />

” m˚aste man dubblera’. För att kunna sätta ihop tv˚a strängar till en längre sträng, n˚agot<br />

som kallas att konkatenera (engelska concatenate) m˚aste vi använda en syntax där det p˚a<br />

n˚agot sätt framg˚ar att de tv˚a citationstecknen som följer p˚a varandra inte betyder att vi vill<br />

skriva ut det tecknet, det gör vi genom att omsluta de strängar som skall läggas ihop med<br />

hakparenteser: c = [’detta är ’ ’en textsträng’] (med mellanslag mellan de bägge<br />

strängarna!) fungerar, liksom c = [a b].<br />

7.2.2 Delsträngar<br />

Vad vi inte berörde tidigare var att internt s˚a lagras varje text-sträng som en vektor p˚a vilken<br />

vi kan operera med som vi gör med numeriska vektorer 1 vi kan p˚a vanligt sätt adressera delar<br />

av dem:<br />

≫a = ’Detta är en textsnutt’<br />

a =<br />

Detta är en textsnutt<br />

≫length(a)<br />

ans =<br />

21<br />

≫a(7:11)<br />

ans =<br />

är en<br />

En nyttig funktion när vi manipulerar delsträngar är k=findstr(S1,S2). Detta kommandot<br />

söker efter den kortare av strängarna S1 och S2 i den längre och returnerar en vektor k som<br />

inneh˚aller index för alla förekomster av den kortare strängen. Antag att S = ’En ensam<br />

enhörning’ s˚a ger kommandot k = findstr(’en’,S) resultatet 4 10. Notera att 1 inte ing˚ar<br />

i svaret, findstr är känslig för versal/gemen (detta kallas p˚a engelska case sensitive). I<br />

följande exempel anväder vi findstr för att hitta ett filnamn i en textsträng. Vi vet att<br />

filnamnet kommer efter ordet ”namnet” och avslutas med ”.m”<br />

≫a=’Den angivna filen har namnet resistor4.m, vilket är sökbart’;<br />

≫hitta1=findstr(a,’namnet ’);<br />

≫hitta2=findstr(a,’.m’);<br />

≫filnamn=a((hitta1+length(’namnet ’)):(hitta2+1))<br />

filnamn =<br />

resistor4.m<br />

Att hitta filnamnet i en sträng som skrivs in för hand i programmet är väl inte s˚a intressant<br />

men metoden i exemplet kan användas för att leta reda p˚a till exempel ett filnamn som kan<br />

ha getts i en inmatningsrad fr˚an en användare. Detta namn kan sedan användas när vi i en<br />

m-fil sparar data till h˚arddisken<br />

7.3 Enkel statistik<br />

MATLAB är i allmänhet mycket bra p˚a att hantera matriser och vektorer. Det lönar sig att<br />

försöka att konsekvent utnyttja det när vi behandlar data. Antag till exempel att vi gjort<br />

en serie mätningar (3.6, 5.4, 2.8, 8.3, 3.7, 4.2, 6.1, 4.1, 3.8, 2.3) och vill beräkna medelvärde<br />

och standardavvikelse för dessa. Vi kan d˚a naturligtvis göra detta genom att tilldela 10 olika<br />

variabler dessa värden: x1 = 3.6, x2=5.4, x3=8.3 ..... och sedan beräkna < x > = (x1 + x2<br />

1 I sjäva verket lagras text-strängen som en numerisk vektor - varje tecken som finns p˚a tangentbordet har<br />

en standardiserad numeriska kod - ASCII kod, a=97, A=65. Functionen abs(’sträng’) ger ASCII koden för<br />

strängen om du är nyfiken.


7.4. POLYNOM 79<br />

+ x3 +.....+x10)/10, och sedan fortsätta p˚a motsvarande sätt för standardavvikelsen. Men<br />

det är mycket enklare att istället fylla en vektor med mätdata och sedan operera p˚a vektorn:<br />

≫medel = sum(x)/length(x)<br />

≫diff = x - medel<br />

≫diff2 = diff.∧2<br />

≫sigma = sqrt(sum(diff2)/(length(x)-1))<br />

Ännu enklare är givetvis att använda de inbyggda funktionerna mean(x) och std(x), men<br />

innan ni gör det m˚aste ni en g˚ang ha kodat detta för hand!<br />

7.4 Polynom<br />

MATLAB har n˚agra inbyggda funktioner för att hantera polynom, för en fullständig beskrivning<br />

hänvisas du till ?/MATLAB/Functions – Categorical List/Mathematics/Polynomials.<br />

Vi g˚ar här igenom n˚agra av de viktigaste funktionerna.<br />

7.4.1 Hitta rötter till polynom.<br />

Givet ett polynom som till exempel y = 3x 3 − 7x + 4, s˚a beräknas rötterna (nollställena) till<br />

polynomet med funktonen roots(p) där p är en vektor med koefficienterna för varje term i<br />

fallande ordning. Notera att om n˚agon koefficient är noll s˚a m˚aste detta explicit anges med<br />

en nolla p˚a rätt ställe i vektorn p.<br />

≫ p = [3 0 -7 4];<br />

≫ roots(p)<br />

ans =<br />

1.7583<br />

1.0000<br />

0.7583<br />

7.4.2 Finn polynomuttryck för givna rötter<br />

Om vi omvänt har ett antal nollställen i en vektor n s˚a ger oss funktionen poly(n) det polynom<br />

som har dessa rötter:<br />

≫ n =[-2 1 4 7];<br />

≫ poly(n)<br />

ans =<br />

1 -10 15 50 -56<br />

vilket allts˚a uttyds som polynomet x 4 − 10x 3 + 15x 2 + 50x − 56.<br />

7.4.3 Värden p˚a polynom<br />

Värdet för ett polynom med koefficientvektor p i punkten x ges av polyval(p,x):<br />

≫m =[3 -2 4 1];<br />

≫polyval(m,4.2)<br />

ans =<br />

204.7840<br />

Allts f(4.2) = 204.7840 om f(x) = 3x 3 − 2x 2 + 4x + 1


80KAPITEL 7. GRÄNSSNITT, TEXT-STRÄNGAR,BERÄKNINGAR OCH ANPASSNINGAR<br />

7.4.4 Derivator av polynom<br />

Att derivera ett polynom är naturligtvis inte särskilt sv˚art att göra utan MATLABs hjälp.<br />

Det kan dock ibland när man skriver generella program vara behändigt att ha en funktion<br />

till hands för detta, i MATLAB heter den polyder(n).<br />

7.4.5 Produkter och kvoter av polynom<br />

MATLAB beräknar produkter av tv˚a polynom med funktionen conv(a,b), samt kvoten<br />

mellan tv˚a polynom med funktionen deconv(a,b). För mer information använder du<br />

hjälpfunktionen.<br />

7.5 Matrisekvationer<br />

Vi har m˚anga g˚anger i detta <strong>kompendium</strong> tjatat om hur bra MATLAB är för matrisberäkningar.<br />

Nu skall vi titta litet närmare p˚a detta fält. Vi börjar med n˚agra enkla exempel.<br />

Inversen A−1 till matrisen A är en matris s˚a att A−1 · A =<br />

1. I linjär algebra har vi lärt oss<br />

metoder för att beräkna inversen till matriser som A =<br />

kan slöa litet och istället använda sig av kommandot inv:<br />

≫format short<br />

≫A=[3 4 ;-2 1];<br />

≫B=inv(A)<br />

B =<br />

0.0909 -0.3636<br />

0.1818 0.2727<br />

≫B*A ans =<br />

1.0000 -0.0000<br />

-0.0000 1.0000<br />

3 4<br />

−2 1<br />

. MATLAB-användare<br />

Om ni provar ovanst˚aende beräkningar i formatet short g s˚a först˚ar ni varför jag valde att<br />

byta format: eftersom den numeriska precisionen hos datorn är begränsad till ett visst antal<br />

decimaler s˚a blir svaret oftast inte riktigt exakt 1 när man kontrollräknar. För att slippa veta<br />

att elementen 0.0000 skiljer sig fr˚an 0 i 17:e decimalen kan format short vara att föredra.<br />

M˚anga fysikaliska fenomen kan beskrivas av matematiska formler som lämpar sig för att<br />

beräknas i en matrisformalism genom att en matris som representerar en operation appliceras<br />

p˚a ett initialtillst˚and och resulterar i ett sluttillst˚and, vi kan skriva det som en matrismultiplikation:<br />

S = O · I. Vi kommer d˚a ofta att söka värden p˚a den operator O som resulterar<br />

i sluttillst˚andet S givet ett initialtillst˚and I. Det här kan l˚ata väldigt abstrakt, och m˚anga<br />

g˚anger är det väl ocks˚a p˚a det viset. Men beräkningsmässigt handlar det om att vi känner<br />

matrisen I och S (ofta kolumnvektorer) s˚a söker vi matrisen O som satisfierar ekvationen<br />

ovan. Detta problem löser vi genom att multiplicera med lämpliga inverser - fr˚an rätt h˚all:<br />

S · I −1 = O · I· I −1 = O.<br />

7.6 Minsta kvadratanpassning<br />

Om vi antar att en uppsättning mätpunkter (xi, yi) uppfyller sambandet y = a + bx s˚a kan<br />

vi med hjälp av maximum likelihood principen finna att den bästa (i meningen att summan<br />

av de kvadratiska avvikelserna minimieras) uppskattningen av parametrarna a och b ges av:<br />

<br />

wix<br />

a =<br />

2 <br />

i wiyi − <br />

wixi wixiyi<br />

∆<br />

och b =<br />

wi<br />

<br />

wixiyi − <br />

wixi wiyi<br />


7.6. MINSTA KVADRATANPASSNING 81<br />

där wi = 1<br />

σ 2 i<br />

och ∆ = <br />

wi wix 2 2 i − wixi<br />

Dessa ekvationer är relativt enkla att beräkna med hjälp av MATLAB. L˚at oss exemplifiera<br />

genom att lösa en variation p˚a uppgift 8.13 i Taylor, där vi skall anpassa mätdata givna i<br />

tabellen till uttrycket s = s0 + vt.<br />

Tid (s) -3 -1 1 3<br />

Position (cm) 4.0 7.5 10.3 12.0<br />

Osäkerhet i 0.5 0.6 0.7 1.1<br />

position (cm)<br />

Felet i tiden är negligerbart. För att utföra anpassningen m˚aste vi beräkna ett antal termer<br />

av typen wx vilket är relativt enkelt med MATLABs vektoroperationer och elementvisa<br />

operatorer. Summan är ju uppbyggd s˚a att först skall varje element i w multipliceras<br />

med motsvarande element i x, därefter skall dessa produkter summeras. Vektoroperationen<br />

wx = w .* x utför den första av dessa operationer och skapar en ny vektor där elementen<br />

är produkten av motsvarande element i w och x vektorerna. Vi kan sedan enkelt summera<br />

dessa genom att applicera vektoroperatorn sum p˚a denna vektor. Vi f˚ar allts˚a n˚agot i stil<br />

med<br />

% linfit.m<br />

% performs least squares fit to y=a+bx<br />

% Sten Hellman 2005-03-03<br />

%<br />

%<br />

clear all;<br />

tid = [-3 -1 1 3];<br />

position=[4.0 7.5 10.3 12.];<br />

DeltaPos = [0.5 0.6 0.7 1.1];<br />

x = tid;<br />

y = position;<br />

sigma = DeltaPos;<br />

w = 1./sigma.∧2;<br />

xy = x.*y;<br />

x2 = x.∧2;<br />

wx = w.*x;<br />

wy = w.*y;<br />

wx2 = w.*x2;<br />

wxy = w.*xy;<br />

sumw = sum(w);<br />

sumwx = sum(wx);<br />

sumwy = sum(wy);<br />

sumwxy = sum(wxy);<br />

sumwx2 = sum(wx2);<br />

delta=sumw * sumwx2 - sumwx∧2;<br />

a = (sumwx2 * sumwy - sumwx * sumwxy) / delta;<br />

b = (sumw * sumwxy - sumwx * sumwy) / delta;<br />

Man kan givetvis hoppa över steget där vi g˚ar ifr˚an t.ex. ”tid” till ”x”, jag har valt att ha<br />

med det steget för att göra det hela tydligare. Vi kommer senare se hur vi skall skriva den<br />

del av koden som gör själva anpassningen som en allmän funktion som i stort sett ser ut som


82KAPITEL 7. GRÄNSSNITT, TEXT-STRÄNGAR,BERÄKNINGAR OCH ANPASSNINGAR<br />

den del av koden som kommer efter de kommandon där vi byter variabelnamn. Det blir d˚a<br />

naturligt att funktionen internt arbetar med variablerna x,y,w, och att den m-fil som kallar<br />

funktionen använder de variabelnamn som är de som används i problemformuleringen.<br />

Eftersom det hela finns sparat i en m-fil kan vi enkelt verifiera att vi reproducerar de resultat<br />

som anges i facit i Taylor om vi sätter alla vikter till 1, dvs sätter alla fel till 1.<br />

När vi änd˚a är ig˚ang är det lämpligt att plotta den kurva vi f˚ar ur anpassningen och data i<br />

samma graf:<br />

xmin = min(x) -1;<br />

xmax = max(x) +1;<br />

xfit = xmin:xmax;<br />

yfit = a + b * xfit;<br />

plot(xfit, yfit, ’b-’);<br />

hold on;<br />

current = axis;<br />

delta = 0.5;<br />

new = [current(1)-delta current(2)+delta current(3)-delta current(4)+delta];<br />

axis(new);<br />

errorbar(x, y, sigma, ’or’);<br />

hold off<br />

Den här delen av koden är skriven s˚a att vi f˚ar en graf med en linje som är lagom l˚ang för att<br />

omfatta de mätta punkterna och med lagom med luft mellan data och kanten av grafen utan<br />

att vi gör n˚agra antaganden om vare sig vilka värden mätdata antar eller om hur m˚anga<br />

punkter som är mätta. Det är en god vana att försöka skriva sin kod p˚a det viset. Just<br />

anpassning till en rät linje är ju ett exempel p˚a en uppgift som vi skall lösa m˚anga g˚anger<br />

i olika sammanhang. Det är därför bra att ha en m-fil som löser den uppgiften under s˚a<br />

allmänna förutsättningar som möjligt.<br />

7.7 Minsta kvadratanpassning med matrismetod<br />

En minsta kvadratanpassning av mätdata till ett andragradspolynom y = a + bx + cx 2<br />

kan göras om vi formulerar sambandet mellan variabelvärden xi, mätta värden yi som en<br />

matrisoperation Y = X·A:<br />

⎛ ⎞<br />

y1<br />

⎜ ⎟<br />

⎜ y2 ⎟<br />

⎜ ⎟<br />

⎜ y3 ⎟<br />

⎝ ⎠<br />

.<br />

=<br />

⎛<br />

⎜<br />

⎝<br />

.<br />

Vi definierar dessutom en viktmatris:<br />

⎛<br />

V −1 ⎜<br />

= ⎜<br />

⎝<br />

1 x1 x 2 1<br />

1 x2 x 2 2<br />

1 x3 x 2 3<br />

1<br />

σ 2 1<br />

0<br />

.<br />

.<br />

0 0 1 σ 2 3<br />

.<br />

⎞<br />

⎟<br />

⎠ •<br />

⎛<br />

⎜<br />

⎝<br />

a<br />

b<br />

c<br />

⎞<br />

0 0 · · ·<br />

⎟<br />

1<br />

σ2 0 · · ·<br />

⎟<br />

2<br />

⎟<br />

· · · ⎟<br />

⎠<br />

.<br />

. . ..<br />

Minstakvadratmetoden ger d˚a en uppskattning av parametervektorn som ges av<br />

A=(X T V −1 X) −1 · (X T V −1 Y), vi f˚ar även en uppskattning av felen i parametervärdena<br />

som ges av A=(X T V −1 X) −1 . Antag till exempel att vi med försumbart fel i x har mätt<br />

följande y-värden<br />

⎞<br />

⎟<br />


7.7. MINSTA KVADRATANPASSNING MED MATRISMETOD 83<br />

x 1 2 3 4 5 6<br />

y 7.9 26.1 58.0 104.0 164.1 238.0<br />

samt att felet i y-mätningen är 0.1. För att finna det anpassade värdet p˚a koefficienterna<br />

sätter vi in v˚ara värden i matrisformalismen och beräknar enligt receptet ovan. Vi har<br />

⎛<br />

⎜<br />

Y = ⎜<br />

⎝<br />

7.9<br />

26.1<br />

58.0<br />

104.0<br />

164.1<br />

238.0<br />

⎞<br />

⎛<br />

⎟ ⎜<br />

⎟ ⎜<br />

⎟ ⎜<br />

⎟ ⎜<br />

⎟ , X = ⎜<br />

⎟ ⎜<br />

⎟ ⎜<br />

⎠ ⎝<br />

kodat i MATLAB blir detta:<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

⎞<br />

⎛<br />

⎟ , V<br />

⎟<br />

⎠<br />

−1 ⎜<br />

= ⎜<br />

⎝<br />

x=[1 ; 2 ; 3 ; 4 ; 5; 6];<br />

y=[7.9 ; 26.1 ; 58.0 ; 104.0 ; 164.1 ; 238.0];<br />

X=[ones(6,1) x x.∧2];<br />

sigma = 0.1 ;<br />

vminus1 = eye(6) * 1/sigma∧2 ;<br />

A=inv(X’ * vminus1 * X) * (X’ * vminus1 * y)<br />

DeltaA=inv(X’ * vminus1 * X)<br />

Deltapar=sqrt(diag(DeltaA));<br />

100 0 0 0 0 0<br />

0 100 0 0 0 0<br />

0 0 100 0 0 0<br />

0 0 0 100 0 0<br />

0 0 0 0 100 0<br />

0 0 0 0 0 100<br />

Det finns n˚agra teknikaliteter att begrunda i detta exempel. Först m˚aste vi tänka p˚a att inte<br />

frestas att inludera ett minustecken i namnet p˚a covariansmatrisen. MATLAB tolkar V-1<br />

som en instruktion att subtrahera V med enhetsmatrisen 1. Giltiga operatorer kan inte vara<br />

en del av variabelnamn! Sedan kan vi se hur vi i satsen där vi tilldelar värden till matrisen<br />

X har använt den genväg som MATLAB öppnar för oss och byggt en matris genom att<br />

kombinera kolumnvektorer. Eftersom vektorn x redan existerar s˚a är det mycket enklare att<br />

skapa kolumnvektorn med en rad ettor och kolumnvektorn med kvadraten p˚a elementen i x<br />

och sedan bygga matrisen fr˚an dem än att bygga en matris genom att placera ut elementen<br />

ett och ett.<br />

⎞<br />

⎟<br />


84KAPITEL 7. GRÄNSSNITT, TEXT-STRÄNGAR,BERÄKNINGAR OCH ANPASSNINGAR<br />

7.8 Övningsuppgifter<br />

1. Pröva att finna vilken matris som löser ekvationen S = O · I givet I =<br />

<br />

<br />

17 19<br />

S =<br />

.<br />

22 38.5<br />

2. Lös följande ekvationssystem:<br />

4x - 5y + 3z = 22<br />

x + 5y - 6z = -21<br />

3x + y + 4z = 17<br />

<br />

3 4<br />

−2 1<br />

Använd dig av att ekvationssystemet kan skrivas p˚a formen AX = B, där A är en känd<br />

matris, B en känd kolumnvektor, medan X är en okänd kolumnvektor vars komponenter<br />

x, y och z sökes.<br />

3. Komplettera m-filen som visas i avsnitt 7.6 s˚a att även felen i de anpassade parametrarna<br />

a och b beräknas som i problem 8.19 i Taylor.<br />

<br />

och


Kapitel 8<br />

Programmering<br />

De m-filer som ni skapat tidigare under kursen är exempel p˚a sm˚a datorprogram. De har<br />

varit väldigt arbetsbesparande, kanske mest för att det har varit s˚a enkelt att ändra n˚agon<br />

liten detalj i en l˚ang beräkning utan att behöva göra om hela arbetet. Nu skall vi ta den<br />

processen ett steg längre. Den stora arbetsbesparingen 1 när man använder datorprogram<br />

kommer dels av att man kan f˚a en dator att utföra monotona uppgifter utan att behöva<br />

skriva ett kommando för varje uppgift som skall utföras, som när man använder en for-slinga<br />

för att upprepa samma kommando flera g˚anger med olika värden p˚a en variabel. Den andra<br />

stora besparingen kommer när man vänjer sig att skriva generella programsnuttar, som till<br />

exempel för att beräkna normalfördelningen, som sedan kan användas som delprogram av<br />

andra program. I det här passet skall vi g˚a igenom vad man behöver tänka p˚a för att skriva<br />

bra program, och de viktigaste kommandon som vi kommer att behöva.<br />

8.1 Att programmera<br />

Att programmera är en konst man behöver lära sig. Hur man bäst skall göra det är<br />

naturligtvis väldigt individuellt, men de allra flesta kommer ganska l˚angt med att träna<br />

genom att skriva de program man för stunden har behov av. Men det finns ocks˚a en omfattande<br />

litteratur och teoribildning om hur bra datorprogram skall vara konstruerade. Man<br />

skall vara medveten om att kunskap om att programmera och kunskap om ett programmeringsspr˚ak<br />

inte behöver vara samma sak. Man m˚aste självklart kunna MATLAB-spr˚aket<br />

ordentligt för att kunna skriva bra MATLAB-program, men det är inte tillräckligt. Omvänt<br />

kan man p˚a en abstrakt niv˚a designa ett program utan att veta ett dyft om det programmeringsspr˚ak<br />

programmet sedan implementeras i. Den här kursen har en praktiskt/pragmatisk<br />

inriktning, vi kommer inte att g˚a in p˚a teorin kring programmerandet utan försöker lära<br />

genom exempel. Vi skall dock i detta kapitel ta upp vissa saker som är bra att försöka att<br />

h˚alla i huvudet när vi börjar skriva program. För att exemplifiera de olika elementen skall<br />

vi skriva en allmän rutin som beräknar primfaktorer för ett givet tal.<br />

8.1.1 Design av programmet<br />

Den viktigaste delen av programmerandet börjar egentligen innan vi skrivit ett enda MATLABkommando,<br />

nämligen design-fasen. Innan vi börjar skriva in en massa MATLAB kommandon<br />

bör man sitta ned och tänka igenom vilka steg programmet skall utföra, i vilken ordning och<br />

vad som är de möjliga utfallen under det att programmet kör. Nuförtiden finns det program<br />

1 Kom ih˚ag att arbetsbesparingen i m˚anga fall kan vara s˚a stor att den förvandlar n˚agonting som varit<br />

fullständigt omöjligt att göra till n˚agot som g˚ar att genomföra. Det är allts˚a inte bara fr˚agan om att göra<br />

samma saker snabbare och lättare, man kan göra helt nya saker ocks˚a!<br />

85


86 KAPITEL 8. PROGRAMMERING<br />

som hjälper till i den här fasen och som ibland till och med skriver programkoden automatiskt<br />

när man väl en g˚ang p˚a ett symboliskt sätt bestämt vad programmet skall utföra. Men<br />

man kommer ganska l˚angt med ett gammalt hederligt flödesschema, en slags ”ritning” över<br />

programmet. Det finns väl definierade regler för hur man skall rita ett flödesschema, här<br />

skall vi inte g˚a in i n˚agra detaljer 2 utan följer bara konventionen att beslut fattas i rombiska<br />

boxar, medan processer sker i vanliga rektanglar. Som exempel visar vi ett flödesschema för<br />

ett program som beräknar primfaktorer för ett godtyckligt tal:<br />

Bara genom att göra en s˚adan här enkel liten skiss dyker det upp m˚anga viktiga aspekter<br />

av programmet som man kanske inte tänker p˚a fr˚an början, som till exempel att vi m˚aste<br />

avdela en variabel för att lagra de primfaktorer som poppar upp. Vi ser ocks˚a tydligt vilka<br />

data som skall in i programmet (x, det tal vi söker faktorer för) och vad som skall ut (antal<br />

primfaktorer och vilka de är). Vi ser ocks˚a att en viss del av koden kommer att upprepas ett<br />

stort antal g˚anger för olika värden p˚a variabeln i.<br />

Studerar man schemat en stund till inser man att programmet, som det är designat i figuren,<br />

kommer att testa alla faktorer udda som jämna vilket naturligtvis inte är nödvändigt eftersom<br />

den enda möjliga jämna faktorn är tv˚a. Det är d˚a dags för steg 2: omdesign. I det här fallet<br />

väljer man lämpligen att först testa p˚a faktorn tv˚a tills man har ett udda tal kvar, och sedan<br />

testa fr˚an 3 och upp˚at med alla udda tal (byt i = i + 1 mot i = i + 2).<br />

Ett bra flödesschema skall bryta ned programmet i avskilda block som utför en specifik<br />

uppgift, visa vilka grenpunkter (villkor) som finns i programmet och hur dessa leder till att<br />

olika delar av koden utförs. Vidare skall vilka data som utbyts mellan programmet och dess<br />

omgivning - det s˚a kallade gränssnittet - vara tydligt.<br />

2 I Microsoft Words ritverktyg finns under ”Figurer” en sub-meny som inneh˚aller olika symboler för ett<br />

flödesschema.


8.2. FORMATERAD IN- OCH UTMATNING 87<br />

8.1.2 Dokumentation av programmet.<br />

Vi har tidigare berört vikten av att dokumentera program med kommentarer i koden. För<br />

stora program räcker inte detta sätt att dokumentera vad programmet gör, och vilket dess<br />

gränssnitt mot omvärlden är. Om programmet börjar omfatta tusentals rader med kod är<br />

det inte praktiskt att bläddra igenom koden p˚a jakt efter kommentarer som avslöjar allt om<br />

programmet. I s˚adana fall bör man producera en separat dokumentation som talar om hur<br />

man använder programmet, vad programmet utför och vad som krävs för att programmet<br />

skall kunna köra (till exempel vilka data som m˚aste matas in i programmet och i vilket<br />

format). Den här typen av dokumentation - Användarhandbok, engelska Users Guide - skall<br />

kunna läsas av n˚agon som inte har n˚agra egentliga kunskaper i det programmeringsspr˚ak<br />

som använts i det aktuella fallet. Däremot är det viktigt att dokumentera till exempel<br />

matematiska algoritmer som används av programmet om dessa har betydelse för hur man<br />

skall först˚a resultaten. Inom den här kursen är det knappast troligt att ni kommer att skriva<br />

s˚apass stora program att de behöver dokumenteras p˚a den här niv˚an, i allmänhet kommer<br />

kommentarer i koden att räcka till.<br />

Verkliga proffs l˚ater dokumentationen av programmet ing˚a i design-fasen, jag har själv sett<br />

exempel p˚a duktiga programmerare som först har utarbetat dokumentationen av programmet<br />

och diskuterat den med användarna av programmet i olika omg˚angar tills de varit nöjda, och<br />

först därefter börjat arbetet med att skriva programmet. Det är väl kanske onödigt att<br />

tillägga att de flesta av oss inte alls lever som vi lär utan sätter oss ned och försöker koda<br />

programmet rakt av och göra n˚agon slags ”design as you go”. Har man lite vana fungerar det<br />

ocks˚a, för det mesta, men vi skulle nog skriva bättre program, och f˚a dem klara lite tidigare<br />

om vi lade ned lite mer möda p˚a design och dokumentation.<br />

8.2 Formaterad in- och utmatning<br />

Hitills har vi inte haft n˚agot särskilt elegant sätt att kommunicera med v˚ara m-filer: vi<br />

har kunnat skicka variabler mellan kommandofönstret och m-filen genom att utnyttja att de<br />

använder samma workspace, och vi har kunnat använda kommandot disp för att skriva ut<br />

textsträngar i kommandofönstret. För att kunna skriva användbara program m˚aste vi ha en<br />

elegantare och flexiblare metod för att skicka information mellan de olika komponenterna.<br />

8.2.1 Läs data och strängar fr˚an kommandofönstret - kommandot input.<br />

För att mata in data och textsträngar i en m-fil kan vi använda kommandot input.<br />

Kommandot förekommer i tv˚a former beroende p˚a om vi vill läsa in en variabel: x =<br />

input(sträng), eller om vi vill läsa in en textsträng: text = (sträng,’s’). I bägge<br />

fallen är sträng en textsträng som skrivs ut i kommandofönstret för att göra oss uppmärksamma<br />

p˚a att programmet förväntar sig att vi skriver in n˚agot. En specialitet är att markören kommer<br />

att stanna omedelbart efter det att strängen skrivits ut, för att f˚a ett radbyte m˚aste vi<br />

inkludera specialtecknet \n i strängen. \n kallas en escape-sekvens, det finns fler s˚adana, de<br />

mest användbara är:<br />

\n radbyte<br />

\t tab: flyttar utskriftspunkten till nästa tabstopp, mycket användbart om man vill<br />

skriva ut en snygg tabell<br />

\b backar utskriftspunkten ett steg<br />

Om vi l˚ater v˚art program för primtalsfaktorer ha den litet hurtiga artighet som kännetecknar


88 KAPITEL 8. PROGRAMMERING<br />

en del moderna program skulle v˚art program kunna börja:<br />

namn=input(’Hej och välkommen till PRIMFAKT - \n Vad heter du? ’,’s’);<br />

out=[’Hej ’ namn’\n Mata nu in det tal du vill söka faktorer för\n’];<br />

x=input(out);<br />

för den fortsatta behandlingen finns nu det tal för vilket vi söker primfaktorer lagrat i variabeln<br />

x.<br />

8.2.2 Formatera strängar för utmatning - Formatkoder och kommandot<br />

sprintf<br />

När vi vill skriva ut ett resultat fr˚an en m-fil till kommandofönstret s˚a kan vi använda kommandot<br />

num2str(x) som omvandlar en siffra till motsvarande textsträng. Vi kan d˚a bygga<br />

upp en textsträng som vi sedan skriver ut i kommandofönstret med kommandot disp:<br />

out = [’Primfaktorerna är ’ num2str(f(1)) ’ och ’ num2str(f(2))] följt av<br />

disp(out);.<br />

Problemet med den konstruktionen är att vi m˚aste veta fr˚an början hur m˚anga tal vi vill<br />

skriva in i strängen. Ett mer flexibelt sätt att göra samma sak är att använda kommandot<br />

sprintf. Kommandot sprintf l˚ater oss skriva in text och variabler till en textsträng<br />

med användande av formateringsregler, vi kan sedan skriva ut strängen p˚a skärmen med<br />

användande av disp, precis som vanligt. Att beskriva hur formaterad utskrift g˚ar till kan<br />

bli väldigt abstrakt, s˚a l˚at oss börja med ett exempel och försöka först˚a det hela utifr˚an det<br />

exemplet. I kommandot<br />

y=2;<br />

x=3;<br />

string = sprintf(’Svaret är %f eller kanske %g ’,y ,x) skapar sprintf en textsträng<br />

som kallas string av den sträng som st˚ar till vänster om det första kommatecknet i<br />

parantesen. Men varje g˚ang en formatkod - ordet som inleds med % - förekommer s˚a ersättes<br />

formatkoden med en variabel hämtad efter det första kommatecknet. Antag att y = 2 och x<br />

= 3, strängen string blir d˚a lika med ” Svaret är 2.000000 eller kanske 3”. Men varför skrivs<br />

y ut med 6 decimaler och g utan decimaler? Det beror p˚a att formatkoden inte bara visar att<br />

man skall stoppa in värdet av en variabel p˚a den platsen i strängen, utan ocks˚a hur den skall<br />

formateras. %f säger att det tal som skall stoppas in är ett decimaltal, och om vi inte<br />

anger annat s˚a kommer det att skrivas med 6 decimaler. %g anger att talet skall skrivas ut<br />

p˚a ”lämpligt” sätt - om det är ett tal större än 10 −4 och mindre än 10 6 skrivs det ut som ett<br />

decimaltal, men utan efterföljande nollor. Ligger talet utanför det intervallet skrivs det som<br />

ett decimaltal g˚anger en exponent av tio. Vill man alltid ha det senare formatet kan man<br />

använda formatkoden %e. Prova till exempel följande (för att skriva ut ett procenttecken i<br />

en textsträng skriver man %%):<br />

y=2.17;<br />

x=34567.98765;<br />

string = sprintf(’x och y med formatet %%f %f %f ’,x,y)<br />

disp(string)<br />

string = sprintf(’x och y med formatet %%g %g %g ’,x,y)<br />

disp(string)<br />

string = sprintf(’x och y med formatet %%e %e %e ’,x,y)<br />

disp(string)<br />

Vi kan p˚averka b˚ade hur stor bredd sifferfältet skall uppta i textsträngen och hur m˚anga<br />

decimaler talet skall skrivas ut med. Det görs genom att skriva in siffror mellan procenttecknet<br />

och formatkoden. Den första siffran talar om vilken minsta bredd sifferfältet skall<br />

uppta, den andra siffran talar om hur m˚anga decimaler vi vill se utskrivna, mellan dessa<br />

siffror skrivs en punkt. S˚a betyder %7.3f att vi vill skriva ut ett decimaltal s˚a att totala


8.2. FORMATERAD IN- OCH UTMATNING 89<br />

bredden blir minst 7 tecken och att talet skall ha 3 decimaler. Prova<br />

y=2.17;<br />

x=34567.98765;<br />

string = sprintf(’x har värdet %7.3f och y har %7.3f med formatet %%7.3f ’,x,y);<br />

disp(string)<br />

för att se hur det fungerar. Lägg märke till dels att talet skrivs ut med större bredd än den<br />

minimibredd vi anger om detta är nödvändigt för att vi skall f˚a plats med hela talet inklusive<br />

det antal decimaler vi ber om, dels att om talet är kortare s˚a fylls det p˚a med blanktecken<br />

för att minimikravet p˚a bredd skall uppfyllas (vill vi att siffrorna skall st˚a till vänster i fältet<br />

skriver vi %-7.3f istället). Oftast vill man ju inte ha dessa blanka tecken inuti strängen utan<br />

skriver %0.3f för att ange antalet decimalsiffror, men ibland kan man vilja linjera upp siffror<br />

som skrivs ut i p˚a varandra följande rader, och d˚a kan en fix vidd vara användbar. Prova<br />

ocks˚a vad som händer om ni använder formaten<br />

string = sprintf(’x is%7.3g and y is %7.3g with format %%7.3g ’,x,y); och<br />

string = sprintf(’x is %7.3e and y is %7.3e with format %%7.3e ’,x,y);<br />

Utöver e, f och g s˚a finns det ett antal andra formatkoder. De som vi kan komma att behöva<br />

i den här kursen är c och s. %c anger att vi vill att en bokstav skall stoppas in, %s anger<br />

att vi vill stoppa in en hel sträng, oavsett hur l˚ang den är. Det som gör sprintf lämplig att<br />

använda för att skriva ut resultat när vi inte vet hur m˚anga variabler vi vill skriva ut är<br />

att om det finns fler variabler till höger om det första kommat inom parantesen efter sprintf<br />

s˚a börjar tolkningen om fr˚an början. Fel använt blir det inte särskilt snyggt, prova hur<br />

out=sprintf(’Resultatet är %g ’,x,y) ser ut. Istället f˚ar vi konstruera fler strängar,<br />

varav en bara best˚ar av det okända antalet variabler som vi vill skriva ut, för att sedan lägga<br />

ihop strängarna till en l˚ang sträng som vi lägger ut med hjälp av disp:<br />

x=1:7;<br />

out1=sprintf(’Resultatet är’);<br />

out2=sprintf(’ %g,’,x);<br />

out3=sprintf(’\b’);<br />

out=[out1 out2 out3];<br />

disp(out)<br />

Observera att strängen out2 inneh˚aller ett mellanslag. (Funderar du över poängen med<br />

strängen out3 s˚a prova utan! Det här är ett av ganska f˚a exemplen p˚a hur \b är användbar).<br />

Vi är nu mogna att koda den sista delen av v˚art program, där vi skriver ut primfaktorerna:<br />

out1=sprintf(’Talet %0.0f har %0.0f primfaktorer \n De är’, x, ... AntalFaktorer);<br />

out2=sprintf(’ %g,’,Faktor);<br />

out3=sprintf(’’ ¯ );<br />

out=[out1 out2 out3];<br />

disp(out)


90 KAPITEL 8. PROGRAMMERING<br />

8.3 Övningsuppgifter<br />

1. Samla ihop alla delarna av programmet för att beräkna primfaktorer till ett fungerande<br />

program.<br />

2. Skriv ett program som beräknar en approximation till e, basen för den naturliga logaritmen,<br />

fr˚an summan.<br />

∞ 1<br />

e =<br />

k!<br />

k=0<br />

L˚at programmet läsa in hur m˚anga termer som skall finnas med i summan, och skriv<br />

sedan i kommandofönstret ut hur m˚anga termer som summerats, och skillnaden mellan<br />

approximationen och exp(1), genom en lämpligt formaterad textsträng.<br />

3. Modifiera programmet s˚a att det istället fr˚agar efter hur liten liten mellan approximationen<br />

och exp(1) som eftersträvas och sedan beräknar hur m˚anga termer som behövs<br />

innan approximationen blir tillräckligt bra.


Kapitel 9<br />

Mer grafik och programmering<br />

9.1 Mer om 2D-grafik<br />

I detta avsnitt samlar vi n˚agra kommandon som kan användas för mer avancerad 2D-grafik.<br />

9.1.1 Avancerade kommandon för 2-D grafik<br />

Fler grafikfönster - kommandot figure<br />

Normalt ritas alla grafer i ett fönster som heter figure(1). Ibland när man till exempel<br />

analyserar resultaten fr˚an en laboration s˚a vill man köra igenom ett program som gör hela<br />

analysen och spara ett antal olika plottar. Detta kan man göra genom att ge kommandot<br />

figure(#) där # är ett tal. Alla plottar som ritas efter detta kommando kommer att ritas<br />

i ett grafikfönster som heter figure(#) ända tills vi ger ett nytt kommando med ett nytt<br />

fönsternamn.<br />

Fyllda polygoner - kommandot fill<br />

Vi kan rita en godtycklig polygon i en graf genom att ge kommandot fill(x, y, ’färg’).<br />

Argumentet till detta kommando är tv˚a vektorer x och y som inneh˚aller x- och y-koordinater<br />

för polygonens hörn, samt en kod för fyllningsfärg (se avsnitt 6.1.3). Ett vanligt användningsomr˚ade<br />

för detta kommando är när man vill lägga in ett färgat band som visar var data<br />

kan förväntas ligga, till exempel ett medelvärde plus-minus en standardavvikelse. Vill man<br />

använda fill tillsammans med data i samma graf kan man behöva tänka sig för litet, det<br />

är det senast utförda plot- eller ritkommandot som hamnar överst, vill vi att datapunkter<br />

skall synas m˚aste de allts˚a plottas ovanp˚a fill-arean, det kan därför ibland vara nödvändigt<br />

att plotta tv˚a g˚anger:<br />

clear all;<br />

gvalue =[9.400 9.770 9.900 10.400 9.940 9.300 9.710 8.430 9.450 9.620];<br />

clf<br />

figure(1)<br />

xvalues=1:length(gvalue)<br />

max = length(gvalue)<br />

boxx=[0 max max 0];<br />

boxy=[9.9 9.9 9.7 9.7];<br />

fill(boxx,boxy,’y’)<br />

hold on<br />

plot(xvalues, gvalue, ’b*’)<br />

hold off<br />

91


92 KAPITEL 9. MER GRAFIK OCH PROGRAMMERING<br />

Att läsa av koordinater i en graf - kommandot ginput.<br />

Ibland vill vi kunna läsa av koordinater för en punkt i en graf, antingen för att kunna<br />

identifiera vilken punkt i en l˚ang serie av data som är vilken, eller för att vi vill kunna rita<br />

ett element för hand med fill eller line till en viss punkt i en graf. Detta kan vi göra genom<br />

att ge kommandot [x,y] = ginput och sedan välja grafikfönstret. Vi ser d˚a att markören<br />

förvandlats till ett h˚arkors. Varje g˚ang vi klickar p˚a musknappen läggs koordinaterna för den<br />

punkt där markören befinner sig in i vektorerna x och y. Vi avslutar genom att trycka p˚a<br />

returtangenten.<br />

9.2 Att redigera en graf interaktivt<br />

I Matlab kan vi redigera grafer för hand direkt i det fönster där grafen ritas. Uppe i verktygslisten<br />

finns en knapp som ser ut som en pil riktad upp˚at ˚at vänster. Trycker man ner<br />

den kan man starta matlabs ”property editor”. Det finns tv˚a sätt att starta den - antingen<br />

dubbelklickar man (efter att ha tryckt p˚a pil-knappen) p˚a ramen kring grafiken för att<br />

redigera grafikfönstrets utseende eller ocks˚a dubbelklickar man n˚agonstans p˚a en graf för<br />

att redigera den grafens utseende. Här g˚ar vi bara igenom n˚agra av de mest användbara<br />

möjligheterna, resten kan du lätt lära dig själv genom att pröva dig fram litet.<br />

9.2.1 Grafikfönstrets egenskaper<br />

Om vi efter att ha valt ”property editor” dubbelklickar p˚a grafikfönstret, utanför själva<br />

grafen, s˚a öppnas ett fönster med flera flikar. Klickar vi p˚a fliken ”Style” s˚a f˚ar vi upp<br />

ett fönster där vi kan välja fönstrets bakgrundsfärg. Välj ”Background Color” och sedan<br />

”Custom color”. Du f˚ar d˚a upp en panel där du kan redigera fram en ny favoritfärg genom<br />

att klicka och dra p˚a pilar som reglerar hur stor inblandningen av de tre olika grundfärgerna<br />

skall vara. I rutan “window name” kan du namnge fönstret (den text som syns p˚a listen till<br />

fönstret). Genom att ta bort markeringen fr˚an “Figure number show” tar du bort “Figure<br />

1:” som annars skrivs ut före den titel du väljer.<br />

9.2.2 Grafens egenskaper.<br />

För att redigera grafens egenskaper dubbelklickar vi med ”property editor” pilen n˚agonstans<br />

p˚a grafen. D˚a öppnas ett fönster med ett antal flikar.<br />

X,Y,Z<br />

Här kan vi redigera axlarna. Vi kan välja manuella värden för min och max p˚a skalan genom<br />

att vid ”limits” ta bort markeringen vid “Auto” och skriva in nya min och maxvärden. Vi<br />

kan ändra vilken sida om grafen som skalan visas och var skalstrecken skall markeras genom<br />

att vid ”ticks” ta bort markeringen i auto och skriva in en vektor med de värden där vi<br />

vill ha skalstreck (märk att listan med markeringar är en vektor, den m˚aste omges med<br />

hakparentes). ”labels” kan vi använda för att ändra vad som skrivs ut vid de skalstreck vi<br />

valt i kommandot ovan, det kan allts˚a st˚a t.ex. ”Paris London Madrid” vid skalstrecken i<br />

stället för ” 1.0 2.0 3.0 ”. Under ”scale” kan vi välja antingen lin- eller logskala p˚a alla tv˚a<br />

(eller tre) axlarna var för sig, och huruvida skalan skall öka (normal) eller minska (reverse)<br />

när vi g˚ar ˚at höger. Vi kan ocks˚a sl˚a p˚a rutnätslinjer i x- och y-led separat.<br />

style<br />

Under denna flik kan vi skriva in en titel för grafen. Vi kan ocks˚a välja typsnitt och storlek p˚a<br />

de siffror och bokstäver som skrivs ut vid axelmarkeringarna, färger p˚a axlar och bakgrund,


9.3. HANDTAGS-GRAFIK 93<br />

placering av axlarna och litet annat sm˚att och gott.<br />

9.3 Handtags-grafik<br />

Matlab ger oss möjlighet att i detalj via kommandon styra utseendet av den grafik vi producerar<br />

p˚a ungefär samma sätt som när vi arbeter i ”property editor”-fönstret. Detta kan<br />

vara av värde när vi producerar grafik i ett program och vill p˚averka utseendet av graferna<br />

inifr˚an programmet istället för att göra det interaktivt. Detta görs med hjälp av n˚agot som<br />

kallas ”handtagsgrafik” (eng handle graphics). När vi ägnar oss ˚at datorprogrammering s˚a<br />

är ett ”handtag” en variabel som pekar tillbaks p˚a ett objekt vars egenskaper vi vill kunna<br />

p˚averka. Det kan vara en fil vi har öppnat i ett program och som vi vill skriva data till eller<br />

stänga eller byta namn p˚a, eller som i det här fallet ett diagram vars egenskaper vi vill kunna<br />

ändra. Handtagen skaffar man sig i allmänhet i det kommando där objektet i fr˚aga skapas,<br />

s˚a t.ex. kan vi i matlab skaffa ett handtag till en plot genom att ge plotkommandot p˚a<br />

formen handtag1=plot(x,y). Detta ger oss ett handtag som vi sedan kan använda dels för<br />

att skaffa oss information om grafer, dels ändra variabel värden, och därmed egenskaper hos<br />

grafen. Handtagsgrafik är i sig en skön konst, vi kan inte gör mer än skrapa p˚a ytan här, för<br />

en mer fullständig beskrivning hänvisar vi till ?MATLAB/Graphics/Handle Graphics<br />

Objects<br />

9.3.1 Linjens egenskaper<br />

De egenskaper vi f˚ar tillg˚ang till genom det handtag vi skapar när vi ger plotkommandot<br />

är linjens egenskaper. Pröva att i exemplet ovan skriva det sista plotkommandot som<br />

hand1=plot(xvalues, gvalue, ’b*’). Om vi sedan skriver get(hand1) i kommandofönstret<br />

s˚a f˚ar vi en lista p˚a de egenskaper hos detta objekt som vi kan ändra. De mest intressanta<br />

är de som kommer först:<br />

get(hand1)<br />

Color = [0 0 1]<br />

EraseMode = normal<br />

LineStyle = none<br />

LineWidth = 0.5000<br />

Marker = *<br />

MarkerSize = 6<br />

Med hjälp av handtaget kan vi sätta dessa egenskaper med hjälp av kommandot set(handtag,<br />

egenskap, värde) (man kan ge fler par av egenskap-värde efter varandra). Prova till exempel<br />

effekten av set(hand1,’Markersize’,25), set(hand1,’Marker’,’o’, ’MarkerSize’,8),<br />

set(hand1,’LineStyle’,’-.’). Egenskapen Color, som är färgen p˚a linjesegment och<br />

punktmarkörer ges som en vektor som anger hur stor br˚akdel mellan 0 och 1 av de tre<br />

grundfärgerna som skall blandas i den färg vi vill se. Vektorn anger grundfärgerna i ordningen<br />

rött-grönt-bl˚att. Svart ges av [0 0 0] medan vitt är [1 1 1], mörkgrönt är [0 0.4 0] och<br />

s˚a vidare. Prova att blanda litet olika kombinationer, för att se ordentligt kanske du vill dra<br />

upp linjebredden litet: set(hand1,’LineWidth’,4,’Color’,[.2 .7.2]).<br />

9.3.2 Axlarnas egenskaper<br />

Vi kan f˚a motsvarande lista över egenskaperna hos axlarna i den aktuella plotten genom<br />

kommandot hand2=gca, följt av get(hand2) (gca st˚ar för ”get current axis” vilket<br />

är detsamma som handtaget till de nuvarande axlarna). Listan vi f˚ar är l˚ang, för en<br />

fullständig genomg˚ang hänvisar vi till dokumentationen, här gör vi n˚agra nedslag bland<br />

de mer användbara:


94 KAPITEL 9. MER GRAFIK OCH PROGRAMMERING<br />

Box = on - L˚ater oss sl˚a p˚a (on) eller av (off) den heldragna boxen<br />

kring grafen.<br />

Color = [1 1 1] - Styr bakgrundsfärgen i plotten.<br />

FontAngle = normal - Kan användas för att skriva axlarna (allts˚a siffrorna, inte<br />

etiketter) kursiverat genom att ge ”italic”.<br />

FontName = Helvetica - Byter typsnitt p˚a axlarna.<br />

FontSize = [10] - Väljer storlek p˚a axlarnas siffror.<br />

LineWidth = [0.5] - Sätter bredden p˚a de linjer som ritar axlar och axelmarkeringar.<br />

TickLength = [0.01 0.025] - Sätter längd p˚a axelmarkeringarna.<br />

TickDir = in - Avgör om axelmarkeringarna skall peka in i grafen (in)<br />

eller ut ur den (out).<br />

Det finns ett antal variabler som ges i formen<br />

XLabel = [7.00012]<br />

Detta är helt enkelt ocks˚a ett handtag som pekar p˚a egenskaperna hos objektet XLabel,<br />

det vill säga dataetiketten p˚a x-axeln. Egenskaperna hos detta objekt syns inte bland<br />

axlarnas egenskaper, för att se dessa m˚aste vi göra get med detta handtag. Det finns<br />

dock en hake - vi kan oftast inte skriva bara get(7.00012), eftersom det tal vi ser är<br />

avrundat. För att vara säker p˚a att vi f˚ar rätt handtag bör vi använda get-kommandot:<br />

labelx=get(gca,’Xlabel’) följt av get(labelx) som ger oss en ny lista med egenskaper,<br />

denna g˚ang enbart för data-etiketten för x-axeln, som vi kan ändra efter behag för att<br />

skräddarsy grafens egenskaper.<br />

9.3.3 Figurens egenskaper<br />

Man kan ocks˚a kalla fram egenskaperna hos figuren genom get(gcf) (gcf: get current figure).<br />

Det är ganska f˚a av de intressanta egenskaperna hos figuren som inte enklare g˚ar att ställa<br />

p˚a annat sätt, men vi kan i alla fall ändra bakgrundsfärgen - allts˚a bakgrunden till figuren,<br />

inte bakgrunden i figuren - genom att ge set(gcf,’Color’,[0.9 0.7 0.7]).<br />

9.4 3-D grafik<br />

Tre-dimensionell grafik är ju n˚agot av en hägring, eftersom vi alltid f˚ar h˚alla tillgodo med tv˚adimensionella<br />

projektioner av kroppar och ytor i den tredimensionella rymden. MATLAB<br />

hjälper oss att skapa s˚adana hägringar p˚a flera olika sätt. Vi skummar litet p˚a ytan, och<br />

hänvisar den som behöver en grundlig genomg˚ang till ?/MATLAB/3-DVisualization.<br />

9.4.1 Kurvor i rymden - plot3<br />

Kommandot plot3(x,y,z,s) fungerar ekvivalent med kommandot plot i tv˚a dimensioner.<br />

Om x, y och z är vektorer (med samma längd) s˚a plottas kurvan mellan punkterna,<br />

strängen s styr linjens utseende och har samma format som för plot-kommandot. Argumenten<br />

x, y och z kan ocks˚a vara matriser av samma storlek, kommandot plottar d˚a en kurva för varje<br />

kolumn i matriserna. Vill man ha fler kurvor i samma graf, men med olika antal punkter,<br />

eller med olika egenskaper hos linjen kan man ge kommandot p˚a formen plot3(x1, y1,<br />

z1, s1, x2, y2, z3, s2,...). I övrigt fungerar de flesta kommandon som kan användas<br />

p˚a en tv˚adimensionell plot ocks˚a här:


9.4. 3-D GRAFIK 95<br />

clear all;<br />

z=1:pi/32:2*pi;<br />

y=sin(z);<br />

x=cos(z);<br />

plot3(x,y,z,’r’)<br />

xlabel(’cos(t)’)<br />

ylabel(’sin(t)’)<br />

zlabel(’t’)<br />

grid on<br />

title(’Helix i tre dimensioner’)<br />

I grafikfönstret kan vi rotera grafen för att betrakta den ur valfritt perspektiv. Tryck ned<br />

knappen “Rotate 3D” (den som har en cirkulär pil runt en kub). Markören ändras d˚a till en<br />

cirkulär pil. Om vi trycker ned musknappen med markören n˚agonstans i grafikfönstret och<br />

drar kommer grafen att rotera. Pröva!<br />

9.4.2 Funktionsytor - mesh och surf<br />

Funktionsytor kan ˚ask˚adliggöras p˚a tv˚a sätt, antingen som ett galler eller som en hel yta.<br />

Innan vi ger oss hän m˚aste vi, i analogi med hur vi först skapade en x-vektor för att göra en<br />

tv˚adimensionell plot av en funktion skaffa oss ett x-y galler där funktionen skall utvärderas.<br />

Detta görs med kommandot [x, y] = meshgrid(xintervall, yintervall) som ger tv˚a<br />

matriser x och y som inneh˚aller koordinaterna för varje punkt där funktionen skall utvärderas.<br />

Prova till exempel:<br />

clear all;<br />

clf<br />

figure(1)<br />

xkoord=-8:.1:4;<br />

ykoord=-4:.1:8;<br />

[x, y]=meshgrid(xkoord, ykoord);<br />

z=sin(sqrt(x.∧2+y.∧2));<br />

mesh(x,y,z);<br />

figure(2)<br />

surf(x,y,z);<br />

9.4.3 Att styra utseendet av en 3D-graf<br />

Perspektiv<br />

Förutom att lägga till axel-rubriker och titlar, och ändra axlarna gradering som för en<br />

tv˚adimensionell graf (och naturligtvis hela batteriet med manipuleringar som handtagsgrafiken<br />

öppnar upp) s˚a finns det n˚agra speciella funktioner för en 3D-graf. En är kommandot<br />

view som anger ur vilken riktning vi betraktar en graf. Denna anges med tv˚a vinklar<br />

(i grader): theta och phi. Theta är vinkeln mellan x-axeln och det plan i vilket grafen ligger.<br />

Theta=0 anger att x-axeln löper parallellt med bildytan, och att y-axeln pekar in˚at i<br />

grafen (ser inget vidare ut!). Phi-vinkeln anger den vinkel som synlinjen bildar med horisontalplanet,<br />

phi=0 anger att vi ser p˚a grafen horisontellt fr˚an sidan, phi=90 att vi betraktar det<br />

hela rakt ovanifr˚an. Dessa vinklar kan man ändra genom kommandot view(theta,phi).<br />

Det är lätt att g˚a bort sig när man börjar ändra denna vinkel, vill man komma tillbaks till<br />

det normala värdet (theta = -37.5, phi = 30) skriver man view(3). Om man i n˚agot läge<br />

blir osäker om vilka värden som gäller kan man ”fr˚aga” genom kommandot [theta, phi]<br />

= view.


96 KAPITEL 9. MER GRAFIK OCH PROGRAMMERING<br />

Färgskala<br />

För att rita in en färgkarta som anger vilken färg som svarar mot vilket värde ger man<br />

kommandot colorbar. Skalan läggs vertikalt om du inte ger n˚agot argument, eller om du ger<br />

’vertical’. Vill du ha en liggande skala ger du colorbar(’horizontal’). Tycker man<br />

inte att färgsättningen duger s˚a finns det ett antal olika färgkartor att välja p˚a - skriv help<br />

graph3d och titta p˚a colormap för att se vilka du kan välja mellan. Du ändrar färgskala<br />

genom kommandot colormap mapname. Om vi inte tycker om det överlagrade svarta<br />

rutmönstret s˚a kan det tas bort med kommandot shading. Det normala utseendet f˚as med<br />

shading faceted, en variant där varje ruta har en färg, men utan att visa nätet f˚as med<br />

shading flat. Vi kan slutligen f˚a en utjämnad färgsättning utan rutnät med shading<br />

interp.<br />

Har vi gjort en snygg färgad yta kan det ibland vara effektfullt (men oftast inte särskilt<br />

informativt) att helt frilägga den innan vi klipper in den i n˚agot annat program. Det görs<br />

genom grid off och axis off.<br />

9.4.4 Konturplottar och projektioner<br />

Vi kan rita konturplottar med kommandot contour(z), antalet niv˚aer kan styras med ett<br />

andra argument, och linjetyp väljs som vanligt: contour(z,12,’r’). Som du ser s˚a är<br />

de värden som ges p˚a axlarna index i respektive matris, inte själva värdet, detta kan vi<br />

˚atgärda genom att göra en tilldelning av värden när vi kallar contour: contour(-8:.1:4,<br />

-4:.1:8, z, 12) ger oss tillbaka v˚ar gamla vanliga kakform. I denna plot kan vi rita in<br />

höjdvärden med kommandot clabel med contour kommandot som argument:<br />

clabel(contour(z, 12)) . Vi kan ocks˚a f˚a en färgkodad projektion med pcolor(x,y,z).<br />

Med rutnätet p˚aslaget blir det inte särskilt elegant, varför man kanske vill följa upp med<br />

shading interp.<br />

9.4.5 Gradientplottar<br />

För att göra genomg˚angen komplett visar vi kokboksmässigt hur man kan konstruera en 2dimensionell<br />

figur som visar gradienten av en funktion av tv˚a variabler. Vi konstruerar först<br />

v˚ar vektor z med n˚agot grövre indelning än tidigare, eftersom gradientpilarna som visas med<br />

samma granularitet som z beräknas i annars blir helt oöversk˚adliga.<br />

clear all;<br />

xkoord=-4:.5:4;<br />

ykoord=-4:.5:4;<br />

[x,y]=meshgrid(xkoord, ykoord);<br />

z=sin(sqrt(x.∧2+y.∧2));<br />

[dx,dy]=gradient(z,0.5,0.5);<br />

contour(-4:.5:4,-4:.5:4,z)<br />

hold on<br />

quiver(x,y,dx,dy,0.5)<br />

Kommandot gradient beräknar gradienten av funktionen z i samma punkter som funktionen<br />

är beräknad, quiver slutligen plottar sm˚a pilar i punkterna som ges av x och y med<br />

riktning som ges av dx och dy. Det sista argumentet i quiver-kommandot är en skalfaktor.<br />

Ger vi ingen skalfaktor s˚a görs pilarna lagom stora för att precis f˚a plats, en skalfaktor som är<br />

mindre än 1 ger litet mer luft mellan pilarna. För mer info hänvisar vi till help gradient<br />

och help quiver.


9.5. MER OM PROGRAMMERING OCH FUNKTIONER 97<br />

9.5 Mer om programmering och funktioner<br />

Som en avrundning av kursen skall du skapa n˚agra funktioner som kan vara bra att ha med<br />

sig i bagaget under fortsättningen här p˚a fysikum. Vi kommer inte att ge n˚agra färdiga<br />

recept, utan istället skissar vi litet p˚a hur funktionerna skall fungera, vad som kan vara bra<br />

att tänka p˚a och exemplifiera med n˚agra korta kod-avsnitt. För det här avsnittet finns inget<br />

klart facit, m˚anga av uppgifterna kan lösas p˚a mer än ett sätt, kvittot p˚a att du gjort rätt<br />

f˚ar du när funktionen fungerar som det är tänkt 1 .<br />

9.5.1 Linjär korrelationskoefficient<br />

L˚at oss börja med en funktion som beräknar den linjära korrelationskoefficienten för en<br />

datamängd av punkter med x- och y-värden.<br />

Algoritm<br />

Givet en uppsättning x- och y-värden beräknas korrelationskoefficienten ur:<br />

Gränssnitt och syntax<br />

N<br />

(xi − ¯x)(yi − ¯y)<br />

i=1<br />

r = <br />

<br />

<br />

N <br />

(xi − ¯x)<br />

i=1<br />

2<br />

N<br />

(yi − ¯y)<br />

i=1<br />

2<br />

Vi börjar med att fundera över funktionens gränssnitt mot de omgivande programmen, som<br />

i det här fallet är ganska enkelt: nödvändiga indata till funktionen är datamängdens xoch<br />

y-värden. Dessa organiserar vi lämpligen som tv˚a vektorer där den ena inneh˚aller xvärdet<br />

och den andra y-värdet för en given punkt. Vi behöver d˚a bara vara noga med att<br />

index löper p˚a samma sätt i de bägge vektorerna, s˚a att x(3) och y(3) är x- och y-värde för<br />

samma mätpunkt. Resultatet vi förväntar oss efter att ha kallat funktionen är helt enkelt<br />

korrelationsparametern r, given av formeln<br />

Men skall vi skriva en s˚a allmän funktion som möjligt, och det är ju det vi strävar efter, s˚a<br />

bör vi kanske även förutse en möjlighet att f˚a ut antalet mätpunkter ur funktionen, eftersom<br />

vi kan behöva det när vi g˚ar in i tabeller (som appendix C i Taylor) för att f˚a ett värde<br />

p˚a sannolikheten för en given korrelationskoefficient för givet antal mätpunkter. Det är<br />

naturligtvis lika enkelt att räkna ut hur m˚anga mätpunkter man har i huvudprogrammet<br />

som kallar funktionen som det är att göra i funktionen, vi m˚aste allts˚a p˚a n˚agot sätt försöka<br />

bestämma vilket vi tycker är bäst. Huvudregeln är att man skall försöka kapsla in s˚a mycket<br />

som möjligt i funktionerna, gränssnittet mellan en kallande rutin och en funktion skall man<br />

försöka h˚alla s˚a litet som möjligt för att beh˚alla flexibilitet. I det här fallet är det ju ocks˚a<br />

s˚a att vi inte vet om man kommer att använda N i huvudprogrammet eller inte, medan vi<br />

vet att N är nödvändigt inuti funktionen. Det är därför logiskt att beräkna N i funktionen,<br />

och att ge N som ett resultat fr˚an funktionen. Funktionens syntax bör därför bli function<br />

[CorCoefficient, N] =lincorr(x, y).<br />

1 När man blir mer avancerad och skriver kod för stora program är inte detta ett tillräckligt kriterium för<br />

att en funktion är väl kodad. I s˚adana sammanhang gäller det dessutom att skriva effektivt, det vill säga<br />

skriva rutiner p˚a s˚a sätt att uppgifterna löses s˚a snabbt som möjligt och med minsta möjliga utnyttjande av<br />

datorns resurser som till exempel internminne.


98 KAPITEL 9. MER GRAFIK OCH PROGRAMMERING<br />

Felkontroll - kommandot error<br />

När man skriver kod man skall använda länge och i m˚anga sammanhang, och kanske till och<br />

med skall dela med sig av till andra användare s˚a m˚aste man tänka igenom vilka möjliga<br />

fel som kan uppst˚a och hur man skall hantera dessa. Ett klassiskt exempel är division<br />

med noll, innan man utför det sista steget för att beräkna r bör man därför kontrollera<br />

att nämnaren inte blir noll. En annan sak som kan vara värd att kontrollera är att de<br />

bägge vektorerna x och y verkligen uppfyller förutsättningen att ha lika m˚anga element.<br />

En check p˚a length(x) = length(y) är nödvändig. Säg att man hittar ett av dessa<br />

fel i funktionen, hur skall man d˚a reagera? P˚a n˚agot sätt m˚aste felet signaleras till den<br />

rutin som kallar funktionen. Detta görs genom kommandot error(’Message’). När detta<br />

kommando utförs skrivs meddelandet ’Message’ ut p˚a skärmen och programmet avbryts,<br />

samtidigt som en del information som skall göra det lättare att se var felet uppstod skrivs ut<br />

i kommandofönstret. Felmeddelandet bör vara s˚a informativt s˚a att man genast inser vilket<br />

fel som inträffade s˚a att det kan korrigeras.<br />

Även om informationen om var felet hände skrivs<br />

ut av matlab s˚a är det en god vana att inkludera s˚adan information i felmeddelandet självt.<br />

Kontrollen av att x och y har samma längd kan allts˚a se ut ungefär s˚a här:<br />

if (length(x) ∼= length(y))<br />

error(’Fel i funktion lincorr: argumenten x och y har inte samma längd’);<br />

end<br />

En liknande test bör göras före divisionen för att undvika division med noll p˚a ett snyggt<br />

sätt.<br />

Testa funktionen<br />

När funktionen är kodad kan du testa den genom att skriva en huvudrutin som till exempel<br />

beräknar korrelationskoefficienten för tal 9.13 i Taylor:<br />

x = [74 83 85 96 98 100 106 107 120 124];<br />

y = [76 103 99 109 111 107 91 101 120 119];<br />

[r,N]=lincorr(x,y)<br />

Är det hela korrekt blir r=0.7278 och N=10.<br />

9.5.2 Viktad anpassning till rät linje<br />

Nästa uppgift blir att med utg˚angspunkt i samma schema designa och skriva en funktion<br />

som gör en viktad anpassning till en rät linje, y=a + bx.<br />

Algoritm<br />

Parametrarna a och b, samt osäkerheten i dessa ges av:<br />

<br />

wix<br />

a =<br />

2 <br />

i wiyi − <br />

wixi wixiyi<br />

∆<br />

där wi = 1<br />

σ 2 i<br />

σa =<br />

wix 2 i<br />

∆<br />

och b =<br />

σb =<br />

wi<br />

wi<br />

∆<br />

<br />

wixiyi − <br />

wixi wiyi<br />

och ∆ = <br />

wi wix 2 2 i − wixi<br />


9.5. MER OM PROGRAMMERING OCH FUNKTIONER 99<br />

Gränssnitt och syntax<br />

Indata till funktionen är lämpligen tre vektorer, en med x-värden, en med y-värden och en<br />

med felen i y-värdena. Vilka resultat vi vill f˚a ut ur funktionen kan variera en del. Vi kommer<br />

alltid att vilja se de anpassade värdena för parametrarna a och b, samt osäkerheten i dessa.<br />

Eventuellt vill vi ocks˚a f˚a en uppfattning om kvaliteten i anpassningen, det vill säga chikvadratsumman<br />

per frihetsgrad och antalet frihetsgrader. Eftersom det, i motsats till lincorr<br />

ovan, inte är nödvändigt att räkna ut dessa senare tal för att funktionen skall kunna köra,<br />

s˚a lönar det sig att testa med nargout om dessa värden verkligen är efterfr˚agade eller inte<br />

innan de beräknas. Syntaxen för funktionen blir d˚a: function [parA, sigmaA, parB,<br />

sigmaB, ChiSquared, Dof] =linfit(x, y, sigma).<br />

Felkontroll<br />

Ett möjligt fel som m˚aste kollas är om de tre vektorerna som är argument till funktionen inte<br />

har samma längd. Vidare bör man kontrollera att ∆ inte är noll s˚a att divisionerna ger ett<br />

odefinierat resultat. Om chi-kvadrat skall beräknas m˚aste vi ocks˚a kontrollera att det finns<br />

minst tre mätta punkter, annars kommer divisionen när chi-kvadrat per frihetsgrad beräknas<br />

att bli odefinierad, samt att inget av mätfelen felaktigt är angivet som 0, i vilket fall bidraget<br />

till chi-kvadratsumman fr˚an den punkten blir odefinierat.<br />

Testa funktionen<br />

Du kan testa den färdiga funktionen p˚a datamängden<br />

x =[1.097 1.700 3.39 1.399 3.70 2.190 2.5 4.00];<br />

x=x*0.001;<br />

y =[0.429 0.668 1.328 0.547 1.445 0.856 0.973 1.557];<br />

dy =[0.001429 0.001668 0.0020 0.0015 0.0020 0.0010 0.0020 0.0030];<br />

Svaret skall bli: a = (1.9347 ± 1.540)10 −3 , b = (389.99 ± 0.665), N = 6, χ 2 /d.o.f. = 2.38<br />

9.5.3 Viktad anpassning och plottning av rät linje.<br />

Här skall vi skriva en funktion som levererar en graf med data plottade med felstaplar och<br />

i samma graf den räta linjen som är ett resultat av anpassningen till en rät linje, med<br />

parametrarna för anpassningen utskrivna.<br />

Algoritm<br />

Anpassningen till en rät linje är inte n˚agot problem, vi l˚ater bara denna funktion i sin tur<br />

anropa linfit som vi skrev i förra avsnittet. Det gäller sedan ”bara” att f˚a grafen att<br />

se snygg ut utan att göra n˚agra antaganden i förväg om hur data ser ut. Det kan man<br />

˚astadkomma genom att först plotta data, sedan flytta ut axlarna med 10% av det värde<br />

som den automatiska skalningen ger för att se till att alla punkter ligger väl inne i grafen.<br />

Därefter drar vi den räta linjen som definieras av anpassningen.<br />

Om det anges i den kallande rutinen s˚a skall linplot skriva ut parametrarna fr˚an anpassningen.<br />

För att skriva ut parametrarna formaterar vi med formatet %0.3g för att det skall<br />

se snyggt ut oberoende av vilket resultatet av anpassningen blir. Vi vill sedan att texten<br />

skall hamna p˚a ett vettigt ställe och väljer därför att börja skriva 5% av grafens totala bredd<br />

in fr˚an vänsterkanten och översta raden 5% fr˚an toppen. Om riktningskoefficienten fr˚an<br />

anpassningen är negativ kommer datapunkter att ligga i det övre vänstra hörnet, vi väljer<br />

d˚a istället att i horisontell ledd börja att skriva i mitten av grafen. (Ett alternativ till denna<br />

algoritm kan vara att lägga till extra 20% i höjdled när vi skalar om vertikalt och använda


100 KAPITEL 9. MER GRAFIK OCH PROGRAMMERING<br />

denna area till att placera in texten.) Vi bör däremot undvika att använda kommandon<br />

som p˚averkar var grafen plottas, som figure(#) och subplot, det är bättre att det kallande<br />

programmet gör s˚adana val, eftersom önskem˚alen kan vara vitt skilda för olika tillämpningar.<br />

Gränssnitt och syntax<br />

Gränssnittet för den här funktionen är detsamma som för linfit, de parametrar som skall<br />

skickas vidare till linfit, vektorerna x, y och sigma m˚aste ges som argument i anropet till<br />

linplot. En lyx-variant av funktionen skulle kunna ha som tillval att man även ger en sträng<br />

som anger hur grafen skall plottas av plot-kommandot, som till exempel ’-or’, men i första<br />

omg˚angen bryr vi oss inte om det. Däremot m˚aste vi skicka med tre textsträngar som ger textsträngar<br />

för titel, x-etikett och y-etikett. Om vi vill kunna välja om parametervärden skrivs<br />

ut i plotten eller inte s˚a m˚aste vi sätta in flaggor för detta i argumenten till funktionsanropen,<br />

parflag som är 1 om vi vill att parametervärdena skall skrivas in och 0 annars, chiflag styr p˚a<br />

samma sätt om chi-kvadrat och frihetsgrader skall skrivas ut (kom ih˚ag att variabler inte skall<br />

ha samma namn som funktioner, vi kan allts˚a inte använda title och xlabel som namn p˚a<br />

variablerna). Utdata fr˚an linplot är de samma som för linfit, allts˚a i första hand värdet<br />

p˚a parametrarna och osäkerheten i dessa, samt som tillval chi-kvadratsumman och antalet<br />

frihetsgrader. Vi kan dessutom tänka oss att linplot ibland kommer att kallas utan att den<br />

kallande rutinen använder utdata alls, i de fall det intressanta bara är att f˚a en graf. Syntaxen<br />

för funktionen blir d˚a : function [parA, sigmaA, parB, sigmaB, ChiSquared, Dof]<br />

=linfit(x, y, sigma, titel, labelx, labely, parflag, chiflag)<br />

Eftersom linplot skall kalla linfit m˚aste vi ocks˚a fundera över gränssnittet mellan<br />

dessa bägge funktioner. I princip är det ju inget som hindrar linplot fr˚an att kalla<br />

linfit med alla sex utdata parametrarna i anropet. Men om linplot inte är kallad med<br />

parametrarna ChiSquared och Dof, och om chiflag är noll s˚a behöver man ju inte beräkna<br />

chi-kvadratsumman i linfit. Att änd˚a kalla linfit med alla sex utdata parametrar betyder<br />

d˚a att programmet spenderar tid p˚a att beräkna saker som aldrig kommer att användas,<br />

vilket är slöseri. Vi m˚aste allts˚a i linplot testa om s˚a är fallet eller inte och bara anropa linfit<br />

med alla sex utdata parametrar om det är nödvändigt, annars använder vi [parA, sigmaA,<br />

parB, SigmaB]<br />

Felkontroll<br />

Det fel vi behöver testa för är om vektorerna x, y och sigma har samma längd, i annat<br />

fall kraschar errorbar-kommandot. Man kan tycka att vi inte behöver testa för det i linplot<br />

eftersom linfit testar för det. Men man skall försöka att skriva varje funktion s˚a komplett och<br />

sluten som möjligt. Det kan ju hända att vi i framtiden vill använda linplot s˚a att den kallas<br />

av n˚agon annan funktion än linfit, i en s˚adan situation kan det vara omöjligt att minnas att<br />

vi m˚aste kolla om den nya funktionen gör den nödvändiga testen.


9.5. MER OM PROGRAMMERING OCH FUNKTIONER 101<br />

Testa funktionen<br />

Om funktionen fungerar bör kodsnutten nedan<br />

clear all;<br />

x =[1.097 1.700 3.39 1.399 3.70 2.190 2.5 4.00];<br />

x=x*0.001;<br />

y =[0.429 0.668 1.328 0.547 1.445 0.856 0.973 1.557];<br />

dy =[0.001429 0.001668 0.0020 0.0015 0.0020 0.0010 0.0020 0.0030];<br />

dy=dy*10;<br />

clf<br />

disp(’YYYY’)<br />

[parA, sigmaA, parB, sigmaB, chi, N] = linplot . . .<br />

(x, y, dy,’Resistor 1’,’Ström (A)’,’Spänning (V)’,1,1)<br />

skapa en graf som ser ut som:<br />

testa ocks˚a att texten dyker upp p˚a rätt ställe när riktningskoefficienten är negativ, och att<br />

vi kan sl˚a av och p˚a utskrift av parametervärden med flaggorna som det är tänkt.


102 KAPITEL 9. MER GRAFIK OCH PROGRAMMERING<br />

9.6 Övningsuppgifter<br />

1. Rita följande funktioner, prova med olika kombinationer av mesh, surf, surfl och shadint<br />

interp, samt testa olika färgkartor.<br />

z =<br />

z =<br />

<br />

x 2 + y 2 − 10 ≤ x ≤ 10, −10 ≤ y ≤ 10<br />

<br />

x2 + y2 <br />

− 2π ≤ x ≤ 2π, −2π ≤ y ≤ 2π<br />

2. Kronan p˚a verket blir att skriva en funktion som med matrismetoden gör en minsta<br />

kvadratanpassning till ett polynom med godtyckligt gradtal. Indata till funktionen är<br />

en vektor med y-värden, en med x-värden och en vektor med osäkerheten i y-värdena.<br />

Dessutom m˚aste vi vid anropet ange till vilket gradtal anpassningen skall göras. Utdata<br />

är vektorn med parametervärdena och covariansmatrisen. Den felkontroll som behöver<br />

göras är att antalet y-värden är minst lika stort som antalet parametrar som skall<br />

anpassas och att inget av felen är noll.


Kapitel 10<br />

Svar och lösningar<br />

10.2 Svar till kapitel 2<br />

1. a) y=3*x.^2+4*x (y = 7 39 95 175 )<br />

b) yPrim = yPrim = 6*x + 4 (yPrim = 10 22 34 46)<br />

2. y=2*x.^3 + 4*x - 3 (y = 3.0000 49.5938 131.2380 210.0720)<br />

3. a1 = [2;-5;2] ; a2 = [3 ; 2 ; -4]; a3 = [1 ; 0 ; 2]<br />

A = [a1 a2 a3]<br />

A2 = [a2’ ; a3’ ; a1’]<br />

4. A + B =<br />

4 -7 9 2<br />

-1 -5 -1 7<br />

1 -2 6 12<br />

A-B =<br />

-2 1 5 -2<br />

5 -3 -1 5<br />

-5 2 0 -2<br />

A’*B =<br />

-9 -2 -4 -10<br />

3 16 -6 -10<br />

33 -33 23 34<br />

-3 -16 15 41<br />

5. x = alfa*pi/180 (x = 0 0.5236 1.0472 1.5708)<br />

s = sin(x) ( s = 0 0.5000 0.8660 1.0000 )<br />

c=(1-s.^2).^0.5 ( c = 1.0000 0.8660 0.5000 0 )<br />

A=[alfa’ s’ c’]<br />

( A =<br />

0 0 1.0000<br />

30.0000 0.5000 0.8660<br />

60.0000 0.8660 0.5000<br />

90.0000 1.0000 0 )<br />

103


104 KAPITEL 10. SVAR OCH L ÖSNINGAR<br />

6. massa = [2.0 1.5 3.0 2.0 2.5];<br />

hastighet = [ 2.0 4.0 -3.0 1.0 6.0];<br />

T = 0.5*massa.*hastighet.^2<br />

(T = 4.0000 12.0000 13.5000 1.0000 45.0000<br />

totT = sum(T) (totT = 75.5000)<br />

7. r = 6*rand(1,10)<br />

10.3 Svar till kapitel 3<br />

1. Ett förslag till lösning kan vara:<br />

function y = slumptal()<br />

%<br />

% producerar ett slumpat heltal mellan 1 och 100<br />

%<br />

y = 1 + floor(100*rand(1,1));<br />

2. Ett förslag till lösning är:<br />

3. Ett exempel är:<br />

function tipsrad()<br />

%<br />

% genererar en slumpm\"assig tipsrad<br />

%<br />

r = 3*rand(1,13)<br />

for i = 1:13<br />

if (r(i) < 1)<br />

disp(’1’)<br />

elseif (r(i) < 2)<br />

disp(’x’)<br />

else<br />

disp(’2’)<br />

end<br />

end<br />

function y=Newton(x)<br />

% function to compute square root of x, using Newtons formula<br />

% y(k+1) = 0.5*(y(k) + x/y(k)) with y(1) = 1<br />

%<br />

% Sten Hellman 050301<br />

yold = 1;<br />

delta = 1;<br />

index = 0;<br />

while(delta > 0.00001)<br />

index = index + 1;


10.5. SVAR TILL KAPITEL 5 105<br />

ynew = 0.5* ( yold + x/yold);<br />

delta = abs(yold-ynew)<br />

yold=ynew<br />

end<br />

y = ( round(10000*ynew) / 10000)<br />

10.5 Svar till kapitel 5<br />

1. Felet med programmet är att variabeln x inte ändras när vi har hittat en primtalsfaktor.<br />

Varje g˚ang vi till exempel testar om 9 är jämnt delbart med 3 s˚a stegas AntalFaktorer<br />

upp med en enhet, men x är fortfarande 9 nästa g˚ang vi testar. När vi hittar en<br />

primfaktor till x m˚aste vi dividera bort den ur x innan vi fortsätter att söka fler<br />

faktorer, till exempel s˚a här:<br />

AntalFaktorer=0;<br />

i=2;<br />

while(i


106 KAPITEL 10. SVAR OCH L ÖSNINGAR<br />

7<br />

6<br />

5<br />

4<br />

3<br />

2<br />

1<br />

0<br />

−1<br />

−2<br />

−3<br />

grad 1<br />

grad 3<br />

grad 5<br />

grad 7<br />

grad 9<br />

sinus<br />

−4<br />

0 1 2 3 4 5 6 7<br />

10.7 Svar till kapitel 7<br />

1. O =<br />

<br />

5 −1<br />

9 2.5<br />

<br />

Vilket f˚as genom att koda:<br />

>> I= [3 4 ; -2 1];<br />

>> S = [17 19 ; 22 38.5];<br />

>> O=S*inv(I)<br />

O =<br />

2. Vi har A =<br />

5.0000 -1.0000<br />

9.0000 2.5000<br />

⎛<br />

⎜<br />

⎝<br />

4 −5 3<br />

1 5 −6<br />

3 1 4<br />

⎞<br />

⎟<br />

⎠ och B =<br />

⎛<br />

⎜<br />

⎝<br />

22<br />

−21<br />

17<br />

⎞<br />

⎟<br />

⎠ med lösningen X =<br />

⎛<br />

⎜<br />

⎝<br />

2<br />

−1<br />

3<br />

⎞<br />

⎟<br />


10.8. SVAR TILL KAPITEL 8 107<br />

vilket f˚as ur: >> clear all<br />

>> B= [22 ; -21 ; 17];<br />

>> A = [4 -5 3 ; 1 5 -6 ; 3 1 4];<br />

>> inv(A)*B<br />

ans =<br />

2.0000<br />

-1.0000<br />

3.0000<br />

3. Det räcker med att lägga till raderna<br />

Deltaa = sqrt(sumwx2/delta);<br />

Deltab = sqrt(sumw/delta);<br />

10.8 Svar till kapitel 8<br />

1. Ett exempel är:<br />

% Primtal-final.m<br />

% to compute factors to arbitrary number x<br />

% Sten Hellman 2005-03-03<br />

%<br />

%<br />

clear all;<br />

namn=input(’Hej och valkommen till PRIMFAKT - \n Vad heter du? ’,’s’);<br />

out=[’Hej ’ namn ’\n Mata nu in det tal du vill soka faktorer for \n’];<br />

x=input(out);<br />

xinitial =x;<br />

% startvrdet p x mste sparas eftersom x kan frndras senare i<br />

% programmet<br />

AntalFaktorer=0;<br />

i=2;<br />

while(i


108 KAPITEL 10. SVAR OCH L ÖSNINGAR<br />

else<br />

i=i+2;<br />

end<br />

end<br />

end<br />

out1 = sprintf(’%g har %g primfaktorer:\n’,xinitial,AntalFaktorer);<br />

out2 = sprintf(’%g, ’,Faktor);<br />

out3 = sprintf(’\b\b’);<br />

out = [out1 out2 out3];<br />

disp(out)<br />

2. En möjlig lösning är:<br />

% exponent.m<br />

% computes approximation to exp(x) from serial<br />

% expansion<br />

% Sten Hellman 2005-03-03<br />

clear all;<br />

disp(’En approximation till e berknas genom serieutveckling’);<br />

Termer=input(’Upp till vilken term skall summeringen g? \n’);<br />

Faktor=1;<br />

Approx = 1;<br />

% this establishes the zero-term<br />

for index=1:Termer<br />

Faktor = Faktor * index;<br />

Approx = Approx + 1/Faktor;<br />

end<br />

Diff = exp(1) - Approx;<br />

out = sprintf(’Efter %g termer r approximationen= %g, skillnaden r %g’,index,Appr<br />

disp(out)<br />

3. Eftersom vi inte p˚a förhand vet hur m˚anga termer som kommer att behövas s˚a m˚aste<br />

vi ersätta for-loopen med en while-loop. Vi justerar dessutom in/output satserna:<br />

% exponent2.m<br />

% computes approximation to exp(x) from serial<br />

% expansion<br />

% Sten Hellman 2005-03-03<br />

clear all;<br />

disp(’En approximation till e berknas genom serieutveckling’);<br />

Delta=input(’Upp till vilken noggrannhet summeringen g? \n’);


10.8. SVAR TILL KAPITEL 8 109<br />

Faktor=1;<br />

Approx = 1;<br />

Diff = exp(1) - Approx;<br />

index = 0;<br />

% this establishes the zero-term<br />

while (Diff >= Delta)<br />

index = index + 1;<br />

Faktor = Faktor * index;<br />

Approx = Approx + 1/Faktor;<br />

Diff = exp(1) - Approx;<br />

end<br />

out = sprintf(’Efter %g termer r approximationen= %g, skillnaden r %g’,index,Ap<br />

disp(out)


Index<br />

\, 89<br />

\b, 87<br />

\n, 87<br />

\t, 87<br />

’ operatorn, 20<br />

[, 20<br />

%e, 88<br />

%f, 88<br />

%g, 88<br />

3D grafik<br />

färgskala, 96<br />

3D-kurvor, 94<br />

AFS konto, 31<br />

aktuell katalog, 32<br />

ankra bilder<br />

i Word, 51<br />

anpassa MATLASBs desktop, 76<br />

användarhandbok, 87<br />

argument<br />

i funktionsanrop, 39<br />

testa antal, 40<br />

array editor, 76<br />

array-fönstret, 20<br />

ASCII kod, 78<br />

avbryta MATLAB, 38<br />

avlusa, 57<br />

avrundning, 12, 24<br />

axis<br />

specialargument, 65<br />

axlar<br />

handtag för, 93<br />

backspace, 87, 89<br />

backsteg, 87<br />

bakgrundsfärg, 63<br />

i grafikfönstret, 92<br />

bar, 66<br />

beteckning p˚a axlar, 65<br />

bilder<br />

i Word, 69<br />

bildobjekt<br />

i Word, 51<br />

break, 38<br />

110<br />

break-point, 58<br />

bug, 57<br />

ceil, 24<br />

citationstecken<br />

i textsträng, 78<br />

clabel, 96<br />

clc, 62<br />

clear, 13<br />

clear av inbyggda funktioner, 12<br />

Clear command window, 62<br />

Clear figure window, 62<br />

close, 62<br />

colorbar, 96<br />

colormap, 96<br />

command history, 15<br />

compact, 13<br />

concatenate, 78<br />

contour, 96<br />

conv, 80<br />

ctrl-C, 59<br />

i MATLAB, 38<br />

current directory, 32<br />

current directory browser, 32<br />

debuggning, 57<br />

deccimalkomma, 2<br />

deconv, 80<br />

default printer, 68<br />

delsträngar, 78<br />

derivator av polynom, 80<br />

desktop, 4<br />

desktop layout, 77<br />

directory, 30<br />

disp , 6<br />

dockade fönster, 77<br />

dokumentation, 87<br />

drive letters, 32<br />

echo, 19<br />

eko<br />

stäng av eko av kommandon, 12<br />

ekvationer<br />

i Word, 52


INDEX 111<br />

elementvisa operationer, 21<br />

elfun, 23<br />

elmat, 23<br />

encapsulated post-script, 69<br />

eps, 69<br />

equation editor<br />

i Word, 52<br />

errorbar, 66<br />

escape-sekvens, 87<br />

eye, 26<br />

färgskala<br />

i 3D grafik, 96<br />

felmeddelande, 98<br />

felsökning, 57<br />

felstaplar<br />

i b˚ade x och y, 71<br />

i grafik, 66<br />

fet stil<br />

i Word, 45<br />

figure, 91<br />

figurer<br />

i Word, 51<br />

figurtext<br />

i Word, 52<br />

fill, 91<br />

filnamn, 30<br />

findstr, 78<br />

fix, 24<br />

flödesschema, 85<br />

floor, 24<br />

font, 45<br />

for-slingor, 37<br />

format, 12<br />

formaterad inmatning, 87<br />

formaterad utmatning, 87<br />

formatkod, 88<br />

antal decimaler, 88<br />

bredd av sifferfält, 88<br />

formatmallar i Word, 47<br />

fotnoter<br />

i Word, 49<br />

fri text, 66<br />

funktionsytor, 95<br />

gca, 93<br />

gcf, 94<br />

get, 93<br />

get current axis, 93<br />

get current figure, 94<br />

ginput, 92<br />

gradient, 96<br />

gradientplottar, 96<br />

grafers egenskaper, 92<br />

grafik<br />

fler grafer i samma fönster, 70<br />

fler kurvor i samma graf, 69<br />

flytta till andra program, 68<br />

rita fritt, 71<br />

skriv ut, 68<br />

spara, 68<br />

grafikfönster, 62<br />

fler fönster, 91<br />

grafikfönstret<br />

stänga, 62<br />

städa upp, 62<br />

välj bakgrundsfärg, 92<br />

grafikfönstrets egenskaper, 92<br />

grid, 64<br />

högerjusterad text<br />

i Word, 45<br />

h˚arddisk, 29<br />

hakparantes, 20<br />

handle graphics, 93<br />

handtag, 93<br />

för axlar, 93<br />

handtag för figurer, 94<br />

handtagsgrafik, 93<br />

help<br />

för en funktion, 40<br />

help, 8<br />

hist, 67<br />

histogram, 67<br />

historia, 15<br />

historiefönster, 15<br />

hjälp<br />

för en funktion, 40<br />

hjälpfönstret, 6<br />

hjälpfunktion, 6<br />

hold, 69<br />

import data, 35, 76<br />

inbyggda konstanter, 11<br />

input, 87<br />

internminne, 29<br />

inv, 80<br />

invers av matriser, 80<br />

justera text<br />

i Word, 45<br />

katalog, 30<br />

aktuell katalog, 32


112 INDEX<br />

klippa ut text<br />

i Word, 44<br />

klistra in text<br />

i Word, 44<br />

kolon - operatorn<br />

för matriser, 26<br />

kolon-operatorn<br />

för vektorer, 24<br />

kolumnvektor, 20<br />

konkatenera, 78<br />

konturdiagram, 67<br />

konturplottar, 96<br />

koordinataxlar, 64<br />

koordinater i grafer, 92<br />

kopiera text<br />

i Word, 44<br />

kovariansmatriser<br />

skapa mha eye, 26<br />

kursiv stil<br />

i Word, 45<br />

kurvbeskrivningar, 66<br />

kurvor<br />

i tre dimensioner, 94<br />

i tv˚a dimensioner, 62<br />

kvoten av polynom, 80<br />

läsa in variabler, 76<br />

clf, 62<br />

legend, 66<br />

length, 24<br />

line, 71<br />

linjär korrelationskoefficient, 97<br />

linjefärg, 63<br />

linjens egenskaper, 93<br />

linjetyp, 63<br />

linspace, 24<br />

load, 35<br />

logaritmskalor, 72<br />

loglog, 72<br />

lokala variabler, 39<br />

loop, 36<br />

M-filer, 15<br />

läsa in fr˚an disk, 16<br />

spara p˚a disk, 16<br />

mallhanterare i Word, 47<br />

mapp, 30<br />

marginaljusterad text<br />

i Word, 45<br />

markörer, 63<br />

markera text<br />

i Word, 43<br />

matrisalgebra, 23<br />

matrisekvationer, 80<br />

matriser, 22<br />

inverser, 80<br />

matrismetoden för minsta kvadratanpassning,<br />

82<br />

mean, 79<br />

medelvärde, 79<br />

mesh, 95<br />

meshgrid, 95<br />

minnesläcka, 30<br />

minsta kvadratanpassing<br />

med matrismetoden, 82<br />

minsta kvadratanpassning, 80<br />

nollställen för polynom, 79<br />

num2str, 88<br />

numerisk precision, 76<br />

numeriska variabler<br />

omvandla till textsträng, 77<br />

numrerade listor<br />

i Word, 49<br />

oändlig loop, 38<br />

ones, 24<br />

papperstorlek<br />

vid printning, 68<br />

paus i MATLABs utskrift, 19<br />

pause, 19<br />

pcolor, 96<br />

perspektiv i 3D grafer, 95<br />

plot, 62<br />

plot3, 94<br />

poly, 79<br />

polyder, 80<br />

polygon, 91<br />

polynom, 79<br />

polyval, 79<br />

PostScript, 68<br />

print<br />

option -v, 68<br />

print, 68<br />

printer<br />

default, 68<br />

välj, 68<br />

printopt, 68<br />

prod, 37<br />

produkter av polynom, 80<br />

projektioner, 96<br />

property editor, 65, 92<br />

punktlistor


INDEX 113<br />

i Word, 49<br />

quiver, 96<br />

rötter till polynom, 79<br />

radbyte, 87<br />

radvektor, 20<br />

rand, 24<br />

randn, 24<br />

redigera axlar, 92<br />

redigera grafer, 92<br />

rensa workspace, 76<br />

roots, 79<br />

round, 24<br />

rubrik<br />

i Word, 46<br />

rutnät, 64<br />

sökväg, 33<br />

save, 35<br />

scientific notation, 12<br />

search path, 33<br />

semilogx, 72<br />

semilogy, 72<br />

set, 93<br />

shading, 96<br />

sidbrytning<br />

i Word, 47<br />

sidnumrering<br />

i Word, 48<br />

skalärprodukt<br />

av vektorer, 21<br />

skrivbord, 4<br />

slingor, 36<br />

slumptal, 24<br />

spara grafik, 68<br />

spara variabler, 75<br />

spara workspace, 35, 75<br />

specfun, 23<br />

sprintf, 88<br />

stänga grafikfönstret, 62<br />

stairs, 67<br />

standardavvikelse, 79<br />

stapeldiagram, 66<br />

stavningskontroll<br />

i Word, 48<br />

std, 79<br />

stem, 67<br />

stolpdiagram, 67<br />

subplot, 70<br />

sum<br />

p˚a en matris, 25<br />

p˚a en vektor, 24<br />

surf, 95<br />

symboler<br />

i Word, 52<br />

tabeller<br />

i Word, 50<br />

tabelltext<br />

i Word, 51<br />

tabstopp, 87<br />

temporär lagring, 34<br />

text<br />

i grafer, 66<br />

text, 66<br />

textsträngar, 77<br />

titlar<br />

för grafer, 65<br />

title, 65<br />

transponera, 20<br />

tv˚adimensionella plottar, 62<br />

typsnitt<br />

i Word, 45<br />

understruken text<br />

i Word, 45<br />

undock, 77<br />

users guide, 87<br />

utskrift<br />

stäng av utskrift av resultat av kommandon,<br />

19<br />

utskrift av grafik, 68<br />

vänsterjusterad text<br />

i Word, 45<br />

värdet av polynom, 79<br />

växla fönster, 62<br />

variabelnamn, 11<br />

vektorer, 20<br />

skapa vektorer, 20<br />

verktygsfältet<br />

i Word, 47<br />

view, 95<br />

while-slingor, 37<br />

whitebg, 63<br />

Word<br />

ankra bilder, 51<br />

bildobjekt, 51<br />

ctrl-C, 44<br />

ctrl-W, 44<br />

ctrl-X, 44<br />

ekvationer, 52


114 INDEX<br />

fet stil, 45<br />

figurer, 51<br />

figurtext, 52<br />

formatmallar, 47<br />

fotnoter, 49<br />

högerjusterad text, 45<br />

infoga symboler, 52<br />

justera text, 45<br />

klipp ut text, 44<br />

klistra in text, 44<br />

kopiera text, 44<br />

kursiv stil, 45<br />

lägga in bilder, 69<br />

mallhanterare, 47<br />

marginaljusterad text, 45<br />

markera text, 43<br />

numrerade listor, 49<br />

punktlistor, 49<br />

rubriker, 46<br />

sidbrytning, 47<br />

sidnumrering, 48<br />

stavningskontroll, 48<br />

tabeller, 50<br />

tabelltext, 51<br />

typsnitt, 45<br />

understruken text, 45<br />

vänsterjusterad text, 45<br />

workspace, 13<br />

läs in, 35<br />

rensa, 76<br />

spara, 75<br />

spara workspace till diskspace, 35<br />

workspace browser, 75<br />

xlabel, 65<br />

ylabel, 65<br />

zeros, 24

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

Saved successfully!

Ooh no, something went wrong!