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

print

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 -