6.1.7 1 ÅBO AKADEMI TEKNISKA FAKULTETEN MATLAB - en kompakt introduktion av Tore Gustafsson MATLAB 1 är ett interaktivt programpaket för numeriska beräkningar. Matlab står för matrix laboratory och är således konstruerat speciellt för matrisberäkningar. Matlab används via några interaktiva fönster. De viktigaste är "Command window" i Matlabs huvudfönster, "M-file editor" och "Help". I "Command window" kan man ge beräkningsinstruktioner och detta är det normala stället för beräkningsresultaten. Det rekommerade arbetssättet är att skriva ner instruktionerna för att lösa ett problem i en speciell instruktionsfil, som kallas m-fil, därför att förlängningen skall vara ".m". M-filerna innehåller egentligen datorprogram skrivna i Matlabs eget programmeringsspråk. M-filerna skrivs och editeras lämpligen med Matlabs egen editor, "M-file editor". Referenser för programmeringen fås ur fönstret "Help". Här hittar vi t.ex. "Getting started", som nybörjaren bör studera. Även en van Matlabanvändare behöver hjälp med instruktionerna. Dessa hittar han i "Help" under rubrikerna "Reference" och "Matlab function reference" (kan variera från version till version). Följande arbetssätt rekommeras: öppna "Command window", "M-file editor" och "Help" och placera dem på skärmen så att alla tre fönstren samtidigt är synliga. Välj sedan den katalog du vill använda som arbetsområde (välj "current directory" uppe i Matlabs huvudfönster). Skriv de instruktioner som behövs för beräkningen i en m-fil med hjälp av "M-file editor" och med "Help" som referens. Lagra filen och utför instruktionerna genom att i "Command window" skriva filens namn (observera att förlängningen bortlämnas). M-filen bör ha ett namn med förlängningen ".m". Bokstäverna å, ä och ö får inte förekomma i filnamnet, som heller inte får börja med en siffra. Matlab styrs av alfanumeriska radvisa instruktioner. Normalt avslutas en instruktion till Matlab med radslutet. Om man önskar fortsätta instruktionen på nästa rad skrivs tre punkter (...) i slutet av raden. Variabler Alla variabler är i princip av typen "matris med flyttalselement". En variabel har ett namn beståe av bokstäver och siffror. Bokstäverna å, ä och ö får inte förekomma, inte heller en siffra som första tecken. En variabel "deklareras" i och med att den tilldelas ett värde. Matrisens dimension slås fast i och med att variabeln tilldelas en given matris. Dess dimension kan ändras genom att tilldela den ett nytt värde. Tilldelning a =.5 definierar en skalär a (= 1x1-matris) och ger den värdet,5. Observera att Matlab använder decimalpunkt, inte decimalkomma! A = [1 3; 4 5 6; 7 8 9] definierar en 3x3 matris A med elementen som givits mellan hakparenteserna [ och ]. Semikolon (;) åtskiljer raderna. Det lönar sig i allmänhet att skriva ned större matriser en rad i gången. Efter semikolon behöver man inte skriva tre punkter (...) för att fortsätta instruktionen: A = [ 1 3; 4 5 6; 7 8 9] Matriselement kan bestå av uttryck eller funktioner: b = [-1.3; sqrt(3); (1++3)*4/5] resulterar i matrisen (vektorn) b till höger. 3 A = 4 5 6 7 8 9 1,3 b = 1,731 4,8 1 MATLAB är ett varumärke ägt av The MathWorks, Inc.
Tore Gustafsson Matlab - en kompakt introduktion Matlab känner en konstant pi = 3,1415965358979 A = 4 7 5 8 4 s = 1,3 1 3 6 1 Matlab känner en konstant i i = 1 Kolon (:) är en operator i MATLAB för att tilldela en sekvens av tal till en matris eller vektor, t.ex x = 1:5 resulterar i x = [1 3 4 5], dvs varje element i sekvensen inkrementeras med ett. I ett uttryck med två kolon anger uttrycket mellan kolonen hur mycket talvärdet skall ökas i varje steg i sekvensen, y = : pi/4 : pi resulterar i y = [,,7854 1,578,356 3,1416]. Matriselement anges med index inom parentes, t.ex. som A(,3) eller b(). Första indexet anger raden och andra indexet kolumnen. Ett a index anger elementets ordningsföljd oberoe om det är en radvektor eller kolumnvektor. Vi kan t.ex. ändra värdet på elementet i rad 3, kolumn 3 i den tidigare specificerade matrisen A med instruktionen A(3,3) = 1 Små och stora tal skrivs i traditionellt e-format: s = 1.3e-4 Komplexa tal är tillåtna i alla funktioner z = 3 + 4*i Uttryck Matematiska operatorer + addition - subtraktion * multiplikation / högerdivision \ vänsterdivision ^ exponent ' transponering c = b T b = [ 1,3 1,731 4,8] = 7,73 d = 4 7 c f 5 8 x = 1 1 3 6 x = 1 3 1,3 1,731 4,8 En MATLAB-sats är ofta av formen variabel = uttryck eller enbart uttryck. Ett uttryck består av variabler och aritmetiska operatorer och/eller funktioner. T.ex. c = b' * b ger inre produkten b T b = 7,73. Satsen fungerar så att uttrycket till höger om likhetstecknet evalueras, varefter räkneresultatet tilldelas variabeln till vänster om likhetstecknet. Observera att likhetstecknet i Matlab alltid betyder tilldelning. Likhetstecknet innebär inte att vi har en ekvation såsom i matematiken. T.ex. instruktionen n = n + 1 innebär att värdet av n ökas med ett. Normalt skrivs resultatet genast ut på skärmen, ett semikolon (;) efter uttrycket förhindrar utskrift Högerdivision och vänsterdivision är för skalärer identiska, är samma som d = c / f d = f \ c, dvs c divideras med f. För matriser gäller att x = A \ b är en lösning till ekvationen A x = b. Om A är kvadratisk innebär division en direkt Gausselimination av A, annars innebär operationen en minsta-kvadrat-lösning till ekvationen.
Matlab - en kompakt introduktion Tore Gustafsson 3 Elementvisa operationer (Array operations) Elementvisa operatorer utför aritmetiska operationer element för element på matriser eller vektorer. T.ex. om x = [ 1 3] och y = [4 5 6] så ger operationen z = x.^ y resultatet z = [ 1 3 79], medan om exponenten är skalär, z = x.^ resulterar i z = [ 1 4 9]. Variablerna i högerledet kan vara vektorer eller matriser, men alla bör ha samma dimension. Resultatet blir då en vektor eller matris med denna samma dimension. Addition och subtraktion behöver inte specificeras som elementvisa därför att addition och subtraktion av matriser enligt definition utförs elementvis. Elementvisa operatorer + addition - subtraktion.* multiplikation./ högerdivision.\ vänsterdivision.^ exponent Matematiska funktioner Matlab innehåller ett otal elementära matematiska funktioner samt vektor-, matris- och polynomtransformationer. Funktionerna sin, cos, exp etc fungerar elementvis med vektorer eller matriser som argument, medan för motsvarande matrisfunktioner finns skilda funktioner, t.ex. matrisexponentialfunktionen expm. alfa = : pi/ : *pi x = sin(alfa) resulterar i x = [, 1,, -1,, ]. Listan till höger ger några vanliga funktioner. Matlabs manual innehåller många fler. En snabb metod att kontrollera hur en matlabfunktion skall användas är att i instruktionsfönstret ge instruktionen help, t.ex. help atan resulterar genast i en grov anvisning för funktionen ifråga. Några matematiska funktioner i Matlab e x exp(x) ln x log(x) log 1 x log1(x) x abs(x) x sqrt(x) sin x sin(x) cos x cos(x) tan x tan(x) arcsin x asin(x) arccos x acos(x) arctan x atan(x) arctan (x/y) atan(x,y) Egna funktioner i m-filer Egna funktioner programmeras med Matlabs uttryck i m-filer, där första utförbara raden är en deklarationsrad, som deklarerar m-filen som en Matlabfunktion. Vi vill t.ex. beräkna integralen = 3 x Q cos( x) e dx. I Matlabs fönster "Help" väljer vi MATLAB /Reference / Functions by Category / Function Functions - Nonlinear Numerical Methods och där hittar vi funktionen quadl för numerisk integration. Quadl behöver integranden som en matlabfunktion. Det mest generella sättet är att skriva ner integranden som en funktion i en m- fil. För detta exempel kan vi kalla m-filen "integrand.m" och därmed har vi introducerat en ny matlab-funktion med namnet "integrand". M-filen ser ut så här: % integrand.m - funktion för quadl function y = integrand(x) y = cos(x).* exp(x); Integralen beräknas sedan med quadl. Integrandfunktionen specificeras i quadl:s argument som ett "handtag", med funktionsnamnet föregått av ett snabel-a (@). Q = quadl(@integrand,, 3) Andra och tredje argumentet för quadl är nedre respektive övre integrationsgränsen. Egna funktioner i m-filer - Första delen av filnamnet fungerar som namn för funktionen. - % anger att resten av raden är en kommentar. - Första utförbara raden i funktionsfilen är en deklarationsrad. - Deklarationsraden måste börja med ordet function. - Andra ordet är den variabel som tilldelas funktionsvärdet. - Efter likhetstecknet ges funktionens namn (samma som första delen av filnamnet) och funktionens argument inom parentes. - Sedan följer beräkning av funktionsvärdet.
Matlab - en kompakt introduktion Tore Gustafsson 4 Quadl kräver att man använder elementvisa operatorer i funktionen ty argumentet x till integranden innehåller samtidigt flera värden. Det lönar sig att avsluta raderna i funktionen med semikolon. Detta förhindrar att resultatet skrivs ut varje gång som funktionen utförs. Diagram f(x) 5-5 -1-15 Integrandens graf -.5 1 1.5.5 3 x - plot(x,y,'-') ritar heldragen linje - plot(x,y,'--') ritar streckad linje - plot(x,y,'o') märker ut de givna punkterna med cirklar - plot(x,y,'k') ritar en heldragen svart linje. hold on hold off plot(x,y) ritar diagram. Ett diagram med grafen av funktionen "integrand", definierad i filen integrand.m, erhålls med följande sekvens: x = :.1 : 3; y = integrand(x); clf plot(x,y) title('integrandens graf') xlabel('x') ylabel('f(x)') Den första raden bildar en vektor med 31 ekvidistanta x-värden, och den andra raden beräknar motsvarande funktionsvärden, som lagras i variabeln y. clf raderar en eventuell tidigare figur. plot(x, y) ritar ett linjediagram med räta linjer mellan (x, y)-par i vektorerna x och y. Diagrammet skalas automatiskt. De tre sista raderna sätter till en titel ovanför diagrammet och storheter på x- och y-axeln. Önskar man rita flera kurvor i samma diagram med olika plot-instruktioner bör man efter den första kurvan ge instruktionen hold on. Diagram kan i Windows överföras via klippbordet till ett textbehandlingsprogram genom att i figurfönstret ur menyn "Edit" välja "Copy Figure". Diagrammet kan sedan överföras till textbehandlingsprogrammet med "paste". Räknenoggrannhet och utskrift Matlab räknar med ca 15 siffrors noggrannhet. Detta gäller emellertid inte för alla funktioner. T.ex. numerisk lösning av differentialekvationer med funktionen ode3 ger en relativt fel mindre än 1 3 och ett absolut fel mindre än 1 6 i resultatet. Önskas högre noggrannhet måste detta specificeras skilt. Likaså beräknar quadl integraler med en felgräns 1 6. Oberoe av räknenoggrannheten skrivs resultatet ut med ett fast antal siffror. Det normala formatet är "short", som skriver resultatet med fyra decimaler. Om det normala formatet för talvärden inte är tillfredsställande kan man välja format short 5 siffror t.ex. 1.3333 format short e 5 siffror med exponent t.ex. 1.3333E+ format long 15 siffror t.ex. 1.33333333333333 format long e 15 siffror med exponent 1.33333333333333E+ Mera om matriser A = 4 7 3 d = 6 5 8 3 6 1 g = [ 4 5 6] F = 4 5 6 7 8 1 Undermatriser kan specificeras med vektorer som index, t.ex d = A(1:,3) ger en x1-matris, dvs rad 1 och ur kolumn 3 ur A. Observera att indexeringen av matriser startar från 1, inte från som i vissa programmeringsspråk. Ett ensamt kolon som index betecknar alla element i motsvarande rad eller kolumn: g = A(,:) F = A(:3,:)
Matlab - en kompakt introduktion Tore Gustafsson 5 En matris kan sättas ihop av ett antal undermatriser, t.ex. b1 = [4 6 8]; b = [1 3 ]; c1 = [ ; 7]; B = [[ b1 ; b ] c1 ].Då det är tvetydigt om en vektor är en radvektor eller kolumnvektor föredrar Matlab radvektorer. T.ex. instruktionerna h(1) = 1 h() = resulterar i en radvektor h = [ 1 ]. Önskar vi bestämma en kolumnvektor elementvis kan vi skriva h(1,1) = 1 h(,1) = Dimensionen av en matris eller vektor X erhålls med instruktionen [m, n] = size(x) Tre speciella matriser definieras med Z = zeros(m,n), som ger en mxn-matris fylld med nollor, E = ones(m,n), som ger en mxn-matris fylld med ettor och I = eye(n), som ger en identitetsmatris av dimensionen nxn. Diagonalmatriser konstrueras enkelt med instruktionen F = diag(d), där d är en vektor. Funktionerna det, norm, rank, cond beräknar matrisens determinant, norm, rang respektive konditionstal. Funtkionen inv inverterar en matris. Se "Matrix Functions - Numerical Linear Algebra" i "Help" för närmare instruktioner, eller skriv en instruktion av typen help det i instruktionsfönstret för en snabbreferens. b 1 = [ 4 6 8] b [ 1 3 ] = c = 1 7 4 B = 1 6 3 8 Exempel: >> size(b) ans = 4 7 Exempel: E = ones(3,1) I = eye(3) D = [E I] ger matrisen 1 D = 1 1 1 1 Exempel: d = [1 3]' F = diag(d) ger matrisen D = 3 Olinjära ekvationer Iterativ lösning av skalära olinjära ekvationer kan utföras med fzero. x = fzero(@funktion,x) fzero beräknar här iterativt ett nollställe x för en given funktion, definierad i en m-fil med namnet funktion.m, utgåe från en given gissning x. Exempel. Bestäm en lösning till ekvationen ( x 3) 1 = i närheten av x = 1. Vi skriver en m-fil, som definierar funktionen vars värde skall vara noll, och kallar den funk.m. Filen ser ut såhär: % funk.m - funktion för fzero function y = funk(x) y = (x-3).^ - 1; Lösningen fås med följande instruktion i "Command window" eller i huvudprogrammet: x = fzero(@funk,1) Observera att vi i m-filen använder elementvisa operationer, och tillåter sålunda att argumentet x kan vara en vektor. Matlab kan inte lösa ekvationer! fzero löser egentligen inte ekvationer, utan söker nollställen för funktioner. Ekva tionen måste alltså först skrivas i normalformen f(x) =, dvs med en nolla i högra membrum. Funktionen f(x) specificeras i m-filen, som ges som argument åt fzero.
6 Tore Gustafsson Matlab - en kompakt introduktion y ( x 3) e = xy = 1 Matlabs normalform: x ( x 3) e 1 = x1x 1 = x x = 1 x x y x f ( x) = ( x1 3) e x1x 1 >> x = fsolve(@ekvsys,[;]) Optimization terminated successfully: Relative function value changing by less than OP- TIONS.TolFun x = 1.6447897385951.68981179 >> Fsolve. Med fzero kan vi enbart lösa skalära ekvationer. Olinjära ekvationssystem löses med funktionen fsolve ur optimization toolbox. Fsolve använder som standard Gauss-Newtons metod för att lösa ekvationen f(x) =. Vektorfunktionen f(x) bör ges i form av en m-fil. Exempel. Bestäm en lösning till ekvationssytemet y ( x 3) e = xy = 1 i närheten av origo. Vi skriver en m-fil, som definierar funktionen vars värde skall vara noll, och kallar den ekvsys.m. Filen ser ut såhär: % ekvsys.m - ekvationssystem för fsolve. function f = ekvsys(x) f(1,1) = (x(1) - 3)^ - exp(x()); f(,1) = x(1)*x() - 1; Lösningen fås med följande instruktion i "Command window" eller i huvudprogrammet: x = fsolve(@ekvsys,[;]) där andra argumentet är startvärdet för iterationen, en vektor [ ] T. Ordinära differentialekvationer Ordinära differentialekvationer kan lösas numeriskt med funktionen ode45. Funktionen ode45 använder en Runge-Kutta-metod av 4:e och 5:e ordningen för numerisk lösning av begynnelsevärdesproblem. Funktionen ode45 löser ett system av 1:a ordningens differentialekvationer, skrivet i formen dy f ( t, y) dt =, med begynnelsetillståndet y vid ett värde t = t. y är tillståndsvektorn, t är den oberoe variabeln och f är en vektorfunktion. [t, y] = ode45(@funktion, [t tf], y); löser differentialekvationen definierad i en m-fil funktion.m från t = t till t = tf och med begynnelsevärdet y(t) = y. M-filen "funktion.m" har två argument: t, som är en skalar och y, som är en kolumnvektor. Den skall sedan returnera värdet på funktionen f(t, y) i form av en kolumnvektor. y1 = y1(1 y ) y y = y1 y y = 1 y dy f ( t, y) dt = f ( t, y) = y1 (1 y ) y y1 Exempel. Vi skall lösa differentialekvationen y 1 = y1(1 y ) y y = y1 mellan < t < med begynnelsetillståndet y 1 () =, y () =,5. Differentialekvationen skrivs i normalformen ovan. Funktionen f(t, y) definieras i m-filen som vi kallar "diffek.m" med följande innehåll: % diffek.m - beräknar högerledet av en diffe- % rentialekvation function f = diffek(t,y) f = [y(1)*(1-y()^)-y(); y(1)];
y Matlab - en kompakt introduktion Tore Gustafsson 7 En grafisk lösning erhålls genom att i Matlabs instruktionsfönster (eller i huvudprogrammet) ge instruktionerna 1 y = [.5]'; [t, y] = ode45(@diffek, [ ], y); -1 plot(t,y') - xlabel('\itt') -3 ylabel('\ity') 5 1 t 15 3 Flödeskontroll i Matlabprogram Instruktionerna "for - ", "if - (else -)" och "while - " kan användas för flödeskontroll i Matlabprogram. Instruktionerna mellan for och utförs upprepade gånger medan variabel tar ett värde i gången ur uttryck. T.ex. for k = 1:5 x(k,1) = log(k); bildar en vektor x som innehåller 5 element: naturliga logaritmerna av 1,, 3, 4 och 5. Om värdet av uttryck är sant ( ) utförs instruktionerna mellan if och, annars utförs intruktionen efter. If - kan kompletteras med else. Då utförs antingen den första satsen instruktioner eller den andra satsen instruktioner beroe på om uttryck är sant eller falskt. T.ex. if x >, y = log(x) else y = -inf ger y värdet ln x om x >, annars får y värdet. Instruktionerna mellan while och utförs upprepade gånger så länge uttryck är sant. T.ex. k = while k < 1 k = k + 1; ökar värdet på k tills k = 1 varefter instruktionen efter utförs. Räkneslingan utförs alltså 1 gånger och resulterar ast i att k = 1 efter slingan. Flödeskontroll kräver logiska uttryck. Ett logiskt uttryck (variabel) får värdet 1 då det är sant och värdet då det är falskt. De logiska operatorerna jämför matriser elementvis. T.ex. k = L = k < 1 ger resultatet L = 1 (k och L är skalärer), medan x = [1 5.3]; L = (x == [1 1 1]) ger resultatet L = [1 ]. for variabel = uttryck instruktion... instruktion if uttryck instruktion... instruktion if uttryck instruktioner else instruktioner while uttryck instruktioner Logiska operatorer < mindre än > större än == lika med <= >= ~= olika & och eller ~ inte Anonyma funktioner Enkla egna funktionsuttryck kan definieras som anonyma funktioner (anonymous function) på en rad i den m-fil, varifrån funktionen anropas. T.ex. integrationsexemplet ovan kunde skrivas på två rader, först en anonym funktion som definierar integranden, sedan anropet till quadl, y = @(x) cos(x).*exp(x); Q = quadl(y,, 3)
8 Tore Gustafsson Matlab - en kompakt introduktion Syntaxen för anonyma funktioner är funktionshandtag = @(argumentlista) matlabuttryck. Nästlade funktioner Man kan även skriva funktioner inne i andra funktioner. Dessa funktioner kallas nästlade (nested functions). Fördelen med nästlade funktioner är att man klarar sig med ett mindre antal m-filer. En annan fördel är att den yttre funktionens variabler är kända i de inre funktionerna. Alla nästlade funktioner avslutas med ordet. Exempel. Vi skall beräkna integralen för c = 1;,9;,8;...;. Huvudprogram: = 3 cx Q( c) cos( x) e dx for c = 1:-.1: Q = berintegral(c) M-filen berintegral.m ser ut på följande sätt: % berintegral.m - beräknar integral för c. function q = berintegral(c) q = quadl(@coscx,, 3); function y = coscx(x) y = cos(x).*exp(c.*x); Mera om variabler och funktioner global x y z Variabler i Matlab är lokala. Detta betyder att en variabels värde är känt ast i den funktion där variabeln har givits ett värde. Globala variabler kan definieras med instruktionen global. Globala variablers värden är dock fortfarande kända ast i de funktioner där de är definierade som globala. Instruktionen global måste således finnas i alla funktioner inklusive huvudprogrammet. Matlabfunktioner av typen quadl, fzero och ode45 kräver att användaren bildar en egen matlabfunktion med de argument som funktionen ifråga kräver. Vill man få in i funktionen värden på egna variabler som beräknas i en annan del av programmet, kan man antingen använda sig av globala variabler, eller låta bli att skriva funktionen i en egen m-fil, utan istället använda anonyma eller nästlade funktioner. Felsökning Matlabs m-fileditor har innehåller funktioner för felsökning i matlabprogram, såsom insättning av stoppunkter och utförning av matlabprogram ett steg i gången. För enklare beräkningsuppgifter rekommeras hellre följande procedurer: - skriv några få rader i gången varefter programmet testas genom att utföras i "Command window" - uttryck du är osäker på kan testas genom att kopiera uttrycket till "Command window" och utföra det där - kontrollera viktiga variablers värden och dimensioner genom att tillfälligt ta bort semikolon på den rad där de beräknas, eller sätt in ny rader med enbart variabelns namn för att få en utskrift. T.ex. kan vi kontrollera att parametern c fungerar som den bör i funktionen coscx genom att låta dess värde skrivas ut medan funktionen utförs. - pröva att dina funktioner fungerar genom att beräkna något funktionsvärde från "Command window". Kom ihåg att du måste ge argumenten inom parentes. - alla variabler som definierats i huvudprogrammet är tillgängliga i "Command window" och finns listade i fönstret "Workspace". Kontrollera dimensionerna. Många fel beror på felaktiga dimensioner, t.ex. att variabeln är en radvektor i stället för en kolonnvektor.