Övning 1 Matlab som avancerad räknedosa 1.1 Räkna ut följande a) 7 3 + 9 7/2 b) e 3π c) sin(2π) d) ln 10 e) ln(e 7 ) f) 3 5 + 10 2 g) 3 + 5i 1.2 Låt 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 Vad blir då a) AB b) BB T c) B T B d) BA T e) ABA T f) BA A = A = [ ] 2 3, B = 7 5 [ ] 6 2. 1 9 [ ] 6 2 9 3 2 7, B = 8 7 6. 5 2 6 5 2 3 1
Övningar i Matematisk Modellering 2 1.4 Låt a) Plocka ut C 13. b) Plocka ut C 21. c) Plocka ut rad 3 ur C. d) Plocka ut kolonn 2 ur C. 1.5 Verifiera sambandet e iπ = 1. 3 2 7 C = 9 8 6. 3 1 9 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 1.7 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) = 2x 2 + 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.9 Plotta funktionerna i övning 1.7. 1.10 Låt a) Summera elementen i rad 2. 1 7 9 8 A = 6 2 3 1 5 2 6 1. 7 7 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 A = 6 5 2 6 9 8 7 2. 8 2 1 0 a) Beräkna det(a). b) Beräkna A 1 och verifiera att AA 1 = A 1 A = I. c) Beräkna egenvärden och egenvektorer till A. d) Diagonalisera A, dvs hitta S och D så att D = S 1 AS.
Svar 4 1.1 a) >> 7*3+9-7/2 26.5000 b) >> exp(3*pi) 1.2392e+04 c) >> sin(2*pi) -2.4493e-16 d) >> log(10) 2.3026 e) >> log(exp(7)) 7 f) >> 3^5+10^2 343
5 Svar Övning 1 g) >> abs(3+5*i) 5.8310 1.2 a) >> A+B b) >> B+A c) >> B+B d) 8 5 8 14 8 5 8 14 12 4 2 18 >> B+B+B 18 6 3 27
Svar 6 e) >> 3*B 18 6 3 27 f) >> 7.5*A+9.2*B 70.2000 40.9000 61.7000 120.3000 1.3 a) >> A*B 69 34 60 76 36 75 b) >> B*B 121 116 61 116 149 72 61 72 38
7 Svar Övning 1 c) >> B *B d) 125 78 117 78 57 66 117 66 126 >> B*A e) 85 88 80 90 40 47 >> A*B*A f) 695 773 825 902 >> B*A??? Error using ==> mtimes Inner matrix dimensions must agree. 1.4 a) >> C(1,3) 7
Svar 8 b) >> C(2,1) c) 9 >> C(3,:) d) >> C(:,2) 3 1 9 2 8 1 1.10 a) >> sum(a(2,:)) 12 b) >> sum(a(:,3)) 19
9 Svar Övning 1 c) >> sum(a(4,2:4)) 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 sin 2 (x) respektive cos 2 (x). Beräkna med hjälp av dessa funktioner sin 2 (7) + cos 2 (7). 2.5 Gör en funktion storst som har två inparametrar a och b. Funktionens a 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) = (cos 3 t, sin 3 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öljande. Antag att vi vill bestämma y = x. Om y 0 är ungefärlig lösning till ekvationen f(y) = y 2 x = 0, så är y 0 + x/y 0 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; disp(s) Om man lägger in ovanståe 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) 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 ); if m>n, error( I funktionen minsumma måste n>=m ); 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) 1.0000 2.5 Ett exempel är function d=storst(a,b); % function d=storst(a,b) - returnerar det tal d som
Svar 14 % är störst av talen a och b. if (a>=b) d=a; else d=b; 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 ); 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 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), t 2 ) 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 18 b) >> mesh(x,y,z) c) >> contour(x,y,z) d) >> surf(x,y,z, EdgeColor, none ) e) >> 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 = x 3 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 s n = n k=1 1 k 2. Vad konvergerar s n mot? Med andra ord vad är lim n n k=1 1 k 2? 3.7 Konstruera en matlabfunktion som returnerar det n te värdet f n i Fibonacciföljden, som definieras av f 0 = 0, f 1 = 1, f n = f n 1 + f n 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 s n ä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); ; fn = f(n); ; Ett annat sätt är att definiera det rekursivt function fn = myfibonacci(n); % function fn = myfibonacci(n);
Svar 20 3.8 % 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); ; Ett annat sätt är att analysera fibonacciföljden och skriva upp ett utryck för det n te elementet. 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); ; 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 är rad 1 Detta är rad 2 Detta är rad 3... Detta ä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; else isp=false; Så fort isp har blivit falskt en gång vet vi egentligen redan att a inte är ett primtal. Skriv om den ovanståe 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)]) 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; i=i+1; else isp=false; 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); 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 a 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 = A T så b ij = a ji. 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 10 0 +1 10 1 +3 10 2 +2 10 3 (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 16 0 + A 16 1 + 3 16 2 + 2 16 3 = 15 16 0 + 10 16 1 + 3 16 2 + 2 16 3 = 9135. Skriv en funktion som tar en sträng som representerar ett hexadecimalt tal och gör om det till ett decimaltal. 25
Svar 26 5.1 function sb=baklanges(s) sb=s(:-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)]; 5.5 function B=nytransponat(A) B=A(:-1:1,:) ; B=B(:-1:1,:);
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);
28