TANA81: Beräkningar med Matlab Variabler I Matlab skapas en variabel genom att man anger dess namn och ger den ett värde: - Variabler och Matriser - Logiska uttryck och Villkor >> x=3.67 x = 3.6700 - Repetitionssatser - Grafik Variabeln kan sedan användas i beräkningar: - Funktioner >> y=log(1+x)/sin(x) y = -3.0569 – Typeset by FoilTEX – 1 – Typeset by FoilTEX – 2 Matriser Exempel Beräkna uttrycket y= Exempel: En 2 × 3 matris innehåller värdena 1 + e1+x √ . 1+ 3 A= I Matlab: >> y=( 1+exp(1+x) )/( 1+sqrt(3) ); a11 a12 a13 a21 a22 a23 = 1 3 7 4 −2 1 . I Matlab skapas matrisen med kommandot: Används ; fås ingen utskrift av beräkningsresultatet. Istället disp(y). >> A = [ 1 , 3 , 7 ; 4 -2 1 ]; Räkneoperationer + - * / \ ^ Tecknet ; betyder ny rad och , nytt element. Behöver ej , annat än för tydlighet. Standardfunktioner sqrt, sin, cos, exp, log, atan,. . . – Typeset by FoilTEX – 3 – Typeset by FoilTEX – 4 Indexering För att manipulera enskiljda element i en matris anger man dess index. Matriser skapas med hjälp av ett antal standard funktioner: ones, zeros, eye, rand,. . . Exempel Antag att vi har en 2 × 3 matris A. Elementet a23 skrivs ut till skärmen genom: Exempel En 5 × 4 matris innehållande endast nollor skapas med kommandot: >> disp( A(2,3) ) % Här A(2,3)=1 Matriser kan förekomma i räkneoperationer (på samma sätt som variabler). Man kan ändra elementet a12 genom att skriva >> A = rand(5,3); >> B = ones(4,5); >> C = B*A; >> A(1,2)=5; För att skriva ut en hel rad används : notation 5 Operationer som finns tillgängliga på matriser är – Typeset by FoilTEX – 6 Vektorer En vektor x är en matris med endast en kolumn (eller en rad). Vektorer kan enkelt skapas med kolon notation: - Vanliga räkneoperationer: +, −, och ∗ - Transponat: B=A’. >> x = (1:5)’; >> y= (2:0.5:3.5)’; - Division: C=A\B eller C=A/B (beräknar antigen AB −1 eller A−1B). ger två vektorer - Storlek: [n,m]=size(A) ger antalet rader och kolumner. Dessutom finns ett stort antal funktioner för att lösa vanliga matris problem. Exempelvis beräknas egenvärden genom >> D = eig( A ); – Typeset by FoilTEX – % 3x5 matris med slumptal! % 4x5 matris med ettor! Matrisen C får storlek 4 × 3. Vid matrisoperationer måste dimensioner passa! >> disp( A(2,:) ) – Typeset by FoilTEX – >> A = zeros(5,4); 7 1 2 2 2.5 x= 3 , och y = 3.0 4 3.5 5 Vektorlängd beräknas med n=length(x). – Typeset by FoilTEX – . 8 Ofta vill man utföra beräkningar elementvis. Använd då +, -, .*, ./, och .^ Logiska uttryck Exempel: kommandona Logiska variabler kan ha värdet sant eller falskt. I Matlab tolkas värdet 0 som falskt och 1 som sant. >> x = 0:0.1:1; >> y = (1+exp(x))./(1+x.^2); 11 skapar en vektor y ∈ R Relationsoperatorer <, <=, >, >=, ==, och ~=. med exempelvis x(3)=0.2000 och y(3)=2.1360. Logiskaoperatorer &, | och ~. Exempel Låt x=3.0 och y=6.5. 1 + e0.2 ≈ 2.1360. 1 + 0.22 >> x > y ans = 0 >> z = x + y >= x^2 | x == y Standardfunktioner som sin, cos, etc utförs elementvis! Prioritet Aritmetriska > Relations > Logiska. Kan använda parenteser. – Typeset by FoilTEX – 9 – Typeset by FoilTEX – Exempel En funktion ges av uttrycket Villkorssatser I Matlab finns f (x) = if <logiskt uttryck> <satser> end 0, x2, x ≤ 0, x > 0. I Matlab kan vi skriva: x=3.5; if (x <= 0) f=0; else f=x^2; end; Vissa rader utförs endast om uttrycket har värdet sant. Alternativ är if <logiskt uttryck> <satser 1> else <satser 2> end – Typeset by FoilTEX – 10 11 – Typeset by FoilTEX – 12 Repetitionssatser Exempel Beräkna maximum av en funktion f (x) = sin(x2 )e−2x på intervallet [0, 1] genom att skapa en vektor med n element och beräkna funktionens värden för ett antal jämt fördelade x-värden. Hitta sedan det största funktionsvärdet. Då ett antal rader skall upprepas ett fixt antal gånger används en for sats: for <variabel>= start:steg:slut <satser> end Exempel Beräkna summan S = 1000 X k=1 I Matlab skriver vi: 1 . k2 S=0; for k=1:1000 S=S+k^(-2); end Detta ger S=1.6439. – Typeset by FoilTEX – 13 Exempel Summera alla positiva element i en matris A. – Typeset by FoilTEX – Då några rader skall upprepas ett (okänt) antal gånger används en while sats: I Matlab skriver vi: while <logiskt uttryck> <satser> end S=0; [n,m]=size(A); for i=1:n for j=1:m if ( A(i,j)>0 ) S=S+A(i,j); end end end disp(S) – Typeset by FoilTEX – 14 Så länge det logiska uttrycket har värdet sant upprepas kommando raderna! 15 – Typeset by FoilTEX – 16 Exempel Fibonacci talen ges av F1 = 0, F2 = 1, och Fn = Fn−1 + Fn−2. Vilket är det största talet Fk som forfarande är mindre än 100? Grafik I Matlab finns ett kommando plot som används för att skapa enkla 2D grafer. I Matlab skriver vi: Skriv F(1)=0;F(2)=1;n=2; while ( F(n)< 100 ) n=n+1; F(n)=F(n-1)+F(n-2); end n-1,F(n-1) >> x = [ 1 2 4 5]; >> y = [ 3 2 2 4]; >> plot( x , y ); Punkterna (xk , yk ) sammanbinds med räta linjer. Linjetyp kan anges: >> plot( x , y , ’r--’ ); Repetitionssatsen avbryts när n = 13 så det största talet blir F12 = 89. ger röd streckad linje. Se help plot. – Typeset by FoilTEX – 17 – Typeset by FoilTEX – 18 Exempel Rita en graf över funktionen y = arctan(x) på intervallet −2 < x < 2. Exempel Rita en graf över funktionen y = cos(x)/(1 + x2) på intervallet 0 < x < 1. I Matlab skriver vi: I Matlab skriver vi: >> x = -2:0.5:2; >> y = atan(x); >> plot( x,y,’b-’,x,y,’r+’); >> x = 0:0.05:1; >> y = cos(x)./(1+x.^2); >> plot(x,y); För att få en “jämnare” kurva måste vi välja fler punkter (xk , yk ). Observera att elementvis ./ och .^ måste användas. Vi kan namnge koordinataxlarna med >> xlabel(’x’); >> ylabel(’y’); – Typeset by FoilTEX – 19 – Typeset by FoilTEX – 20 Kommandofiler i Matlab Funktioner i Matlab Man kan samla Matlab kommandon i en fil. Antag exempelvis att följande program finns på filen summa.m: En funktion har ett antal inparametrar och beräknar ett antal utparametrar. I Matlab måste varje funktion skrivas på en egen fil (med ändelse .m). S=0; for k=1:100 S=S+k; end; Filen som innehåller funktionen skall ha följande utseende: % Detta är en kommentar! % % Inledande kommentar! % function [ut1,ut2,ut3]=min_funktion( in1,in2,in3 ); I Matlab skriver jag då: >> summa >> S 5050 <kommando rader> Variabeln S ges då ett värde! Filen måste sluta på .m. En hyfsad Editor finns inbyggd i Matlab. – Typeset by FoilTEX – 21 Exempel Skriv en funktion Medel som beräknar medelvärdet av elementen i en vektor x. Funktionen skall kunna anropas på följande sätt: >> y = Medel( x ); – Typeset by FoilTEX – 23 Kan ha godtyckligt antal in– och utparametrar. Den inledande kommentaren visas då man skriver: >> help min_funktion – Typeset by FoilTEX – 22 På filen Medel.m skriver vi: %Medel: Beräknar medelvärdet av vektorn x. % % Anrop: % >> y=Medel( x ); % function [y]=Medel(x); n=length(x); S=0; for k=1:n S=S+x(k); end; y=S/n; % blir retur värde! – Typeset by FoilTEX – 24 I Matlab kan vi nu skriva: Exempel Skriv en funktion som beräknar skillnaden mellan två vektorer mätt enligt formeln: d(x, y) = max |xk − yk |. >> Medel( exp( 1:10 ) ) ans = 3.4844e+03 1≤k≤n Vi skall kunna skriva >> x=rand(10,1); y=rand(10,1); % 10 slumptal mellan 0 och 1. >> D = Skillnad( x , y) D = 0.7563 – Typeset by FoilTEX – 25 På filen Skillnad.m skriver vi. function [S]=Skillnad( x , y ) n=length(x); S=0; for k=1:n Sk = abs( x(k) - y(k) ); if (Sk>S) S=Sk; end end Samma sak kan enklare skrivas S=max(abs(x-y));. Ganska komplicerade operationer kan utföras enkelt med hjälp av Matlabs standardfunktioner. – Typeset by FoilTEX – 27 – Typeset by FoilTEX – 26