kompendium - Fysikum - Stockholms universitet
kompendium - Fysikum - Stockholms universitet
kompendium - Fysikum - Stockholms universitet
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