Matlab som avancerad räknedosa

Övning 1
Matlab som avancerad räknedosa
1.1 Räkna ut följande
a) 7 · 3 + 9 − 7/2
b) e3π
c) sin(2π)
d) ln 10
e) ln(e7 )
f) 35 + 102
g) |3 + 5i|
1.2 Låt
2 3
A=
,
7 5
6 2
B=
.
1 9
Vad blir då
a) A + B
b) B + A
c) B + B
d) B + B + B
e) 3B
f) 7.5A + 9.2B
1.3 Låt


6 2 9
B = 8 7 6 .
5 2 3
3 2 7
A=
,
5 2 6
Vad blir då
a) AB
b) BB T
c) B T B
d) BAT
e) ABAT
f) BA
1
2
Övningar i Matematisk Modellering
1.4 Låt
a)
b)
c)
d)


3 2 7
C = 9 8 6 .
3 1 9
Plocka
Plocka
Plocka
Plocka
ut
ut
ut
ut
C13 .
C21 .
rad 3 ur C.
kolonn 2 ur C.
1.5 Verifiera sambandet eiπ = −1.
1.6 Det finns många funktioner som opererar på matriser och vektorer. Några exempel
är mean, max, min, sum. Använd dessa för att beräkna medel, största och minsta
värde samt summan av v om
a) v = 1 7 9 −2 .
b) v = 1 : 10 (Vad betyder denna notation?)
c) v = −7 : 5
d) v = 3 : 5 : 32
e) v = 5 : −2 : 1
Låt x = 1 : 0.1 : 2. Beräkna f (x) om
a) f (x) = 2x + 3
b) f (x) = 2sin(πx)
c) f (x) = 2e−3x
d) f (x) = 2x2 + 7x + 3
e) f (x) = cos(πx) sin(3x)
√
f) f (x) = 2x
1.8 Låt x = 0 1 4 10 och y = 2 3 0 4 . Prova att mata in följande i Matlab
och försök förstå vad som händer.
a) plot(x,y)
b) plot(x,y,’*’)
c) plot(x,y,’-’)
d) plot(x,y,’r.’)
e) plot(x,y,’mp’)
1.7
1.9 Plotta funktionerna i övning 1.7.
1.10 Låt

1
6
A=
5
7
a) Summera elementen i rad 2.
7
2
2
7
9
3
6
1

8
1
.
1
2
3
1: Matlab som avancerad räknedosa
b) Summera elementen i kolonn 3.
c) Summera element 2 till 4 i rad 4.
1.11 Matlab innehåller många funktioner för numerisk linjär algebra, t ex eig, det, inv.
Låt


3 2 7 −8
6 5 2 6 

