Introduktion till Matlab


Matlab är ett slags matematikprogram där man framför allt på ett smidigt sätt kan räkna med vektorer och matriser. Detta är till stor nytta då man ska börja hantera signaler och titta på olika egenskaper hos dessa. Det finns också många sätt att åskådliggöra vektorer och signaler på genom att rita upp olika slags diagram. Matlab kan även byggas ut genom att man själv definierar funktioner för beräkning och kurvritning. Sådana "utbyggnader" av Matlab finns det redan en hel del av samlade i s.k. "toolboxar" (ursäkta den tvivelaktiga pluralbildningen).

Matlab som räknedosa

Allt som en räknedosa klarar av, kan Matlab göra minst lika bra. För den som har glömt sin multiplikationstabell går det t.ex. alldeles utmärkt att använda Matlab så här:

  7*8
Matlab svarar:
  ans =

      56
Även för den som kan sin multiplikationstabell kan Matlab användas som räknedosa. De vanliga elementära funktionerna finns med hela gänget så det går utmärkt att beräkna uttryck som t.ex.

   e-1.23sin 0.456 + 7.89 2  arctan 0.13579

genom att skriva
  exp(-1.23)*sin(0.456) + 7.89^2*atan(0.13579)
Matlab svarar:
  ans =

      8.5305
Observera att Matlab alltid förutsätter att enheten är radianer då man använder trigonometriska funktioner (sin, cos och tan). Det finns vissa fördefinierade konstanter t.ex. pi. Om man exempelvis skriver
  x = sin(pi/4)
så svarar Matlab
  x =

      0.7071

Uppgift 1. Utför följande beräkning i Matlab och förklara resultatet:
  exp(i*pi)
Tydligen så finns den imaginära enheten i också med som fördefinierad konstant i Matlab. Detta gör det smidigt att räkna med komplexa tal i Matlab. En division mellan två komplexa tal kan se ut så här:
  (1 + 3*i) / (2 + i)
vilket ger
  ans =

     1.0000 + 1.0000i
För att räkna ut absolutbeloppet av ett komplext tal används funktionen abs:
  abs(4 + 3*i)
som ger
  ans =

       5


Räkning med vektorer

Vektorräkning är enkelt i Matlab. Om man vill addera två vektorer x1=(1, 2, 3) och x2=(7, -5, 2) räcker det att utföra följande kommandon:

  x1 = [1 2 3];
  x2 = [7 -5 2];
  x1 + x2
Ett semikolon i slutet av kommandot gör att resultatet inte skrivs ut. Den sista raden ger därför utskrift av resultatet eftersom kommandot inte avslutas med något semikolon. Ett snabbare sätt är att inte mellanlagra i variabler:
  [1 2 3] + [7 -5 2]
I båda fallen blir resultatutskriften så här:
ans =

     8   -3    5
Om man inte anger något namn på den variabel som resultatet skall lagras i så hamnar resultatet i en variabel med namnet ans (vilket ni antagligen redan listat ut vid det här laget).
Vektorer kan också representeras med kolonnmatriser. Genom att separera vektorns element med semikolon istället för blanktecken så erhåller man kolonner istället för rader:
  [1; 2; 3] + [7; -5; 2]
Utskriften blir

ans =

     8
    -3
     5
     
Uppgift 2. Beräkna summan av vektorerna x1=(-2.5, 2, 1.8) och x2=(4.7, -8.3, -4.6) med hjälp av Matlab.

Uppgift 3. Räkna ut vektorn 7*(1, 2, 3, 4) - 2*(2, 3, 5, 8).

För att omvandla en radvektor till en kolonnvektor (eller vice versa) använder man transponeringsoperatorn ' (apostrof eller prim). Exempel:

  a = [1 6 8 5], b = a'
ger resultatet
  a =

       1     6     8     5


  b =

       1
       6
       8
       5
Adressering av enskilda vektorelement utförs med vanliga ("runda") parenteser (och inte "klamrar" som i t.ex. Java och C):
  a(2), b(3)
ger (med a och b som ovan)
  ans =

       6


  ans =

       8
Uppräkning av tal i en vektor kan göras t.ex. så här
  x = 1:9
med utskriften
  x =

       1     2     3     4     5     6     7     8     9

Uppgift 4. Skriv in kommandot

  hej = 3:2:16
och förklara resultatet.

Olika sätt att plocka ut delar av en vektor visas här:

  v = 0:8
  v1 = v(2:4)
  v2 = v([1 3 7])
  v3 = v([2 5:8])
  v4 = v([3 8 2])
