Introduktion till MATLAB Om laborationen Övningarna går ut på att bekanta sig med MATLAB och se hur man löser olika typer av problem. Arbetet är självständigt. Hoppa över sådant ni tycker verkar för lätt och tveka inte att fråga närvarande handledare om det är något niundrar. Avsnittshänvisningarär tillkursboken, Användarhandledning för MATLAB 5.För kommandon, variabelnamn och MATLAB-resultat används skrivmaskinsstil.för matematiska variabler och formler används kursiv stil. Grundläggande information om programmet Information från andra källor Datorövning 1 innehåller material som liknar följande kapitel i kursboken: Kapitel 1 Vad är MAT- LAB?, Kapitel 2 Att komma igång och Appendix A Introduktion, steg för steg. Det kan även vara intressant att öppna titta på Getting started i helpdesk. 1. Start och avslutning av MATLAB (Avsnitt 2.1) Starta MATLAB genom att klicka på MATLAB-ikonen. Ett s k kommandofönster öppnas. Du får bl a upp följande text: >> To get started, type one of these: helpwin, helpdesk, or demo. For product information, type tour or visit www.mathworks.com. Teckenkombinationen >> är MATLABs prompter. Den visar att MATLAB är beredd att ta emot kommandon. I exemplen nedan låter vi promtern vara med. Ett kommando ges efter MATLABpromtern och utförs då return-tangenten trycks ned. För att avsluta MATLAB: skriv exit eller quit Bra att veta redan nu: Vill du avbryta någon körning i MATLAB, men ändå stanna kvar i MATLAB: tryck ctrl-c. Det kan vara bra att prova några av de kommandon som föreslås ovan, speciellt demo och tour. Spar dock detta tills du har tid över. Sida 1
Introduktion till matriser i MATLAB MATLAB är ett s k interpreterande språk, vilket innebär att så fort man givit ett kommando, såfår mansvar.manbehöver dessutom aldrig typdeklarera variabler, utan inför dem när helst man dem behöver. 1. Använd MATLAB som en enkel räknedosa Prova att använda operatorerna +,, Λ, =,ˆsamtnågon matematisk funktion(avsnitt 2.4). Exempel: >> 2*3 + 4 Värdet lagras automatiskt i ans (answer) om inget annat variabelnamn anges. Du kan skapa egna variabler t ex genom att ge följande kommando: >> minvar = 2*3 + 10.6 Svaret lagras då i variabeln minvar. Observera att decimalpunkt skall användas; inte decimalkomma. Notera att svaret från MATLABinnehållervariabelnamnetsom angavs. Variabler används direkt i aritmetiska uttryck, detta gäller även variabeln ans. Prova att använda dina variabler men gissa först svaret: >> ans + minvar / 2 Prioritetsordningenfungerar precissomman väntar sig. Provaatt använda parenteser för att upphäva denna: >> (10 + minvar) / 2 Ge nu kommandot >> who så ser du vilka variabler som finns i arbetsarean. För att få mer information om variablerna, skriv >> whos den talar även om vilken storlek variablerna har. Vi skall om en stund skapa större variabler än den skalära minvar. För att få mer information om ett visst kommando i MATLAB, så skriver man >> help kommando Sida 2
prova nu >> help who Prova även att skriva enbart >> help Kommandon som ges utan att avslutas med semikolon, ;, gör att MATLAB skriver ut svaret genast. Om man inte vill ha svaret utskrivet så avslutar man kommandot med ett semikolon. ge nu följande kommando: >> minvar2 = 2*3 + 4; Skriv sedan who eller whos för att se att det faktiskt skapades en variabel i alla fall. Vill du se värdet av minvar2,så skriv bara variabelns namn: >> minvar2 Det går alltid att fåredapå en variabels värde genom att skriva dess namn, oavsett hur den skapats. 2. Vektorer i MATLAB (Avsnitt 2.2, 13.1) Namnet MATLAB kommer ursprungligen från MATrix LABoratory. Den grundläggande datatypen är en matris, vilket även kan ses som en slags tabell. (Vi tänker oss nu bara tvådimensionella matriser). En matris med m st rader och n st kolonner sägs ha storleken m n. I andra programmeringsmiljöer arbetar man med ett tal åt gången, men i MATLAB arbetar man alltså medhela matriser på ett smidigt och enkelt sätt. Om matrisen har storlek 1 1 såär det ett vanligt tal (skalär), om den är av storlek 1 n eller m 1 så kallas den för radvektor respektive kolonnvektor. En vektor kan ses som en slags punktmängd. Variabler i MATLAB är oftast vektorer och matriser, t ex behövs vektorer då man skall rita grafen till en funktion f (x). Prova nu följande: >> vkol = [ 1; 2; 3; 4 ], vrad = [ 5 6 7 8 ] Fler variabler kan definieras på samma rad genom att man använder kommatecken eller semikolon mellan variabeldefinitionerna. Sida 3
För att särskilja element i en kolonnvektor så används semikolon, ;. För att särskilja element i en radvektor såanvänds blanktecken, som ovan, eller kommatecken, som nedan: >> vkol = [ 1; 2; 3; 4 ], vrad = [ 5, 6, 7, 8 ] Skriv whos för att se vilka variabler du har. Hur gör du för att ändra enbart ett element i en vektor? Skriv nu >> vkol( 2 ) = 2.2 och se vad som händer. För att skriva ett kommando igen med endast små ändringar kan den bekväme prova att trycka på "-tangenten. Prova detta och ändra till >> vkol( 6 ) = 1 Vektorn utökas och de element som inte specificerades blir nollor. Vektorer kan också skapas med kortkommandon, s k kolon-notation eller med ett kommando som heter linspace.provaföljande: >> vektor = 0:8, vektor2 = 0:0.5:2, vektor2lin = linspace(0,2,5) Ändra linspace(0,2,5) till linspace(0,2,10) och jämför resultaten. Verifiera din upptäckt genom att se vad hjälpen säger >> help linspace Om man snabbt vill göra om en radvektor till en kolonnvektor, så kan man transponera den (dvs med apostrof, ). Prova med att skriva >> nyradvekt = vkol 3. Matriser i MATLAB Definiera en 3 3-matris: >> A = [ 8 1 6; 3 5 7; 4 9 2 ] eller såhär Sida 4
>> B = [ 1 2 3 4 5 6 7 8 9]; Raderna i en matris skils åt med semikolon, :, eller genom att trycka på return-tangenten. MATLAB ger inget svar innan man avslutat matrisen. Skriv whos igen nu för att se storleken hos matriserna. För att komma åt endast ett element så indexeras matrisen på samma sätt som vektorerna. Vad tror du händer nu: >> B, B(3,1) = A(1,3) Kommandot size kan användas om man vill se storleken på enmatris: >> size(a) Vill man spara matrisens storlek i två variabler m och n så skriver man: >> [m,n] = size(a) 4. Rita funktioner av typen f (x) Att rita funktioner av en variabel är lättimatlab.ritatexf (x) = sin(x) i intervallet [0, 3ß]. Skriv följande: >> x = 0:3*pi; >> y = sin( x ); plot( x, y ); Ettnyttfönster, s k grafikfönster, öppnas. Resultatet blir en kantig graf, eftersom enbart 10 punkter används. Skriv length(x) deller whos för att se längden på vektorerna x och y. Skalningen av axlar görs automatiskt. Vi ser här att sin-funktionen faktiskt kan ha en vektor som argument och returnera motsvarande resultat som en vektor, dvs matematiska funktioner i MATLAB fungerar elementvis på vektorer! Förklara vad som händer om endast y-värden ges (plot(y)). Prova även följande: >> x2 = linspace(0, 3*pi, 40); >> y2 = sin( x2 ); >> plot( x, y, -, x2, y2, -- ); Vad händer? Vad ger nu length(x2)? Varför ritas y 2 = f (x 2 ) ut i ett större intervall än y = f (x)? Sida 5
Ena linjen blev streckad genom att vi lade till parametern --, mer om linjeformatering finns i tabell 13.1, s252. Lägg till ett bakgrundsnät med kommandot grid. Man kan även använda fplot för att rita funktioner. Den fungerar dock enbart för MATLABs standardfunktioner (som sin(x), cos(x), exp(x),...) samt för egendefinierade funktioner som man skriver själv och lagrar i s k M-fil. 5. Programmera i MATLAB Som du säkert vet kan man programmera MATLAB på liknande sätt som t ex C++, dvs for-loop, while-loop och if-sats finns. Naturligtvis, kan man få samma resultat i exemplen ovan med hjälp av dessa kontrollstrukturer. Vi visar tvånyasätt att skapa vektorer med samma innehåll som x2 och y2 ovan, men sparar nu värdena i x3, y3 samt x4, y4.skrivföljande: >> n = 40; x3 = []; y3 = []; >> i = 1; >> while i <= n x3( i ) = 3*pi*( i - 1 )/( n - 1 ); y3( i ) = sin( x3( i ) ); i = i + 1; end >> clf; plot( x3, y3 ); grid; >> n = 40; x4 = []; y4 = []; >> h = 3*pi/( n - 1); >> for xx = 0:h:3*pi x4 = [ x4 xx ]; y4 = [ y4 sin( xx ) ]; end >> clf; plot( x4, y4 ); grid; Kolla att resultatet blir lika med: >> max( abs( x2 - x3 ) ), max( abs( y2 - y3 ) ) och på samma sätt för x4 och y4. Som du ser så finns flera sätt att skapa och bygga upp vektorer. Om möjligt så skall man dock välja kortkommandon (kolon-notation och linspace), eftersom det ger lättläst kod och dessutom är mycket snabbare än med vanlig loop! Sida 6
Nuskallviskapaenstörre matris som består av 10000 reella tal organiserade i 100 rader och 100 kolumner. Vi skriver här alla kommandon på samma kommandorad genom att skilja satser åt med semikolon eller kommatecken. Ge följande kommando: >> clear A >> A = zeros( 100, 100 ); >> for i=1:100, for j=1:100, A(i,j)=sin(i/10)*sin(j/10); end, end >> mesh( A ) Kommandot clear A; suddar ut variabeln A från MATLABs minne. Om man bara skriver clear suddas alla tidigare definierade variabler ut från minnet. Kommandot zeros(n,m) skapar en nollmatris av storlek N M, dvs en matris med bara nollor. På motsvarande sätt fås ettmatrisen med kommandot ones, enhetsmatrisen med kommandot eye och en slumptalsmatris med kommandot rand. Kommandot mesh ritar upp matrisen A som en graf i ett grafikfönster. Semikolon, ;, efter tilldelning av element till matrisen A undertrycker utskriften. Om du inte hade givit semikolon, så hade du fått en förfärlig massa utskrifter. Prova att genom att ge följande kommando: >> for i=1:5, for j=1:5, A(i,j) = sin(i/10)*sin(j/10), end, end Om man skriver end; end; däremot, så får man samma resultat, dvs semikolon efter end har ingen verkan på utskrifter i motsvarande loop. Fortsätt nu att prova några andra kommandon för att visualisera matrisen A.Skriv >> clf; surf( A ); colormap( jet ); colorbar; Fortsätt sedan med >> shading flat; Prova även några kombinationer av följande kommandon: surf, surfc, surfl, shading flat, shading interp, colormap( jet ), colormap( bone ), colormap( prism ). För mer information om färgskalor och 3D grafik, skriv help graph3d. 6. Lokal arbetskatalog För kommande övningar behöver du skapa en lokal arbetskatalog. Klicka på iconen Den här datorn, vidare till C: och katalogen Temp. Skapa en där en katalog med namnet matlab01. Sida 7
Skriv sedan >> addpath c:\temp\matlab01 Det går även att gå in under Set path i File-menyn. Spara fortsättningsvis alla filer du skapar i denna katalog. För att ändra aktiv katalog till din nyskapade katalog skriver du >> cd c:\temp\matlab01 7. Spara bilder Kommandot print används för att spara en ritad bild eller ta ut den på papper. Skriv >> help print för att se vilka format man kan spara bilden i. Det är vanligt att man inte hinner läsa all text som fladdrar förbi, prova igen >> more on >> help print då skrivs bara en liten del i taget ut på skärmen. Man trycker return för att fortsätta utskriften eller qför att avsluta den. Om du ger följande: >> print -djpeg bildnamn så sparas grafen som en bild påfilenbildnamn.jpg. Man kan även använda menyerna i grafikfönstret för att spara bilden på en fil.välj File-menyn och sedan Export. Blädderlistan Save as type visar ett antal format. I PC-miljögår det att skriva ut genom att gå in i grafikfönstrets File-meny och välja print. 8. Generering av funktionstabeller Om man istället vill ha en funktionstabell för en funktion, t ex y = x 2,såkanmansätta ihop de vektorer man har till en matris: Sida 8
>> x = 0:10; >> y = x.ˆ2; >> funktionstabell = [ x; y ] Här ser vi en s k elementvis operation. x.ˆ2 innebär att varje element i x kvadreras och svaret blir en vektor av samma längd som x. Punkten anges för att skilja elementvisa operationer från s k matrisoperationer. Matrisalgebra hör dock inte till denna kurs men finns översiktligt beskrivet i Appendix B. 9. Att ladda och spara data (Avsnitt 2.8) För att spara numeriska resultat påenfilanvänds kommandot save. Om det anropas utan parametrar lagras samtliga variabler i arbetsarean. Det är vanligt att andra program skall kunna läsa filen, då ger man parametern -ASCII vilket skapar en textfil istället för en binärfil. Prova att lagra en variabel i en binärfil: >> x = rand(10); >> save minvar.mat x Filen minvar.mat innehåller nu variabeln x. Det går nu att läsa in variabeln >> clear >> load minvar.mat >> x När data lagras i ASCII-format så sparas inte variabelnamnet. Då en matris inläses från textfil får variabeln samma namn som filen. För att läsa in datafiler som är av ostrukturerad karaktär finns kommandon fread, fscanf, fgetl,etc. M-filer: Kommandofiler och funktionsfiler (Avsnitt 2.9) När man börjar behärska MATLAB lite mer och man behöver många kommandon för att lösa ett problem, såär det klokt att spara dessa i en s k M-fil, dvs filer som har suffix.m. Det finns två sorters M-filer, dels kommandofiler och dels funktionsfiler. En funktionsfil måste innehålla en funktion som man definierar själv med kommandot function. En M-fil exekveras (körs) då man skriver filens namn (utan suffixet) när man är i kommandofönstret i MATLAB. Sida 9
Filen kan utnyttja redan definierade variabler, men kan även läsa in från tangentbord och skriva ut påskärmen. Du skall nu få provköra några M-filer som redan är färdiga. Hämta hem följande filer från kurshemsidan http://www.tdb.uu.se/edu/course/homepage/teknberei1/ ritafunk.m surprise1.m surprise2.m sork.m aritmetikspel1.m aritmetikspel2.m Testkör, svara på eventuella frågor och njut av resultaten! Nu skall du få skriva en egen liten kommandofil. Öppna editorn genom att skriva: >> edit Editorn fungerar ungefär som ett Word-dokument, t ex kan man klippa och klistra textrader. Man skriver in det man vill programmet skall göra i editorn, gärna snyggt och prydligt (rad-för rad), så det är lättläst för andra. Kommentarer inleds med %-tecken. Programmet utför kommandona i den ordning som de står i filen. Om någon kommandorad är för lång så skriver man tre punkter,..., sist pådenradsommåste avbrytas, t ex texten = [ Hej och välkommen till ett roligt program!,... Vi hoppas att du skall tycka om MATLAB. ]; disp( texten ); Skriv nu: % Mitt första program. % ex1.m disp( Hej! ); x = input( Ge ett tal: ); y = input( Ge ett till tal: ); sum = x + y; disp( Summan av talen blir: ); sum % prova även med disp(sum) här Spara programmet som ex1.m (antingen i File-menyn, med diskett-symbolen eller snabbast med ctrl-s). Flytta muspekaren till kommandofönstret och skriv Sida 10
>> ex1 då körs ditt program! Här visas även att inläsning från tangentbord sker med input och utskrift påskärm med disp. Nukanduändra lite i editorn, t ex prova disp(sum) istället. Kom ihåg att spara nya versionen innan du provar att köra det modifierade programmet. Nu ska du få skriva en egen funktion och spara den på f.m Öppna nytt fönster i edit (File - New) och skriv in följande: function y = f( x ) % MATLAB-funktion som returnerar värdet % av en matematisk funktion % f.m y = x.*x - sin(x) + 5; Spara som f.m. Nu kan du i kommandofönstret skriva följande: >> v = linspace(0,2*pi); >> w = f(v); >> clf; >> plot( v, w ); Eller, ännu snyggare: Öppna en ny fil, ex2.m, i vilken du lägger in dessa kommandon och modifierar så attanvändaren kan ge intervallet som funktionen skall ritas i: % Ex2.m % Lek med funktioner. disp( Program som ritar en specialfunktion i intervallet [a,b] ); a = input( Ge a: ); b = input( Ge b: ); v = linspace(a,b); w = f(v); clf; plot( v, w ); % Testa även med area(v, w)... Sedan kör du programmet med >> ex2 Sida 11
Om du vill se vilka filer du har i din aktuella katalog, såskriv >> dir Innehållet i en M-fil kan du få med kommandot type,prova >> type ex2 >> type plotyy Andra katalogkommandon finner du i Avsnitt 2.9. Skriv nu >> help ex1 samt >> help f Vad händer? Vi nämnde ovan att man kan spara en MATLAB-session med kommandot diary. Man kan återanvända kommandona om man editerar diary-filen och döper om den så det blir en M-fil. Skriv: >> diary matrisen clear; n = 5 A = magic(n); n = 10 A = magic(n); clf; subplot(2,1,1); surf(a); subplot(2,1,2); mesh(a); >> diary off Modifiera filen matrisen med edit och kalla den matrisen.m Nu kan du testköra ditt nya program genom att ge >> matrisen Sida 12
Demonstrationsexempel och information om MATLAB För att fåhjälp i MATLAB så kan man t ex använda helpdesk, help eller helpwin För demonstration av MATLAB, SIMULINK och s k toolboxar (Communications, Control System, Financial, Higher-Order Spectral Analysis, System identification, Image Processing,...) prova nu demo-kommandot: >> demo och välj sedan önskad demonstration. Ibland medför en demonstration att motsvarande MATLABkommandon skrivs ut i kommandofönstret. Vill du avbryta, såtryckctrl-c. 10. Allmän information om MATLAB-produkter För att få information om återförsäljare, böcker etc som har med MATLAB att göra så kanmanfå stor hjälp av MathWorks hemsidor. Öppna din internetbläddrare (t ex Netscape eller Explorer) och ge URL: http://www.mathworks.com/ Bilden på sid 468 har ändrats, men innebörden är densamma på Vilka MATLAB-böcker finns? Se t ex under och klicka på General. http://www.mathworks.com/products/ http://www.mathworks.com/support/books/ Överst bland alla böcker står den du just nu har framför dig! Klicka och se vilken information som finns om denna. Varning! Deras länk är felaktig, för att få information om kursen måste du ge följande URL http://www.tdb.uu.se/οmatlab Sida 13
11. Tillämpningar där MATLAB använts (Avsnitt 1.1) Ge kommandot >> tour välj MATLAB In Industry. Bl a kan man se här att Forskmarks kraftstation och SAAB Military aircraft bygger sina simuleringsmodeller i MATLAB. Samma information kan erhållas på: http://www.mathworks.com/industry/ Sida 14