Introduktion til MatLab Kasper Bjering Jensen, Tinne Hoff Kjeldsen, RUC, september 2010 MatLab forkortelse for Matrix Laboratorium Gå sammen to og to og arbejd jer igennem side 1-3. Ca. kl. 14 springer I ned til afsnittet Mfil til lineær regression i MatLab på side 3. Kl. 15 stopper I og vi mødes i plenum. Side 4-11 er ment som yderligere introduktion til MatLab kig det igennem, der er bl.a. en forklaring af vektorstrukturen i MatLab, løkker, træningsopgaver og en liste med kommandoer. Inden vi går i gang med MatLab Alle opretter et base katalog og et underkatalog hertil med navnet matlab: Log på Højre-klik på Start og klik på Stifinder Find Jeres H-drev Klik på det lille +, så ser I Jeres mappestruktur Klik på Jeres hovedmappe på H-drevet: navn på Hardy\sys\user [H:] Gå op i Filer - ny - mappe. Skriv base i "mappen" I stifinder: klik på base mappen Gå op i Filer - ny - mappe. Skriv i matlab i "mappen" Luk stifinder: klik på x i øverste højre hjørne I gang med MatLab Vi arbejder i kurset med MatLab version 6.5, som du åbner fra dit Novell-vindue. Når du åbner det, skulle du gerne se noget der ligner nedenståe skærmbillede. Det er opdelt i 4 dele: 1. Symbolet >> er programmets kommandoprompt lokaliseret i Command Window (kommandovinduet). Her indtastes spørgsmål og andre retningslinjer til programmet, i form af et særligt kodesprog. 2. Current directory (aktuel sti) angiver det sted i din computers filstruktur, hvor du arbejder. 3. Workspace angiver navn og størrelse på vektorer (og matricer) som du har oprettet. Det gennemgås på side 4, hvad en vektor er i MatLab-forstand. 4. Command History angiver koder tidligere indtastet i kommandovinduet. 1
Nu opretter I jeres første MatLab-fil (den kan tegne grafen for funktionen f(x)=3x+4, x [0,8] ) Gå op i file - new - M-file (I åbner dermed MatLab editoren) Skriv nu følge: x=0:0.5:8; f=3*x+4; plot(x,f, * ) figure plot(x,f) Gå op i file - save as. Find nu base mappen og dobbeltklik på den Find nu matlab mappen og dobbeltklik på den Nede i vinduet filename skriver I: myfirstfile (skriv oven i 'untitled1') Klik på save Nu sættes MatLabs arbejdskatalog Gå ud i MatLabs kommandovindue (det med >>) Skriv: myfirstfile (tryk på enter) svaret er sandsynligvis følge: Undefined function or variable 'myfirstfile ' skriv: pwd (tryk på enter) (pwd står for print working directory, så her får man altså at vide hvilket katalog MatLab arbejder eller kigger i) resultat: ans = h:\ skriv: cd base\matlab (tryk på enter) resultat: ans= h:\base\matlab (Nu har I sat MatLab til at arbejde fra jeres matlab-mappe. I kan også klikke jer frem til jeres matlab-mappe i Current Directory -feltet. Det skal I gøre hver gang I starter MatLab) skriv: myfirstfile (tryk på enter) Hvis det ikke virker så skriv: addpath H:\base\matlab (tryk på enter) skriv: myfirstfile (tryk på enter). Nu skulle det gerne virke! I skulle gerne få to figurere Figure No. 1 og Figure No. 2. Hvad er forskellen på dem? Hvorfor er der forskel? Inden I går videre, skal I lukke de to figurere Nu er vi klar til at gå igang med MatLab I skal nu tegne grafen for funktionen ƒ(x) = e x, x [0, 10] Skriv i kommando-vinduet (ved >> som er kommandoprompt en): x= 0:1:10 (enter) y=exp(x) (enter) Tryk nu på tilføj ; efter exp(x) (enter) (nu vises y-værdierne ikke) Skriv: 2
plot(x,y,'*') (enter) hold on (enter) (med denne kommando plottes graferne i det same vindue) plot(x,y) (enter) (Det ser ikke så pænt ud!) hold off (enter) (Slår hold on funktionen fra igen) x = 0:0.1:10; (enter) y = exp(x); (enter) plot(x,y) (enter) Inden I går videre, skal I lukke figuren I skal nu tegne grafen for funktionen ƒ(x) = 2x, x [-10, 10] Skriv: x = -10:1:10; (enter) y = 2*x (enter) plot(x,y) (enter) Inden I går videre, skal I lukke figuren I skal nu tegne grafen for funktionen ƒ(x) = x 2, x [-10, 10] Skriv: y=x*x (enter) resultat: inner matrix dimensions must agree skriv: y=x.*x (enter) skriv: y=x.^2 (enter) (hvad er forskellen på de to kommadoer?) plot(x,y) (enter) Inden I går videre, skal I lukke figuren Herefter arbejder I videre med det der står i lærebogen, fra side 200 prik 3 til afsnit C.2 side 202. Når I er færdige med det, fortsætter I med nedenståe: Nu skal I lave en M-fil vælg file - new - M-file (I åbner dermed MatLab editoren) I editorvinduet skriver I: x=-3:0.1:3 for b=-5:1:5 y=x.^2-b*x-1; plot(x,y) hold on vælg file - save as I vinduet 'filename' skriver I: sjov Nu skal I køre Jeres m-fil I kommandovinduet skriver I: sjov (enter) Hvad gør programmet? (Hvis I får problemer, så skriv: addpath h:\base\matlab (enter)) M-fil til lineær regression i MatLab Nu skal I lave en M-fil, der kan lave lineær regression i MatLab. Gem den og brug den som skabelon, hver gang I får brug for at lave lineær regression. I bliver ledt igennem oprettelsen af filen i afsnit 2.5 Lineær regression i MatLab side 45 i Lærebogen så arbejd jer igennem dette afsnit. Resten af tiden kan I bruge på at arbejde med 1. porteføljeopgave (en af opgaverne 1.43-1.46), som skal være færdig fredag d. 17/9. Se Krav til 1. porteføljeopgave på kursets hjemmeside under menupunktet ugesedler. 3
Grundlægge koder Det mest centrale element i arbejde med MatLab er vektorer. En vektor er et en-dimensionalt talskema ketegnet ved et navn og en længde. Navnet er typisk et eller flere bogstaver. Længden angiver antal positioner (eller koordinater) i vektoren. Længden er altså altid et positivt heltal. Et navn på en vektor kunne være x og en længde kunne være 7. Det betyder at vektoren x består af 7 tal, som står i en bestemt rækkefølge. Eksempelvis: x = [23 11 19 7 58 23 0] Det er vigtigt at forstå konsekvensen af at tallene står i en bestemt rækkefølge. Det betyder f.eks. at tal kan optræde flere gange (som i eksemplet) og det betyder at ovenståe vektor er forskellig fra eksempelvist nedenståe vektor y, selvom de indeholder de samme tal: y = [7 19 58 0 23 11 23] For at oprette vektoren x med ovennævnte indhold, indtastes blot ovennævnte udtryk ved kommandoprompten efterfulgt af tryk på enter. Som vist på billedet herunder, angiver MatLab straks vektoren med navn og indhold i kommandovinduet. Samtidigt figurerer vektoren nu med navn og størrelse 1 i workspace og den indtastede kommando er registreret i kommandohistorikken. 1 Angivelsen af størrelsen som 1x7 betyder at vektoren består af én række på syv tal. En vektor er en speciel udgave af det man i matematik kalder for en matrix. En matrix er et skema med et antal rækker med hver samme antal tal. F.eks. kan en 3x4-matrix se ud som herunder. En vektor er netop en matrix med kun én række. 7 12 4 31 17 56 8 0 3 4 4 2 4
Generelt betegnes vektor x med længde n oftest med notationen: x = (x1, x2, x3,, xn) Denne notation angiver at vi nummererer pladserne i vektoren. Nummeret kaldes ofte for indeks. For ovenståe vektor x gælder altså følge: Indeks 1 2 3 4 5 6 7 Værdi 23 11 19 7 58 23 0 Er vi af en eller anden grund særligt interesseret i tallet på et koordinat med et bestemt indeks, kan vi kalde værdien med vektorens navn efterfulgt af indekset i parentes. F.eks. gælder der at: x(1)=23 x(4)=7 x(7)=0 Prøv at kalde de forskellige koordinater ved at skrive x(1), x(4), osv. i kommandopromten. Det bør se ud som ovenfor til højre. Prøv nu at oprette en vektor y, med værdier i følge rækkefølge: 1, 7, 3, 48, 13, 52 og 31. Det bør nu figurere i dit workspace, som vist her for neden til højre. Det ses at de to vektorer x og y som forventet har den samme længde. Vi vil da ofte være interesseret i at lave et punktplot i et koordinatsystem af punkterne (x1,y1), (x2,y2), (x3,y3), osv. Skriv derfor i kommandoprompten: plot(x,y, * ). Forklar figuren (ses herunder til venstre). Prøv kommandoen: plot(x,y). Hvad er forskellen? (Se figuren herunder til højre). Prøv og diskuter kommandoen: plot(x,y, *- ) (den resultere figur er ikke afbilledet her). 5
Ofte kan man have behov for at definere en vektor med rigtig mange tal, som vokser på en jævn og pæn måde. F.eks. alle tal fra 0 til 10. I så fald kan man bruge følge genvejskommando: t = 0:1:10 Denne vil oprette vektoren t med længde 11, som konkret ser sådan ud: t = (0 1 2 3 4 5 6 7 8 9 10). I ord beder kommandoen MatLab om at oprette en vektor med navnet t, hvis første koordinat skal være 0 og hvis koordinater derefter skal springe med afstanden 1 op til 10, som skal være sidste koordinat 2. Prøv selv, jf. nedenståe billede. Det er muligt at lave nye vektorer ved hjælp af regneoperationer på eksistere vektorer. For regneoperationer benyttes følge symboler: + * / ^ Plus Minus Gange Dividere Opløftet i laves med to tryk på ^ Et eksempel kan være at man ønsker at oprette en vektor y, der skal have samme længde som x, og hvor koordinatet yi er frembragt ved at gange ti med 2 og lægge 3 til. Da kan man skrive: y=2*t+3 Der oprettes nu en ny vektor y med de ønskede koordinater. Tjek at det passer. Da vektorerne t og y er lige lange, kan du nu lave et punktplot af disse. Prøv det. Ser grafen ud som du havde forventet? Hvordan hænger den sammen med måde du beregnede indholdet af vektoren y på? Hvorfor er der denne sammenhæng? 2 Det sidste tal angiver maks-værdien for talrækken i vektoren. Skrives f.eks. t=0:3:10 fås vektoren t = (0 3 6 9). 6
MatLab kan altså bruges til at afbillede funktioner med herover den rette linje y = 2x+3. Grundideen er at man først opretter en vektor med den afbillede funktions domæne ovenfor t. Derpå opretter man via passe regneoperationer på domænevektoren, en vektor med tilhøre billeder af domænet. Endeligt plotter man de to i et koordinat system. Et eksempel mere: Et objekt kastes fra ca. 1,5m højde lodret op i luften, med starthastigheden 15 m/s. Hastigheden aftager som objektet stiger, indtil det står stille. Derpå falder objektet hurtigere og hurtigere mod Jorden. Hvis vi kalder afstanden fra Jorden til objektet til tiden t for S(t) kan denne beskrives matematisk med udtrykket S(t)=-4,9 t 2 +15 t + 2. For at afbillede denne funktion, skriv: t = 0:1:5 S = -4.9*t.^2+15*t+2 plot(t,s) Det giver kurven herunder til venstre. Formen kan godt ligne den forventede (?) parabelform, men er meget kantet. Det skyldes en vigtig pointe for omgang med grafer i MatLab. Programmet kan ikke selv genke funktionsudtrykket den plotter alene punkterne (t1,s1), (t2,s2), osv. og forbinder dem med rette linjer fra punkt 1 til 2, 2 til 3, 3 til 4, osv. Vil man have en mere præcis graf, må man altså lave et bedre domæne. Prøv f.eks. med t=0:0.01:5. Husk at genberegne S, når du ændrer t. Nu får man grafen herunder i midten. Denne gang ser den pæn ud. Men som det sidste billede viser, er den stadig kantet når man zoomer tilstrækkeligt langt ind. Valget af domænet er altså afgøre for hvor præcis en graf man får. Et par bemærkninger til ovenståe: MatLab benytter engelsk decimalkomma dvs. punktum (altså 4.9 og ikke 4,9 ) Fortegnsminus er det samme som subtraktionsminus og sættes blot foran tallet. Hvis man vil opløfte koordinaterne i en vektor enkeltvis i samme potens, skal man sætte punktum foran ^. Ellers tror MatLab man laver det der hedder Matrix-multiplikation. Det samme gælder hvis du skal gange eller dividere to vektorer altså t.*s og t./s Da du plottede den finere graf overskrev den automatisk den gamle. Havde du ønsket at oprette grafen oven i den anden, skulle du have brugt kommandoen hold on. Havde du ønsket at oprette den i et nyt vindue, havde du kunnet anve kommandoen figure. 7
M-filer Ofte skal man bruge den samme stump kode igen og igen eller man skal bruge en meget lang kode. I begge tilfælde kan det være en fordel at kunne skrive og gemme hele koden, før man beder MatLab om at køre denne. Det gøres i såkaldte M-filer. Klik på ikonet for blank/ny side for at oprette en ny M-fil. Prøv at skrive nedenståe (t.v.) kode ind i filen og gem den under navnet test.m. Du kan derefter køres på tre måder: Ved at trykke F5, ved at lukke filen og højre-klikke på den i Current Directory vinduet og vælge Run (som herunder til højre), eller ved at skrive navnet test som kommando i kommandoprompten. Hvis du vil ændre i koden efter at have lukket filen, skal du blot dobbeltklikke på den i Current Directory -vinduet. Bemærkninger til ovenståe: Man kan skrive pi for at få den velkte værdi π. Der findes en række funktioner der nemt anves. F.eks. log for naturlogaritmen (det vi tit kalder ln ), exp for eksponentialfunktionen (det vi ker som e x ) og sin for sinus. På side 205-208 i noterne er en liste med nu flere funktioner. Hver gang programmet definerer en vektor, skriver MatLab hele vektorens indhold ud i kommandovinduet. Se selv ved at køre programmet fra kommandoprompten. Dette kan forhindres ved at afslutte vektordefinere linjer med semikolon. Prøv at sætte semikolon efter linje 1-5 i programmet og kør det igen. Din fil blev gemt i den aktuelle sti. Hvis du lukker MatLab ned og åbner det igen, skal du vælge den samme sti, for at kunne køre dit program herunder at have adgang til det via Current Directory -vinduet. 8
For-End løkker Meget ofte vil man have behov for at udføre mange operationer i træk, hvor kun en enkelt indgåe parameter ændrer sig. I de tilfælde skal man benytte for- -løkker. Grundstrukturen i en sådan ser ud som følger: for i=a:b:c programkode 1 programkode 2 Programkode n Dette betyder. Gennemløb løkken mellem for og et antal gange. Ved første gennemløb skal i antage værdien a. Ved andet gennemløb skal i have værdien a+b, ved tredje gennemløb a+2b, osv. indtil i når værdien c. Den ændre variabel (her kaldet i) er altså en vektor med længde 1, som ændrer tallet på dets enlige koordinat for hvert gennemløb. Øvelse 1 Prøv f.eks. i en M-fil at indtaste nedenståe kode (fra noterne s. 202) og kør derefter filen: x=-3:0.1:3; for b=-5:1:5 y=x.^2-b*x-1; plot(x,y) hold on Hvad kom der ud af det? Forklar udkommet ved at analysere koden hvad gør programmet? Øvelse 2 Prøv at indtaste nedenståe kode og kør derefter filen: x=0:0.1:10; for i=1:1:100 F(i)=(4+5*x(i))/(x(i)^2+3); plot(x,f) Du får fejlmeddelelsen Vectors must be the same lengths. Hvorfor opstår denne fejl? Ret programmet så den ikke opstår igen. Forklar hvad der sker inde i løkken. Hvorfor var det ikke nødvigt at bruge en løkke i dette tilfælde? Skriv et udtryk op der er lige så brugbart! Der er altså to pointer her: 1) Man kan bruge for--variablen til at kalde skifte koordinater i en vektor (kræver heltalsværdier) og 2) man kan ændre (og oprette) en vektor koordinat for koordinat. 9
Øvelse 3 Prøv at indtaste nedenståe kode og kør derefter filen: x=0:0.1:10; for a=-2:1:2 for b=-10:5:10 y=a*x+b; plot(x,y) hold on Forklar hvad der sker inde i løkken og hvorfor udkommet er som det er. Pointen her er, at hvis man har behov for to variere størrelser, kan løkker bygges ind i hinanden. Øvelse 4 Prøv at indtaste nedenståe kode og kør derefter filen: N(1)=2; for j=2:1:20 N(j)=(N(j-1)+1)/(N(j-1)-1); plot(j,n(j), * ) hold on Forklar hvad der sker i løkken og hvorfor udkommet er som det er. Hvad sker hvis N(1) ændres? Pointen er at en for--løkke kan bruges til at frembringe værdier successivt dvs. én ad gangen, hvor en værdi afhænger af en eller flere forgåe værdier. Dette gøres bl.a. ved at benytte regneoperationer på koordinatnumre. En anden pointe er, at man kan plotte punkter et ad gangen. Øvelse 5 I øvelse 1 fremkaldtes en familie af parabler. Disse parablers toppunkter ligger selv på en parabel. Udvid scriptet fra øvelse 1, så det tydeligt ses at dette er sandt. Øvelse 6 Fibonacci-talrækkens første to tal er 0 og 1. Derpå gælder at de øvrige tal i rækken frembringes som summen af de to foregåe. Lav et program, der danner en vektor med de første 1000 Fibonaccital. Øvelse 7 Standardformlen for en parabel er y = ax 2 +bx+c. Lav et program der viser hvad der sker med parablen, når man ændrer på de tre størrelser a, b og c. 10
Øvrige kommandoer MatLab har naturligvis en hel hob af kommandoer og funktioner, som gør det muligt at lave ting af meget avanceret karakter. Her skal blot nævnes et vigtigt eksempel: Help Kommandoen helpbruges til at spørge om en bestemt kommandos funktion. Skriver man f.eks. help plot fås nedenståe resultat: Heraf kan f.eks. ses, at man med plot-kommandoen har en lang række af muligheder. F.eks. kan man ændre grafer og symbolers farver, man kan benytte andre punktmarkører * og man kan få forskellige typer af stiplede grafer. Prøv dig frem! Help-kommandoen er ekstremt brugbar, hvis man skal finde ud af noget om en bestemt kommando. 11