11.07.2015 Views

Matlab som avancerad räknedosa

Matlab som avancerad räknedosa

Matlab som avancerad räknedosa

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Övning 1<strong>Matlab</strong> <strong>som</strong> <strong>avancerad</strong> <strong>räknedosa</strong>1.1 Räkna ut följandea) 7 · 3 + 9 − 7/2b) e 3πc) sin(2π)d) ln 10e) ln(e 7 )f) 3 5 + 10 2g) |3 + 5i|1.2 LåtVad blir dåa) A + Bb) B + Ac) B + Bd) B + B + Be) 3Bf) 7.5A + 9.2B1.3 LåtVad blir dåa) ABb) BB Tc) B T Bd) BA Te) ABA Tf) BAA =A =[ ] 2 3, B =7 5[ ] 6 2.1 9⎡ ⎤[ ] 6 2 93 2 7, B = ⎣8 7 6⎦ .5 2 65 2 31


Övningar i Matematisk Modellering 21.4 Låta) 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⎤7C = ⎣9 8 6⎦ .3 1 91.6 Det finns många funktioner <strong>som</strong> 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 minstavärde samt summan av v oma) v = [ 1 7 9 −2 ] .b) v = 1 : 10 (Vad betyder denna notation?)c) v = −7 : 5d) v = 3 : 5 : 32e) v = 5 : −2 : 11.7 Låt x = 1 : 0.1 : 2. Beräkna f(x) oma) f(x) = 2x + 3b) f(x) = 2sin(πx)c) f(x) = 2e −3xd) f(x) = 2x 2 + 7x + 3e) f(x) = cos(πx) sin(3x)f) f(x) = √ 2x1.8 Låt x = [ 0 1 4 10 ] och y = [ 2 3 0 4 ] . Prova att mata in följande i <strong>Matlab</strong>och försök förstå vad <strong>som</strong> 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åta) Summera elementen i rad 2.⎡ ⎤1 7 9 8A = ⎢6 2 3 1⎥⎣5 2 6 1⎦ .7 7 1 2


3 1: <strong>Matlab</strong> <strong>som</strong> <strong>avancerad</strong> <strong>räknedosa</strong>b) Summera elementen i kolonn 3.c) Summera element 2 till 4 i rad 4.1.11 <strong>Matlab</strong> innehåller många funktioner för numerisk linjär algebra, t ex eig, det, inv.Låt⎡⎤3 2 7 −8A = ⎢6 5 2 6⎥⎣9 8 7 2 ⎦ .8 2 1 0a) 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 41.1a)>> 7*3+9-7/2ans =26.5000b)>> exp(3*pi)ans =1.2392e+04c)>> sin(2*pi)ans =-2.4493e-16d)>> log(10)ans =2.3026e)>> log(exp(7))ans =7f)>> 3^5+10^2ans =343


5 Svar Övning 1g)>> abs(3+5*i)ans =5.83101.2a)>> A+Bans =b)>> B+Aans =c)>> B+Bans =d)8 58 148 58 1412 42 18>> B+B+Bans =18 63 27


Svar 6e)>> 3*Bans =18 63 27f)>> 7.5*A+9.2*Bans =70.2000 40.900061.7000 120.30001.3a)>> A*Bans =69 34 6076 36 75b)>> B*B’ans =121 116 61116 149 7261 72 38


7 Svar Övning 1c)>> B’*Bans =d)125 78 11778 57 66117 66 126>> B*A’ans =e)85 8880 9040 47>> A*B*A’ans =f)695 773825 902>> B*A??? Error using ==> mtimesInner matrix dimensions must agree.1.4a)>> C(1,3)ans =7


Svar 8b)>> C(2,1)ans =c)9>> C(3,:)ans =d)>> C(:,2)ans =3 1 92811.10a)>> sum(A(2,:))ans =12b)>> sum(A(:,3))ans =19


9 Svar Övning 1c)>> sum(A(4,2:4))ans =10


Svar 122.1>> A=[1 -2 1;2 -6 6;-3 5 1]A =1 -2 12 -6 6-3 5 1>> b = [1;2;3]b =123>> x = inv(A)*bx =10.00006.00003.00002.2 Ett förslag ärs = 0;for k=1:100;s=s+k;enddisp(s)Om man lägger in ovanstående rader i en textfil summa_ovn.m så kan man exekveraden i matlab med>> summa_ovn5050När man skriver summa_ovn i matlabs kommandofönster så exekveras varje rad itextfilen summa_ovn.m precis <strong>som</strong> om man kört de direkt i kommandofönster. Enbieffekt av detta är att variabler <strong>som</strong> t ex ’k’ i exemplet ovan sätts. Vi kanske hellrehade velat att dessa variabler var lokala. I så fall ska man kanske implementeraen summeringsfunktion i stället.En annan variant är att utnyttja matlabs möjlighet att arbeta på hela vektorer.Det finns en funktion sum <strong>som</strong> om den får en vektor <strong>som</strong> inargument, returnerarsumman av elementen i vektorn. Ett skript <strong>som</strong> beräknar och skriver ut summanav talen 1 till 100 blir då>> sum(1:100)ans =5050