vilket ger följande utskrift
  v =

       0     1     2     3     4     5     6     7     8


  v1 =

       1     2     3


  v2 =

       0     2     6


  v3 =

       1     4     5     6     7


  v4 =

       2     7     1
Fundera gärna på varför resultatet blir så.

Uppgift 5. Egentligen är inte addition av en vektor (av dimension minst 2) och ett tal matematiskt definierat. Undersök ändå vad som händer i Matlab då man skriver in följande

[1 2 3 4] + 7
Detta är ett typiskt exempel där Matlab har hittat på egna praktiska konventioner. Däremot finns ingen vettig tolkning av följande
[1 2 3 4] + [7 8]
vilket resulterar i en felutskrift (pröva själv).

För två vektorer av samma dimension fungerar inte vanlig matrismultiplikation. Därför ger inmatningen

[1 2 3 4] * [2 3 5 7]
en felutskrift. Däremot finns en uppfinning i Matlab kallad elementvis multiplikation som ser ut så här:
[1 2 3 4] .* [2 3 5 7]
och fungerar så här
  ans =

       2     6    15    28
Observera punkten (innan multiplikationstecknet) som indikerar att operationen ska ske elementvis.

Naturligtvis kan man även beräkna den vanliga skalärprodukten. För detta krävs att man utnyttjar transponering:

  [1 2 3 4] * [2 3 5 7]'
med resultatet
ans =

    51
I detta fall ska man inte ha punkt före multiplikationsoperatorn.


Matriser

Matlab är speciellt avsett för räkning med matriser. Rader separeras med semikolon medan kolonner antingen kan separeras med kommatecken eller bara med blanktecken. Här följer ett exempel på addition respektive multiplikation av två matriser:

  A = [1 2; 3 4]; B = [-5 6; 7 -8];
  C = A + B,
  D = A*B
Observera att Matlab skiljer mellan versaler och gemener ("stora" respektive "små" bokstäver) så att t.ex. a och A är två olika variabler.

Uppgift 6. Beräkna matrisen

  A*B + 2*A - 3*B*C
då matriserna A, B och C ges av:
  A = [1 3 2; -1 0 1; 2 1 0],
  B = [-2 1 0; 1 1 2; 0 1 -1],
  C = [0 1 1; -1 1 0; 1 0 1],
Matrisoperationer som transponering och invertering utförs med lätthet. Att räkna ut matrisuttrycket

   (I + A TB) -1

går till så här i Matlab:

  inv((eye(3) + A'*B))
där vi förutsätter att matriserna A och B är definierade som ovan (eller åtminstone är av dimension 3x3). Som man kan ana så ger funktionen eye en enhetsmatris av given storlek. Ett prim (') transponerar en matris (egentligen konjugeras matrisen också om den skulle råka innehålla något komplext tal). Funktionen inv inverterar en matris.

Uppgift 7. Räkna ut inversen av matrisen I - A B C där A, B och C är matriserna i föregående uppgift.


Signaler i Matlab

Tidsdiskreta signaler kan i Matlab representeras med vektorer. För att visa en sinussignal kan man gå tillväga på följande sätt (raderna med procenttecken i början är bara kommentarer och behöver inte skrivas in):

% Tillverka en tidsvektor med värden från 0 till 2 s
% i steg om 1 ms (0.001 s)
  t = 0:0.001:2;
% Beräkna en sinussignal med frekvensen 20 Hz och rita kurvan
  x = sin(2*pi*20*t);
  plot(t, x);

Eftersom kurvan som visas motsvarar 2*20=40 perioder av sinussignalen blir det svårt att se sinusformen. För att titta på en enda period kan man använda följande kommando:

  plot(t(1:50),x(1:50));

Detta ritar bara de 50 första punkterna på kurvan vilket motsvarar precis en period av sinussvängningen (varför?).

Uppgift 8. Utnyttja tidsvektorn t för att göra en signal x1 som består av en sinussignal med frekvensen 50 Hz samt rita denna signal med plot (på samma sätt som med x ovan).

Uppgift 9. Tillverka en signal x2 som består av en summa av två sinussvängningar, en med frekvensen 30 Hz och en med frekvensen 100 Hz. Visa signalen med plot. Plotta också de 200 första värdena av signalen för att lättare kunna se hur svängningarna ser ut.

Till sist ska vi se hur en dämpad sinussvängning kan se ut.

Uppgift 10. Beräkna och rita kurvan (grafen) för funktionen

   f(t) = e-2t sin 20 t

för t mellan 0 och 4 s i steg om 0.01 s. Tips: Utnyttja elementvis multiplikation (.*).