HANDLEDNING FÖR MATLAB 5.3
sammanställd av Lennart Edsberg
INNEHÅLLSFÖRTECKNING
1. Introduktion 1
2. Grunder
2.1 Skalärer, vektorer och matriser 2
2.2 Utskriftsformat 3
2.3 Hur man ger kommandon 4
2.4 Aritmetiska uttryck och elementära funktioner 4
2.5 Räkna antalet aritmetiska operationer 5
2.6 Avbrott, lagring av data 5
2.7 Utskrift av resultat på papper 6
2.8 Några enkla kommandon för vektor/matris-data 6
2.9 Komplexa tal
3. Hur man skapar nya matriser
3.1 Matrisbyggande funktioner 7
3.2 Matrisalgebra 8
3.3 Polynomkommandon 8
3.4 Normer och konditionstal 9
3.5 Elementära funktioner opererande på vektorer/matriser 9
3.6 Att utvidga redan definierade matriser 9
3.7 Kolonnotation, generering av vektorer 10
3.8 Att skapa delmatriser 10
4. Villkor och repetition i MATLAB
4.1 Villkor 11
4.2 Villkorskommandot i MATLAB 11
4.3 Repetitionskommandot FOR och WHILE 12
5. Grafik
5.1Tvådimensionella punktmängder och kurvor
5.1.1 Kommandot plot 13
5.1.2 Flera fönster på skärmen 14
5.1.3 Olika typer av koordinatsystem 15
5.1.4 Skalning 14
5.1.5 Text i grafiska bilder 15
5.1.6 Grafisk inmatning 15
5.1.7 Utskrift av grafer på papper 16
5.2 Tredimensionella kurvor 16
5.3 Tredimensionella bilder 16
6. Programmering i MATLAB
6.1 MATLABs kommandofiler 18
6.2 In/utmatning till/från kommandofiler 18
6.3 Funktionsfiler 19
6.4 Allmänt om m-filer 22
7. Körning av MATLAB på olika datorsystem
7.1 MATLAB vid X-terminal 23
7.2 MATLAB på Macintosh 23
7.3 MATLAB på IBM-PC 24
8. Skillnader mellan Matlab 3.5 och 4.2 25
9. Blandade exempel 26
10. Sessionsexempel:dagbok, körning, utskrift 28
Inledande laboration 29
Referenslista till MATLABkommandon 39
Lathund
1 INTRODUKTION 15/8-98
MATLAB är ett interaktivt matematikprogram konstruerat för numeriska beräkningar och visualiseringar av matematiska problem. Namnet MATLAB står för MATrix LABoratory och var ursprungligen ett program skrivet i Fortran av den amerikanske professorn Cleve Moler i början av 70-talet och avsett att användas i undervisning i Linjär Algebra. Programmet har sedan dess skrivits om i objektorienterad C samt utökats och omarbetats i flera versioner, f.n. version 5.2. MATLAB kan köras på många olika datorer, från PC till arbetsstation och program skrivna i MATLAB kan utan problem flyttas mellan olika datorer. Matlab marknadsförs i USA av The MathWorks Inc, email: info@mathworks.com och i Sverige av Comsol Europe AB, email: info@comsol.se. Dagsaktuell information om produkten finner man på WWW-sidan http://www.comsol.se
MATLAB är ett kommandostyrt program. Varje programrad som ges i MATLAB utförs direkt och resultatet kan avläsas på skärmen. Detta gör att MATLAB kan användas som avancerad kalkylator vid lösning av mindre problem. I MATLAB kan man även exekvera kommandon som ligger i sekvens på en fil och därvid kombinera repetition, kontroll av logiska uttryck, inläsning och utskrift, vilket gör att MATLAB även fungerar som ett programspråk. Satserna liknar mycket dem som bygger upp programspråket Pascal.
Även funktionsbegreppet finns implementerat i MATLAB, vilket gör att man på ett strukturerat, effektivt och lättdokumenterat sätt kan lösa mer komplicerade uppgifter.
Styrkan hos MATLAB ligger i den kompakta notationen, vilket gör det möjligt att utföra beräkningar med ett fåtal kommandon, som i ett vanligt programspråk annars skulle krävt ett stort antal satser. I beräkningar där vektorer och matriser ingår, finns speciella satser i vilka indexhantering inte behöver programmeras. Med denna möjlighet till "vektorisering" blir programmen mycket kompakta, men för den skull inte svåra att förstå. En ytterligare bidragande orsak till programmens korthet i MATLAB är det stora antal fördefinierade funktioner som finns tillgängliga i olika bibliotek. Möjligheten att koncentrera sig på den bakomliggande numeriken snarare än att fördjupa sig i själva kodningen gör att den som inte är så förtjust i programmering borde finna sig väl till rätta. En annan styrka hos MATLAB ligger i den enkelhet med vilken man kan få funktionssamband representerade grafiskt såväl 2-dimensionellt som 3-dimensionellt. Med enkla kommandon kan man få plotbilder med markerade axlar i linjär eller logaritmisk skala och kurvorna utmärkta med symboler eller i olika färger.
Denna manual är en kortfattad beskrivning av de viktigaste kommandona i MATLAB 5.2 och lämpar sig som lathund i en grundkurs i numeriska metoder. En fullständig beskrivning av allt som finns i MATLAB finner man i MathWorks egna manualer, dvs 1) i referenserna nedan. En mer omfattande användarhandledning finner man i referens 2).
Denna 7:e upplaga av "Användarhandledning för MATLAB" beskriver MATLAB 5.2, en version som funnits tillgänglig på marknaden i drygt ett år och som är en uppgradering av MATLAB 4.
REFERENSER:
1) MATLAB, High-Performance Numeric Computation and Visualization Software:a) User's Guide,
b) Reference Guide, c) New Features Guide, d) Building a Graphical User Interface, e) External
Interface Guide. The Math Works Inc., 24 PrimePark Way, Natick, Massachusett 01760, USA
2) Användarhandledning för MATLAB 4.2, Eva Pärt-Enander, Pernilla Isaksson, Bo Mellin, Anders
Sjöberg, Institutionen för teknisk databehandling, Uppsala Universitet, mars 1995
-1-
2 GRUNDER
2.1 SKALÄRER, VEKTORER OCH MATRISER
Den grundläggande datatypen i MATLAB är en matris med reella eller komplexa element. En matris med en enda rad eller kolumn kallar vi en vektor, en matris med endast en rad och en kolumn kallar vi en skalär.
En matris identifieras av ett variabelnamn bestående av bokstäver, siffror och tecknet _. Det första tecknet måste vara en bokstav. MATLAB skiljer på stora och små bokstäver så variabeln A och variabeln a är olika variabler.
En matris är ett rektangulärt schema av tal. Vi säger att en matris har storleken m x n om den har m rader och n kolumner. En kolumnvektor av storleken n är en n x 1-matris, en radvektor en 1 x n-matris. En skalär är en 1 x 1-matris.
En matris definieras genom att man tilldelar ett värde till dess variabelnamn. Detta sker med följande tilldelningskommando:
variabelnamn = uttryck
Efter uttryck trycker man på Retur-tangenten. Detta gör man f.ö. alltid efter det man har givit ett kommando i MATLAB.
Tilldelning kan ske på olika sätt, det enklaste är att ge elementen radvis, omgivna av vänster och höger hakparenteser. Element i vektorn/matrisen åtskiljs med blanktecken eller kommatecken. Rader i matrisen åtskiljs av semikolon eller genom att trycka på Retur-tangenten. Hakparenteser kan utelämnas vid tilldelning av en skalär.
I nedanstående exempel och därpå följande exempel är >> den symbol (prompter) som MATLAB skriver ut och som indikerar att ett kommando kan ges:
Ex. >>a=5.2
a=
5.2000
>>x=[2 4.5 -2.1E2 4/7 2*sin(1.3*pi)/4]
x=
2.0000 4.5000 -210.0000 0.5714 -0.4045
>>A=[1 3 2;4 8 -2;3 0 1;5 1 1]
A=
1 3 2
4 8 -2
3 0 1
5 1 1
Observera att elementen kan skrivas som heltal, decimaltal, bråk eller aritmetiska uttryck. Observera även att värdet på den tilldelade variabeln skrivs ut direkt efter att den blivit tilldelad.
Vill man undertrycka denna utskrift skriver man semikolon direkt efter tilldelningen:
Ex. >>a=5;
>>y=[6 0 1 -4 18 2 -17];
- 2 -
Vill man ha en radvektor skriver man blanktecken (eller kommatecken) mellan elementen. En kolumnvektor fås om man skriver semikolon mellan elementen.
En situation som är vanlig vid t.ex. plottning av funktionssamband är att man vill generera en vektor med ekvidistanta värden.
Ex. >>x=[-0.5 -0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7];
För sådana situationer finns följande specialkommando som ger en radvektor (se 3.7):
>>x=-0.5:0.1:0.7;
En matris eller vekor kan även tilldelas värden genom elementvis tilldelning. Obs! När man refererar till element används runda parenteser.
Ex. >>A(1,1)=2.3; A(1,2)=-1.3; A(2,1)=4.5; A(2,2)=7.9;
Om man i efterhand vill kontrollera vilket värde en variabel har skriver man bara variabelnamnet:
Ex. >>A             >>A(2,1)
A=             A(2,1)=
2.3 -1.3
4.5 7.9              4.5
I MATLAB finns fördefinierade variabler. Några av dessa är eps, pi, inf, NaN , i och j .
eps returnerar maskinnoggrannheten, pi returnerar ett närmevärde till p med 15 decimaler. inf är definierat som 1/0 och NaN (Not a Number) är relaterad till inf och erhålles som svar då beräkningar såsom 0/0, inf/inf etc utföres. Variablerna i och j är reserverade för imaginära enheten.
Variabler deklareras inte i MATLAB. De variabler som införs (genom att ge tilldelningssatser) och deras värden sparas i den arbetsarea som man blir tilldelad av MATLAB.
För att kontrollera vilka variabler som finns i arbetsarean kan man när som helst under körningen ge
kommandot who, som visar vilka variabler man har. Kommandot whos visar mer, bl a variablernas dimensioner. WORKSPACE ........
För att ta bort variabler används MATLAB-kommandot clear . Observera att alla MATLAB- kommandon skrivs med små bokstäver:
Ex. >>clear raderar ALLA variabler i arbetsarean
>>clear A raderar variabeln A
>>clear a1,a2,a3,a4 raderar variablerna a1,a2,a3,a4
>>clear global raderar globala variabler (se 6.3.1)
>>clear all raderar alla variabler, både de globala och de i arbetsarean
I ndeanstående exempel illustreras användningen av kommentarer i MATLAB; en kommentar kan läggas in på en rad om man inleder med tecknet % och gäller då till slutet på raden. Detta används med fördel då man skriver program i MATLAB (se avsnitt 6 ).
Ex. >>a=a+1; % variabeln a byter nu värde
- 3 -
2.2 UTSKRIFTSFORMAT
Resultatet av varje beräkningssats skrivs på skärmen om man inte avslutar satsen med ett semikolon. Resultat av beräkningar kan visas på skärmen på ett antal olika sätt, bl.a. i standardformat eller i s.k. kort decimalformat (med 4 decimaler). Utskriftsformatet har ingenting att göra med hur noggrannt själva beräkningarna i MATLAB är utförda, vilket alltid sker med ca 16 siffror. Vill man ändra utskriftsformetet för att se fler siffror i resultaten kan man använda kommandot format:
>>format long ger 15 siffror i utskriften
>>format long e ger utskrift i flytande form med 15 decimaler
>>format short e ger utskrift i flytande form med 4 decimaler
>>format compact ger kompaktare utskrift (utan blanka rader)
>>format ger standardformatet åter
2.3 HUR MAN GER KOMMANDON och HUR MAN FÅR HJÄLP
När MATLAB startas, öppnas ett kommandofönster på skärmen och promptern >> syns längst upp till vänster. Efter promptern kan man ge ett MATLAB-kommando, t ex en tilldelningssats.
Flera kommandon kan skrivas på samma rad om de åtskiljs av semikolon eller kommatecken. Om en tilldelningssats avslutas med semikolon skrivs värdet på den tilldelade variabeln inte ut, men om kommatecken används skrivs variabelnamn samt variabelvärde ut.
Ex. >>a=10; b=3.14*a+a^2/2, c=[1 2 3];
b= 81.4000
Om ett kommando inte får plats på en rad på skärmen avslutar man raden med ... (tre punkter), byter till ny rad och fortsätter sedan skriva kommandot. Kommandon måste skrivas med små bokstäver, men variabelnamn kan innehålla både små och stora bokstäver. Om variabelnamn (och =) saknas läggs resultatet i variabeln ans.
Den kommandosekvens som givits under en session sparas och kan återfås med piltangenterna.
Man kan alltid begära hjälp i MATLAB om man är osäker på vad ett kommando uträttar eller vad som finns i Matlab. Observera återigen att MATLAB-kommandon skrivs med små bokstäver.
Ex. >>help clear >>help >>help matlab/matfun
MATLAB har även en hjälpdatabas, i vilken man kan söka efter kommandon och följa referenser. Med kommandot >>helpdesk startas en webbläsare (t ex Netscape eller Microsoft Explorer) som laddar in indexsidan, se nedanstående figur.
- 4 -
2.4 ARITMETISKA UTTRYCK OCH ELEMENTÄRA FUNKTIONER
MATLAB har de vanliga aritmetiska operatorerna och en stor mängd elementära matematiska funktioner. De aritmetiska operatorerna uppfyller de vanliga prioritetsreglerna.
1. ^ potens       .^ komponentvis exponentiering, se 3.5
2. * multiplikation       .* komponentvis multiplikation, se 3.5
/ division       ./ komponentvis division, se 3.5
\ används vid lösning av linjära ekvationssystem, se 3.2
3. + addition - subtraktion
Vanliga parenteser används för att upphäva prioritetsreglerna.
Några av MATLABs inbyggda elementära matematiska funktioner är:
abs( ) absolutbelopp
sqrt( ) kvadratrot
round( ) avrundning till närmaste heltal
fix( ) avrundning till närmaste heltal mot noll
floor( ) avrundning nedåt
ceil( ) avrundning uppåt
sign( ) ger tecknet, t.ex. sign(x) blir 1 om x är positivt
rem( ) ger resten då två heltal divideras
sin( ) sinus Obs! argumentet förutsätts givet i radianer
cos( ) cosinus -"-
tan( ) tangens -"-
asin( ) arcus sinus
acos( ) arcus cosinus
exp( ) exponentialfunktionen
log( ) naturliga logaritmen
log10( ) 10-logaritmen
Argumentet till funktionerna kan var en skalär, vektor eller matris. Observera att svaret kan bli ett komplext tal för vissa funktioner, t ex asin(2), log(-1), sqrt(-2)
2.5 RÄKNA ANTALET ARITMETISKA OPERATIONER
MATLAB kan räkna antalet aritmetiska operationer som utförs i hela eller delar av en session:
Ex. >>flops(0) ställer räknaren till noll
>>flops ger antalet flops som utförts sedan räknaren haft värdet 0
Addition/subtraktion räknas som en operation liksom multiplikation/division och anrop av en elemen- tär funktion.
Om man vill mäta cpu-tiden finns kommandot cputime , som ger den cpu-tid som använts av Matlab sedan Matlab-sessionen startades:
Ex. >>t=cputime;
< Matlabsatser som utför det man vill ta tid på >
>>cputid=cputime-t
- 5 -
2.6 AVBROTT, LAGRING AV DATA, DEMONSTRATIONSPROGRAM
Följande kommandon kan användas då man vill stoppa utskriften på skärmen eller återgå till exekvering:
return lämnar 'keyboard mode', se 6.2
ctrl-c avslutar utskriften helt. Efter kommandot är man kvar i MATLAB
quit,exit avbryter hela MATLAB-körningen. Sessionen avslutas helt
och alla egendefinierade variabelvärden går förlorade
MATLAB kan också föra protokoll (dagbok) över allt som skrivs på skärmen, dock ej grafik.
>>diary filnamn.d lagrar den efterföljande sessionen på filen filnamn.d
>>diary on sätter på lagringen. Fortsätter med aktuell diary-fil
>>diary off stänger av lagringen
diary -kommandot lagrar alltså själva texten som skrivits på skärmen. Ett exempel som visar praktisk användning av diary kommandot återfinns i avsnitt 9.
Vill man lagra sina variabelvärden innan man slutar körningen så att man kan använda dem vid ett senare körningstillfälle utan att definiera om dem så ska save resp load användas:
>>save filnamn sparar alla egendefinierade variabler på filen
filnamn.mat
>>save filnamn v1 v2 sparar variablerna som är listade i lista på filen
filnamn.mat Variabellistan är en lista av
variabler åtskilda med blanktecken. Variabelvär-
dena sparas i binär kod, dvs EJ som i en textfil
>> save filnamn v1 v2 -ascii sparar variablerna i listan som en textfil på filen
filnamn
>>load filnamn hämtar variabler från binärfilen filnamn.mat
>>load filnamn.dat hämtar variabler från textfilen filnamn.dat
till variabeln filnamn
Vill man få en överblick av vad som kan uträttas med Matlab 5.2 finns ett antal demo-program.Man startar dessa med kommandot >>demo och kan sedan välja i en meny. De demonstrationer som finns i matrishantering, numerisk analys och visualisering rekommenderas.
2.7 UTSKRIFT AV RESULTAT PÅ PAPPER.
Dokument som skapas med Matlab, dvs dagboksfiler (avsnitt 2.6), kommando- och funktionsfiler (avsnitt 6) och plotbilder (avsnitt 5) kan skrivas ut på papper. Kommandon som åstadkommer detta är
beroende av vilken dator man kör på, se avsnitt 7 för dessa tekniska detaljer.
- 6 -
2.8 NÅGRA ENKLA KOMMANDON FÖR VEKTOR/MATRIS-DATA.
Antag att A är en m x n-matris, x en 1 x n radvektor och y en m x 1 kolumnvektor
>>[m,n]=size(A) ger m och n
>>length(A) ger det största av m och n
>>length(x) ger n
>>[maxx,ind]=max(x) ger största elementet maxx i x samt dess index
>>max(A) ger en radvektor med det största elementet i varje kolumn i A
>>sum(x) ger summan av elementen i vektorn x
>>sum(A) ger en radvektor med summan av varje kolumn
>>prod(x) ger produkten av elementen i vektorn x
>>diff(x) ger differenser x(2)-x(1), x(3)-x(2),.... av elementen i x
>>mean(x) ger medelvärdet av elementen i x
>>median(x) ger medianen av elementen i vektorn x
>>std(x) ger standardavvikelsen av elementen i vektorn x
>>sort(x) sorterar elementen i vektorn x i stigande ordning
>>hist(x) ritar ut ett 10-intervalls histogram för elementen i vektorn x
>>bar(x) ritar ut ett stapeldiagram över värdena i vektorn x
>>magic(n) ger en magisk kvadrat av storleken n
2.9 KOMPLEXA TAL.
Matlab kan hantera komplexa tal. Variablerna i och j är reserverade för imaginära enheten. Om man råkar ge i och/eller j ett annat värde under sessionen kan de tilldelas imaginära enheten med satsen >>i=sqrt(-1). Ett komplext värde kan tilldelas på något av följande sätt:
3+2i 3+2*i 3+2j 3+2*j 3+2*sqrt(-1)
Några kommandon för komplexa tal:
>>real(z) ger realdelen av z
>>imag(z) ger imaginärdelen av z
>>abs(z) ger absolutbeloppet av z
>>conj(z) ger komplexkonjugatet av z
>>angle(z) ger fasvinkeln, dvs Q i z = x+iy = r exp(i Q )
3 HUR MAN SKAPAR NYA MATRISER
En matris kan definieras av en tilldelningssats där alla element räknas upp på det sätt som anges i 2.1. I MATLAB finns även matrisbyggande funktioner och sammanslagningsfunktioner som utnyttjar matriser som redan är definierade. En fördel med matrishantering i MATLAB är att MATLAB håller ordning på alla matrisdimensioner. Om en matrisoperation skall utföras, t.ex. en matrismultiplikation, undersöker MATLAB om dimensionerna är sådana att operationen går att utföra.
3.1. MATRISBYGGANDE FUNKTIONER
Antag att matrisen A redan är skapad. Följande nya matriser kan skapas med enkla kommandon
- 7 -
a) ones, en matris med bara ettor
>>B=ones(n) ger en n x n-matris med ettor
>>B=ones(m,n) ger en m x n-matris
>>B=ones(size(A)) ger en matris av samma storlek som A
b) zeros, en matris med bara nollor
>>B=zeros(n) ger en n x n-matris med nollor
>>B=zeros(m,n) ger en m x n-matris
>>B=zeros(size(A)) ger en matris av samma storlek som A
c) eye, enhetsmatrisen
>>B=eye(n) ger en enhetsmatris av storleken n x n
>>B=eye(size(A)) ger en enhetsmatris av samma storlek som A
d) rand och randn, slumptalsmatriser
>>b=rand ger ett skalärt slumptalsvärde ur den likformiga fördelningen
>> b=randn -"- ur normalfördelningen
>>B=rand(n) ger en n x n-matris med slumptal
>>B=rand(size(A)) ger slumptal i en matris av samma storlek som A.
rand ger slumptal tagna ur den likformiga fördelningen på intervallet [0,1], medan randn ger
normalfördelade slumptal med medelvärde 0 och standardavvikelse 1.
e) diag, en diagonalmatris
>>b=diag(A) om A är en matris så genereras en kolumnvektor innehållande
diagonalelementen i A
>>B=diag(a) om a är en vektor så genereras en kvadratisk matris med samma
diagonalelement som i a. Utomdiagonala element är noll
f) repmat, blockmatriser
>> B=repmat(A,m,n) skapar en matris med m x n block, där varje block är A
3.2. MATRISALGEBRA
Många kommandon för matrisalgebraiska manipulationer finns, men av utrymmesskäl beskrivs här bara de mest grundläggande för reella matriser. Fullständig beskrivning finns annars i referenserna.
Antag att A, B och C är matriser, x och y vektorer och t en skalär. De vanliga matrisalgebraiska operationerna kan då utföras med dessa storheter. Transponering görs i MATLAB med tecknet '
>>A=B+C B och C måste ha samma dimensioner
>>A=B-C B och C måste ha samma dimensioner
>>A=B*C antalet kolumner i B måste vara = antalet rader i C
>>A=B' transponering av B
>>y=A*x x måste vara en kolumnvektor
>>y=x*A x måste vara en radvektor
- 8 -
>>A=t*B multiplikation med skalär
>>y=t*x - " -
>>t=x'*x vanlig skalärmultiplikation (om x är kolumnvektor)
>>A=B^2 B måste vara kvadratisk
Dessutom finns för operatorerna *, / och ^ komponentvisa operationer vilka är praktiska att använda när man vill beräkna en funktion för värden som definieras av en vektor:
>>z=x.*y komponentvis multplikation, dvs z(i) = x(i)*y(i)
>>z=x./y -"- division, dvs z(i)=x(i)/y(i)
>>z=x.^y -"- exponentiering,dvs z(i)=x(i)^y(i)
I MATLAB är det enkelt att lösa linjära ekvationssystem. Lösning med Gausselimination av Ax = b, där A är en n x n-matris, erhålles helt enkelt med kommandot >>x=A\b
Om matrisen är singulär avbryts exekveringen och ett meddelande skrivs ut.
Om systemet är över- eller underbestämt, dvs om A är rektangulär, erhålles minstakvadratlösningen!
Obs! Kontrollera att A och b har rätt dimension innan \ används. Matlab har mycket liberala regler vad gäller användningen av både \ och /. Den grundläggande regeln är att \ löser matrisekvationen AX=B, medan / löser XA=B där = betyder exakt likhet eller likhet i minstakvadratmetodens mening beroende på A's och B's dimensioner. Detta har till följd att även >>x=b\A går att utföra i Matlab (om b är en kolumnvektor med lika många element som A har rader), men ger då minstakvadratlösningen x (en radvektor) till bx=A. Dimensionerna kan avläsas med kommandona size och length , se 2.8
Inversen till nxn matrisen A erhålles med kommandot >>B=inv(A)
Även >>x=inv(A)*b kan användas för att lösa ett linjärt ekvationssystem, men då krävs fler räkneoperationer än då man använder A\b .
LR-faktoriseringen av en matris A erhålles med kommandot
>>[L,R]=lu(A) L är radpermuterad, se även help lu
>>[L,R,P]=lu(A) P är permutationsmatrisen i faktoriseringen LR=PA
I det senare kommandot är R och L triangulära matriser. P är den permutationsmatris svarande mot den permutation av raderna i A som görs vid Gausseliminationen.
Determinanten av en matris fås med kommandot >>d=det(A)
Rangen för en matris ger av kommandot >>r=rank(A)
Kommandot för egenvärdesberäkning av en matris A är: >>[D,X]=eig(A)
I diagonalmatrisen D finns egenvärdena till A, egenvektorerna står som kolumner i matrisen X.
Kommandot >>[Q,R]=qr(A) ger QR-faktoriseringen av en rektangulär matris A och kommandot >>[U,S,V]=svd(A) ger singulärvärdesfaktoriseringen av en rektangulär matris A.
Matrisexponentialfunktionen eA ges av expm(A). Användbart för lösning av system av differentialekvationer med konstanta koefficienter, se 6.3.2
- 9 -
3.3 POLYNOMKOMMANDON
Några användbara kommandon för hantering av polynom finns. Kommandot >>r=roots(c) ger
rötterna (en del kan vara komplexa) till polynomet c1xn + c2xn-1 + ..... + cnx + cn+1 = 0. Koefficienterna till det polynom som har rötterna r1, r2, .... , rn ges av kommandot >>c=poly(r). K ommandot >>p=polyval(c,a) ger polynomvärdet vid x = a (som kan vara en vektor) för polynomet med koefficientvektorn c.
3.4 NORMER OCH KONDITIONSTAL.
Antag att x är en vektor och A en matris. Vanlig euklidisk norm av vektorn resp matrisen:
>>x2norm=norm(x)
>>a2norm=norm(A)
Maximumnorm av vektorn x resp matrisen A:
>>xinfnorm=norm(x,inf)
>>ainfnorm=norm(A,inf)
Konditionstalet för en matris mätt i euklidisk norm fås med:
>>a2kond=cond(A)
Konditionstalet mätt i maximumnorm däremot bildas genom att utgå från definitionen:
>>ainfkond=norm(A,inf)*norm(inv(A),inf)
3.5 ELEMENTÄRA FUNKTIONER PÅ VEKTORER OCH MATRISER
MATLABs inbyggda matematiska standardfunktioner opererar även elementvis på vektorer och matriser. Om f är en sådan funktion och x en vektor så blir f en vektor (tabell):
f(x) = (f(x1), f(x2), ....., f(xn))
För att bilda tabeller av funktioner har man även användning av operatorerna .* ./ och .^ se 3.2
Ex. >>x=[-1 0 1 2];
>>y=sin(x); ger vektorn y = (sin(-1), sin(0), sin(1), sin(2))
>>z=1+x.*sin(x) ger vektorn z, där z(i)=1+x(i)*sin(x(i))
>>u=1./x ger vektorn (-1, Inf, 1, 0.5000), Obs! u=1/x är felaktigt!
>>v=2*sin(x)-x./(1+x)+exp(-2*x).*x.^0.3
3.6 ATT UTVIDGA REDAN DEFINIERADE MATRISER
MATLAB håller reda på alla matrisdimensioner. Man kan därför lätt ändra storleken på matriser om man vill lägga till fler element, rader eller kolumner. På detta vis är det enkelt att bygga nya matriser genom att använda delar av gamla matriser. Man använder samma regler för att slå samman matriser som att tilldela matriser, dvs enskilda element skiljs åt med blanktecken eller kommatecken och rader skiljs åt med semikolon eller Enter.
Ex. Antag att vi definierar matriserna A och B, radvektorerna x och z samt kolumnvektorn y:
>>A=[1 2;3 4]; B=[5 6;7 8]; x=[9 10]; y=[11;12]; z=[13 14];
- 10 -
För att utvidga x till en 1 x 4-vektor som är [9 10 11 12] kan vi göra på olika sätt:
1) >>x(3)=11; x(4)=12;
2) >>x=[x 11 12]
3) >>xtra=[11 12]; x=[x xtra];
För att lägga till en ny rad till A, t.ex. den rad som motsvarar vektorn z, finns följande alternativ:
1) >>A=[A; 13 14];
2) >>A=[A;z];
Vill man lägga till flera rader följer man samma mönster, dvs: >>A=[A;x;0 0;z];
För att slå ihop två matriser gör man på motsvarande sätt: >>A=[A;B];
På samma sätt kan vi utvidga en matris med en eller flera kolumner:
>>A=[A y];
>>u=[15;16]; A=[A u];
>>A=[A B];
Om denna utvidgning av en vektor eller matris används i en slinga (se 4.3) kan vi utvidga rekursivt. I nedanstående exempel startar rekursionen med x och A som två tomma fält. I slingan ökas sedan x med ett nytt element för varje varv i slingan. På samma sätt ökas A med en ny kolumn med två element för varje varv i slingan. Denna teknik är användbar när data till plottning (se 5) skall skapas.
>>x=[]; A=[];
>>for i=1:10
p=0.1*i;
x=[x p];
A=[A [sin(p);cos(p)]];
end
3.7 KOLONNOTATION, GENERERING AV VEKTORER.
I MATLAB använder man kolon (:) för att definiera en följd av värden.
i:k definierar en följd av värden från i till k med steget 1, dvs i, i+1, i+2, ..., k
i:j:k definierar en följd av värden från i till k med steget j, dvs i, i+j, i+2j, ... , k
Ex: >>a=2:4; ger vektorn a = (2 3 4)
>>b=7:-1:3 ger vektorn b = (7 6 5 4 3)
>>x=-0.2:0.1:0.3 ger vektorn x = (-0.2 -0.1 0 0.1 0.2 0.3)
>>a=0;b=2*pi;n=10;x=(a:(b-a)/n:b)';y=sin(x);[x y] ger en sinustabell
3.8 ATT SKAPA DELMATRISER.
Tecknet kolon (:) kan även användas för att skapa delmatriser av en befintlig matris A:
A(i,j) delmatrisen bestående av det enda elementet Aij
A(:,j) kolumn nr j i matrisen A
A(i,:) rad nr i i matrisen A
A(:) kolumnvektorn som fås genom att stapla kolumnerna i A på varandra
A(:,j:k) delmatrisen av A bestående av kolumnerna j t o m k
A(i:k,:) delmatrisen av A bestående av raderna i t o m k
A(i:k,j:l) delmatrisen med elementen i rad i t o m k och kolumn j t o m l
-11-
4 VILLKOR OCH REPETITION I MATLAB
MATLAB innehåller även kommandon som medger repeterad exekvering av kommandon och testning av logiska villkor. Detta är speciellt användbart när man vill skriva program i MATLAB, men kan även användas då MATLAB körs med kommandon som utförs direkt.
4.1 VILLKOR
De villkor som beskrivs här avser jämförelser mellan reella skalära storheter. Möjlighet att jämföra vektorer och matriser finns också, men den intresserade hänvisas då till någon av referenserna.
De relationsoperatorer som finns för att bygga upp en relation (dvs ett uttryck som blir sant eller falskt när det utvärderas) är
< <= > >= == ~=
där == (obs! två likhetstecken) används för att testa likhet och ~= betyder "skilt ifrån".
Dessutom finns logiska operatorer för att kombinera två eller flera relationer med och, eller, icke:
& | ~
Ex. Exempel på logiska uttryck som kan bildas a<b x>=y & a==b y>x | a~=b
Ett logiskt uttryck som är sant har värdet 1. Är uttrycket falskt har det värdet 0.
4.2 VILLKORSKOMMANDOT I MATLAB
Ett villkorskommando kan i MATLAB anta olika former. Den enklaste formen är
if logiskt uttryck
satsgrupp
end
Med logiskt uttryck menas en relation skriven enligt reglerna i 4.1. En satsgrupp är en eller flera satser, dvs vanliga MATLAB-kommandon. Satserna i satsgruppen utförs endast om logiskt uttryck är sant.
If-satsen kan skrivas på en enda rad och liknar då ett vanligt kommando (obs! då behövs kommatecken eller semikolon före end).
if logiskt uttryck satsgrupp, end
Ex. >>if a<b x=y+1;z=x^2,end
If-satser kan utökas med else:
if logiskt uttryck
satsgrupp1
else
satsgrupp2
end
och kan även den skrivas på en rad: if logiskt uttryck satsgrupp1, else satsgrupp2, end
Ex. >>if det(A)==0 disp('singulär matris'),else x=A\b,end
- 12 -
4.3 REPETITIONSKOMMANDOT I MATLAB
MATLAB har två kommandon för repetition, nämligen for-sats och while-sats (EJ repeat-sats!).
4.3.1 FOR-KOMMANDOT
For-kommandot tillåter en satsgrupp att bli exekverad ett fixt, förutbestämt antal gånger. Formen för en sådan sats är
for variabel = uttryck
satsgrupp
end
och kan även skrivas på en rad (obs! kommatecken eller semikolon före end) :
for variabel = uttryck satsgrupp, end
Här är uttryck sådant att det tilldelar variabeln ett startvärde, definierar ett tillväxtvärde och definierar ett slutvärde. I de flesta fall använder man kolon-notation (se 3.5), t.ex. i:j:k eller i:k. MATLAB-satsen
for v=i:j:k uppför sig som for v:=i to k step j
for v=i:k uppför sig som for v:=i to k step 1
Ex. >>s=0; tecken=1;
>>for i=1:20 s=s+tecken/(i*i);tecken=-tecken;end
Man kan även räkna upp de variabelvärden för vilka en slinga ska utföras:
for v=[i1,i2,.....,in]
Ex. >>s=0;
>>for i=[1,2,5,10] s=s+2^i; end
Det går också att skriva nästlade slingor:
for variabel1=uttryck1
satsgrupp1
for variabel2=uttryck2
satsgrupp2
end
satsgrupp3
end
4.3.2 WHILE-KOMMANDOT
While-kommandot exekverar en satsgrupp så länge ett logiskt uttryck är sant. Formen för en while-sats är
while logiskt uttryck
satsgrupp
end
eller, på en och samma rad: while logiskt uttryck satsgrupp, end
Ex. Beräkning av sqrt(2) med Newton-Raphsons metod
>>c=2;x0=c;differens=1;
>>while abs(differens)>1E-13 x1=(x0+c/x0)/2;differens=x1-x0; x0=x1,end
- 13 -
Ex. Beräkning av maskinnoggrannheten för en dator, dvs det minsta tal ep för vilket 1+ep # 1.
För alla tal u<ep gäller alltså 1+u=1 på datorn.
>>ep=1;while 1+ep>1 ep=ep/2;end;ep=2*ep
5 GRAFIK
MATLAB har kommandon som medger två- och tredimensionell ritning. Kommandona är flexibla och enkla att använda. Skalning och markering av axlar görs automatiskt. Vid tredimensionell grafik får man se ett perspektiv av en rymdyta där skymda linjer är borttagna. Nivåkurvor kan också genereras enkelt. När grafisk utmatning skall göras, öppnas ett grafikfönster på skärmen. I de flesta system kan man ha kommandofönstret och grafikfönstret samtidigt på skärmen.
5.1 TVÅDIMENSIONELLA PUNKTMÄNGDER OCH KURVOR.
5.1.1 KOMMANDOT PLOT
MATLAB kan rita ut en mängd av ordnade koordinatpar. Det enklaste kommandot som kan användas är kommandot plot, som tar emot olika antal parametrar beroende på hur många kurvor man vill rita och vilken markering varje kurva skall ges. När plot-kommandot utförs växlar skärmen automatiskt från kommandofönster till grafikfönster. För att återvända till kommandofönstret igen så trycker man bara på en godtycklig tangent eller klickar med musen i kommandofönstret.
I den enklaste användningen av plot-kommandot ger man bara en vektor som indata. Antag att denna vektor innehåller n komponenter.
>>plot(x) ritar x-komponenternas värden mot index, dvs (i,xi), i=1,2,..,n ritas
Om x-koordinaterna ligger lagrade i vektorn x och y-koordinaterna i vektorn y fås en xy-plot genom kommandot
>>plot(x,y)
I bägge fallen fås en heldragen kurva, dvs punkterna sammanbinds med räta linjestycken.
Ex. >>x=-10:0.2:10;
>>y=sin(x);
>>plot(x,y)
Om man inte vill ha en heldragen kurva finns olika typer av punkter, linjer och färgsättningar (om man kör på färgterminal):
punkttyper . + * o x square diamond
linjetyper - -- : -.
färger t.ex. r (rött) b(blått) g(grönt) w(vitt)
Några exempel på plotkommandon ges nedan. Låt t,x och y vara vektorer av samma längd, A och B matriser av samma storlek:
plot(x) talparen (j,xj) ritas
plot(x,y) y plottas mot x, dvs talparen (xj,yj) ritas
plot(x,y,'--') ritar kurvan streckad
- 14 -
plot(x,y,'o') markerar punkterna med en ring
plot(t,x,t,y) x ritas mot t och y plottas mot t, dvs två kurvor ritas
plot(A) plottar kolumnerna i A mot radindex. Om A är en m x n-
matris ritas n st kurvor med m st talpar i varje kurva
plot(x,A) plottar kolumnerna i A mot vektorn x. Antalet element i x
måste vara lika med antalet rader i A
plot(A,y) plottar vektorn y mot kolumnerna i A
plot(A,B) plottar kolumnerna i B mot kolumnerna i A
comet(x,y) ritar en animerad graf av y som funktion av x
hold on ger ny bild ritad ovanpå gammal bild (axlar behålls)
hold off ger ny bild i fräscht grafikfönster nästa gång plot anropas
clf suddar grafikfönstret (även om hold gjorts)
grid lägger till ett nät på befintlig plotbild
errorbar(x,y,e) adderar felstaplar i en bild som ritats med plot(x,y)
fill(x,y,c) ritar den polygon vars hörn definieras av vektorerna x och y;
polygonen fylls med färgen som anges av c, t ex 'g' för grön
drawnow framtvingar ritning; t ex kommer MATLAB vänta med att rita
upp bilder från ritkommandon i en slinga tills slingan är klar om inte drawnow ges efter varje ritkommando
area(x,y) fungerar som plot , men fyller utrymmet nedanför linjen med färg
pie(x) ritar ett tårtdiagram av vektorn x.
När ingen punkttyp anges ritas heldragna linjer mellan punkterna. Om man vill ha en annan punkttyp, linjetyp eller färg än den som MATLAB ger anger man den i ett tredje argument, t.ex.
plot(x,y,'+') plot(t,x,'r',t,y,'b')
Ex. >>x=-6:0.2:6;
>>y=sin(x);plot(x,y);hold on ger en graf av sinusfunktionen
>>z=cos(x);plot(x,z);hold off ger en graf av cosinus ovanpå föregående graf
Ex. >>plot(x,y,x,z) ger samma graf som ovanstående exempel
Ex. >>x=-6:0.2:6;
>>A=[sin(x);cos(x)];
>>plot(x,A) ger samma graf som i exemplet ovan
Obs! Om plot- kommandot ligger inne i en slinga, kommer endast sista bilden att synas i grafik- fönstret. Vill man se alla bilder en efter en måste man antingen lägga in pause efter plot (men före end) eller framtvinga ritning med drawnow (se ovan). Med hold on inne i slingan överlagras alla grafer i en bild. Glöm inte att göra hold off efter slingan om fler grafer skall ritas efteråt!
5.1.2. FLERA FÖNSTER PÅ SKÄRMEN
Med plot-kommandot får man alltså en bild av ett koordinatsystem med godtyckligt många kurvor plottade samtidigt. Vill man ha flera bilder samtidigt i grafikfönstret finns kommandot subplot:
subplot(m,n,p) där m,n och p är tre heltal, delar upp grafikfönstret i ett m x n
nät av små delfönster och väljer ut fönster nr p som aktuellt plot-
fönster. Delfönstren numreras från vänster till höger, uppifrån
och ner. m<=9, n <=9.
subplot återställer till det normala fallet, dvs ett fönster, nästa gång plot anropas
- 15 -
figure(2) öppnar ännu ett grafikfönster på skärmen. All plottning görs därefter i detta fönster. Återgång till det ursprungliga fönstret görs med figure(1)
Ex. >>x=-6:0.2:6;
>>y=sin(x); z=cos(x);
>>subplot(2,1,1); plot(x,y)
>>subplot(2,1,2); plot(x,z)
5.1.3 OLIKA TYPER AV KOORDINATSYSTEM
Plot-kommandot ritar i det cartesiska xy-systemet. Ytterligare varianter av plot finns som använder andra koordinatsystem:
polar(fi,r) plottar i polära koordinater. fi är en vektor med vinklar givna
i radianer och r är en vektor med avstånden från origo.
grid-kommandot ger koncentriska cirklar och radier när
det används tillsammans med polar.
semilogx(x,y) plottar i ett x-y-system där 10 log-skala används längs x-
axeln och vanlig linjär skala på y-axeln. Detta är alltså
samma som plot(log10(x),y).
semilogy(x,y) ger linjär x-skala och 10 log-skala på y-axeln.
loglog(x,y) ger 10 log-skalor på både x- och y-axeln.
5.1.4 SKALNING
Om inget annat anges skalas axlarna automatiskt så att skärmens storlek utnyttjas så bra som möjligt. Vill man själv ändra denna skalning så går det att åstadkomma med kommandot axis:
axis('square') sätter grafikfönstret till en kvadrat. Denna omställning kan
behövas om man vill att en cirkel skall plottas som en cirkel
och inte som en oval som det annars kan bli
axis('normal') sätter fönstret till normalt läge
axis([v1 v2 v3 v4]) sätter skalningen så att xmin=v1, xmax=v2, ymin=v3, ymax=v4
axis('auto') återgår till automatisk skalning
axis('equal') samma skala på x- och y-axeln (rektangulärt grafikfönster)
Observera att axis-kommandot skall ges efter plotkommandot! (i version 4.2)
5.1.5 TEXT I GRAFISKA BILDER
Kommandon finns för att lägga in överskrifter, text på axlarna mm. Dessa kommandon skall ges efter plot-kommandot!
title('textsträng') visar textsträngen överst i grafikfönstret, rubrik
xlabel('textsträng') skriver ut textsträngen under x-axeln
ylabel('textsträng') skriver ut textsträngen till vänster om y-axeln
- 16 -
Vill man sätta in text inne i plotbilden finns kommandot text och gtex t:
text(u,v,'textsträng') skriver ut textsträngen med början i punkten (u,v)
gtext('textsträng') ge först detta kommando, flytta sedan markören med
musen till det ställe på plotbilden där texten skall börja och klicka sedan musen.
En ruta med förklaringar till den aktuella grafen erhålles med legend:
legend('textsträng1','textsträng2',......,pos)
Detta kommando skriver en textruta i den aktuella grafen. Om pos är given placeras rutan enligt följande:
pos= -1:rutan placeras utanför axlarna till höger om figuren
0:rutan placeras innanför axlarna så att minimalt antal punter täcks över
1:rutan placeras i övre högra hörnet
2:rutan placeras i övre vänstra hörnet
3:rutan placeras i nedre vänstra hörnet
4:rutan placeras i nedre högra hörnet
Med kommandot legend('off') plockas rutan bort.
5.1.6 GRAFISK INMATNING
Med kommandot ginput kan man med musen markera punkter i en plotbild (som kan bestå endast av axlar).
[x,y]=ginput(n) n st punkter hämtas via knapptryckningar på musen till
de två vektorerna x och y
Se även exemplet i avsnitt 9.
5.1.7 UTSKRIFT AV GRAFER PÅ PAPPER
Bilder som skapats med MATLABs plotkommandon kan skrivas ut på papper. Kommandon som åstadkommer detta är beroende av vilken dator man kör på, se avsnitt 7 för dessa tekniska detaljer.
5.2 TREDIMENSIONELLA KURVOR
För att rita en tredimensionell kurva används kommandot plot3 , som fungerar analogt med plot:
plot3(x,y,z) ritar en kurva genom punkterna (xj,yj,zj)
plot3(x,y,z,'o') markerar punkterna med typen o ; andra typer, se plot
comet3(x,y,z) ritar en animerad graf av punkterna
Ex. >>t=0:pi/50:10*pi;
>>x=sin(t);y=cos(t);
>>plot3(x,y,t)
- 17 -
5.3 TREDIMENSIONELLA BILDER
För att rita funktionen z=f(x,y) kan man i MATLAB göra på följande sätt:
1. Bestäm ett rektangulärt område i xy-planet över vilket vi vill rita ytan som motsvaras
av funktionen z=f(x,y). Vi kan säga att området ges av
R = [xmin,xmax] x [ymin,ymax]
2. Definiera randvärdena till rektangeln genom att skapa två vektorer x och y:
x = [xmin=x1, x2, x3, ... , xm = xmax]
y = [ymin=y1, y2, y3, ... , yn = ymax]
Sedan bildar man ett punktgitter i hela rektangeln genom att använda MATLAB-funktionen
[X,Y]= meshgrid(x,y) . Vi får då två m x n-matriser, en för x- och en för y-koordinater
3. Nästa steg är att evaluera z=f(x,y) i punkterna (xi,yj), i=1,2,...,m, j=1,2,...,n och
lagra dessa värden i matrisen Z. Här bör man vara försiktig då man evaluerar formeln f(x,y),
så att man gör det korrekt. Här har man stor användning för operatorerna som arbetar element
för element, dvs .*, ./ och .^ (se 3.2)
4. Slutligen generarar vi en bild av z=f(x,y) genom att ge kommandot mesh(X,Y,Z)
Följande kommandon utgör en liten del av alla de kommandon som finns för att rita tredimensionella bilder:
[X,Y]=meshgrid(x,y) givet en 1 x n-vektor som innehåller x-koordinater i stigande
ordning och en m x 1-vektor y med y-koordinater i stigande
ordning. meshgrid bildar m x n-matriserna X och Y som
representerar talparen i hela rektangeln given av x och y.
mesh(X,Y,Z) ritar en nätyta av element i matrisen Z, dvs en bild där en bild
där närliggande punkter binds samman med räta linjer. Bilden
är ritad i tredimensionellt perspektiv av z-värdena som höjder
över xy-plane Axlar ritas ut och markeras.
surf(X,Y,Z) ritar en grå- eller färgnyanserad bild av elementen i
matrisen
view(az,el) ändrar azimut- och elevationsvinkeln för den punkt
varifrån en 3D bild betraktas. Skönsvärden för dessa
vinklar är az=-37.5, el=30
view(r) tittar på figuren från punkten r=[x,y,z]
contour(x,y,Z) ritar ut konturkurvor av f(x,y) i xy-planet
meshc(X,Y,Z) ritar en yta som mesh samt nivåkurvor under ytan
Möjligheterna till grafik är mycket stora i Matlab 5.2, i synnerhet när det gäller utnyttjande av färger i olika färgskalor, nyanseringar, animering m m, se Matlabs egen manual eller ge help graph3d
Ex. >>x1=-2.5:0.1:2.5;
>>y1=-2.5:0.1:2.5;
>>[X1,Y1]=meshgrid(x1,y1);
>>Z1=3*(1-X1).^2.*exp(-X1.^2-(Y1+1).^2)-10*(X1/5-X1.^3-...
Y1.^5).*exp(-X1.^2-Y1.^2)-exp(-(X1+1).^2-Y1.^2)/3;
- 18 -
>>x2=-8:0.5:8;
>>y2=x2;
>>[X2,Y2]=meshgrid(x2,y2);
>>R=sqrt(X2.^2+Y2.^2)+1E-14
>>Z2=sin(R)./R;
>>subplot(2,2,1);mesh(X1,Y1,Z1);
>>subplot(2,2,2);meshc(X1,Y1,Z1);
>>subplot(2,2,3);mesh(X2,Y2,Z2);title('sin(r)/r');
>>subplot(2,2,4);mesh(X2,Y2,Z2);view([1,0,0]);title('sin(r)/r');
-19 -
6 PROGRAMMERING I MATLAB
Normalt arbetar MATLAB som en interpretator, dvs MATLAB tolkar och utför ett kommando så snart kommandot är givet och man tryckt på Enter. Detta arbetssätt lämpar sig för mindre beräkningar, men blir klumpigt när antalet kommandon som behövs för att utföra en uppgift blir stort. Dessutom går de kommandon som man givit under en session förlorade när man lämnar MATLAB. I MATLAB finns dock möjligheten att spara de kommandon som behövs för att lösa en beräkningsuppgift på en fil och exekvera denna. Genom denna facilitet kan MATLAB även användas som ett högnivåprogramspråk, och de kommandofiler som byggs upp kan ses som MATLAB-program.
6.1 MATLABS KOMMANDOFILER.
Det man bör göra för lite större beräkningsuppgifter är att lagra kommandon på en extern fil, en s.k. m-fil eller kommandofil, som kan läsas in och exekveras i MATLAB som ett MATLAB-program. En m-fil är uppbyggd av MATLAB-kommandon, men kan även referera till andra m-filer, t ex en m-fil som innehåller en funktion (se 6.3). Tillvägagångssättet vid användning av en m-fil är följande:
1) skriv in de MATLAB-kommandon som bygger upp m-filen med någon editor
som finns tillgänglig på den dator som du kör på och spara den sedan på en
fil med namnet filnamn.m, där filnamn är ett namn som du hittar på själv
2) återgå till MATLAB.
3) exekvera satserna i filen filnamn.m med kommandot filnamn . (EJ filnamn.m)
När man kör en m-fil exekveras genomlöps alla kommandon från början till slut. Exekveringen avbryts dock om m-filen innehåller input-, pause- eller keyboard-kommandon (se 6.3.4). Efter det att sista kommandot i m-filen lästs och utförts är MATLAB redo att ta emot nya kommandon från tangentbordet igen.
Det är lämpligt att stoppa in kommentarer i sitt MATLAB-program precis som i andra programspråk. En kommentar skrivs i MATLAB genom att %-tecken skrivs framför den kommenterande texten.
Ett bra tips är att alltid börja ett MATLAB-program med satserna clear, clf
Ex. Antag att vi skrivit in kommandona i Ex. i 4.3.1 på en fil som vi kallat serie.m
Exekveringen av den startas genom att ge kommandot
>>serie
s= utskriften på skärmen blir denna
0.8213
>> MATLAB kan nu ta emot ett nytt kommando
Med echo on och echo of f i en kommandofil kan man koppla på resp koppla från utskrift av filens kommandon under exekvering. Kommandot echo är speciellt användbart i samband med felsökning.
6.2 IN/UTMATNING TILL/FRÅN KOMMANDOFILER.
Exekveringen av en m-fil avbryts när ett input-, pause- eller keyboard-kommando påträffas bland kommandona i filen. Exekveringen återupptas då man matat in indata och/eller avslutat motsvarande kommando.
input('textsträng') skriver ut texten textsträng och väntar på inmatning
från tangentbordet. Exekveringen återupptas när man
matat in indata och tryckt på Enter.
disp('textsträng') skriver ut texten och fortsätter sedan exekveringen.
Lämpligt att använda om man vill ha förklarande text
insatt i den utmatning som görs av m-filen
- 20 -
disp(a) skriver ut a utan texten a=
pause medför att exekveringen stannar tills dess man tryckt
ned en godtycklig tangent
pause(2) åstadkommer en två sekunder lång paus i exekveringen
keyboard anropar tangentbordet som om det vore en kommandofil
Exekveringen avbryts och kontrollen övergår till tangent-
bordet. Variabler kan skrivas ut och ändras, och ett god-
tyckligt MATLAB-kommando kan ges. Man lämnar
tangentbordskontrollen genom att ge kommandot return
(med bokstäver) varvid kontrollen övergår till m-filen.
Några exempel:
Kommando Ger vid exekvering
x=input('Ge talet x: ') Ge talet x: 2.0944
x=
2.0944
A=input('Ge matrisen A radvis ') Ge matrisen A radvis:[1 2;3 5]
A=
1 2
3 5
disp('Nu startar iterationerna') Nu startar iterationerna
disp('Ange matrisen A') Ange matrisen A
keyboard >> nu kan MATLAB-
kommando ges, t ex
>>A=[1 2;3 5]; return
6.3 FUNKTIONSFILER.
6.3.1 ALLMÄNT OM FUNKTIONSFILER
Uppbyggnad och användning av funktioner i MATLAB görs analogt med deklaration och anrop av funktioner/procedurer (subrutiner) i andra programspråk. I MATLAB finns dock inte procedur- begreppet utan endast funktioner. I MATLAB lagras varje funktion på en egen m-fil, som sedan kan anropas med ett MATLAB-kommando. En funktion har ett antal indata-parametrar, som före anropet skall ha fått sina värden, och ett antal utdata-parametrar, som får sina värden när funktionen anropas. I MATLAB finns ett stort antal inbyggda funktioner, t.ex. en funktion för LR-faktorisering, vilken anropas som följande exempel visar:
Ex. >>[L,R]=lu(A); A är indata, L och R är utdata
För att se vilka funktioner som finns ger man help -kommandot och för att få mer information om en särskild funktion, t.ex. lu , så ger man
>>help lu
Funktionsfiler har separat arbetsarea som innehåller de variabler som funktionen använder då den exekveras. Variablerna i en funktionsfil är lokala variabler och existerar endast under exekveringen av
funktionen och går sedan förlorade. Variabler i en funktionsfil som heter precis samma sak som variabler i MATLABs arbetsarea är alltså olika variabler i olika minnesutrymmen.
- 21 -
En funktion kan ha en eller flera indata- och utdataparametrar. En variabel från MATLABs arbetsarea kopieras till en lokal variabel om den är indataparameter till funktionen (värdeanrop).
Man kan själv skapa egna funktioner.
Ex. Funktionen kvad(x)=x2/(1+x) som MATLAB-funktion: function [fx]=kvad(x);
fx=x^2/(1+x);
Om indata kan vara en vektor används .-operatorer: function [fx]=kvad(x);
fx=x.^2./(1+x);
Generellt skall en funktionsfil skall ha följande egenskaper:
1) första raden skall inledas med ordet function (obs! stavningen, EJ funktion).
2) första raden deklarerar funktionsnamnet, utparametrarna, och inparametrarna.
Inparametrarna är de variabler som kopieras från MATLABs arbetsarea till funk-
tionens arbetsarea. Första raden ska se ut på följande sätt:
function [utparametrar ] = namn(inparametrar)
där namnet på funktionen, dvs namn också ska ingå i filnamnet: namn.m
Om utdata består av en enda parameter, får [ ] utelämnas.
3) En funktion anropas genom att man skriver
>> [utdatavariabler] = namn(indatavariabler)
Utdata- och indatavariablerna (de aktuella parametrarna) behöver inte ha samma
namn som ut- och inparametrarna (de formella parametrarna).
4) Kommentarrader som ligger efter första raden skrivs ut då man ger kommandot
help namn . En liknande konvention gäller för kommandofiler
5) I MATLAB kan man definiera globala variabler. Om man i kommandofilens början
definierar t.ex. global alfa beta blir variablerna alfa och beta tillgängliga
i de funktioner där definitionen global alfa beta står som en rad efter
function-raden. Globala variabler tas bort med kommandot clear global .
Ex. Följande funktion, som beräknar medelvärdet och standardavvikelsen för elementen
i en vektor x, finns lagrad på en funktionsfil statistik.m:
function [medel,standard]=statistik(x);
%funktionen statistik beräknar medelvärde och standardavvikelse %för vektorn x
n=length(x);
medel=sum(x)/n;
if n>1 standard=sqrt(sum((x-medel).^2)/(n-1));
else standard=0; end;
I en kommandosekvens (som kan göras om till en kommandofil) kan funktionen sta-
tistik anropas på t.ex. följande sätt:
>>a=rand(1,100) vektor med 100 slumptal på (0,1)
>>[m,s]=statistik(a)
m=
0.5159
s=
0.2915
- 22 -
I MATLAB kan namnen på andra funktioner vara indataparametrar till en funktion. Exempel på sådana funktions-funktioner är MATLAB-funktionerna fplot och feval . Utförlig beskrivning av dessa funktioner fås genom att använda help -kommandot. Nedan ges några exempel på enkel användning. Observera att den indataparameter som är en funktion skall ges som en sträng (' ' runt namnet) vid anropet.
Ex. >>fplot('sin',[0 10]) plottar funktionen sin på intervallet [0,10].
>> feval('sin',2.17) evaluerar sin(2.17)
6.3.2 NÅGRA NUMERISKA FUNKTIONER I MATLAB.
För att utföra vissa grundläggande icke-linjära numeriska beräkningar finns ett antal funktions-funktioner i MATLAB. För närmare beskrivning av dessa rekommenderas kommandot help .
fplot('fun',[xmin xmax]) plottar funktionen fun(x) på intervallet (xmin,xmax)
fzero('fun',x0,tol) beräknar nollställe nära x0 med tolerans tol till fun(x) = 0
fsolve('fun',x0,tol) beräknar roten till fun(x)=0, där fun är vektorvärd
fmin('fun',x1,x2,tol) beräknar det x-värde i intervallet (x1,x2) som minimerar fun(x)
fmins('fun',x0,tol) beräknar ett lokalt minimum nära x0 till en funktion fun av flera
variabler
quad('fun',a,b,tol) beräknar integralen av fun(x) på (a,b)
quad8('fun',a,b,tol) - " -
Funktionen fun i ovanstående anrop förutsätts ha en enda parameter i sitt anrop.
För numerisk lösning av system av differentialekvationer formulerade som begynnelsevärdesproblem
finns i MATLAB funktionerna ode23 och ode45, vilka bygger på Runge-Kuttametoder samt ode23s , som är lämplig för styva problem. Om differentialekvationssystemet skrivs på formen
y' = f(t,y), y(t 0 ) = y 0
och vi önskar en numerisk lösning då tiden t går från t0 till tslut kan ode23 anropas på följande sätt (samma anrop för ode45 och ode23s ):
[tout,yout]=ode23('f',tint,y0)
Indata:
f är namnet på den funktionsfil där högerleden f(t,y) är givna som en kolumnvektor
tint är det intervall [t0,tslut] där lösningen önskas
y0 är begynnelsevärden givna som en kolumnvektor
Utdata:
tout är de t-värden i vilken lösningen y är beräknad
yout är en matris, vars kolumner är y-lösningar i t-värdena tout
Funktionen f ska anropas på följande sätt: z = f(t,y)
Indata:
t är ett t-värde
y är en kolumnvektor med y-komponenterna
Utdata:
z är en kolumnvektor med f -komponenterna
- 23 -
Ex. Lös y'' + y = exp(-t), y(0)=1, y'(0) = 0 numeriskt på (0,10). - Skriv om som system
y1' = y2 y1(0) = 1
y2' = -y1 + exp(-t) y2(0) = 0
Funktionen f: function [z]=f(t,y);
z=[y(2);-y(1)+exp(-t)];
Funktionen f sparas på filen f.m
Anropet blir sedan: [tout,yout]=ode23('f',[0,10],[1 0]')
varvid tidpukterna finns i vektorn tout , och den numeriska lösningen i yout , varvid y1 står i första
raden, y2 i andra raden av matrisen yout . En plotbild av lösningen fås med anropet
plot(tout,yout)
Noggrannheten i den numeriska lösningen är satt till 10-3 (relativnoggrannhet). Om man önskar en annan noggrannhet ........................................
Toleransparametern tol bestämmer vilka steglängder som ode23 använder. Rutinen använder inte
konstant steglängd utan variabel steglängd.
I specialfallet att differentialekvationssystemet är linjärt med konstanta koefficienter, dvs
y' = Ay, y(0)=y 0
erhålles den exakta lösningen (bortsett från avrundningsfel) med >>y=expm(A*t)*y0
6.4 ALLMÄNT OM m-FILER
Som tidigare framhållits bör man i början av en m-fil lägga in en kommenterande text som visar vad som uträttas i filen. Kommentartext i början av en kommandofil och från rad 2 i en funktionsfil skrivs ut när man ger kommandot
help filnamn (utan suffixet .m)
Med kommandot type får man utskrift i kommandofönstret av innehållet i en textfil:
type filnamn ger utskrift av filen filnamn.m
type filnamn.d ger utskrift av textfilen filnamn.d
Med kommandot what får man reda på vilka m-filer som finns i den aktuella katalogen. Det är ofta lämpligt att inleda en m-fil med kommandona clear och clf för att inte gammalt skräp i arbetsarean skall ge oönskade bieffekter.
- 24 -
6.5 FELSÖKNING I MATLAB-PROGRAM
För att söka programmeringsfel i ett MATLAB-program som inte fungerar kan man använda sig av olika metoder.
Ett enkelt sätt är att förse programmet med mer utmatning av variabelvärden, så att man kan se hur beräknade värden förändras då programmet genomlöps. Detta åstadkoms genom att ta bort semikolon efter tilldelningssatser och sedan köra programmet igen. Bättre interaktion åstadkoms genom att även stoppa in keyboard -satser. Då en keyboard-sats upptäcks av programmet, stannar exekveringen, promptern K>> skrivs ut och kontrollen övergår till tangentbordet. I det läget kan man t ex skriva ut och/eller ändra variabelvärden, för att sedan återuppta exekveringen genom att ge kommandot return .
Ett annat hjälpmedel för att söka fel, eller som man ofta säger, avlusa (eng. debug) ett program, är att använda MATLABs debug kommandon. Med dessa kan man lägga in brytpunkter, stega sig framåt, hoppa mellan olika funktioner m.m. För att referera till olika satser i programmet måste man först lista programmet med radnummer. Debug kommandona börjar alla med bokstäverna db . Nedan anges några debug kommandon. Mer information erhålles med kommandot help debug .
Kommandon som skriver ut en m-fil med radnummer:
dbtype filnamn skriver ut innehållet i filen filnamn med radnummer
dbtype filnamn r1:r2 skriver ut rad r1 t o m rad r2 i filen filnamn
Kommandon som lägger in brytpunkter i filen:
dbstop in filnamn placerar en brytpunkt på första exekverbara raden i m-filen
filnamn
dbstop at r in filnamn placerar en brytpunkt på raden r i filen filnamn .
dbstatus filnamn skriver ut de radnummer där det finns en brytpunkt i filnamn
dbclear at r in filnamn avlägsnar brytpunkten på rad r i filnamn
Kommandon som exekverar filen:
dbstep utför nästa rad i den fil som avlusas
dbcont utför alla rader fram till nästa brytpunkt eller till slutet på filen
dbquit avbryter avlusningen
- 25 -
7 KÖRNING AV MATLAB PÅ OLIKA DATORSYSTEM
7.1 MATLAB under unix vid X-terminal
Börja med att logga in och ansluta dig till en skrivare (kommandot setprinter ). Starta MATLAB med kommandot matlab . Promptern i terminalfönstret blir >> . Skriv önskade beräkningsuttryck och tryck på retur. Efter första plot-satsen i MATLAB dyker grafikfönstret upp. Flytta detta fönster till en plats långt till höger på skärmen (läs om fönsterhantering i Terminalsalshäftet), annars försvinner det snart bakom terminalfönstret.
Med MATLAB-kommandot print (följt av Enter) skickas grafikfönstrets innehåll till laserskrivaren. Ha alltid med ditt namn t ex genom title('Anna P') innan du gör print så att du hittar din kurva bland alla laserskrivarutskrifter!
I emacsfönstret kan filer skapas och ändras. Gör emacsfönstret aktivt genom att klicka i det. Emacssekvensen ctrl-x ctrl-f följt av önskat filnamn t ex spiral.m skapar en m-fil (eller tar fram filen om den redan existerar). Skriv och ändra i filen (studera Gnu-Emacshäftet). Spara med ctrl-x ctrl-s och gå till terminalfönstret och kör programmet genom att skriva förnamnet (dvs spiral i detta fall).
Med piltangenterna återfås tidigare givna kommandon.
Gör what så kommer en förteckning över alla m- och mat-filer i din katalog. Med type spiral fås programlistan för spiral.m. Med dir listas bibioteket.
Unixkommandon kan användas i MATLAB om man inleder raden med ett utropstecken, t ex !print spiral.m ger programlistan för spiral.m utskriven på papper.
Med diary filnamn.d (se sidan 5) sparas allt som görs i MATLAB utom kurvorna i en dagboksfil som sedan kan snyggas till med Emacs och sedan skrivas ut med !print filnamn.d
Lämna MATLAB med quit.
7.2 MATLAB på Macintosh
Man startar MATLAB första gången genom att dubbelklicka i symbolen för MATLAB (i fortsättningen kan du dubbelklicka direkt på ett MATLAB-dokument).
Efter en liten stund kommer kommandofönstret och grafikfönstret fram. I kommandofönstret finns promptern >> . Skriv önskade MATLAB-uttryck och tryck på Enter.
Om man ska göra större saker är det smidigare att utnyttja editorn. Gå till menyn File och markera New. Ett editeringsfönster kommer fram på skärmen. Skriv in dina MATLAB-satser. När du är klar och vill exekvera, gå till menyn File och markera där Save and go. Byt på uppmaning namnet Untitled mot något mer talande namn.
Resultatutskrifter fås i kommandofönstret och kurvor i grafikfönstret.
Om du vill ändra i programmet: klicka i editeringsfönstret så att det aktiveras (syns på den randade överkanten). Skriv in ändringarna och gör Save and go igen.
Gå till File-menyn och markera Open om du vill pröva ett existerande program, en förteckning över programmen visas och du kan klicka på önskat namn. Markera annars New igen om du vill skriva ett nytt program. Mer i File-menyn: Close stänger det aktiva editfönstret, Print ger pappersutskrift av aktivt fönster.
Tidigare givna kommandon kan letas upp i kommandofönstret, gå sedan in i redigerings- menyn, kopiera, markera var kommandot skall stå och klistra sedan in det på önskad plats i editeringsfönstret.
Quit lämnar Matlab.
- 26 -
7.3 MATLAB på IBM-PC
Gå först in i Windows. Man startar MATLAB med att dubbelklicka i matlab-ikonen .
Ett kommandofönster med promptern >> öppnas på skärmen. Skriv önskade MATLAB-kommandon och tryck på retur. Om man skall göra större saker är det smidigare att skriva in en m-fil med någon editor.
Klicka på File i MATLABfönstrets meny och välj New samt M-file ur undermenyn så kommer man in i en editor. Skriv in MATLABsatserna och spara sedan filen. Om man vill hämta in en gammal fil klickar man på File och väljer sedan Open . Då öppnas ett nytt fönster där man ser namnen på de filer som finns i arbetskatalogen. Välj den önskade filen så startas editorn och filens text syns på skärmen. Editera och spara.
Med piltangenterna återfås tidigare givna kommandon.
Vill man skriva ut en session från kommandofönstret på papper använder man kommandot diary (se 2.6). Dagboksfilen kan editeras i editorn (använd Open , se ovan).
Utskrift av m-filer, funktionsfiler och dagboksfiler på papper kan antingen åstadkommas genom att ge !print filnamnet i MATLABs kommandofönster eller genom att klicka på File och sedan välja Print . Utskrift av en graf i grafikfönstret görs genom att klicka på File i det fönstret och sedan välja Print .
- 27 -
8. SESSIONSEXEMPEL:UTSKRIFT AV DAGBOK OCH GRAFER
Nedan ges exempel på en körning i MATLAB, där en dagbok och två plotbiler skapas och skrivs ut
på skrivare. Antag att ett MATLABprogram som plottar en kurva finns sparad på filen prog.m
>> diary dagbok.d %tillfällig dagboksfil "dagbok.d" öppnas
>> type prog %skriver ut prog.m på skärmen och i dagboken
t=0:0.1:5;
x=exp(-t).*sin(t);
y=exp(-t).*cos(t);
maxx=max(x),maxy=max(y) %skriver ut max(x) och max(y) på skärmen och i dagboken
plot(t,x,t,y); %ritar grafen på skärmen (syns EJ i dagboken)
title('x=exp(-t)cos(t), y=exp(-t)sin(t)')
xlabel('t')
ylabel('x,y')
>> prog %kör filen prog.m, resultatet (förutom grafen) hamnar på
skärmen och i dagboken
>> diary off %stänger av dagboken
>> print %skriver ut grafen på skrivaren
>> !print dagbok.d %skriver ut dagboken på skrivaren
>> !print prog.m %skriver ut MATLABprogrammet på skrivaren
>> delete dagbok.d %tar bort den tillfälliga dagboken från biblioteket
Antag att vi vill fortsätta med ytterligare ritning efter dagboken stängts:
>> plot(x,y) %ger en annan graf av funktionssambanden
>> title('y som funktion av x')
>>xlabel('x')
>>ylabel('y')
>> print %Skriver ut den nya grafen på skrivaren
Obs! När man kör i Nadas terminalsalar kan man välja skrivare genom att ge unix-kommandot
setprinter -Pskrivare innan man går in i MATLAB, t ex setprinter -Pred
Man kan även destinera utskriften till önskad skrivare med MATLABs print-kommando, t ex
>>print -Pred
Obs! Det är viktigt att skilja mellan utskrift av dagboksfilen och utskrift av grafen. Dagboksfilen
skrivs ut med operativsystemskommandot !print dagbok.d (utropstecknet framför
refererar till ett operativsystemkommando) medan grafen skrivs ut med MATLABkommandot
Det kan ibland vara lämpligt att editera dagboken först (ta bort onödig utskrift) innan
den skrivs ut.
- 28 -
INLEDANDE LABORATION:bekanta dig med MATLAB
I denna inledande datorövning med MATLAB behandlas några olika användningssätt av MATLAB. Övningen genomförs så att du själv ger de kommandon som anges, iakttar de resultat som skrivs ut på skärmen och gör de uppgifter som finns insprängda i texten.
Varje avsnitt inleds med en kort beskrivning och därefter ges exempel på hur MATLAB används. Exemplen innehåller dialoger med datorn. Det som skrivs med denna stil är precis det som du ser på din datorskärm när du genomför exemplen. För att spara utrymme i nedanstående text visas ibland dialogen i två kolumner åtskilda av ett mittstreck.
Tecknet >> är MATLABs prompter. Den text som följer efter promptern är användarens inmatning. Systemets svar följer på raden (eller raderna) efter. Om du gör fel när du genomför exemplen, så talar datorn om att något är fel. Då är det bara att försöka igen!
Övningen är indelad i två avdelningar anpassade efter förkunskaperna i matematik. Avsnitt 1 - 5 förutsätter endast gymnasiematematik, medan de återstående avsnitten 6 - 8 förutsätter kunskaper i linjär algebra (vektorer, matriser, linjära ekvationssystem).
1. MATLAB som kalkylator. Variabler och arbetsyta
MATLAB kan användas som en avancerad kalkylator. Man knappar in matematiska uttryck nästan som man skriver dem på papper och får svaret direkt. De flesta matematiska funktioner finns tillgängliga. Parenteser kan användas till godtyckligt djup. - Först några enkla kalkyler:
>>3+2-1 inmatning avslutas med Enter-tangenten
ans =
4
>>2^6-1
ans =
63
>>cos(pi/4)-sqrt(2)/2 trigonometriska funktioner arbetar med radianer
ans =
0
När mer omfattande kalkyler skall göras är det praktiskt att lagra mellanresultat i variabler. För användning av variabler i MATLAB gäller följande:
q Variabler kan ha godtyckliga namn, se 2.1. Dessa namn finns sedan kvar i datorn ända
tills man suddar dem eller går ur MATLAB
q Om man skriver en variabels namn, så skrivs dess värde ut
q Om en rad avslutas med ; undertrycks utskriften
q Om man gör en beräkning utan att tilldela resultatet ett namn (dvs utan att ha ett vänsterled) så
hamnar resultatet i variablen ans
- 29 -
Nedan följer några satser med användning av variabler i MATLAB:
>>x=2 >>y
x = y =
2 0.2000
>>x=5 >>mitt_resultat=sin(y*pi);
>>mitt_resultat
x =
mitt_resultat =
5
0.5878
>>x/25
>>exp(mitt_resultat^5)
ans =
ans =
0.2000
1.0727
>>y=x/25;
Obs! Matlab skapar variabelnamnet ans när användaren inte tilldelar resultatet till en variabel.
Vi har nu använt några av funktionerna i MATLAB, nämligen sin, cos och exp. Om du skriver help följt av namnet på en funktion, så får du information om funktionen:
>>help sqrt
SQRT Square root
SQRT(X) is the square root of X.
Complex results are produced if X is not positive
See also SQRTM.
Alla variabler du skapar läggs på den arbetsyta (workspace), som du får tilldelad när MATLAB startas
q Arbetsytan kan sparas ( save ) för att senare återladdas ( load ). Då en arbetsyta återladdas
befinner man sig i samma läge som då den sparades, dvs alla variabler har samma värden
som då de sparades
q Med kommandot who får man reda på vilka variabler man har för tillfället
q Med kommandot clear suddas hela arbetsytan, se 2.1
Fortsättning på föregående dialog:
>>who >>who
Your variables are Your variables are:
ans x
mitt_resultat y >>x
??? Undefined function or
>>save temp variable x
>>clear
- 30 -
Arbetsytan är nu tom. Inga variabler finns definierade (med de finns sparade på skivminnet). Vi kan nu lämna MATLAB och logga ut från datorn. Då vi loggar in igen kan vi fortsätta enligt nedan. Vi fortsätter exemplet (utan att lämna MATLAB emellan) och återlagrar arbetsytan:
>>load temp >>who
>>x
x = Your variables are:
5 ans x
mitt-resultat y
De fyra variablerna är återigen tillgängliga, med sina gamla värden.
2. Funktionstabeller
I MATLAB kan man enkelt bilda en tabell av en funktion. Vi börjar med att skapa en tabell över de x-värden som funktionen skall beräknas i, därefter anropas funktionen för denna x-tabell och vi får en tabell av funktionsvärden:
>>x=1.5:0.5:2.5 >>y=sin(x)
x = y =
1.5 2.0 2.5 0.9975 0.9093 0.5985
Tabeller kan multipliceras, divideras och exponentieras komponent för komponent om man sätter en punkt (.) före operationen. Addition och subtraktion utförs naturligtvis alltid komponentvis:
>>x=0:2:6 >>x+x.^2
x = ans =
0 2 4 6 0 6 20 42
>>y=x.^2 >>f=2-2*x+3*x.^2+x.^3
y = f =
0 4 16 36 2 18 106 314
>>x.*y >>y./x
Warning:Divide by zero
ans =
ans =
0 8 64 216
Inf 2 4 6
I den näst sista satsen beräknas polynomet f(x) = 2 - 2x + 3x2 + x3. Med hjälp av hakparenteser kan man samla ihop en eller flera tabellfunktioner till en snygg tabell:
>>x=0:0.1:10;y=sin(x);z=cos(x); x, y och z är tabeller skrivna som rader.
>>tab=[x' y' z']; Genom att använda tecknet ' blir x, y och z
tabeller skrivna som kolumner.
Genom att räkna upp dem och sätta [ ] runt om
dem skapas en ny tabell bestående av flera
kolumner.
-31-
-----------------------------------------------------------------------------------------------------------
Uppgift 1:Skriv ut en tabell över funktionen g(x) = x3/20 - 2 - x3e-x för x = 0, 0.5, 1, .... , 5
---------------------------------------------------------------------------------------------------------
3. Grafik
Det finns två fönster i MATLAB
q kommandofönstret
q grafikfönstret
De exempel vi sett hittills har endast använt kommandofönstret. När olika plot-kommandon används hamnar kurvor, grafer och andra figurer i grafikfönstret. I MATLAB kan man rita xy-grafer, 3-dimensionella grafer och kurvor mm. Kommandot >>plot används för 2-dimensionell grafik (xy-grafer), se 5.1.1. När man givit plot-kommandot öppnas grafikfönstret och grafen ritas i det. Vill man sedan ge ett nytt kommando måste man först återgå till kommandofönstret. Detta gör man genom att klicka i det eller genom att trycka på en godtycklig tangent. Man går tillbaks till grafikfönstret genom att klicka på det eller med kommandot >>figure(gcf) . Grafikfönstret suddas med kommandot >>clf .
>>t=0:2:10;
>>y=sin(t);
>>plot(t,y)
Grafen ser inte ut som en sinuskurva. Detta beror på
att vi har så få tabellvärden att figuren inte blir rätt-
visande, ty mellan tabellvärden dras räta linjer. Steget
mellan två tabellvärden, som i detta fall = 2, är för stort.
Vi behöver många fler värden, dvs mindre tabellsteg
för att få en snygg sinuskurva.
>>t=0:0.01:10;
>>y=sin(t);
>>plot(t,y)
>>title('y=sin(x)')
>>xlabel('x')
>>ylabel('y')
Man kan sätta beteckningar på axlar och rubrik över plot-bilden, se 5.1.5. Om man så önskar kan man välja att markera punkter och linjetyper och olika färger på linjerna (förutsätter färggrafik), se 5.1.1. Med kommandot comet(t,y) görs en animerad plottning av kurvan.
------------------------------------------------------------------------------------------------------------
Uppgift 2: Rita grafen för funktionen g(x)=x3/20 - 2 - x3e-x för x på intervallet (0,5). Välj lämpligt tabellsteg så att grafen blir snygg.
------------------------------------------------------------------------------------------------------------
-32-
4. Dagbok
Kommandot diary används för att föra protokoll (upprätta en dagbok) över allt som skrivs i kommandofönstret. Det som sparas på dagboken är de kommandon som givits och de resultat som de ger utskrivna i kommandofönstret. Däremot sparas inte det som syns i grafikfönstret. Dagboken lagras på en fil som man kan editera, inspektera eller skriva ut på papper. Dagboken kan startas när som helst under ett Matlab-pass, stängas av för att sedan sättas på igen om man så önskar. Följande exempel visar hur dagboken startas, resultatet genereras och sparas på filen uppgift3.d , varefter dagboken avslutas:
>>diary uppgift3.d >>x(151)
>>x=[-2:0.02:1]';
>>x'*x ans =
ans = 1
152.5100 >>diary off
Dialogen finns nu sparad på filen uppgift3.d. Dagboksfilen kan listas genom att ge MATLAB-kommandot type . Alternativt kan operativsystemets list-kommando användas eller det kommandot som skriver ut filen på papper. Systemkommandon måste inledas med utropstecken (!) om de ges inuti MATLAB (gäller ej Mac, se 7.2).
>>type uppgift3.d
>>x=[-2:0.02:1]'; Följande rader t.o.m. raden diary off är innehållet
>>x'*x i dagboksfilen
ans =
152.5100
>>x(151)
ans =
1
>>diary off
Genom att ge kommandot diary on återupptas registreringen på samma fil som användes tidigare. Det kan vara användbart ibland, men tag för vana att starta en ny dagboksfil i stället. Man kan mycket lätt drunkna i allt skräp man sparar annars. Det går alltid att redigera i dagboksfilerna i efterhand med hjälp av någon editor:sudda sådant man inte vill spara, slå ihop flera dagboksfiler till en, lägga till förklarande text, etc.
För att lätt hitta bland sina biblioteksfiler är det lämpligt att ge sina dagboksfiler efternamnet d , t ex uppgift3.d
5. Programmering
Hittills har vi använt MATLAB som en interpretator, dvs MATLAB tolkar och utför ett kommando så snart kommandot är givet och man tryckt på Enter. Detta arbetssätt lämpar sig för mindre beräkningar, men blir klumpigt när antalet kommandon som behövs för att utföra en uppgift blir stort. I MATLAB finns dock möjligheten att spara de kommandon som behövs för att lösa en beräkningsuppgift på en fil och exekvera denna. Genom denna facilitet kan MATLAB även användas som ett högnivå- programspråk, och de kommandofiler som byggs upp kan ses som MATLAB-program.
- 33 -
Gå in i en editor och öppna en fil. Skriv in följande satser som skapar en funktionstabell och sedan ritar en graf av funktionen.
x=0:0.2:2;
f=2-2*x+3*x.^2+x.^3;
plot(x,f)
title('f(x)=2-2x+3x^2+x^3')
xlabel('x')
ylabel('f(x)')
Spara filen som en m-fil, t ex under namnet prog.m och lämna editorn. Kör MATLAB-programmet genom att ge kommandot prog
Lös även samma uppgift genom att först spara funktionen på en funktionsfil. Gå in i editorn. Skriv in följande satser
function y=funk(x);
y=2-2*x+3*x.^2+x.^3;
Spara filen som en m-fil under namnet funk.m. Hämta in filen prog.m till editorn. Editera den så att vi får följande MATLABprogram som anropar funktionen funk:
x=0:0.2:2;
f=funk(x);
plot(x,f)
title('f(x)=2-2x+3x^2+x^3')
xlabel('x')
ylabel('f(x)')
Kör programmet genom att ge kommandot prog
Skriv ut innehållet i grafikfönstret på skrivare.
Skriv även ut de två m-filerna prog.m och funk.m på skrivare.
LABORATIONEN DEL 1 - 5 UTFÖRD AV: __________________________________________
LINJE och INSKRIVNINGSÅR: ____________________
DATUM:_______________________
GODKÄND AV: ________________________________________
-34-
6. Vektorer
MATLAB skiljer på radvektorer och kolumnvektorer. En vektor skapas genom att hakparenteser [ och ] sätts före resp efter vektorns element:
>>x=[5;4;3] semikolon mellan elementen ger kolumnvektor
x =
5
4
3
>>x=[5 4 3] blanktecken eller kommatecken mellan elementen
ger radvektor
x =
5 4 3
>>x=[5 4 3]' en radvektor kan transponeras till en kolumnvektor
x =
5
4
3
I MATLAB kan vi utföra vanlig vektoralgebra på de vektorer som vi skapar:addition, subtraktion, multiplikation med skalär, skalärprodukt:
>>u=[2;-5;4;2] >>z=u-3*v
u = z =
2 -1
-5 -8
4 10
2 -10
>>v=[1;1;-2;4]; >>u'
>>u+v ans =
ans = 2 -5 4 2
3 >>u'*v
-4
2 ans =
6 -3
Addition och subtraktion av vektorer kan endast utföras på vektorer med samma antal komponenter
(samma dimension). Det går inte heller att addera en radvektor och en kolumnvektor:
>>x=[1 2 4 6]'; z=[2 1]'; >>y=[1 2 4 6]
>>x+z y =
??? Error using ==> + 1 2 4 6
Matrix dimensions must agree. >>x+y
??? Error using ==> +
-35- Matrix dimensions must agree
När man refererar till enstaka element i en vektor, t ex för att se vilka värden några av elementen har, används vanlig parentes, dvs ( och ):
>>y(3) 1 2 5 6
ans = >>y(2:4)
4
>>y(3)=5 ans=
y = 2 5 6
7. Funktioner av vektorer
I MATLAB kan man enkelt bilda en funktion av en vektor, och får då en ny vektor. Vi börjar med att skapa en radvektor med ekvidistanta element med hjälp av kolon-notation (se 3.6) och bildar sedan en tabell av sinusfunktionen:
>>x=1.5:0.5:2.5 >>y=sin(x)
x = y =
1.5 2.0 2.5 0.9975 0.9093 0.5985
Vektorer kan multipliceras, divideras och exponentieras komponent för komponent om man sätter en punkt (.) före operationen. Addition och subtraktion utförs naturligtvis alltid komponentvis:
>>x=0:2:6 >>x+x.^2
x = ans =
0 2 4 6 0 6 20 42
>>y=x.^2 >>f=2-2*x+3*x.^2+x.^3
y = f =
0 4 16 36 2 18 106 314
>>x.*y >>y./x
Warning:Divide by zero
ans =
ans =
0 8 64 216
Inf 2 4 6
I den näst sista satsen beräknas polynomet f(x) = 2 - 2x + 3x2 + x3. Observera att tvåan efter likhetstecknet inte är en vektor, men då en skalär storhet adderas till/subtraheras från en vektor så omvandlas skalären automatiskt till en vektor av samma dimension som vektorn.
Med hjälp av hakparentesen kan man samla ihop en eller flera tabellfunktioner till en snygg tabell:
>>x=0:0.1:10;y=sin(x);z=cos(x); x, y och z är radvektorer
>>tab=[x' y' z']; genom att transponera x, y och z blir de
kolumnvektorer, som om de staplas bredvid
varandra blir en tabell (egentligen en matris)
som sedan kan skrivas ut med tab
-36-
Som framgår av ovanstående exempel är det mycket enkelt i MATLAB att bilda en tabell av en funktion. Ingen for-sats eller index behövs; om man beräknar funktionen av en variabel som är en vektor, så bildar MATLAB automatiskt en ny vektor.
-----------------------------------------------------------------------------------------------------------
Uppgift 3:Skriv ut en tabell över funktionen g(x) = x3/20 - 2 - x3e-x för x = 0, 0.5, 1, .... , 5
---------------------------------------------------------------------------------------------------------
8. Matriser
1 2 3
Matrisen A = 5 4 9 kan matas in på något av följande sätt:
8 7 6
>>A=[1 2 3 >>A=[1 2 3;5 4 9;8 7 6]
5 4 9
8 7 6]
Semikolon (;) används i matriser till att markera slut på raden, se 2.1. I bägge fallen erhålles följande utskrift på skärmen:
>>A =
1 2 3
5 4 9
8 7 6
En matris kan också bildas genom att vi ställer samman vektorer:
>>u=[1:1:4] >>z=v.^2
u = z =
1 2 3 4 4 4 1 1
>>v=[2 2 1 1] >>A=[u;v;z]
v = A =
2 2 1 1 1 2 3 4
2 2 1 1
4 4 1 1
Med kommandot >>B=[u' v' z'] bildas en annan matris. Vilken? Med kommandona
>>C=[u v z] och >>D=[u';v';z'] bildas ytterligare matriser. Vilka?
Vi kan referera till ett element av matrisen eller ändra ett element genom att ange radindex och kolumnindex innanför vanliga parenteser:
>>A(3,1) >>A(2,2)=8
ans = A =
4 1 2 3 4
2 8 1 1
4 4 1 1
-37-
Precis som för vektorer används alltså vanliga parenteser ( ) då vi refererar till element, medan hakparenteser [ ] används då en matris skapas!
I MATLAB hanteras vektorer och matriser enligt vektoralgebrans räkneregler, dvs addition, subtraktion samt multiplikation av matriser/vektorer (förutsatt att dimensionerna stämmer), se 3.2.
----------------------------------------------------------------------------------------------
2 1 1 1 7
Uppgift 4:Givet följande två matriser A = , B = samt vektorn x =
4 5 2 3 9
Skapa dessa variabler i MATLAB och bilda sedan C=AB, D=BA, z=Ax, p=zTz, E=ATA
samt q=xTEx.
---------------------------------------------------------------------------------------------
Ett linjärt ekvationssystem Ax = b löses i MATLAB med satsen >>x = A\b
>>A=[2 1;4 5]; >>A=[2 1;4 2];
>>b=[3 9]'; >>x=A\b
Matrix is singular to working
>>x=A\b precision
x = x =
1 Inf
1 Inf
Om matrisen är icke-singulär (det (A) # 0) löses ekvationssystemet med Gausselimination av MATLAB. Om matrisen är singulär (det (A) = 0) skriver MATLAB ut en varning.
--------------------------------------------------------------------------------------------------------
Uppgift 5: Använd MATLAB för att lösa det linjära ekvationssystemet
1 1 1 -1 x1 4
1 1 1 1 x2 2
1 2 4 8 x3 -2
1 4 16 64 x4 14
---------------------------------------------------------------------------------
LABORATIONEN DEL 6 - 8 UTFÖRD AV: __________________________________________
LINJE och INSKRIVNINGSÅR: ____________________
DATUM:_______________________
GODKÄND AV: _________________________________________
-38 -
REFERENSLISTA
Kommando Användning Avsnitt
Allmänt
clc rensar kommandofönstret 2.3
clear rensar arbetsarean 2.1
clf rensar grafikfönstret 5.1.1
cputime cpu-tid 2.5
ctrl -c avslutar utskriften, kvar i MATLAB 2.6
demo körning av demonstrationsexempel 2.6
diary genererar dagbok 2.6
format talformat 2.2
global global variabel 6.3.1
help hjälpfacilitet 2.3
length vektorlängd 2.8
load hämtar in senast sparade arbetsarea 2.6
pause stannar exekvering tills tangent trycks ned 6.2
quit lämnar MATLAB 2.6
save sparar arbetsarean 2.6
size rad- och kolumndimensioner 2.8
what ger namnen på m-filerna 6.4
who listar aktuella variabelnamn 2.1
whos som who men med variablernas typer 2.1
Algebraiska operationer
+ - * / de fyra räknesätten 2.4
.* ./ komponentvis multiplikation, division 2.4, 3.2
\ "backslash", vid ekvationslösning 3.2
^ upphöjt till 2.4
.^ komponentvis upphöjt till 2.4, 3.2
' transponering 3.2
Relationsoperatorer och logiska operatorer
< <= mindre än, mindre än eller lika med 4.1
> >= större än, större än eller lika med 4.1
== lika med 4.1
~= skild ifrån 4.1
& och 4.1
| eller 4.1
~ negation 4.1
all alla sanna 4.1
any någon sann 4.1
Speciella tecken
= tilldelning 2.1
[ ] för att skapa matriser, utdata från funktioner 2.1, 6.3.1
( ) i aritmetiska uttryck, omger index och argument 2.1, 2.4, 6.3.1
. decimalpunkt 2.1
E e 10-exponent i tal 2.1
... fortsättning av sats på nästa rad 2.3
, separerar index och funktionsargument 2.1, 6.3.1
; undertrycker utskrift, separerar rader i matriser 2.1, 3.6 : indexering, vektorgenerering 3.7, 3.8
' vid utskrift av text, i vissa plotkommandon 5.1.2, 5.1.4, 6.2
% inleder kommentar 2.1
-39-
Speciella värden
ans resultatet om ett uttryck ej tilldelats en variabel 2.3
eps flyttalsprecision 2.1
flops räknar antalet operationer 2.5
i, j imaginära enheten 2.9
Inf oändligheten 2.1
NaN Not a Number 2.1
pi p 2.1
Speciella matriser
diag diagonalmatriser 3.1
eye enhetsmatriser 3.1
meshgrid matris för 3D-bilder 5.3
ones ettmatriser 3.1
rand,randn slumptalsmatriser 3.1
zeros nollmatriser 3.1
Speciella matris/vektor-funktioner
cond konditionstal 3.4
det determinanten 3.2
eig egenvärdena till en matris 3.2
inv inversen till en kvadratisk matris 3.2
lu LR-faktorisering 3.2
norm vektor- och matrisnorm 3.4
qr QR-faktorisering 3.2
rank rangen 3.2
svd singulärvärdesfaktorisering 3.2
Polynomhantering
poly ger koefficienter när rötter är kända 3.3
polyval värdet av ett polynom 3.3
roots rötterna till ett polynom 3.3
Dataanalys
bar stapeldiagram 2.8
diff differenser av elementen i en vektor 2.8
hist histogram 2.8
length vektorlängd 2.8
magic magisk kvadrat 2.8
max största elementet i en vektor 2.8
mean medelvärdet av elementen i en vektor 2.8
median medianen av elementen i en vektor 2.8
min minsta elementet i en vektor 2.8
prod produkten av elementen i en vektor 2.8
size rad- och kolumndimensioner 2.8
sort sorterar elementen i en vektor 2.8
std standardavvikelsen för elementen 2.8
sum summan av elementen i en vektor 2.8
- 40 -
Kontrollflöde
else används med if 4.2
end avslutar if , for och while 4.2, 4.3
for upprepar satser visst antal gånger 4.3
if villkorskommando 4.2
while upprepar satser tills villkor uppfyllt 4.3
Grafik
axis manuell skalning av axlarna 5.1.4
clf suddar grafikfönstret 5.1.1
comet animerad uppritning av graf 5.1.1
comet3 animerad uppritning av 3D-graf 5.2
contour konturkurva för 3D-bild 5.3
drawnow framtvingar plottning 5.1.1
errorbar kurva med felstaplar 5.1.1
figure referens till grafikfönster 5.1.2
fill fyller i polygon med färg 5.1.1
ginput inmatning av text via musen 5.1.6
grid rutmönster i grafikfönstret 5.1.1
gtext text i grafiken 5.1.5
hold on håller kvar grafikfönstret 5.1.1
hold off avslutar kvarhållningen av grafikfönstret 5.1.1
loglog loglog x-y bild 5.1.3
mesh för 3D plottning, ritar yta 5.3
meshc ritar yta och konturkurvor 5.3
meshgrid för 3D plottning 5.3
plot x,y bild 5.1.1
plot3 x,y,z bild 5.2
polar polär bild 5.1.3
print utskrift av grafik-fönstret 5.1.7, 7
semilogx log x-y bild 5.1.3
semilogy x-log y bild 5.1.3
subplot delar upp grafikfönstret 5.1.2
surf för 3D plottning 5.3
text utskrift av text i grafen 5.1.5
title textsträng övanför plotbilden 5.1.5
view för 3D plottning 5.3
xlabel text under x-axeln 5.1.5
ylabel text under y-axeln 5.1.5
Programmering
disp utskrift av text 6.2
echo utskrift av kommandon i m-.filer 6.1
function inleder MATLAB-funktion 6.3.1
global global variabel 6.3.1
input inmatning från tangentbord 6.2
keyboard lämnar kontrollen till tangentbordet 6.2
m-fil exekverbar fil av MATLAB-kommandon 6.1
pause stoppar tillfälligt exekveringen 6.2
return återlämnar kontrollen till programmet 6.2
- 41 -