A=
9 8 7 2  .
8 2 1 0
a)
b)
c)
d)
Beräkna det(A).
Beräkna A−1 och verifiera att AA−1 = A−1 A = I.
Beräkna egenvärden och egenvektorer till A.
Diagonalisera A, dvs hitta S och D så att D = S −1 AS.
4
Svar
1.1
a)
>> 7*3+9-7/2
ans =
26.5000
b)
>> exp(3*pi)
ans =
1.2392e+04
c)
>> sin(2*pi)
ans =
-2.4493e-16
d)
>> log(10)
ans =
2.3026
e)
>> log(exp(7))
ans =
7
f)
>> 3^5+10^2
ans =
343
5
Svar Övning 1
g)
>> abs(3+5*i)
ans =
5.8310
1.2
a)
>> A+B
ans =
8
8
5
14
b)
>> B+A
ans =
8
8
5
14
c)
>> B+B
ans =
12
2
4
18
d)
>> B+B+B
ans =
18
3
6
27
6
Svar
e)
>> 3*B
ans =
18
3
6
27
f)
>> 7.5*A+9.2*B
ans =
70.2000
61.7000
40.9000
120.3000
1.3
a)
>> A*B
ans =
69
76
34
36
60
75
116
149
72
61
72
38
b)
>> B*B’
ans =
121
116
61
7
Svar Övning 1
c)
>> B’*B
ans =
125
78
117
78
57
66
117
66
126
d)
>> B*A’
ans =
85
80
40
88
90
47
e)
>> A*B*A’
ans =
695
825
773
902
f)
>> B*A
??? Error using ==> mtimes
Inner matrix dimensions must agree.
1.4
a)
>> C(1,3)
ans =
7
8
Svar
b)
>> C(2,1)
ans =
9
c)
>> C(3,:)
ans =
3
1
d)
>> C(:,2)
ans =
2
8
1
1.10
a)
>> sum(A(2,:))
ans =
12
b)
>> sum(A(:,3))
ans =
19
9
9
Svar Övning 1
c)
>> sum(A(4,2:4))
ans =
10
10
Övning 2
Enkla skript och funktioner
2.1 Använd matlab för att lösa följande uppgift i linjär algebra,
x − 2y + z = 1
2x − 6y + 6z = 2
−3x + 5y + z = 3
2.2 Gör ett skript som räknar ut summan av talen 1 till 100.
2.3 Gör en funktion som har två inparametrar m och n och en utparameter som är
summan m + (m + 1) + . . . + n. Lägg till ett felmeddelande om n < m.
2.4 Skriv två funktioner sin2 och cos2 som beräknar sin2 (x) respektive cos2 (x).
Beräkna med hjälp av dessa funktioner sin2 (7) + cos2 (7).
2.5 Gör en funktion storst som har två inparametrar a och b. Funktionens enda
utparameter skall vara det största av dessa två tal. Lägg till en hjälptext till
funktionen så att den syns om man skriver help storst.
2.6 Antag att vi har följande parametriska kurva:
(x, y) = (cos3 t, sin3 t),
0 ≤ t ≤ 2π.
Skriv ett matlabskript som skapar en plot av kurvan samt beräknar ett närmevärde
till kurvans längd genom att diskretisera kurvan.
2.7 En urgammal metod för att beräkna approximationer
till kvadratrötter är föl√
jande. Antag att vi vill bestämma y = x. Om y0 är ungefärlig lösning till
ekvationen f (y) = y 2 − x = 0, så är
y0 + x/y0
2
en ännu bättre lösning.
Konstruera en matlabfunktion y = mysqrt(x,yinit,precision) som returnerar
en approximativ kvadratrot. Sluta när skillnaden mellan två iterationer är mindre
än precision.
11
Svar
12
2.1
>> A=[1 -2 1;2 -6 6;-3 5 1]
A =
1
-2
1
2
-6
6
-3
5
1
>> b = [1;2;3]
b =
1
2
3
>> x = inv(A)*b
x =
10.0000
6.0000
3.0000
2.2 Ett förslag är
s = 0;
for k=1:100;
s=s+k;
end
disp(s)
Om man lägger in ovanstående rader i en textfil summa_ovn.m så kan man exekvera
den i matlab med
>> summa_ovn
5050
När man skriver summa_ovn i matlabs kommandofönster så exekveras varje rad i
textfilen summa_ovn.m precis som om man kört de direkt i kommandofönster. En
bieffekt av detta är att variabler som t ex ’k’ i exemplet ovan sätts. Vi kanske hellre
hade velat att dessa variabler var lokala. I så fall ska man kanske implementera
en summeringsfunktion i stället.
En annan variant är att utnyttja matlabs möjlighet att arbeta på hela vektorer.
Det finns en funktion sum som om den får en vektor som inargument, returnerar
summan av elementen i vektorn. Ett skript som beräknar och skriver ut summan
av talen 1 till 100 blir då
>> sum(1:100)
ans =
5050
13
Svar Övning 2
2.3 En funktion som beräknar summan är följande.
function s = minsumma(m,n);
% function s = minsumma(m,n)
% beräknar summan av talen m, m+1, ..., n-1, n
s = sum(m:n);
De kommentarsrader som följer efter funktionsdefinitionen skrivs ut om man
skriver help minsumma. Man kan lägga in mer kontroll och felmeddelanden genom
matlabfunktionen error. Då kan det se ut så här
function s = minsumma(m,n);
% function s = minsumma(m,n)
% beräknar summan av talen m, m+1, ..., n-1, n
if nargin<2,
error(’Funktionen minsumma behöver två inargument’);
end
if m>n,
error(’I funktionen minsumma måste n>=m’);
end
s = sum(m:n);
2.4
function y=sin2(x);
y=(sin(x))^2;
function y=cos2(x);
y=(cos(x))^2;
>>sin2(7)+cos2(7)
ans =
1.0000
2.5 Ett exempel är
function d=storst(a,b);
% function d=storst(a,b) - returnerar det tal d som
14
Svar
% är störst av talen a och b.
if (a>=b)
d=a;
else
d=b;
end
2.6 En variant är följande matlabskript
steg = 2 * pi/100;
t = 0:steg:(2*pi);
x = cos(t).^3;
y = sin(t).^3;
plot(x,y);
l=0;
for ii = 1:(length(t)-1)
l = l + sqrt( (x(ii+1)-x(ii))^2 + (y(ii+1)-y(ii))^2 );
end
disp([’Längden är ungefär: ’ num2str(l)]);
Eftersom matlab är bra på att hantera hela vektorer skulle man kunna göra den
sista delen utan for-loop, t ex med skriptet
steg = 2 * pi/100;
t = 0:steg:(2*pi);
x = cos(t).^3;
y = sin(t).^3;
plot(x,y);
l = sum( sqrt( diff(x).^2 + diff(y).^2) );
2.7 Här kommer en lösning som använder while.
function y = mysqrt(x,yinit,precision);
% function y = mysqrt(x,yinit,precision);
% calculates the square root of x
y0 = yinit;
y1 = (y0+x/y0)/2;
while abs(y1-y0)>precision,
y0 = y1;
y1 = (y0+x/y0)/2;
15
Svar Övning 2
end
y = y1;
16
Övning 3
Mer om funktioner och grafik
3.1 Rita den parametriska kurvan (x, y, z) = (t cos(2πt), t sin(2πt), t) genom följande
kommandon i Matlab:
>>
>>
>>
>>
>>
t=0:.01:10;
x=t.*cos(2*pi*t);
y=t.*sin(2*pi*t);
z=t;
plot3(x,y,z)
Rita på motsvarande sätt följande kurvor:
a) (x, y, z) = (t cos(2πt), t sin(2πt), t2 )
√
√
b) (x, y, z) = ( t(cos(t) + cos(40t)), t(sin(t) + sin(40t)), t)
c) (x, y, z) = (3 + t, 2.3 + 3t, −2 − 2t)
3.2 Prova att skriva in följande rader i Matlab:
>> [x,y]=meshgrid(-10:0.5:10);
>> z=sin(sqrt(x.^2+y.^2))./(sqrt(x.^2+y.^2));
>> surf(x,y,z)
Prova sedan att ändra på parametrarna för meshgrid enligt följande: (Tänk på
att du måste generera om z med de nya x och y, samt rita ytan med surf igen
efter att du anropat meshgrid).
a) >> [x,y]=meshgrid(-10:10);
b) >> [x,y]=meshgrid(-5:0.1:5);
c) >> [x,y]=meshgrid(-3:0.5:3,-7:.3:7);
3.3 Skriv in följande i Matlab:
>>
>>
>>
>>
>>
>>
th = 0:(2*pi/100):2*pi;
r = 0:.2:5;
[thg, rg] = meshgrid(th,r);
x=rg.*cos(thg);
y=rg.*sin(thg);
z=cos(5*thg) + 6*exp(-rg.^2);
Prova sedan följande och försök förstå vad som händer. Använd help för att se
hur de olika funktionerna nedan fungerar.
a) >> surf(x,y,z)
17
Övningar i Matematisk Modellering
b)
c)
d)
e)
>>
>>
>>
>>
18
mesh(x,y,z)
contour(x,y,z)
surf(x,y,z,’EdgeColor’,’none’)
surf(x,y,z,’FaceColor’,’blue’)
3.4 Prova följande rader i Matlab. Försök och förstå vad som händer vid varje kommando. Prova gärna att skriva >> help light etc.
>>
>>
>>
>>
>>
>>
L = 40*membrane(1,25);
surf(L)
light(’Position’,[40 100 20])
light(’Position’,[.5 -1 .4])
shading interp
lighting phong
3.5 Om man roterar kurvan y = x3 för 0 ≤ x ≤ 1 ett varv kring x-axeln får man en
strut. Illustrera denna strut i en 3D plot i matlab.
3.6 Skriv en matlabfunktion (med n som inparameter) som beräknar
n
X
1
.
sn =
2
k
k=1
Vad konvergerar sn mot? Med andra ord vad är
n
X
1
lim
?
n→∞
k2
k=1
3.7 Konstruera en matlabfunktion som returnerar det n’te värdet fn i Fibonacciföljden, som definieras av
f0 = 0, f1 = 1, fn = fn−1 + fn−2
3.8 Skriv en funktion som beräknar siffersumman för ett heltal.
3.9 Konstruera en matlabfunktion som simulerar n tärningskast med k tärningar och
som beräknar summan av de k tärningarnas värde för dessa n tärningskast. Plotta
sedan ett histogram över dessa summor för några olika n och k. Tips: skriv
help hist för att se hur man plottar histogram.
19
Svar Övning 3
3.5
[x,th] = meshgrid(0:0.05:1,(0:0.01:1)*(2*pi));
y = x.^3.*cos(th);
z = x.^3.*sin(th);
surfl(x,y,z);
colormap copper
shading interp
axis square
3.6 Ett kort funktion som beräknar delsumman sn är
function sn=ksumma(n);
sn = sum(1./(1:n).^2);
3.7 Det finns flera sätt att lösa problemet. Ett sätt är att iterera sig fram till rätt
punkt med hjälp av iterationsformeln
function fn = myfibonacci(n);
% function fn = myfibonacci(n);
% calculates the n’th fibonacci number
if n<0,
error(’n får inte vara negativ’);
elseif n==0,
fn = 0;
elseif n==1,
fn = 1;
elseif n==2,
fn = 1;
else
f(1)=1;
f(2)=1;
for k=3:n;
f(k)=f(k-1)+f(k-2);
end;
fn = f(n);
end;
Ett annat sätt är att definiera det rekursivt
function fn = myfibonacci(n);
% function fn = myfibonacci(n);
20
Svar
% calculates the n’th fibonacci number
n = round(n);
if n<0,
error(’n får inte vara negativ’);
elseif n==0,
fn = 0;
elseif n==1,
fn = 1;
elseif n==2,
fn = 1;
else
fn = myfibonacci(n-1) + myfibonacci(n-2);
end;
Ett annat sätt är att analysera fibonacciföljden och skriva upp ett utryck för det
n’te elementet.
3.8
function ss = minsiffersumma(n);
% function ss = minsiffersumma(n);
n = abs(round(n));
ss = 0;
while n~=0,
siffra = rem(n,10);
ss = ss + siffra;
n = floor(n/10);
end;
3.9 Jag gör först en rutin som simulerar n stycken försök där man kastat k tärningar
och räknat ut summan.
function sdice = throwkdice(k,n);
dice = ceil(rand(k,n)*6); % Genererar n kolumner med k tärningskast.
sdice = sum(dice); %summerar de k kasten för varje kolumn.
Sedan skriver jag i kommandofönstret
hist(throwkdice(2,1000),2:12);
hist(throwkdice(4,10000),4:24);
Övning 4
Strängar och mer om funktioner
4.1 Kommandot num2str tar ett tal och gör om det till en sträng. Använd detta i ett
skript som skriver ut följande för rad 1 till 100:
Detta
Detta
Detta
...
Detta
är rad 1
är rad 2
är rad 3
är rad 100
4.2 Prova följande i Matlab:
>> namn = ’x’;
>> eval([namn ’=sin(’ num2str(1.2) ’)’])
Vad händer? Se till att ni har förstått hur kommandot är uppbyggt.
4.3 Gör en funktion med två inparametrar där den första är en sträng med ett funktionsnamn och den andra ett tal. Din funktion ska beräkna funktionsvärdet för
det talet och skriva ut svaret på följande sätt:
>> berakna(’sin’,1.2)
sin(1.2) = 0.9320
4.4 Följande funktion avgör om ett tal a är ett primtal eller inte:
function isp=primtal(a)
if a>1
isp=true;
for i=[2 3:2:sqrt(a)],
if mod(a,i)==0 & (i~=a),
isp=false;
end
end
else
isp=false;
end
Så fort isp har blivit falskt en gång vet vi egentligen redan att a inte är ett primtal.
Skriv om den ovanstående funktionen genom att byta ut for-loopen mot en whileloop som avbryts när man gått igenom alla tal eller då isp har antagit värdet
false.
21
Övningar i Matematisk Modellering
22
4.5 Skriv en funktion som räknar ut derivatan av en funktion i en punkt numeriskt.
Den ska alltså anropas på följande sätt:
>>fprim=derivera(funk,x0)
där funk är en sträng som innehåller namnet på funktionen och x0 är punkten
man vill derivera funktionen i.
4.6 Om man vill använda data från Matlab i t ex ett java-program så kan det vara
smidigt att kunna skriva till en enkel textfil. Följande kommandon öppnar en fil,
skriver lite grann i den och stänger filen igen. Prova.
fid = fopen(’minfil.txt’,’w’);
fprintf(fid,’sin(1) = %6.2f \n’,sin(1));
fprintf(fid,’slut’);
fclose(fid);
Vad betyder 6.2? Vad betyder \n?
4.7 Kommandot rem(x,y) beräknar resten då x divideras med y.
a) Skriv en funktion ej_delbar(y) som returnerar en vektor med alla tal mellan
1 och 100 som inte jämnt delbara med y.
b) Skriv ett skript som räknar ut alla primtal mellan 1 och 100 och skriver dem
till en textfil.
23
Svar Övning 4
4.1 Följande rader skriver ut de sökta raderna:
for i=1:100
disp([’Detta är rad ’ num2str(i)])
end
4.3 Följande är två varianter som utför beräkningen,
Alternativ 1:
function berakna(fnamn, tal)
svar = feval(fnamn, tal);
disp([fnamn ’(’ num2str(tal) ’) = ’ num2str(svar)])
Alternativ 2:
function berakna(fnamn, tal)
straeng = [fnamn ’(’ num2str(tal) ’)’];
svar = eval(straeng);
disp([straeng ’ = ’ num2str(svar)])
4.4
function isp=primtal(a)
if a>1,
isp=true;
testtal=[2 3:2:sqrt(a)];
i=1;
while isp & (i<=length(testtal)),
if mod(a,testtal(i))==0 & (testtal(i)~=a),
isp=false;
end
i=i+1;
end
else
isp=false;
end
4.5
function fp=derivera(f,x0)
h=0.001;
fp=(feval(f,x0+h)-feval(f,x0))/h;
Svar
24
4.7
a)
function z = ej_delbar(y)
% Returnerar alla tal mellan 1 och 100 som ej är delbara med y
tal = [1:100];
rester = rem(tal,y);
z = tal(rester ~= 0);
b) Följande skript skriver alla primtal mellan 1 och hundra till filen
minaprimtal.txt.
fid = fopen(’minaprimtal.txt’,’w’);
tal = [2:100];
while length(tal) > 0,
fprintf(fid,’%3d\n’,tal(1));
rester = rem(tal,tal(1));
tal = tal(rester ~= 0);
end
fclose(fid);
Övning 5
Öva inför tentan
5.1 Skriv en funktion som tar en sträng som inparameter och returnerar strängen
utskriven baklänges.
5.2 Skriv ett funktion minplot.m, vars enda inargument är en sträng funktionsnamn
med ett funktionsnamn, för den funktion man vill plotta. Antag att man standardmässigt vill plotta funktionen i intervallet 0 till 10. Använd feval för att
räkna ut funktionens värden.
5.3 Generera en 10 × 5 matris med slumpmässiga bokstäver ur det engelska alfabetet.
Skriv ut matrisen. Sortera raderna i bokstavsordning, och skriv ut den sorterade
matrisen.
5.4 I rövarspråket så byter man ut alla konsonanter mot konsonanten följt av ett o
och sedan konsonanten igen. Således blir meningen ”Jag är klok” på rövarspråk
”Jojagog äror koklolokok”.
Skriv en funktion som tar en mening och gör om den till rövarspråket. Ni kan
anta att man bara använder små bokstäver.
5.5 Transponering av en matris innebär spegling genom diagonalen på matrisen, dvs
om B = AT så bij = aji . Skriv en funktion som speglar en matris genom den
andra diagonalen i matrisen.
5.6 Våra vanliga tal är givna i basen 10, dvs om ett tal skrivs 2317 så betyder detta
att talet skall tolkas som 7 · 100 + 1 · 101 + 3 · 102 + 2 · 103 (vilket såklart blir 2317). I
datorsammanhang representerar man ibland tal i hexadecimal form med basen 16.
Då räcker inte siffrorna till, utan talen 0 till 15 skrivs som 0123456789ABCDEF .
Som ett hexadecimalt tal tolkas alltså talet 23AF som F · 160 + A · 161 + 3 · 162 +
2 · 163 = 15 · 160 + 10 · 161 + 3 · 162 + 2 · 163 = 9135. Skriv en funktion som tar en
sträng som representerar ett hexadecimalt tal och gör om det till ett decimaltal.
25
Svar
5.1
function sb=baklanges(s)
sb=s(end:-1:1);
5.2
funktion minplot(funktionsnamn);
x = 0:0.1:10;
y = feval(funktionsnamn,x);
plot(x,y);
Sedan kan man använda den nya funktionen för att plotta funktioner.
minplot(’sin’);
minplot(’cos’);
minplot(’sqrt’);
minplot(’atan’);
5.3
alfabet = ’abcdefghijklmnopqrstuvwxyz’;
m = alfabet(ceil(rand(10,5)*26))
ms=sortrows(m)
5.4
function mr=rovarsprak(m)
kons=’bcdfghjklmnpqrstvwxz’;
mr=[];
for j=1:length(m),
if isempty(find(kons==m(j)))
mr=[mr m(j)];
else
mr=[mr m(j) ’o’ m(j)];
end
end
5.5
function B=nytransponat(A)
B=A(end:-1:1,:)’;
B=B(end:-1:1,:);
26
27
Svar Övning 5
5.6
function x=hexadectilldec(h)
hexa=’0123456789ABCDEF’;
x=0;
nn=length(h);
for j=nn:-1:1,
koeff=find(hexa==h(j))-1;
x=x+koeff*16^(nn-j);
end
28