MATLAB Matrix laboratory Utvecklat av MathWorks Inc Introduktion till MATLAB Stefan@it.uu.se Utvecklat av MathWorks, Inc Första versionen klar i slutet av 70-talet Matematisk labmiljö för Numeriska beräkningar Grafik Programmering En enkel miljö för att snabbt testa idéer och för att studera resultat Vad är MATLAB? Vad är MATLAB? Avancerat interaktivt mjukvarupaket för beräkningar och visualiseringar. Ursprungligen MATrix LABoratory. Många kraftfulla fördefinierade funktioner med möjlighet att definiera egna. Eget objektorienterat programmeringsspråk. Samverkan med C++, Java och FORTRAN möjlig. Över 5 tilläggsprogram (toolboxar) finns för speciella tillämpningsområden, t ex: signalbehandling bildbehandling statistik symbolisk matematik finansiell matematik Körs under UNIX/Linux, Windows eller Macintosh. 1
Vad är MATLAB? Vad är MATLAB Toolboxar MATLAB är inte är symbolmanipulerande program som Maple eller Derive MATLAB genererar numeriska lösningar (siffror) Maple och Derive genererar formeluttryck och är matematikverktyg Varför inte generera numeriska lösningar genom att stoppa in siffervärden i folmeluttrycken? Ineffektivt Omöjligt I många fall Användningsområden Användningsområden Överallt där det förekommer beräkningsproblem! Undervisning: matematik, särskilt linjär algebra, beräkningsvetenskap, fysik, kemi, teknik, ekonomi, etc. Forskning: tekniska beräkningar, algoritmutveckling, analys av metoder och visualisering av resultat. Industrin: Spritt inom industrin MATLAB kan användas interaktivt som en avancerad räknedosa. Enkelt! MATLAB kan användas för att generera grafik. Enkelt! MATLAB kan också användas som ett programmeringsspråk på ett mer avancerat sätt.
Starta MATLAB När MATLAB startas öppnas ett kommandofönster: Arbeta interaktivt I kommandofönstret kan man arbeta interaktivt som en avancerad miniräknare Semikolon undertrycker utskrift Om inget variabelnamn anges läggs variabeln i ans (=answer) >> a=75 a = 75 >> b=34; >> c=a*b c = 550 >> a+b 109 Variabler i MATLAB Variabler i MATLAB Behöver inte deklareras skapas när de behövs Ingen typdeklaration Matris grundläggande datatyp - alla variabler är matriser (skalär är en 1 1-matris) Finns även andra datatyper, t ex Strängar Sparse (för glesa matriser) Struct (en matris med olika poster) Finns Heltal, reella tal komplexa tal Logiska 0 = sant, 1 = falskt = tilldelning == likhet >> c = sqrt(-) c = 0 + 1.414i >> 1 == 0 >> 1+1 == 1 3
Hur skapas en matris? Matrisalgebra >> x = [; 1] Skapa 1 A = 5 7 3 Semikolon eller retur i matrisen ger radbyte >> A = [1 7; 5 3]; >> A A = 1 7 5 3 >> A = [1 7 5 3] A = 1 7 5 3 Vanliga räkneregler för matriser/vektorer gäller. x = 1 >> A*x 9 13 >> x*a??? Error using ==> * Inner matrix dimensions must agree. Att bygga ut en matris 1 7 >> A = [A; 1]; Skapa A = 5 3 alternativt 1 >> temp = [ 1]; >> A = [A; temp]; Skilj på rad- respektive kolonnvektorer! >> temp = [;1]; >> A = [A; temp];??? Error using ==> vertcat All rows in the bracketed expression must have the same number of columns. Element, rader och kolonner Man kan arbeta med enskilda element, rader, kolonner, submatriser Kolon (:) betecknar hel rad respektive kolonn >> A(,1) 5 >> A(,:) 5 3 >> A(,:) = [0 0] A = 1 7 0 0 1 4
Speciella matriskommandon Finns inbyggda funktioner för att skapa vanliga (och ovanliga) matriser Kan skapa mer avancerade matriser genom kombinationer eye(n) enhetsmatrisen ones(m,n) ett-matris zeros(m,n) noll-matris + ett stort antal andra >> B = ones(,3) B = 1 1 1 1 1 1 >> eye() 1 0 0 1 >> C = zeros(,) C = 0 0 0 0 Elementvisa operationer Operationer, t ex *,/,^ kan även utföras elementvis Exempel) B^ = B*B men b B.^ = b 11 1 b b 1 >> B = [1 7;5 3]; >> B^ 36 8 0 44 >> B.^ 1 49 5 9 Elementvisa operationer Funktioner och operatorer På samma sätt är B C vanlig matrismultiplikation mellan två matriser medan b11c11 b1c1 B.*C = b1c1 bc Ibland kan detta >> a = [ 4]; generera fel >> a.^ 4 16 >> a^??? Error using ==> ^ Matrix must be square. Finns mängder av inbyggda funktioner abs(x), sqrt(x), sin(x), log(x), log10(x), >> a = [- 4]; >> abs(a) 4 >> log(a) 0.6931 + 3.1416i 1.3863 Observera att alla arbetar på vektorer och matriser 5
Funktioner och operatorer Fler exempel min(x) ger minsta värdet i x, kolonnvis om x matris max(x) på samma sätt, men största värde sum(x) summan av elementen i x mean(x) medelvärdet av elementen i x std(x) standardavvikelsen av elementen i x exp(x) e x för alla element i x real(z) reealdelen av elementen i x imag(z) imaginärdelen av elementen i x log(x) tvålogaritmen av elementen i x lu(a) LU-faktorisering av matrisen A Funktioner och operatorer Backslash-operatorn, \ Används för att lösa ekvationssystem, Ax=b >> A = [- 4; 5]; b=[1;]; >> x=a\b x = 0.1667 0.3333 Är en intelligent operator som ändrar metod efter vilket problem som ska lösas Om triangulärt system utförs framåt resp bakåtsubstitution Etc, etc Funktioner och operatorer Enkel grafik (D) Några andra användbara operationer size(a) ger antal rader och kolonner i A length(x) ger längden av vektorn x eig(a) rank(a) norm(a) egenvärden och egenvektorer A:s rang A:s norm (-norm) norm(a,inf) A:s maxnorm cond(a) A:s konditionstal (i -norm) Inv(A) A:s invers Gången när något ska plottas är Skapa en horisontell axel (t ex x-axel) Beräkna funktionsvärden (y-axel) Plotta x mot y, plot(x,y) >> x = linspace(0,*pi,50); >> y = cos(x)+sin(x); >> plot(x,y) 6
Enkel grafik (D) X-axel skapas genom x = linspace(x0,x1,antal_pkt); eller x = [x0:steglangd:x1]; Plotkommandot kan utvidgas på många olika sätt, t ex >> plot(x,cos(x), -,x,sin(x), o ) Grafik i 3D Funktioner av två variabler kan visualiseras på många olika sätt mesh(x,y,z) Grafik i 3D Grafik I 3D surf(x,y,z) contour(x,y,z) 7
Skriv i filen MinFil.m följande: Ett MATLAB-program skrivs antingen som en s k kommandofil eller en funktion Alla MATLAB-program lagras i m-filer, dvs filer som har ändelsen.m En funktion ska man betrakta som en svart låda som kommunicerar med omvärlden med in- och utparametrar In Ut (resultat) En kommandofil är ett sätt att lagra kommandon som annars skulle skrivas interaktivt. Genom att köra filen exekveras alla kommandon i filen % En första kommandofil x0 = 0; x1 = *pi; n = 100; x = linspace(x0,x1,n); y = cos(x)+sin(x); plot(x,y) Kommandona körs nu genom kommandot >> MinFil Vill man ändra t ex intervallet från 0 till pi behöver man bara ändra x1, sedan köra filen igen Skriv i filen MinFunk.m följande: [x, y] = MinFunk(x0, x1, n) % Min testfunktion x = linspace(x0,x1,n); y = cos(x)+sin(x); plot(x,y) Funktionen anropas genom >> xstart=0; xslut=pi; n=100; >> [x, y] = MinFunk(xstart,xslut,n); En funktion måste alltid börja med funktionshuvud, t ex [x, y] = MinFunk(x0, x1, n) utparametrar inparametrar Alla variabler inne i funktionen är lokala, dvs existerar inte utanför funktionen Alla variabler i en kommandofil är globala 8
Villkorssatser If-sats: Repetitionssatser For-sats: k = input( Ge ett tal: ); If k==0 disp( Talet är noll ); elseif k>0 disp( Talet är positivt ) else disp( Talet är negativt ) for k=1:length(x) x(k)= %Antar värdena 1,,,(längden av x) eller t ex for k=1::length(x) x(k)= % Antar värdena 1,3,5,7, Repetitionssatser While-sats: % Så länge som fel < tol utför % beräkning fel = norm(x(i)-x(i-1)) while fel < tol i = i+1; x(i) = Effektiv programmering I största möjliga grad bör vektoroperationer användas Ex) Antag att f = (f 1, f,,f n ) skapats och vi vill beräkna f 1 +f + +f n-1 +f n % Metod 1 tmp = f(1); for k = :n-1 tmp = tmp + *f(k); sum = tmp + f(n) 9
Effektiv programmering Ex forts) Utnyttja att sum är en skalärprodukt mellan (1,,,,1) och (f 1, f,,f n ) T % Metod sum = [1 *ones(1,n-) 1]*f ; Metod är mycket snabbare! Tecknet i f betyder transponat, dvs f T Effektiv programmering Behandla vektorer och matriser som vilka variabler som helst Skriv generellt. Undvik att skriva funktioner som bara fungerar för ett problem Undvik siffror inne i loopar och inne i program. Använd bokstäver och sätt konstanter och parametrar initialt i koden. Effektiv programmering [m,n] = size(a); for i = 1:m är bättre än t ex for j = 1:n A(i,j) = A(i,j)- for i = 1:500 for j = 1:400 A(i,j) = A(i,j)- Några små tips Piltangent återkallar tidigare kommando Pl återkallar senaste kommando vars namn började med pl ctrl-c avbryter exekveringen av ett kommando (men stoppar inte MATLAB) diary kan användas för att spara skärmutskrifter i en fil >> diary uppg1.txt >> Allt som skrivs på skärmen hamnar nu i filen uppg1.txt >>diary off % stänger diary 10
Några små tips Hur får man hjälp? format ändrar utskriftsformatet Använd help interaktivt >> y = sin(*pi/3); >> y y = 0.8660 >> format long; y y = 0.8660540378444 >> format long e; y y = 8.66054037844387e-001 >> format short e; y y = 8.6603e-001 >> format short; y y = >> help plot PLOT Linear plot. PLOT(X,Y) plots vector Y versus vector X. If X or Y is a matrix, then the vector is plotted versus the rows or columns of the matrix, whichever line up. If X is a scalar and Y is a vector, length(y) disconnected points are plotted. PLOT(Y) plots the columns of Y versus their index etc, etc 0.8660 % Standardformatet åter Hur får man hjälp? Använd menyn Help Under t ex MATLAB help finns alla funktioner listade efter typ, man kan söka efter funktioner etc 11