Matematikk 1000 Øvingsoppgaver i numerikk leksjon 3 Løsningsforslag Oppgave 1 Flo og fjære a) >> x=0:.1:24; >> y=3.2*sin(pi/6*(x-3)); Disse linjene burde vel være forståelige nå. >> plot(x,y,'linewidth',3) Grafen får tykkelsen 3 (default 1 er 1). >> set(gca,'fontsize',20) Justerer opp skriftsstørrelsen. >> xlabel('t [timar]'); ylabel('t [meter]') Setter tekst på aksene (både x- og y-aksen). >> hold on Setter at plottene skal bli stående når vi lager ere plott. >> plot([0 24],[-1-1],'k-') Plotter linja y = 1 for x fra og med 0 til og med 24. Linja skal være en svart strek. >> plot([6 18],[3.2 3.2],'ro','linewidth',2) >> plot([2.39 9.61 14.39 21.61],-ones(1,4),'gd') 1 Med default menes den verdien som blir satt dersom det ikke er spesisert. 1
Her plotter vi inn diverse punkt - de første to blir markert med en (tykk) rød (r) sirkel (o), og de re neste blir markert med grønne (g) diamanter (d). For å nne ut mer om hvilke muligheter man har (farger, typer punkt etc.), kan man skrive ` help plot'. >> legend('t(t)','y=-1','flo','t(t)=-1') legend-kommandoen gjør oss i stand til å forklare hva de ulike grafene og punktene representerer. Input-variablene til legend-, xlabel og ylabel-funksjonene er små tekst-snutter inni apostroer 2. Slike små tekstvariabler kalles strenger. >> axis([0 27-4 4]) Her justerer vi x-aksen litt ut slik at grafen ikke kolliderer med teksten i hjørnet øverst til høgre. b) Om vi tar med kommentarer, kan skriptet se slik ut: % Skript som plotter en modell for tidevann x=0:.1:24; % Vektor med argument-verdier y=3.2*sin(pi/6*(x-3)); % Vektor med fusjonsverdier plot(x,y,'k','linewidth',3) % Plotter fuksjonen set(gca,'fontsize',20) % Fikserer skriftsstørrelsen på aksene xlabel('t [timer]'); ylabel('t [meter]') % Setter tekst på aksene hold on plot([0 24],[-1-1],'k-') % Markerer linja y=-1 plot([6 18],[3.2 3.2],'ro','linewidth',2) % Markerer punktene for flo plot([2.39 9.61 14.39 21.61],-ones(1,4),'gd') % Markerer når vannstanden var -1 m legend('t(t)','y=-1','flo','t(t)=-1') % Forklarende tekst til grafene axis([0 27-4 4]) % Justerer intervallene aksene går over hold off Som sagt, er det en god vane å kommentere skript, selv om det kanskje er gjort litt vel omstendelig her. Oppgave 2 Summer og for-løkker a) 10 i=1 i 2 = 1 2 + 2 2 + 3 2 + 4 2 + 5 2 + 6 2 + 7 2 + 8 2 + 9 2 + 10 2 = 1 + 4 + 9 + 16 + 25 + 36 + 49 + 64 + 81 + 100 = 385. c) I kommandovinduet får vi opp følgende: 2 Hermetegn kan også brukes 2
>> FinnSum sum = 385 Dette stemte jo bra. Om vi dropper semikolonet i linje 3, får vi >FinnSum sum = 1 sum = 5 sum = 14 sum = 30 sum = 55 sum = 91 sum = 140 sum = 204 sum = 285 sum = 385 sum = 385 d) Skriptet kan lett tilpasses ved å endre 10 til 100 i linje 2: sum=0; for i=1:100 sum=sum+i^2; end sum Det er lurt allerede nå å venne seg til å lagre la med hurtigtast, typisk Ctrl+S, i stedet for å klikke i menyen; ellers kan det kan fort bli i overkant mye klikking. Om vi nå kjører skriptet, får vi svaret 338350. e) Nedre grense skal nå være 5, og øvre grense skal være 20. Hvor hver gang legger vi til i, som vi skriver som `sqrt(i)' i MATLAB: sum=0; for i=5:20 sum=sum+sqrt(i); end sum 3
Vi kjører skriptet og får (det tilnærma) svaret 55.5197. f) I linje 2 ser vi at i går, i steg på 1, fra og med 0 til og med 12. Dette er altså summasjonsgrensene. I linje 3 ser vi at for hver omgang, hver iterasjon, blir det lagt til 1/i. Summen er altså 12 i=0 1 i. Vi kommer tilbake til summer av denne typen når vi senere i kurset skal beregne integraler. Oppgave 3 Lys til bløtkaka a) Vi kan tenke som så: Etter ett år feirer de bursdag med ett lys. Etter ett år til er barnet to år, så de bruker to lys til, altså har de brukt 1+2=3 lys. Etter enda ett til bruker de 3 lys og har brukt 1+2+3=6 lys til sammen. På reårsdagen bruker de de re siste lysene; 1+2+3+4=10. b) Tankegangen over er rett, men det blir litt tungvindt å gjøre med papir og blyant for 100 lys. Men siden det er snakk om ei enkel aritmetisk rekke, kan vi nne en formel for summen; etter n år vil vi ha brukt n i = n(n + 1)/2 i=1 lys, så vi nner svaret ved å løse ulikheten n(n + 1)/2 100. Men i denne sammenhengen er det kanskje mer naturlig å gjøre det ved å skrive et lite MATLAB-skript som regner ut hvor mange lys vi bruker år for år. Det kan vi gjøre slik 3 : 1 % Skript som regner ut forbruk av kakelys 2 3 % Setter antall lys til null 4 Lys=0; 5 6 % Bestemmer hvor mange aar framover vi skal regne 7 N=20; 8 9 for aar=1:n 10 Lys=Lys+aar % Lar Lys oeke med antall aar (skrives til skjerm) 11 end 3 Linjenumrene er ikke med i selve skriptet. Vi har tatt dem med for å lettere kunne referere til bestemte steder i skriptet. Når ting blir litt mer, ikke mye mer, komplisert etterhvert, kan dette vere ganske praktisk. 4
Her har vi laga ei for-løkke som går fra det første året til og med det 20. året. For hvert år blir antall år lagt til variabelen Lys, som gir totalt lysforbruk etter hvert av årene. Dette blir skrevet til skjerm. Vi har kalt skriptet BursdagsLys.m. Om vi kjører det i MATLAB, får vi dette ut: >> BursdagsLys 1 3 6 10 15 21 28 36 45 55 5
66 78 91 105 120 136 153 171 190 210 Vi kjenner igjen svaret fra a) i den fjerde utskriften. Men det blir ganske oversiktlig å lese dette; vi ser at vi et sted går fra 91 til 105 brukte lys, men det blir litt krøkkete å telle seg fram til hvilke år det er snakk om. Derfor er det mer praktisk å skrive ut både antall år og antall lys helst på ei linje. Dette oppnår vi om vi endrer for-løkka til for aar=1:n Lys=Lys+aar; % Lar Lys oeke med antall aar 6
disp([aar Lys]) end % Skriver til skjerm disp-funksjonen skriver det som står inni parantesen til skjerm uten å gi den noe variabelnavn. I dette tilfellet skriver den ut vektoren [aar Lys]. Når vi nå kjører skriptet, får vi nå en litt mer oversiktilg utskrift: >> BursdagsLys 1 1 2 3 3 6 4 10 5 15 6 21 7 28 8 36 9 45 10 55 11 66 12 78 13 91 14 105 15 120 16 136 17 153 18 171 19 190 20 210 7
Vi ser at familien må ut og handle lys før den 14. bursdagen. c) Nå må vi ta hensyn til at alderen ikke starter på null og at der er to barn. Vi kan implementere det ved å justere noe på for-løkka fra b): 1 % Skript som regner ut forbruk av kakelys 2 3 % Setter antall lys til null 4 Lys=0; 5 6 % Bestemmer hvor mange aar framover vi skal regne 7 N=15; 8 9 for aar=1:n 10 AarKari=7+aar; % Bursdags-alder inneværende år for Kari 11 AarOla=5+aar; % Samme for Ola 12 Lys=Lys+AarKari+AarOla; % Lar Lys oeke med alderen til Kari + Ola 13 disp([aar Lys]) % Skriver til skjerm 14 end Der er ofte mange ulike måter å implementere ting på. Skriptet nedenfor gjør akkurat det samme som skriptet over: 1 % Skript som regner ut forbruk av kakelys 2 3 % Setter lys-forbruk til null 4 Lys=0; 5 6 % Bestemmer hvor mange aar framover vi skal regne 7 N=15; 8 9 % Gir alder til Kari og Ola 10 AarKari=7; 11 AarOla=5; 12 13 for aar=1:n 14 AarKari=AarKari+1; % Oppdaterer Karis alder 15 AarOla=AarOla+1; % Samme for Ola 16 Lys=Lys+AarKari+AarOla; % Totalt lysforbruk 17 disp([aar Lys]) % Skriver til skjerm 18 end Begge skriptene gir følgende utskrift til skjerm: 1 14 2 30 3 48 8
4 68 5 90 6 114 7 140 8 168 9 198 10 230 11 264 12 300 13 338 14 378 15 420 Lys-beholdninga rekker akkurat i 12 år. Ekstra: Oppgave 4 Maksimering Siden det skal være ei funksjonsl med vektoren x som argument, må første linje være slik: function M=MaksFunk(x) Selvsagt kunne funksjonen hatt et annet navn enn `MaksFunk', og ut-variabelen må ikke nødvendigvis hete `M'. Vi skal nne det største elementet i x-vektoren. Det kan vi gjere ved å gå gjennom vektoren element for element. For hvert nytt element sjekker vi om det er større enn det som har vist seg å vere størst så langt. Vi kan starte med å si at det foreløpig største elementet, er det første elementet i x, M=x(1). Dette er ei funksjonl som implementerar nettopp dette: 1 function M=MaksFunk(x) 2 9
3 % Funksjon som finner det største elementet i vektoren x 4 5 M=x(1); % tilordner M - foreløpig største element 6 7 for xelement=x % for-løkke som løper gjennom x 8 if xelement>m 9 M=xElement; % om elementet er større enn M, oppdaterer vi M 10 end 11 end Vi tester funksjonsla, som vi har kalt MaksFunk.m, på litt ulike vektorer. I kommandovinduet kan det se slik ut: >> x = -2-1 0 1 2 3 >> MaksFunk(x) ans = 3 >> y=3-(x-sqrt(2)).^2; >> MaksFunk(y) ans = 2.8284 >> x=-2:.5:3; >> y=3-(x-sqrt(2)).^2; >> MaksFunk(y) ans = 2.9926 >> x=-2:0.1:3; >> y=3-(x-sqrt(2)).^2; >> MaksFunk(y) ans = 2.9998 10
Vi ser at når vi bruker nere og nere oppdeling i x-vektoren, ser maksimalverdien til y ut til å nærme seg 3, som er maksimalverdien til funksjonen f(x) = 3 (x 2) 2. 11