13 Svar Övning 22.3 En funktion <strong>som</strong> 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, ns = sum(m:n);De kommentarsrader <strong>som</strong> följer efter funktionsdefinitionen skrivs ut om manskriver help minsumma. Man kan lägga in mer kontroll och felmeddelanden genommatlabfunktionen error. Då kan det se ut så härfunction s = minsumma(m,n);% function s = minsumma(m,n)% beräknar summan av talen m, m+1, ..., n-1, nif narginn,error(’I funktionen minsumma måste n>=m’);ends = sum(m:n);2.4function y=sin2(x);y=(sin(x))^2;function y=cos2(x);y=(cos(x))^2;>>sin2(7)+cos2(7)ans =1.00002.5 Ett exempel ärfunction d=storst(a,b);% function d=storst(a,b) - returnerar det tal d <strong>som</strong>


Svar 14% är störst av talen a och b.if (a>=b)d=a;elsed=b;end2.6 En variant är följande matlabskriptsteg = 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 );enddisp([’Längden är ungefär: ’ num2str(l)]);Efter<strong>som</strong> matlab är bra på att hantera hela vektorer skulle man kunna göra densista delen utan for-loop, t ex med skriptetsteg = 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 <strong>som</strong> använder while.function y = mysqrt(x,yinit,precision);% function y = mysqrt(x,yinit,precision);% calculates the square root of xy0 = yinit;y1 = (y0+x/y0)/2;while abs(y1-y0)>precision,y0 = y1;y1 = (y0+x/y0)/2;


15 Svar Övning 2endy = y1;


Övning 3Mer om funktioner och grafik3.1 Rita den parametriska kurvan (x, y, z) = (t cos(2πt), t sin(2πt), t) genom följandekommandon i <strong>Matlab</strong>:>> 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 <strong>Matlab</strong>:>> [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 igenefter 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 <strong>Matlab</strong>:>> 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 <strong>som</strong> händer. Använd help för att sehur de olika funktionerna nedan fungerar.a) >> surf(x,y,z)17


Övningar i Matematisk Modellering 18b) >> 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 <strong>Matlab</strong>. Försök och förstå vad <strong>som</strong> 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 phong3.5 Om man roterar kurvan y = x 3 för 0 ≤ x ≤ 1 ett varv kring x-axeln får man enstrut. Illustrera denna strut i en 3D plot i matlab.3.6 Skriv en matlabfunktion (med n <strong>som</strong> inparameter) <strong>som</strong> beräknars n =n∑k=11k 2 .Vad konvergerar s n mot? Med andra ord vad ärlimn→∞n∑k=11k 2 ?3.7 Konstruera en matlabfunktion <strong>som</strong> returnerar det n’te värdet f n i Fibonacciföljden,<strong>som</strong> definieras avf 0 = 0, f 1 = 1, f n = f n−1 + f n−23.8 Skriv en funktion <strong>som</strong> beräknar siffersumman för ett heltal.3.9 Konstruera en matlabfunktion <strong>som</strong> simulerar n tärningskast med k tärningar och<strong>som</strong> beräknar summan av de k tärningarnas värde för dessa n tärningskast. Plottasedan ett histogram över dessa summor för några olika n och k. Tips: skrivhelp hist för att se hur man plottar histogram.


Svar 203.8% calculates the n’th fibonacci numbern = round(n);if n


Övningar i Matematisk Modellering 224.5 Skriv en funktion <strong>som</strong> 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 <strong>som</strong> innehåller namnet på funktionen och x0 är punktenman vill derivera funktionen i.4.6 Om man vill använda data från <strong>Matlab</strong> i t ex ett java-program så kan det varasmidigt 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) <strong>som</strong> returnerar en vektor med alla tal mellan1 och 100 <strong>som</strong> inte jämnt delbara med y.b) Skriv ett skript <strong>som</strong> räknar ut alla primtal mellan 1 och 100 och skriver demtill en textfil.


23 Svar Övning 44.1 Följande rader skriver ut de sökta raderna:for i=1:100disp([’Detta är rad ’ num2str(i)])end4.3 Följande är två varianter <strong>som</strong> 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.4function isp=primtal(a)if a>1,isp=true;testtal=[2 3:2:sqrt(a)];i=1;while isp & (i


Svar 244.7a)function z = ej_delbar(y)% Returnerar alla tal mellan 1 och 100 <strong>som</strong> ej är delbara med ytal = [1:100];rester = rem(tal,y);z = tal(rester ~= 0);b) Följande skript skriver alla primtal mellan 1 och hundra till filenminaprimtal.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);endfclose(fid);


Svar 265.1function sb=baklanges(s)sb=s(end:-1:1);5.2funktion 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.3alfabet = ’abcdefghijklmnopqrstuvwxyz’;m = alfabet(ceil(rand(10,5)*26))ms=sortrows(m)5.4function mr=rovarsprak(m)kons=’bcdfghjklmnpqrstvwxz’;mr=[];for j=1:length(m),if isempty(find(kons==m(j)))mr=[mr m(j)];elsemr=[mr m(j) ’o’ m(j)];endend5.5function B=nytransponat(A)B=A(end:-1:1,:)’;B=B(end:-1:1,:);


27 Svar Övning 55.6function 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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!