Kapitel 4. Programmet MATLAB MATLAB (namnet härlett ur MATrix LABoratory) är ett matematikprogram baserat på matrisalgebra, som blivit mycket använt för fysikaliska och tekniska tillämpningar. Den ursprungliga versionen, som skrevs på FORTRAN av Cleve Moler i University of New Mexico, saknade grafik, men bildade ändå stommen för senare versioner av MATLAB skrivna på C-språket. För att lära sig använda MATLAB, kan man utom handböckerna som levereras med programmet, också använda böcker, som beskriver fysikaliska och tekniska tillämpningar av MATLAB. En kort introduktion, MATLAB Primer som skrivits av Kermit Sigmon finns på nätet, se t.ex. http://www.internationaleconomics.net/documents/matlab.pdf, den nyaste versionen kan köpas i bokhandeln). En utförligare beskrivning av MATLAB finner man i The MATLAB Handbook skriven av Eva Pärt-Enander, Anders Sjöberg, Bo Melin och Pernilla Isaksson i Uppsala universitet. I Uppsala har också skrivits en svensk handledning (se http://www.it.uu.se/edu/bookshelf/). Det finns versioner av MATLAB för många slags datorer. De följande exemplen har testats med Windowsversionen, som är ganska lätt att använda, t.ex. via mikronätet (TOUKO). MATLAB (v. 6.5) finns dessutom på flere av Unix-datorerna i HU (rock, soul, heavy, etc). Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 1
Det finns också en studentversion av MATLAB som man kan köpa för ca 70 C =. MATLAB skiljer sig från de symboliska programmen därigenom, att den i allmänhet ger numeriska approximationer för de räkneoperationer man ber den utföra. I de nyaste versionerna av MATLAB (6 och högre) ingår dock även symboliska verktyg. MATLAB startas på de flesta datorer genom att man skriver matlab (för att undvika att den öppnar många grafiska fönster på en unix dator, vilket tar tid, kan man skriva matlab -nojvm). Programmet startar då upp och ger prompten >>. Om man själv vill öva sig i att använda MATLAB, kan man pröva kommandot intro, eller demo, som demonstrerar vilka slags problem som MATLAB klarar. Om man vill ha hjälp med något kommando i MATLAB, skriver man help kommando. För att avsluta en session med MATLAB använder man kommandot quit eller exit. Genom att trycka på uppåt-pilen får man på nytt ett tidigare kommando, med vänsterpil flyttar man sig till vänster ett steg, och delete (backspace) tar bort ett tecken. Om man tycker att någon räkneoperation tar för lång tid, kan man avbryta den med Ctrl-C. Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 2
4.1. Grunderna till MATLAB MATLAB har en inbyggd hjälpfunktion, som ger information om olika kommandon, som t.ex. >> help pi PI 3.1415926535897... PI = 4*atan(1) = imag(log(-1)) = 3.1415926535897... Med kommandot lookfor kan man söka upp sådana kommandofiler, som innehåller en given textsträng: >> lookfor root matlabro.m: % MATLABROOT Root directory of MATLAB installation. SQRT Square root. SQRTM Matrix square root. ROOTS Find polynomial roots. CPLXROOT Riemann surface for the n-th root. Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 3
MATLAB kan användas som en vanlig kalkylator, i likhet med Mathematica: >> 4711 + 1174 5885 >> 3^4, 5*(4+12) 81 80 Resultatet anges som ans, om man inte sätter ut något variabelnamn. Normalt gör man detta, och resultatet av en räkneoperation kan då se ut på detta sätt: >> x =16 x = 16 >> y = 3*x y = 48 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 4
Observera användningen av parenteser: Om man skriver a/b +c läser MATLAB detta som a + c, medan b a/(b+c) uppfattas som a. Detta beror på räkneoperationernas olika prioritet. b + c För division finns det två tecken, vanlig division (/) och vänsterdivision (\). 2/5 betyder detsamma som 5\2. I matrisräkning har vänsterdivisionen en speciell betydelse, som vi skall se senare. Normalt skriver MATLAB ut resultaten med 5 siffrors noggrannhet. Vill man ha mera, kan använda kommandot format long (eller format long e, som ger exponentformat). Man kan också behandla komplexa tal i MATLAB. Variablerna i och j används för att beteckna den imaginära enheten (om de inte definierats på annat sätt), och man kan därför utföra räkneoperationer med dem: >> z=1+2i z = 1.0000 + 2.0000i >> conj(z) 1.0000-2.0000i Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 5
>> z^2 - z -4.0000 + 2.0000i >> imag(z^2-z) 2.0000 Observera, att conj(z) här betecknar den komplexa konjugaten av z, dvs z. Argumentet av ett komplext tal (dvs fasvinkeln i det komplexa planet) anges med angle, t.ex. >> arg=angle(z) arg = 1.1071 MATLAB känner till alla de vanliga elementära funktionerna: >> cos(45) 0.5253 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 6
>> pi 3.1416 >> cos (pi/4) 0.7071 sin(pi) är inte exakt 0, eftersom pi är en approximation för π: >> sin(pi) 1.2246e-016 Observera, att de trigonometriska funktionerna anges i radianer, men det är lätt att konvertera dem till grader, eftersom MATLAB känner till π (som vi sett). Vi skall ännu se på några andra exempel. Den naturliga logaritmfunktionen betecknas med log, och den briggska med log10: Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 7
>> x=10; >> log(x) 2.3026 >> log10(x) 1 Nepers tal e får man genom att räkna ut exponentialfunktionens värde för x = 1: >> e=exp(1) e = 2.7183 I princip känner MATLAB till bara en matematisk storhet, en rektangulär matris. Ofta tolkas dock matriser med en rad eller en kolumn som vektorer och matriser med en rad och en kolumn som skalärer. En kolumnvektor och en radvektor anges på olika sätt i MATLAB: Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 8
>> vcol = [1; 2; 3; 4] vcol = 1 2 3 4 >> vrow = [ 5 6 7 8] vrow = 5 6 7 8 Man kan operera på en vektor (elementvis) med en funktion, t.ex. kvadratroten: Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 9
>> sqrt(vcol) 1.0000 1.4142 1.7321 2.0000 Om man vill se vilka variabler som hittills definierats, använder man kommandot who: >> who Your variables are: a b vrow y ans vcol x Om man vill stryka variabeldefinitionerna, använder man kommandot clear. Man kan också alstra en vektor med kolonoperatorn: >> v = 0:8 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 10
v = 0 1 2 3 4 5 6 7 8 >> v2=0:0.5:2 v2 = 0 0.5000 1.0000 1.5000 2.0000 Som vi ser, uppfattas argumentet mellan de två gränserna som en tillväxtterm. Ifall den fattas, antas tillskottet vara 1. Man kan också utföra operationer på en vektor: >> 2.^v 1 2 4 8 16 32 64 128 256 Observera punkten framför operatorn ^, som anger att operationen utförs elementvis. Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 11
För att beräkna vektorprodukten av två vektorer, kan man använda funktionen cross. Produkten av de två vektorerna i + j och j + k (i = [100] etc.) kan sålunda beräknas som följer: >> a = [1 1 0]; >> b = [0 1 1]; >> c = cross(a,b) c = 1-1 1 Matriser kan konstrueras på olika sätt. Dels kan man konstruera dem direkt från en elementlista, dels kan man alstra dem med hjälp av MATLAB-kommandon, och dels kan de läsas in från filer. En matris kan konstrueras genom att räkna upp element för element: >> B(1,1)=1; B(1,2)=2; >> B(2,1)=3; B(2,2)=4 B = 1 2 3 4 men vanligen används en annan metod. Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 12
En fyrradig matris kan man t.ex. läsa in genom att ange elementen radvis, åtskilda av semikolon, och omge hela uttrycket med klamrar: >> A = [ 1 2 3 4 ; 2 3 4 1 ; 3 4 1 2 ; 4 1 2 3 ] A = 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 (om man inte vill att MATLAB skall skriva ut matrisen, kan man tillfoga ett semikolon (;) efter kommandot). En radvektor kan anges på liknande sätt, elementen kan vara matematiska uttryck (observera, att pi betecknar symbolen π): >> x = [-0.5, 0.5, 1, pi ] x = -0.5000 0.5000 1.0000 3.1416 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 13
Emedan x är en radvektor, kan man inte utföra multiplikationen Ax, vilket observeras av MATLAB: >> b = A*x??? Error using ==> * Inner matrix dimensions must agree. Däremot fungerar multiplikationen xa: >> b=x*a b = 16.0664 7.6416 7.7832 9.9248 Genom att transponera x till en kolumnvektor med apostrofbeteckningen >> x = x x = -0.5000 0.5000 1.0000 3.1416 kan man utföra beräkningen: Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 14
>> b = A*x b = 16.0664 7.6416 7.7832 9.9248 Låt oss definiera två matriser A och B: >> A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 >> B = [1 2 3; 4 5 6] B = 1 2 3 4 5 6 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 15
Vi kan lätt bilda matrisprodukten BA: >> B*A 30 36 42 66 81 96 men försöker vi räkna ut AB, lyckas det inte: >> A*B??? Error using ==> * Inner matrix dimensions must agree. Detta beror på, att raderna i matrisen A har tre element, medan kolumnerna i B har endast två element. Matrismultiplikationen kan alltså inte utföras. Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 16
Determinanten av matrisen A är noll, medan determinanten av B inte existerar: >> det(a) 0 >> det(b)??? Error using ==> det Matrix must be square. Detta leder till att matrisen A blir singulär och saknar invers, medan B definitionsmässigt inte har någon invers eftersom den inte är en kvadratisk matris. Vi ser detta genom att försöka beräkna inverserna med MATLAB: Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 17
>> inv(a) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.937385e-018 1.0e+016 * 0.3152-0.6304 0.3152-0.6304 1.2609-0.6304 0.3152-0.6304 0.3152 >> inv(b)??? Error using ==> inv Matrix must be square. Om man obetydligt förändrar något av elementen i A, får vi en matris som uppför sig bättre: >> A2 = [1 2 3; 4 5 6; 7 8 9.01]; >> det(a2) -0.0300 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 18
Determinanten är fortfarande ganska liten, men inversen existerar, även om konditionstalet rcond är litet: >> rcond(a2) 9.2695e-005 >> inv(a2) 98.3333-199.3333 100.0000-198.6667 399.6667-200.0000 100.0000-200.0000 100.0000 Ekvationssystemet Ax = b, där b är kolumnvektorn [456] kan dock lösas med hjälp av MATLAB på följande sätt: >> b = [4; 5; 6]; >> A\b Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 19
-0.3333-2.3333 3.0000 (observera vänsterdivisionen \). Om vi byter ut matrisen A mot den modifierade matrisen A2, fås b = [-3.3333, 3.6667, 0.0000], en rätt stor skillnad. Om ett lineärt ekvationssystem Ax = b innehåller flere ekvationer än obekanta, säges det vara överdeterminerat. Detta inträffar ofta då man anpassar kurvor till experimentella data. Ekvationssystemet brukar då lösas med Gauss minsta kvadratmetod. MATLAB använder denna metod automatiskt då man använder operatorn \. Nedan visas ett exempel härpå: >> A=[1 2; 3 4; 5 6]; >> b=[7; 8; 9]; >> A\b -6.0000 6.5000 Introduktion till vetenskapliga beräkningar I, Tom Sundius 2009 20