Tobias Ritschel s103275 Introduktion til Matlab Matrix Operationer og Plots Til brug ved DTU Ballerup 19. marts 2014
Indhold 1 Hjælp i Matlab 3 2 Scripts i Matlab 4 3 Vektor og Matrix Operationer 7 3.1 Vektorer i Matlab......................... 7 3.2 Matricer i Matlab......................... 9 3.3 Vektor og Matrix Operationer.................. 9 3.3.1 Addition.......................... 9 3.3.2 Multiplikation....................... 10 3.3.3 Punktvise Operationer.................. 11 3.3.4 Data i Vektorer og Matricer............... 12 3.4 Matrix Funktioner........................ 14 1
INDHOLD 3.4.1 Generering af Matricer.................. 14 3.4.2 Andre Matrix-Kommandoer............... 15 3.5 Lineære Ligningssystemer.................... 15 4 Plotting i Matlab 18 4.1 Regulære Plots.......................... 18 4.2 Formattering af Plots....................... 19 4.3 Diverse Andre Plots....................... 21 4.3.1 Histogrammer og Bar-Charts.............. 21 4.3.2 Logaritmiske Plots.................... 23 4.3.3 3D Plots.......................... 25 4.3.4 Konturplots........................ 26 5 Differentialligninger i Matlab 27 2/ 29
Afsnit 1 Hjælp i Matlab Noget af det vigtigste at kunne når man bruger Matlab er at kunne finde hjælp på egen hånd. Man finder ofte sig selv i en situation hvor man ikke lige kan huske hvordan en funktion skal bruges, hvilke inputs eller outputs den har, eller noget helt tredje. Så kan man bruge Matlab hjælpen. Prøv f.eks. at skrive følgende. help sin hvis man foretrækker at åbne hjælpen i et vindue for sig, kan man bruge kommandoen doc. Prøv f.eks. at skrive følgende. doc sin Foretrækker man at slå ting op online, kan man også finde hjælp-siderne på mathworks.se, eller bare google f.eks. sin matlab, så skal man nok finde noget brugbart. Dette kan især være nyttigt hvis man har en meget speciel problematik. 3
Afsnit 2 Scripts i Matlab Når man koder i Matlab laver man scripts der indeholder kode og kan køres. Et script har fil-formatet.m. For at åbne et nyt script kan man trykke på New Script i øverste højre hjørne eller bruge genvejen CTRL+N. Al kode skrives i et eller flere scripts, og flere scripts kan godt arbejde sammen. Man kan også lave det der hedder funktioner i Matlab som da kan kaldes fra andre scripts. En funktion er praktisk taget et script hvor man som det aller øverste skriver følgende. function output = MyFun(x) function angiver at dette script er en funktion. output er den variabel som man ønsker at funktionen skal returnere. output er ikke obligatorisk, men er som regel nyttig. MyFun er funktionens navn og Matlab foretrækker at dette er identisk med filnavnet. Dette er modsat filnavnene på scripts som man kan vælge frit. x er det input man giver funktionen. De funktioner man selv laver opfører sig på samme måde som Matlabs indbyggede kommandoer. sin(x) 4
er eksempelvis en kommando, der både bruges og har samme funktionalitet som i eksemplet nedenfor. I eksemplet nedenfor er et script som kalder en funktion. Det er vigtigt at de to stykker koder er i hver deres fil. I matlab er alt hvad der står til højre for et %-tegn såkaldte kommentarer, som altså ikke har nogen anden funktion end at øge læsevenligheden. Det er vigtigt at funktionen og scriptet ligger i samme mappe. Man kan godt importere funktioner og scripts fra andre mapper, men dette er mere omstændigt. Læg mærke til de linjer der starter med %. Alt der kommer efter procenttegnet og er på samme linje bliver udkommenteret. Det vil sige at det ikke tæller med som kode, men blot fungerer som tekst til læseren af koden. Det gør det nemt at arbejde med koden, og udgør en vigtig del af god kodestil. 5/ 29
Script (TestMyFun.m) % Clears the commando window (usually below the editor) clc; % Clears all variables as to avoid confusion from previous runs clear all; % Closes all figures to avoid problems related to this close all; % Create 1e2 (10^2) points between 0 and 2*pi % for function evaluation x = linspace(0,2*pi,1e2); % Evaluate f(x) in the above 10^2 points y = MyFun(x); % Plot (x,y) using the option x--r which makes the line % dashed with x for each point and colored red. plot(x,y, x--r, LineWidth,2, MarkerSize,15); Funktion (MyFun.m) function output = MyFun(x) % Evaluate sin(x) in the input points output = sin(x); 6/ 29
Afsnit 3 Vektor og Matrix Operationer 3.1 Vektorer i Matlab Et vigtigt værktøj i Matlab er vektorer. Man laver disse med firkant-parenteser. Hvad er forskellen på a og b når man skriver følgende? Hint: Hvis man ikke ønsker at se hvad a og ber i kommando-vinduet, kan man blot tilføje et ; efter den pågældende linje. a = [1,2,3] b = [1;2;3] Man kan konvertere vektorer fra række- til søjlevektor med apostroffer. Hvad giver følgende? Hint: isequal bruges til at tjekke om to matricer eller vektorer er ens. I Matlab anses 1 for sand og 0 for falsk. disp(isequal(a,b )); disp(isequal(a,b )); 7
3.1. VEKTORER I MATLAB Man kan også lave vektorer med tal i stigende eller faldende orden. Får man a eller b når man skriver følgende? c = 1:3; I tilfældet ovenfor stiger følgen med 1 hver gang, altså har den en inkrementering på 1. Man kan have en vilkårlig inkrementering. Hvad får man hvis man skriver følgende? d = 1:2:5; Inkrementeringen kan også være negativ. Hvad sker der hvis man skriver følgende? e = 5:-2:1; Kan man have en inkrementering der ikke er et heltal? f = 1:0.5:3; Når man skal plotte kan kommandoen linspace være bevendt. Hvad får man hvis man skriver følgende? Hvilke parametre betyder hvad? Hint: Kig i Matlabs hjælp for at se en beskrivelse af funktionen. g = linspace(0,3,4); Kan man bruge linspace til at generere andet end heltal? h = linspace(0,3,11); 8/ 29
3.2. MATRICER I MATLAB 3.2 Matricer i Matlab Matricer er mindst lige så vigtige som vektorer og de findes naturligvis også i Matlab. (Matlab er en forkortelse for MATrix LABoratory). Man kan lave matricer som rækker af rækkevektorer og søjler af søjlevektorer. Disse kan skrives på følgende måde. Giver de det samme? Hint: brug isequal(a,b) til at tjekke det. A = [ 1,2,3 ; 4,5,6 ; 7,8,9]; B = [[1;4;7], [2;5;8], [3;6;9]]; Man kan nemt transponere matricer. Hvis vi manuelt transponerer A eller B får vi den matrix vi ser i C. Undersøg om følgende to matricer ens. C = [1,4,7 ; 2,5,8 ; 3,6,9]; D = A ; 3.3 Vektor og Matrix Operationer 3.3.1 Addition Man kan lægge to vektorer eller matricer sammen med "+", men det er vigtigt at dimensionerne passer. For "+" skal antallet af række og søjler eksempelvis være ens for de to vektorer man vil lægge sammen. Udfra dette argument vil a og b fra et af de forrige afsnit ikke kunne lægges sammen. Hvordan reagerer Matlab hvis du prøver at køre følgende? Hvilken fejlbesked får du? Hint: Hvis du har noget koder der ikke virker som du samtidig heller ikke vil 9/ 29
3.3. VEKTOR OG MATRIX OPERATIONER slette, så kan du udkommentere koden ved enten at sætte et % før koden på samme linje, eller ved at sætte cursoren på den pågældende linje og trykke CTRL+R. apb = a + b; Hvad hvis man transponerer enten a eller b, vil de da have det samme antal rækker og søjler? Giver følgende to additioner det samme? apbt = a + b ; atpb = a + b ; Vektorer er blot et specialtilfælde af en matrix hvor enten antallet af rækker eller søjler er 1. Udfra reglen om addition af vektorer, kan du så afgøre om man kan lægge en matrix og en vektor sammen? Apa = A + a; Apb = A + b; Hvad med to matricer sammen? ApB = A + B; 3.3.2 Multiplikation Man kan gange to vektorer, to matricer eller en matrix og en vektor sammen med "*". Her gælder reglen om at de to vektorer eller matricer skulle have samme dimensioner ikke længere. Hvad får man hvis man ganger a og b fra et af de forrige afsnit, sammen? 10/ 29
3.3. VEKTOR OG MATRIX OPERATIONER ab = a * b; Hvad får man hvis man ganger a og b omvendt sammen? ba = b * a; Hvad får man hvis man ganger matricen A fra forrige afsnit med søjlevektoren b? Ab = A * b; I de tre ovenstående tilfælde har de indre dimensioner passet og det har derfor været tilladt. At de indre dimensioner passer vil sige at antallet af søjler i den venstre faktor har været lig antallet af rækker i den højre faktor. Eksempelvis er antallet af søjler i A 3 og antallet af rækker i b også 3. Kan man gange matricen A med rækkevektoren a? Aa = A * a; Hvad får man hvis man ganger A med B? AB = A * B; 3.3.3 Punktvise Operationer Nogle gange vil man gerne gange to matricer eller vektorer sammen element for element, eller punktvist. Med punktvise operationer er det vigtigt at alle 11/ 29
3.3. VEKTOR OG MATRIX OPERATIONER dimensioner er ens, ligesom ved addition. Punktvis multiplikation gøres med ".*" i stedet for blot "*". Kan man gange a og b sammen punktvist? apwb = a.* b; Hvad hvis man transponerer enten a eller b? apwbt = a.* (b ); atpwb = (a ).* b; Hvad med to matricer? ApwB = A.* B; Kan man gøre det samme med division? ApwdB = A./ B; Prøv til sidst med potens. Asquared = A.^2; 3.3.4 Data i Vektorer og Matricer Til tider vil man gerne kunne hente et enkelt element fra sin vektor eller sin matrix, eller sågar større dele. Hvilke elementer fra a fra de forrige afsnit får man ud ved at skrive følgende? 12/ 29
3.3. VEKTOR OG MATRIX OPERATIONER a1 = a(1); a2 = a(2); a3 = a(3); Hvilke elementer får man ud af A fra de forrige afsnit ved at skrive følgende? A12 = A(1,2); A31 = A(3,1); A23 = A(2,3); Hvilke elementer får man ud af a ved at skrive følgende? a23 = a([2,3] ); a23 = a( 2:3 ); a23 = a( 2:end); Hvilken af følgende giver 2. række og hvilken giver 2. søjle? A2r = A(2,:); A2c = A(:,2); Hvilken del af A får man ved at skrive følgende? A23r12c = A(2:end,1:2); Aallr13c = A(:,[1,3]); 13/ 29
3.4. MATRIX FUNKTIONER 3.4 Matrix Funktioner 3.4.1 Generering af Matricer Der er en række funktioner til at generere matricer i Matlab der kan være nyttige at kende. Se om i kan gennemskue hvilke kommandoer der gør hvad. I kan evt. kigge i hjælpen. I_33 = eye(3); I_32 = eye(3,2); M = magic(3); Z_33 = zeros(3); Z_32 = zeros(3,2); O_33 = ones(3,3); O_32 = ones(3,2); Der er mulighed for at generere tilfældige tal i Matlab. Funktionen rand(m) eller rand(m,n) genererer en hhv. m m eller m n matrix med uniformt fordelte pseudotilfældige tal mellem 0 og 1 (begge ekskluderet). Skal man kun bruge en enkelt tilfældig værdi kan man blot skrive rand. Med funktionen randi får man kun heltal. Denne funktion kan kaldes på mange måder, bl.a. randi(max,m) og randi(max,m,n) som giver uniformt fordelte pseudotilfældige heltal mellem 1 og max. Den første giver en m m matrix og den anden giver en m n matrix. Man kan også angive både øvre og nedre grænse ved randi([min,max],m,n). Funktionen randn trækker tal fra en normalfordeling med middelværdi 0 og standardafvigelse 1. Denne funktion kan kaldes på samme måde som rand med eksempelvis randn(m), randn(m,n) og randn. 14/ 29
3.5. LINEÆRE LIGNINGSSYSTEMER 3.4.2 Andre Matrix-Kommandoer Der er også en masse andre kommandoer til brug ved matricer der kan være rigtig nyttige at kende. Prøv nogen af nedenstående af og vær opmærksom på at nogle kan have flere forskellige funktioner. I kan evt. kigge i hjælpen. Det kan være nyttigt at starte med matricen A = magic(3); B = inv(a); C = diag(a); D = diag(1:4); e_1 = eig(a); e_2 = eigs(a); m_1 = max(a); m_2 = max(a,[],2); m_3 = max(max(a)); m_4 = min(a); m_5 = mean(a); m_6 = diff(a); s_1 = spy(a); s_2 = spy(eye(3)); 3.5 Lineære Ligningssystemer Det er muligt at løse ligningssystemer i Matlab ved brug af backslash-operatoren \. Hvis man f.eks. gerne vil løse følgende tre ligninger 15/ 29
3.5. LINEÆRE LIGNINGSSYSTEMER 3x 1 + 4x 2 2x 3 = 5 2x 1 + 3x 2 + 7x 3 = 1 2x 1 + 2x 2 3x 3 = 2, kan man opskrive ligningssystemet på formen Ax = b på følgende måde 3 4 2 A = 2 3 7, x = 2 2 3 x 1 x 2 x 3 5, b = 1. 2 I Matlab kan løsningen til disse tre ligninger, eller ligningssystemet, findes ved x = A\b; Tjek om løsningen er rigtig. Hint: Se om A*x - b er nulvektoren, eller om A*x giver b. Man kan også løse for flere forskellige højresider på samme tid. Hvis man f.eks. også ville løse for højresiden b2 = [2, 3, 5] T kan løsningen findes ved x_double = A\[b,b2]; Hvordan ser x ud nu i forhold til før? Tjek om løsningerne er rigtige. Undersøg om man kan løse alle ligningssystemer. Prøv f.eks. at løse nedenstående ligninger i Matlab 16/ 29
3.5. LINEÆRE LIGNINGSSYSTEMER 3x 1 + 4x 2 2x 3 = 5 2x 1 + 3x 2 + 7x 3 = 1 5x 1 + 7x 2 + 5x 3 = 2, Hvordan reagerer Matlab? Hint: Tjek rangen af koefficientmatricen og totalmatricen ved brug af rank(a) og rank([a,b]), og husk at ligningssystemer kun har løsninger hvis rangen af koefficientmatricen er lig med rangen af totalmatricen. 17/ 29
Afsnit 4 Plotting i Matlab 4.1 Regulære Plots Kommandoen plot bruges til regulære plots, f.eks. til at plotte y(x) = sin(x). Hvad er forskellen på disse to plots? x = linspace(0,2*pi,1e3); y = sin(x); figure; plot(y); figure; plot(x,y); Hvad sker der hvis man fjerner figure; kommandoerne? Det er også muligt at plotte flere grafer i samme figur. Prøv eksempelvis z = cos(x); 18
4.2. FORMATTERING AF PLOTS plot(x,y,x,z); Der er også mulighed for at give en matrix som input istedet for en vektor. Det kan dog være nemt at gøre noget forkert. Lad os sige vi gerne vil skabe samme graf som i eksemplet ovenfor med plot(x,y,x,z);. Prøv følgende og se om du kan regne ud hvorfor de går galt. plot([x,y,z ]); plot([x,y,z] ); plot(x,[y,z]); plot(x,[y;z]); plot([y;z]); 4.2 Formattering af Plots Man kan generelt gøre sin plots ganske pæne i Matlab og det kan nogle gange betale sig at lave sine plots i Matlab selvom dataen kommer et andet sted fra. Vi fortsætter med eksemplet fra forrige sektion. Prøv at se om du kan forklare følgende kommandoer i nedenstående eksempel. hold set legend xlabel, ylabel title 19/ 29
4.2. FORMATTERING AF PLOTS axis grid print Prøv eksempelvis at fjerne en kommando ad gangen, eller starte helt uden nogen kommandoer og så tilføje dem en ad gangen. Kig evt. også i hjælpen for at se andre mulige parameter værdier til kommandoerne. % Set fontsize variable fs = 30; % Construct data for plotting x = linspace(0,2*pi,1e3); y = sin(x); z = cos(x); % Plot data plot(x,y, -.r, LineWidth,2); hold on plot(x,z, --xg, LineWidth,4); hold off set(gca, FontSize,fs); legend( sin(x), cos(x), Location, NorthOutside ); xlabel( x ); ylabel( y(x) and z(x) ); title( Plot of sine and cosine ); axis([0, 2*pi, -1, 1]); grid set(gcf, Position,get(0, ScreenSize )); print(gcf, -dpng, MySineAndCosineGraph ); 20/ 29
4.3. DIVERSE ANDRE PLOTS 4.3 Diverse Andre Plots 4.3.1 Histogrammer og Bar-Charts Kommandoerne hist og bar kan bruges til at lave histogrammer og barcharts. Se om i kan se hvad forskellen på følgende fire plots er. Hint: I data1 har vi kun et datasæt, mens der i data2 faktisk er 2 datasæt. Prøv evt. at vælge andre værdier af nbins og centers, og se om i kan se effekten. nbins = 20; centers = -2:0.1:2; data1 = randn(1e3,1); data2 = randn(1e3,2); subplot(221); hist(data1); subplot(222); hist(data1,nbins); subplot(223); hist(data1,centers); subplot(224); hist(data2); Ligeledes for bar. Hvilken forskel gør det at give inputtet centers som det første input? Er der nogen synlig forskel på at give hist og histc som input? 21/ 29
4.3. DIVERSE ANDRE PLOTS data3 = rand(30,1); data4 = rand(4,3); centers = linspace(100,130,length(data3)); subplot(231); bar(data3); subplot(232); bar(centers,data3); subplot(233); bar(data4, stacked ); subplot(234); bar(data4, grouped ); subplot(235); bar(data4, hist ); subplot(236); bar(data4, histc ); 22/ 29
4.3. DIVERSE ANDRE PLOTS 4.3.2 Logaritmiske Plots Nogle gange kan grafer være betydeligt mere deskriptive når man plotter dem i et logaritmisk eller semilogartimisk plot. Følgende tre plot-kommandoer kan bruges: loglog, semilogx, semilogy. Disse bruges ligesom den almindelige plot-kommando. Eksempelvis x = linspace(0,10,1e3); y = 3*x.^5; subplot(121); plot(x,y); subplot(122); loglog(x,y); Prøv at konstruere de tre plots vist på figur 4.1. Hint: Brug set(gca, Xtick,[1,2,3]) til, eksempelvis, at sætte tickmarks ved x = 1, 2, 3. 23/ 29
4.3. DIVERSE ANDRE PLOTS Figur 4.1: Logaritmiske Plots 24/ 29
4.3. DIVERSE ANDRE PLOTS 4.3.3 3D Plots Det er ikke altid at 3D plots er særligt brugbare, eksempelvis kan de være svære at læse hvis de er med i en rapport. Til gengæld kan de være nyttige til at undersøge funktioner inde i Matlab hvor man kan rotere grafen og få et indtryk af dens rumlige udformning. De to funktioner surf og mesh kan bruges til 3D plots. Brugen er i princippet den samme som med plotkommandoen, men kræver lidt mere forarbejde. surf og mesh har samme syntax, så forarbejdet til den ene kan sagtens bruges til den anden. Se om du kan se hvad forarbejdet er og hvorfor det er nødvendigt i følgende eksempel. Hvad gør funktionen meshgrid? Hvad er forskellen på surf og mesh plots? Behøver man strengt taget give de to funktioner X og Y som input? Hvordan kan man undersøge 3D funktioner når man har plottet dem? % Construct axis points x = linspace(-5,5,2e1); y = linspace(-4,4,1e1); % Construct grid [X,Y] = meshgrid(x,y); % Evaluate function in every grid point F = (X.^2 + Y - 11).^2 + (X + Y.^2-7).^2; % Create 3D plot subplot(121); surf(x,y,f); subplot(122); mesh(x,y,f); 25/ 29
4.3. DIVERSE ANDRE PLOTS 4.3.4 Konturplots Konturplots kan være et godt alternativ til 3D plots, eksempelvis i rapporter hvor 3D figurer kan være svære at aflæse. Funktionen contour bruges til at lave konturplots. Se om du kan finde ud af hvad der gør hvad i følgende. Behøver man give X, Y og v som input? Hvad gør colorbar? % Construct axis points x = linspace(-5,5,1e3); y = linspace(-5,5,1e3); % Construct grid [X,Y] = meshgrid(x,y); % Evaluate function in every grid point F = (X.^2 + Y - 11).^2 + (X + Y.^2-7).^2; % Create contours v = [0:2:10 10:10:100 100:20:200]; contour(x,y,f,v); colorbar 26/ 29
Afsnit 5 Differentialligninger i Matlab Mange ingeniørmæssige problemstillinger involverer differentialligninger og deres løsninger. En bestemt klasse af differentialligninger hedder ordinære differentialligninger, og på engelsk ordinary differential equations, ofte forkortet ODEs. Matlab har en række indbyggede såkaldte ODE solvere, som kan finde numeriske løsninger til differentialligninger. Prøv at se om i kan finde gennemskue brugen af kommandoen ode45. Hvad gør linjen xdot = @(t,x) lambda.* x;? % Simulation parameters t0 = 0; tf = 1; % Model parameters lambda = [-1,3] ; x0 = [50,3] ; 27
% Model xdot = @(t,x) lambda.* x; % Simulation [t,x] = ode45(xdot,[t0, tf],x0); % Visualize simulation plot(t,x); grid; Dette er et eksempel på et simpelt differentialligningssystem hvor det også er muligt at finde en analytisk løsning. Nogle modeller er betydeligt mere komplicerede og da kan det være fordelagtigt at dedikere en hel funktion til modellen. Da vil man kunne bruge følgende kode. % Simulation parameters t0 = 0; tf = 1; % Model parameters lambda = [-1,3] ; x0 = [50,3] ; % Simulation [t,x] = ode45(@ode,[t0, tf],x0,[],lambda); % Visualize simulation plot(t,x); grid; hvor @ODE refererer til en funktion 28/ 29
function xdot = ODE(~,x,lambda) xdot = lambda.* x; end Brug Matlabs hjælp til at finde ud af hvorfor der er [] i kaldet af ode45 og hvorfor der er i inputtet til ODE. Prøv at Google jer frem til andre solvere og se om de kan implementeres på samme måde. Tip: Hvis ens program hænger eller går i stå når man brugere en solver som ode45 kan det være en god idé at stoppe programmet ved at vælge kommandovinduet og trykke CTRL + C og udskifte sin solver med, eksempelvis, ode15s. 29/ 29