Ö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