TANA81: Beräkningar med Matlab Variabler Matriser

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