Matlabföreläsningen
Lite mer och lite mindre!
Inmatning:
Här är lite exempel på inmatning i Matlab:
>> pi
ans =
3.1416
>> format long
>> ans
ans =
3.141592653589793
>> format %återställer format (%- tecknet gör att matlab struntar i allt till höger om det!)
>> 7.5 %inte 7,5
ans =
7.5000
>> a=100
a=
100
>> a=10; %a blir 10 men vi ser inte någon utskrift
>>
För alla möjliga format skriv help format. Testa sedan hur pi ser ut i olika format!
De vanliga räknesätten är + - * / ^. Då två vektorer ska multipliceras, divideras eller upphöjas med
varandra elementvis, då måste man använda .* eller ./ respektive .^
Om man utelämnar punkten så blir det matrisoperationer, och två radvektorer kan inte
matrismultipliceras med varandra! (Radvektor = [1 2], Kolonnvektor = [1 ; 2])
Nu lite mer exempel på inmatning:
>> a=[8 9] %detta är en radvektor
a=
8
9
>> a(1) %detta är elementet ur vektorn a som har index 1, dvs det första elementet
ans =
8
>> a(2)
ans =
9
>> length(a)
ans =
2
>> size(a)
ans =
1
2
>> size(a)(2) %matlab kommer inte att gilla dessa paranteser
??? Error: ()-indexing must appear last in an index expression.
>> ans(2) %men detta går bra!
ans =
2
>> a=[8;9] %nu är a istället en kolonnvektor
a=
8
9
>> length(a)
ans =
2
>> size(a)
ans =
2
1
>> a'
% '-tecknet efter a gör om a till en radvektor. ' gör också om rader till kolonner!
ans =
8
9
>> a=[1 2; 3 4] % efter ; hoppar vi neråt till nästa rad
a=
1
2
3
4
>> a=1:5 % a= start: slut
a=
1
2
3
4
5
>> a=0:0.1:0.6 % a=start:steglängd:slut
a=
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
>> a=ones(2,3) %ettor ... 2 rader, 3 kolonner ... antalet rader anges alltid först!
a=
1
1
1
1
1
1
>> b=zeros(2,1)
b=
0
0
>> A=[a b; b 2*a] % när man skapar matriser går det bra att skriva in färdiga matriser.
% ;-tecknet gör att de staplas på varandra.
A=
1
1
1
0
1
1
1
0
0
2
2
2
0
2
2
2
OBS: vi har fått matrisen [a b]
[b 2a] !!!
Vi kan komma åt ett element mitt i matrisen om vi vill:
>> A(3,2) % elementet på rad 3 och kolonn 2 i matrisen A
ans =
2
>> size(A)
ans =
4
4
>> a=1:3 ; b=2:4 ;
>> a.*b %a och b måste ha samma längd. multiplikationen sker elementvis.
ans =
2
6 12
>> clear a % rensar variabeln a, clear all rensar alla variabler
>> a
??? Undefined function or variable 'a'.
>> log(sqrt(exp(1))) % ln(rotenur(e^1)) = 1/2
ans =
0.5000
skriv help elfun för att få en lista på alla vanliga matematiska funktioner.... arctan, sin, etc
>> a=linspace(start,slut,antal) % testa hur detta fungerar! kan vara smidigare än a=st:lä:sl !!!
Strängar:
Detta fanns inte med på föreläsningen: En sträng består av två 'fnuttar' och text, t.ex.
s='matte rockar fett!!'
Om en sträng egentligen är ett tal kan man konvertera den till ett tal med hjälp av str2num , t.ex.
>> s='3.14159'
s=
3.14159
>> str2num(s)
ans =
3.1416
Den andra riktningen går också bra, men vi använder num2str:
>> n=3.14159
n=
3.1416
>> num2str(n)
ans =
3.1416
Man kan sätta ihop strängar precis som vektorer och matriser:
>> ['Hej ' 'jacob' '!(' num2str(2009) ')']
ans =
Hej jacob!(2009)
Testa nu följande (vad tror du att det blir?)
>> str2num (['1' num2str(3.14)]) + 1
Kurvritning
>> x=linspace(-2,2,100); %x går mellan -2 och 2 och 100 punkter plottas
>> y=x.^2 + 1;
>> plot(x,y) % ritar funktionen y=x^2+1 ... obs man måste skriva .^2 ......
Nu en funktion av 2 variabler... f(x,y) = sin(x)*y. Vi låter både x och y gå mellan -2pi och 2pi.
>>x=linspace(-2*pi,2*pi,300);y=x;
>>[X,Y]=meshgrid(x,y); %skapar matriser med storleken 300x300 som innehåller x respektive y
%upprepade flera gånger.
>>Z=sin(X).*Y; %observera igen punkten. detta beräknar funktion f(x,y) i angivna gitterpunkter
>>mesh(X,Y,Z) % detta plottar funktion... nu kan man vrida och flytta den med muspekaren om man
% först trycker på motsvarande ikoner i figurfönstret
Testa att rita funktionerna z=+/-sqrt(x^2+y^2). Konens ekvation är z^2 = x^2 + y^2... Varför?!!
Man kan inte rita konen som en enda graf!!
Script- och funktionsfiler
Ett skript är en fil som innehåller en lista kommandon som man skulle kunna skriva själv direkt in i
Matlab, men när man skriver namnet på skriptfilen körs denna lista igenom automatiskt, precis som
om man skulle skrivit in den själv. Skriptfiler ska sparas som blabla.m
En funktionsfil är samma som en skriptfil, men kan anropas med indata och ger utdata. T.ex. kan man
ha skrivit en funktion dubblera som dubblerar alla tal i en matris. Om man då skriver
A=dubblera(ones(3)) får man en 3x3 matris A, som består av 2:or. Funktionsfiler måste börja med
function utdata=funktionsnamn(indata)
%hjälptext (om man vill).
Funktionsfilen ska också sparas som filnamn.m
För att skriva .m filer öppna matlabs inbyggda editor genom att trycka på nyfil-ikonen uppe till
vänster. OBS!!!!
kopiera, klistra in, spara, etc har andra tangentbordskombinationer, lär er
dessa direkt, onödigt att slösa med tid! För att kunna köra era .m filer måste den mappen ni
sparar filerna i vara samma som den som står under current directory i matlabfönstret. Glöm
inte att spara .m filerna innan ni testkör, det sker inte automatiskt!
Detta är innehållet i dubblera.m:
function d=dubblera(x)
% dubblera dubblerar elementvis matrisen x
d=2*x; %obs vi skriver ; för att när funktionen körs inte få d = blabla utskrivet på skärmen!!
Nu dubhalv.m: (VIKTIGT)
function [d,h] = dubhalv(x)
% d är matrisen x dubblerad
% h är matrisen x halverad
d=2*x;
h=x/2;
Vi testar nu denna funktion:
>> dubhalv(1:3) %om vi skriver såhär så får vi bara ut de dubblerade värdena
ans =
2
4
6
>> [d h] = dubhalv(1:3) % här får vi ut allt.... det spelar ingen roll om våra variabler d och h heter
% samma sak som de gör i funktionsfilen. De kan heta något annat också.
d=
2
4
6
h=
0.5000 1.0000 1.5000
Vi skriver nu en skriptfil heter.m som vi såg på föreläsningen
namn=input('Vad heter du?\n'); %semikolon behövs!! \n betyder ny rad
disp(['Hej ' namn '!'])
Testkörning:
>> heter
Vad heter du?
'jacob'
Hej jacob!
Obs att jag var tvungen att skriva 'jacob' för programmet vill ha en sträng. Skriver jag bara jacob så
blir det felmeddelande.
Polynom
För att skriva in polynom i Matlab så använder man sig av vektorer.
T.ex. svarar vektorn [0101] mot 0x^3 + 1x^2 + 0x +1 , dvs x^2+1. Vektorn [1 0 1] ger samma
polynom.
Vill vi addera två vektorer måste de ha samma längd. Om de heter A och B kan vi göra följande:
A=[zeros(1,length(B)-length(A) A];
B=[zeros(1,length(A)-length(B) B];
Vi kan nu skria A+B för att få summan av motsvarande polynom.
För att multiplicera polyonom använder vi kommandot conv(A,B). Division ges av deconv,
men detta får såklart inte användas i den första labben, eftersom ni själva ska programmera
polynomdivision.
För att hitta rötter till polynomet A skriver vi bara roots(A). Matlab räknar alltid numeriskt, så det
finns ingen garanti att den hittar exakta värden för rötterna.
För att räkna ut ett polynoms värden, (och därför också för att plotta ett polynom): Använd
polyval(A,x) för att räkna ut A(x). Det går bra om x är en matris... polynomets värde räknas ut
elementvis, dvs varje tal i matrisen sätts in i polynomet, och vi får därför en hel matris av värden.
If-satser
En if-sats ser ut såhär:
if villkor
då händer följande
elseif annat villkor
då händer följande
else
i övriga fall händer detta
end
Vi kan också ha enklare if-satser
if villkor
då händer detta
end
eller en ifsats som innehåller if, else, end.
I samtliga fall utför bara Matlab koden som står under ETT av villkoren. Om inget villkor är sant så
går Matlab bara förbi hela ifsatsen utan att göra något.
Exempel på villkor:
a>2
a==b % två likhetstecken i rad
1<2
a<=b % a är mindre än eller lika med b
a>=b % a är större än eller lika med b
a~=b % a är inte lika med b
Följande var inte med på föreläsningen:
Om det är sant att a>2 så är uttrycket a>2 lika med ett! Om det är falskt så är a>2 lika med noll.
Man kan därför skriva if 1 blablabla end . Då kommer alltid blablabla att utföras.
Om man vill vända ett sant påstående (1) till ett falskt (0) eller tvärtom så använder man symbolen ~.
Alltså ~0 = 1 och ~1 = 0.
Ex.
if ~(a==0)
blabla
end
Loopar – While-satser och For-satser
While:
while (villkor)
gör blabla
end
Om villkoret villkor är sant så utförs blabla om och om igen tills att villkoret är falskt.
Skriver man while (1) så stannar inte loopen alls (om inte kommandot break anropas).
For:
for var=vek %var är en variabel, den får heta vad som helst
% vek är en vektor som får vara vad som helst
blabla
end
Denna loop går length(vek) stycken varv. I det första varvet får var värdet vek(1), i nästa varv får den
värdet vek(2), osv... Alltså: var får alla värden som finns i vek – ett i taget.
Ex.
for i=1:100000
disp('All work and no play makes Jacob a dull boy.')
end
Linjär algebra
För att lösa ett ekvationssystem [A | b], där A är koefficientmatrisen och b är högerledet så skriver vi i
matlab A\b. Även om det teoretiskt sett inte finns en lösning så bryr sig inte Matlab om det utan
beräknar ändå en lösning. Matlab kommer dock att ge en varning att matrisen är lite 'knepig'.
Dessutom så kan vissa matriser vara 'knepiga' även om det finns en unik lösning till systemet. Det kan
då vara svårt för matlab att få många korrekta decimaler på lösningen. Vi får då samma varning. Man
bör alltså kontrollera lösningen x=A\b genom att skriva A*x och kolla om det blir b.
Detta ingår i kursen linjär algebra: En matris kan multipliceras med en vektor. Om man skriver A*x =
b så får man en vektorekvation som precis innehåller samma ekvationer som ekvationssystemet [A|
b]. Dvs, om man skriver ekvationssystemet på matrisform så ser det ut som A*x=b. Detta är
förklaringen till att man ska kolla att A*x = b.
Ett annat sätt att lösa ekvationssystemet är att skriva in den utökadematrisen i Matlab
(skriv U=[A b]). Använd sedan rref(U) för att få trappstegsformen av U. Sedan kan man med papper
och penna skriva upp lösningen.