Exercises GEO1040 Øyvind Ryan 19. februar 2013
1. Bruk Matlab til å regne ut: a. 2.2 + 4.7 2.2 + 4.7 b. 5/7 5/7 c. 3 2 3^2 2 3 4 2 13 2.2 2 d. (2*3-4^2)/(13-2*2^2) e. 4.7 4 4.7^4 f. Hva er det 12. desimalet i 1/7? Hint: funksjonen floor er nyttig her. x=1/7; x11=floor(x*1e11); x12=floor(x*1e12); tall=x12-10*x11 2. Lag følge variable: x = 0.762 og y = 9.56+e 1 og regn ut: x + y, x y, x y og sin x 2 y 2
x=0.762 y=sqrt(9.56) + exp(-1) x+y x*y x/y sin(x^2*y) 3. Bytt om verdiene til variablene x og y uten at Matlab viser verdien til den temporære variabelen som du bruker. temp=x; x=y y=temp 4. Beregn antall sekunder i ett år. 365*24*60*60 5. Beregn avstanden x 2 + y 2 hvor x = 10 km and y = 50 km. x=10 y=50 dist=sqrt(x^2 + y^2) 6. Beregn volumet til Jorda og den gjennomsnittlige tettheten. Angi tettheten i kg/m 3. Jordas masse er 5.9737 10 24 kg og radiusen er 6371 km. R=6371*1000; M=5.9737e+24; vol=4/3*pi*r^3; M/vol 7. a. La Matlab regne ut cos(θ) og sin(θ) for θ = 0,π/6,π/4,π/3 og π/2. Sjekk at resultatene er rimelige: 3
Løsningsforslag: cos(0) = sin(π/2) = 1 cos(π/6) = sin(π/3) = 0.8660 cos(π/4) = sin(π/4) = 0.7071 cos(π/3) = sin(π/6) = 0.5 cos(π/2) = sin(0) = 0 b. Gjør om verdiene til θ fra radianer til grader. Hint: deg = rad 180 π. Regn ut verdiene ved å bruke funksjonene cosd(θ) og sind(θ). Får du samme svar som i a.? (Hvis ikke har du gjort noe feil.) Løsningsforslag: JA, du får samme svar! 8. La Matlab regne ut verdiene, og sjekk at resultatene er rimelige: e 1, 16, cosπ, sin π 6, tan π 4, arcsin 1 2, arctan1, cos45. exp(1) sqrt(16) cos(pi) sin(pi/6) tan(pi/4) asin(1/2) atan(1) cosd(45) 9. Anta at 1. januar er dag 1 i uke 1. I hvilken uke er dag 117? Løsningsforslag: Her vil vi at 1 til 7 skal gi uke 1, 8 til 14 uke 2, osv. Da kan vi dele med 7 og avrunde oppover. Vi sjekker først at det fungerer som vi vil ved å teste med dagene 1, 7 og 8. ceil(1/7) ceil(7/7) ceil(8/7) uke=ceil(117/7) Svaret er 17. 10. Anta at 1. januar er dag 4 i uke 1. I hvilken uke er dag 117? Løsningsforslag: Her må vi legge til 3 dager i formelen for de som mangler i den første uken: 4
uke = ceil((117+3)/7) Svaret er 18. 11. Vi antar at en bakteriepopulasjon vokser eksponentielt og har en vekst gitt ved P = P 0 e kt der t er tiden i sekunder, P 0 = 120 er antall bakterier ved t=0 og k = 0.04s 1. Finn ut hvor mange bakterier det er etter: a. 10 sekunder Løsningsforslag: 179 b. 30 sekunder Løsningsforslag: 398 c. 1 minutt Løsningsforslag: 1.3228 10 3 d. 1 time Løsningsforslag: 4.14 10 64 12 (Jordskjelv). Jordskjelvet på Haiti i 2010 målte 7.0 Mw (Moment magnitude scale) og det i Chile ca en måned senere 8.8 Mw forskjellen i energi for to jordskjelv kan beskrives ved E = 10 3 2 (m 1 m 2 ) Hvor mange ganger mer energi ble utløst i jordskjelvet i Chile enn i det på Haiti? Løsningsforslag: 501 ganger mer 13 (Aldersbestemmelse etter Karbon-14 metoden). Karbon-14 er en radioaktiv isotop med halveringstid på 5730 år. I atmosfæren er det et nokså konstant blandingsforhold mellom karbon-14 og vanlig karbon 12. Dette forholdet kaller vi I 0. Når dyr og planter dør vil de ikke lengre ta opp karbon-14 og mengden av karbon-14 de inneholder blir gradvis redusert, mens mengden av karbon-12, som ikke er radioaktivt, blir uforandret. Forholdet mellom karbon-14 og karbon- 12 i prøven av det døde dyret/planten kaller vi I. Tiden t er antall år som har gått siden dyret/planten vi ser på døde. Sammenhengen mellom I 0, I og t er gitt ved: t = ln(i /I 0) ln0.5 5730 Bruk Matlab til å regne ut alderen på følge prøver: a. En tann fra en sabeltanntiger der I er ca 10% av I 0 Løsningsforslag: 19000 år 5
b. En tann fra en mammut der I er ca 5% av I 0 Løsningsforslag: 24765 år c. En trebit der forholdet mellom I og I 0 er 50% Løsningsforslag: 5730 år d. Et maleri der I er ca 96% av I 0. Fra hvilken epoke er dette maleriet? Løsningsforslag: 337 år. Barokken (1674) 14. Når en lydbølge går fra et medium til et annet res både hastigheten til bølgen og retningen. Snells brytningslov uttrykker dette forholdet ved sammenhengen v1sin(θ 2 ) = v2sin(θ 1 ), der størrelsene er angitt på figuren under. Vi skal se på en lydbølge som går fra luft til vann. Lydhastigheten i luft er 340m/s, mens lydhastigheten i vann er 1500m/s. Løsningsforslag: Kode som løser oppgaven blir v1 = 340; v2 = 1500; theta1=10; theta2= asind(v2/v1*sind(theta1)); t= 5; 6
s= v2*t; dybde=s*cosd(theta2); x=sqrt(s^2-dybde^2); x2 = s*sind(theta2); a. Vi antar at θ 1 = 10. Finn θ 2 Løsningsforslag: θ 2 = 50 b. Vi kan uttrykke lengden bølgen tilbakelegger i vannet med formelen: s = vt, der v = 1500 m/s. Finn ut hvor langt lydbølgen beveger seg i løpet av 5 sek etter den traff vannet. Løsningsforslag: t=5 gir s=7500m c. Finn ut hvor dypt ned (langs z-aksen) bølgen har beveget seg i vannet. Løsningsforslag: 4820m d. Finn ut hvor langt bortover (langs x-aksen) bølgen har beveget seg ved hjelp av Pythagoras læresetning. Finnes det en annen metode å regne ut denne lengden på? Løsningsforslag: 5746m, Ja man kan bruke s*sind(θ 2 ). x og x2 i løsningsforslaget gir samme svar 15. Gitt følge kode: for i=1:6 num = i; a. Hvor mange steg er det i løkka? Løsningsforslag: 6 b. Hvilken verdi har num etter at løkka er ferdig? Løsningsforslag: 6 c. Hvilken verdi har num etter at løkka har gått 3 ganger? Løsningsforslag: 3 16 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. 7
tallet=10; for k=2:6 tallet = tallet+k/2; tallet Hva skrives ut? tallet = 10 tallet = 20.5 tallet = 20 tallet = 30 tallet = 0 Løsningsforslag: 20 er riktig svar. 17. Vi skal bruke Matlab til å studere partall og oddetall. Lag en løkke som skriver ut de n første oddetallene. Sett n lik et tall i begynnelsen av programmet. n=10; for k=1:n disp(2*k-1) 18. Skriv en for-løkke som finner de n første kvadrattallene. n=10; for k=1:n disp(k^2) 19. Ê Man definerer fakultet av n til n! = 1 2 3 4... n. Skriv en for-løkke som regner ut n!. Sett verdien til n helt i starten av programmet. n=10; val=1; for k=2:n val=val*k; disp(val) 8
20. Din nye PC har kostet 2000 kroner. Den devalueres med 20% hvert år. a. Hvor mye blir PC en verdt når du får bachelorgraden din om 3 år? val=2000; for k=1:3 val=val*0.8; disp(val) b. Skriv om programmet slik at PC en i stedet devalueres med 20% av den opprinnelig verdien hvert år (det vil si at vi devaluerer med et fast beløp hvert år, i motsetning til i a.). val=2000; deval=val*0.2; for k=1:3 val=val-deval; disp(val) 21. Du har 1000 kroner på bankkontoen din. Banken din tilbyr fast rente på 5% per år. a. Bruk en for-løkke til å beregne hvor mye du har på kontoen om 10 år. sumpenger1=1000; for k=1:10 sumpenger1=sumpenger1*1.05; sumpenger1 Kjører du koden vil du se at vi sitter igjen med 1629kr etter 10 år med den første banken b. En annen bank tilbyr deg en rente på 4% per år de 5 første årene og 6% per år de 5 siste årene. Hvor mye kan du tjene ved å bytte bank? 9
sumpenger2=1000; for k=1:5 sumpenger2=sumpenger2*1.04; for k=6:10 sumpenger2=sumpenger2*1.06; sumpenger2 diffpeng=sumpenger2-sumpenger1; disp(diffpenger) Vi sitter igjen med 1628kr etter 10 år med den andre banken. Det er derfor ikke lønnsomt å bruke den andre banken. 22. En vanntank inneholder 10 liter usaltet vann på dag 0. I forbindelse med et eksperiment i oseanografi, blir det tilført 1dl salt hver dag fra dag 1. Samtidig, fordampes 2dl usaltet vann hver dag. Regn ut hvordan forholdet salt/vann varierer i løpet av den første uken. vannmengde=10; saltmengde=0; for k=1:7 saltmengde=saltmengde+0.1; vannmengde=vannmengde-0.2; forhold=saltmengde/vannmengde; disp(forhold) 23 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. tallet=0; for i=1:2 for j=2:3 tallet = tallet+i+j; tallet Hva skrives ut? 10
tallet = 7 tallet = 0 tallet = 11 tallet = 16 tallet = 5 Løsningsforslag: 16 er riktig svar. 24. Vi skal se på en av de store innsjøene i Norge. Anta at vanntilførselen fra elvene i området, V 0, var 128 m 3 /s i år 2000. Pga. økt bresmelting økte tilførselen med 4% pr. år frem til 2009. a. Finn V 0 i m 3 /år i 2000. Løsningsforslag: 4 10 9 m 3 /år. b. Hvor stor var V 0 i 2009? Løsningsforslag: 5.75 10 9 m 3 /år. c. Anta videre at i tillegg er det tilsig fra grunnvannet. Det var V G = 0.8 km 3 /år i 2003 og ble redusert med 3% pr.år. Regn ut total tilførsel av vann til innsjøen i 2004 og i 2009. Løsningsforslag: i 2004: V 2 004 = V 0 1.04 4 +V G 0.97 = 4.75 10 9 m 3 /år. i 2009: V 2 009 = V 0 1.04 9 +V G 0.97 ( 2009 2003) = 5.77 10 9 m 3 /år. 25. Legg inn disse vektorene i Matlab: (1, 9,7,5, 7), (π, 14,7/3), (1,3,5,7,9,...,99), (124,120,116,112...,4,0). : a=[1,-9,7,5,-7] b=[pi,-14, 7/3] c=1:2:99 d=124:-4:0 26. Legg inn arrayet (1, 2, 4, 8, 16,... 4096) Matlab og finn summen. Hint: 4096 = 2 12. : a=0:12; a=2.^a; summen=sum(a) NB: Ikke kall summen sum siden sum også er navnet på en innebygd funksjon. 27. Definer vektorene A, B, og C slik at de har følge verdier i Matlab: 11
A=[1 2 3 4 5 6 7 8 9] B=[2 4 6 8 10 12 14 16 18] C=[0.5,1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] A=1:9; B=2:2:18; C=0.5:0.5:5; D=B.^2-A.^2 a. På hvilken plass i hhv. A, B, og C finner du tallet 4? Løsningsforslag: plass 4, 2 og 8 b. Hvilken av vektorene er lengst? Løsningsforslag: C er lengst c. Opprett vektoren D=B.^2-A.^2. d. Hva blir A + B +C + D? Løsningsforslag: Vi får enfeilmelding fordi alle vektorene ikke har samme lengde 28. Definer a=[1 2 3 4 5 6 7 8 9 10]. Lag et program som beregner sum(a) ved hjelp av en løkke istedenfor funksjonen sum. a=1:10; summen=0; % initialisere for i=1:length(a) summen=summen+a(i); 29. Trykket (p) i en gitt høyde (z) i atmosfæren uttrykkes ved p(z) = p 0 e ( z H ), hvor p 0 er bakketrykket, z er høyden over bakken og H en karakteristisk konstant. Vi kan bruke følge verdier på disse: p 0 = 1004 [hpa] H = 7800 [m] a. Opprett et array Z, med høyder 0-20km med intervall på 500m 12
b. Finn trykket for alle høydene og lagre dem i et array P z : P0=1004; % trykk ved bakken i hpa H=7800; % konstant i m z=0:500:20000; % høyder i m Pz=P0*exp(-z/H) Pass på at høydene og konstanten er enten begge i meter eller begge i kilometer 30. I denne oppgaven skal vi se på hvordan vi kan skrive ut oddetall, partall, og kvadrattall. R=1:2:49; P=2:2:50; S=P-R; length(s) prod(s) sum(s) prod(p./r) sum(1./p) a. Opprett en vektor R med alle oddetallene mellom 0 og 50 og et array P med alle partallene f.o.m. 2 t.o.m. 50 b. Lag en vektor S = P - R. Hvor lang er S? Hva blir produktet av alle elementene i S? Hva blir summen av alle elementene i S? Løsningsforslag: 25, 1, 25 c. Hva blir produktet av elementene i P R? Løsningsforslag: 8.9067 d. Hva blir summen av 1 P? Løsningsforslag: 1.9080 31. Finn tettheten til 4 forskjellige steintyper på nettet, sett verdiene i en vektor og konverter fra g /cm 3 to kg /m 3. 13
% basalt, granite, sandstone, purnice from http://www.seed.slb.com/v2/faqview.cfm?id=1115 a=[3.0 2.7 2.3 0.5] a=a*1000 32. Det magnetiske feltet i Oslo i 2010 har de tre komponentene B N = 15126.1, B E = 484.7 og B Z = 48656.1 hvor verdiene er gitt i nanotesla og B N er feltintensitet mot nord, B E mot øst, og B Z vertikalt nedover. Sett de tre elementene i et array. Deretter beregn deklinasjon D og inklinasjon I av feltet som er relatert til feltkomponentene ved formlene tand = B E /B N og tan I = B Z / B 2 N + B 2 E. B=[15126.1,484.7,48656.1] % mag felt i Oslo i nt declin=atand(b(2)/b(1)) % declination in degrees inclin=atand(b(3)/sqrt(b(1)^2+b(2)^2)) % inclination in degrees 33 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. A = [1 2 3 4] B = [5 6 8] Operasjonen C = A + B gir C = [6 8 11 4] Operasjonen C = A + B gir C = [1 2 3 4 5 6 8] Operasjonen C = [A,B] gir C = [1 2 3 4 5 6 8] Operasjonen C = [A + B] gir C = [6 8 11 4] Løsningsforslag: Det tredje alternativet er riktig. 34 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. tallet=0; for i=1:2 for j=2:3 tallet = tallet+i+j; tallet Hva skrives ut? tallet = 7 tallet = 0 tallet = [0 3 7 11 16] 14
tallet = 16 tallet(i,j) = [0 3 7 11 16] Løsningsforslag: 16 er riktig. 35 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. A = [1 2 3 4] B = [6 7 8] Operasjonen C = A B gir C = [6 14 24 0 0] Operasjonen C = A B(1) gir C = [6 12 18 24] Operasjonen C = B A gir C = [5 5 5 4] Operasjonen C = [A,B] gir C = [6 7 8 1 2 3 4] Løsningsforslag: Det andre alternativet er riktig. 36 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. D = [2 2 2 2] E = [2 2 2] Operasjonen F = D. E gir F = [8 8 8 8] Operasjonen F = D E gir en matrise. Operasjonen F = D. E(1) gir F = [0 0 0 0] Operasjonen F = E. D(4) gir F = [4 4 4] Løsningsforslag: Det fjerde alternativet er riktig. 37. Gitt følge kode: for i=1:3 num = i; obs(i)= num; a. Hva slags type variabel er obs? Løsningsforslag: obs er en array b. Hvilke(n) verdi(er) har obs når løkka er ferdig? Løsningsforslag: [1 2 3] c. Hva er summen av obs? Løsningsforslag: 6 38. Gitt følge array 15
F = [24.3 25.2 30.9 39.9 50.5 58.8 62.4 59.7 52.0 42.4 32.9 26.8 42.1] F inneholder gjennomsnittstemperatur for hver måned på Blindern gitt i Fahrenheit. Formelen for å konvertere fra Fahrenheit til Celsius er gitt ved C = (F 32)/1.8. Bruk en for-løkke og lag en ny array C som inneholder tilsvare temperaturer i Celsius. F = [24.3 25.2 30.9 39.9 50.5 58.8 62.4 59.7 52.0 42.4 32.9 26.8 42.1]; for i=1:length(f) C(i)=(F(i)-32)/1.8; 39. Fibonacci-tallene er en tallfølge der hvert tall er summen av de to forrige tallene i følgen: 0 1 1 2 3 5 8 13...osv a. Lag en løkke som lager de femten første Fibonaccitallene, og legger dem i et array kalt Fibo. Fibo = zeros(1,15); Fibo(1) = 0; Fibo(2) = 1; for i = 3:15 Fibo(i) = Fibo(i-1) + Fibo(i-2); Her må vi først lage et array for tallene med femten elementer der første element inneholder tallet 0 og det andre elementet tallet 1. Så går vi i løkke der vi starter på element 3 og beregner verdien på elementet ut fra de to foregåe elementene som vi lagrer i element nr. i. b. Lag en løkke der du finner Fibonaccitall nr. n. Du velger verdien til n i begynnelsen av programmet. Du skal ikke lage en vektor som i a., bare finne tall nr n. n = 15; f1 = 0; 16
f2 = 1; for i = 3:n f3 = f2 + f1; f1 = f2; f2 = f3; disp(f3); Vi velger 15 som tallet n og legger dette i en variabel. Dette gjør det lettere å re på tallet senere. Så initaliserer vi to variable f1 og f2 til verdi 0 og 1. Så går vi i en løkke der i varierer fra 3 til n og beregner Fibonacci tallet nr. i som vi legger i variablen f3. Videre tar vi vare på det nest siste tallet i f1 og det siste som vi nå har i f3 legges i f2. Da er vi klar for neste runde i løkka. c. Vanskelig: Du får oppgitt at tallene på plass nr. 16 og 17 i Fibonaccitallrekka er henholdsvis 610 og 987. Bruk kun denne informasjonen til å regne ut rekka bakover fra tall nr 17. Legg disse tallene inn i et array.(arrayet du får burde være lik den du fikk i oppgave 1. pluss de to tallene du fikk opgitt i denne oppgaven.) Fibo = zeros(1,17); Fibo(17) = 987; Fibo(16) = 610; for i = 15:-1:1 Fibo(i) = Fibo(i+2) - Fibo(i+1); Her må vi snu på måten vi gjennomløper løkka. Vi starter med i = 15 siden vi skal bruke verdiene på plass 17 og 16 til å beregne den neste verdien nedover i arrayet. Vi initaliserer element 16 og 17 til de angitte verdiene. Da er det bare å strte beregningene for element i ut fra de to vediene på plass i + 1 og i + 2 ved en enkel subtraksjon. 40. I Oppgave 19 i Seksjon?? definerte vi fakultet av n til å være n! = 1 2 3 4... n, og programmerte en løkke som regnet ut n!. Skriv om løkken slik at alle fakultetverdiene fra 1! til n! lagres i et array som du kaller fakultet. n = 10; fakultet = zeros(1,n); 17
fakultet(1) = 1; for i = 2:n fakultet(i) = fakultet(i-1) * i; Her velger vi n = 10 og setter av plass for et array på 10 elementer med verdi 0. Vi initaliserer første element til 1 og starter løkka med indeks til element 2. Vi bruker foregåe element til å beregne verdien av element i. 41. En tallfølge er gitt ved a 1 = 1, a 2 = 3 og a n+2 = 3a n+1 2a n. Skriv et program som returnerer en vektor med de 8 første leddene i følgen. n=8; % antall elementer som skal beregnes a=zeros(1,n); % initialisere arrayen a(1)=1; a(2)=3; for i=3:n a(i)=3*a(i-1)-2*a(i-2); eller n=8; % antall elementer som skal beregnes a=zeros(1,n); % initialisere arrayen a(1)=1; a(2)=3; for i=1:n-2 a(i+2)=3*a(i+1)-2*a(i); 42. Legg inn vektorene a = (3,1, 2,5,4,3) og b = (4,1, 1,5,3,1) i Matlab, og utfør kommandoen» plot(a,b). Utfør også kommandoene» plot(a) og» plot(b), og bruk» hold on til å sørge for at de to siste figurene kommer i samme vindu. a=[3 1-2 5 4 3]; b=[4 1-1 5 3 1]; plot(a,b) figure hold on plot(a) 18
plot(b) hold off 43. Plot de to funksjonene f (x) = e 0.5x2 og h(x) = e (x 3t)2. La x variere fra 4 til 4 med små skrittlengde (prøv deg frem til du faa fine glatte grafer). t skal være et tall mellom 0 og 2. Plott de to funksjonene i samme figur. La de ha ulik farge. Prøv ut forskjellige verdier av t. Hva gjør t? x=linspace(-4,4,1000); f=exp(-0.5*x.^2); t=0.5; h_xt=exp(-(x-3*t).^2); figure(1) plot(f) hold on plot(h_xt, g ) t forflytter senteret av funksjonen, eller forflytter bølgetoppen". 44 (To vulkaner). Vi kan se for oss en vulkan som en sylinder og beskrive dens utslippsrate av magma ved Q = πr4 P 8µL m3 /s Der L er lengden i meter, R radiusen i m, µ viskositeten til magmaen i Pa/sek og P trykket i vulkanen gitt i Pa. For en vulkan fra Hawaii og Mount St Helen under typiske utbrudd: L H = 5000 L St = 7000 µ H = 100 µ St = 2 10 6 R H = 1m L St = 50 P H = 5 10 6 P St = 3 10 7 a. Hvilken vulkan slipper ut mest magma under et typisk utbrudd? Løsningsforslag: Følge kode løser problemet: L = [5000 7000]; u = [100 2*10^6]; R = [1 50]; P = [5*10^6 3*10^7]; Q = (pi*r.^4.*p)./(8*u.*l); Vulkanen på St. Helens slipper ut mest (St.Helens: 5.2594e+03, Hawaii: 3.9270) 19
b. Hvor stort trykk ville man trengt i vulkanen på Hawaii for at de to vulkanene skulle slippe ut like mye magma? Pp = P(1)/Q(1)*Q(2); som gir at trykket på Hawaii vulkanen må være minst 6.6964e+09 Pa for å slippe ut samme mengde magma. c. Plott Q som funksjon av radier og lengder i nærheten av de gitte verdier, hva er de viktigste faktorene for hvor mye lava som blir sluppet ut? R = 1:50; L = 5000; u = 100; P = 5*10^6; Q = (pi*r.^4*p)/(8*u*l); figure(1); plot(r,q); xlabel( Radius [km] ); ylabel( Lavaflom ); clear R L Q; R = 1; L = 5000:100:7000; Q = (pi*r.^4*p)./(8*u*l); figure(2); plot(l,q); xlabel( Radius [km] ); ylabel( Lavaflom ); Ut fra plottene ser vi at det er radius som er den viktigste faktoren for mengden av lava som strømmer ut. 45. Vi skal se litt mer på oppgaven fra tidligere der vi hadde en bakteriepopulasjon som vokste eksponentielt og hadde en vekst gitt av P = P 0 e kt der t er tiden i sekunder, P 0 =120 er populasjonen ved t = 0 og k = 0.04. t=0:30; % tidsrekka k=0.04; % parameter 20
P0=120; % bakteriepopulasjonen ved start P=P0*exp(k*t); figure(1) plot(p) xlabel( tid [s] ) ylabel( antall bakterier ) title( Populasjon ) xlim([1 30]) t=1:60*6; P=P0*exp(k*t); figure(2) hold on plot(p) xlabel( tid [s] ) ylabel( antall bakterier ) title( Populasjon ) plot(t,1e8, r* ) xlim([1 360]) hold off Tidspunktet naar populasjonen naar grensen er ved ca. 340 sekunder. a. Lag en tidsvektor for de 30 første sekundene som du kaller t. b. Regn ut bakteriepopulasjonen for hver t, og plot denne. Sett navn på aksene. c. Lag en ny tidsvektor som representerer 6 minutter. d. Regn ut bakteriepopulasjonen for hvert sekund i 6 minutter, og plot denne. Sett navn på aksene e. Plot en linje i figuren din som markerer der populasjonen når 10 8 bakterier. La linjen være røde stjerner. Les av for hvilken t denne verdien nås. 46. Bruk kommandoen» plot til å lage en enkel strektegning av et hus. 21
x=[0 1 1 0 0 0.5 1]; y=[1 1 0 0 1 1.8 1]; plot(x,y) % definere aksene for å se huset bedre figure plot(x,y) axis([-0.5 1.5-0.5 2]) 47. Bruk Matlab til å tegne grafen til f (x) = x 3 1 over intervallet [ 1,1]. Legg så inn grafen til g (x) = 3x 2 i samme koordinatsystem, og velg forskjellig farge på de to grafene. Bruk skrittlengde 1 100 langs x-aksen. x=-1:0.01:1 figure hold on y=x.^3-1 plot(x,y, r ) y=3*x.^2 plot(x,y, g ) hold off 48. Skriv inn realistiske verdier til nedbør på 7 dager i et array og lag et søylediagram som viser nedbør som en funksjon av tid (med bar). Lag også et histogram av verdiene (med hist). Prøv deg frem med forskjellige verdier av n. ned=[2 3 0 1.3 1.1 0 0]; subplot(2,2,1) bar(ned) title( bar ) subplot(2,2,2) hist(ned) title( hist default ) subplot(2,2,3) hist(ned,2) title( hist 2 ) subplot(2,2,4) hist(ned,4) title( hist 4 ) 22
49. Om man kaster en ball vil den følge en bane gitt av formelen: f (x) = x tan(θ) 1 g x 2 2v0 2 cos 2 (θ) + y 0 der v 0 er startfarten (i m/s), θ er vinkelen du kaster ballen i forhold til x-aksen, y 0 er høyden ballen kastes i (ved x=0) og g er tyngdeakselerasjonen. Figur 1: En balls bane gjennom luften i Oppgave 49 Du kan sette g = 9.81m/s 2. Prøv ulike startverdier og lag figurer som viser banen til ballen. Hint: om du setter θ i grader må du bruke tand() og cosd(). v0=80; theta=60; x=0:0.01:10; g=9.81; y0=2; y=x*tand(theta)-((g*x.^2)/(2*v0*(cosd(theta))^2))+y0; plot(y) hold on ylim([0 max(y)]) 50 (Meteorer). Vi skal se på energien i meteorer som treffer månen og størrelsen på krateret de lager. 23
a. Den kinetiske energien til masse i bevegelse er K E = 1 2 mv 2 der K E er energien i Joule, m er massen i kg og v hastigheten i m/s. Hva er den kinetiske energien til en meteor på 5 g som beveger seg med v = 71 km/s (typisk hastighet i asteroidebeltet)? K_e =.5*0.005*32000^2; % = 1.26*10^7 Joule b. En ligning som blir brukt for å beregne diameteren på kratere på månen er der D at er Diameteren i meter, D at = 0.015ρ 1 6 p ρ 1 2 t W.37 sinφ 2 3 ρ p = 600 og ρ t 3000 er henholdsvis meteorens og månens tetthet i kg/m 3, W er prosentandelen av kollisjonsenergien som går med til å lage et krater, og φ er vinkelen på nedslaget i grader. Bruk W = 0.9K E, φ = 90 til å regne ut diameteren til krateret meteoren fra a. ville laget. ro_p = 600; % kg/m^3 ro_t = 3000; % kg/m^3 W =.9*K_e; % J i=90; D_at =.015*ro_p^(1/6)*ro_t^(-.5)*W^(.37)*sind(i)^(2/3); % 0.32 m c. ρ p = 600 er et ca. anslag, vis enten ved plott eller på andre måter hvordan kraterdiameteren avhenger av tettheten til meteoren og månen ved å variere ρ p og ρ t innenfor rimelige verdier (hvor stort ville krateret blitt dersom den var av feks is, jern, bly, gull?). Løsningsforslag: ρ i s = 920 D a t = 0.34m ρ j er n = 7870 D a t = 0.49m ρ bl y = 11360 D a t = 0.52m ρ g ull = 19320 D a t = 0.57m 24
d. La nå ρ p = 5000 men la den totale massen variere fra 1 g til 100 kg, og plott kraterstørrelsen som funksjon av vekten til meteoren. Husk å sette verdier på aksene. Hint: logspace(-3,2, 100) generer 100 verdier mellom 10 3 og 10 2 med logaritmisk avstand. Det går også an å bruke linspace her. v=logspace(-3,2, 100); W2=.9*.5.*v.*71000^2; D2=.015*ro_p^(1/6)*ro_t^(-.5).*W2.^(.37).*sind(i)^(2/3); plot(v,d2) e. Denne formelen gjelder strengt tatt kun for mindre kratere på månen, men vi kan teste hvor stor asteroiden som laget Chicxulub krateret på Yucatan halvøya må ha vært etter denne formelen. Krateret har en radius på 180 km og mange mener at det er dette nedslaget som utslettet dinosaurene. Bruk ρ t = 6000, ρ p = 3000 og resten som i b. og beregn massen. Hva med radiusen? Virker resultatene sannsynlig? Løsningsforslag: ca mass = 8*10^12 r = sqrt(m/(4*pi*ro)) % = ca 14 km som er ca 3x for stort stort. 51. I denne oppgaven skal vi se på en modell for samspillet mellom rovdyr og byttedyr. Vi lar x n og y n betegne hhv. antall rovdyr og antall byttedyr etter n uker, og vi antar at x n+1 = x n (1 r + c y n ) y n+1 = y n (1 dx n + q) der r, q, c og d er små, positive tall. a. Forklar tankegangen bak modellen. b. Velg r = 0.02, q = 0.04, c = 0.0002, d = 0.001, x 1 = 50, y 1 = 200. Lag et program som regner ut x n og y n for n 1000. Plott følgene x n og y n i samme koordinatsystem. Hvorfor er toppene til x n forskjøvet i forhold til toppene til y n? 25
% rovdyr og byttedyr % antall dyr i en uke = antall dyr uka før - de døde + de nyfødte % antall nyfødte rovdyr avhengig av antall byttedyr % antall døde byttedyr avhengig av antall rovdyr nt=1000; % antall uker r=0.02; % def av fødselsrater og dødelighetrater q=0.04; c=0.0002; d=0.001; x=zeros(1,nt); y=zeros(1,nt); x(1)=50; % initialisering antall rovdyr y(1)=200; % initialisering antall byttedyr for n=2:nt x(n)=x(n-1)*(1-r+c*y(n-1)); y(n)=y(n-1)*(1-d*x(n-1)+q); figure hold on plot(x, r ) plot(y, b ) title( antall rovdyr (rød) og byttedyr (blå) ) hold off % er det mange byttedyr, øker antall rovdyr; er det få byttedyr, minker antall rovdyr 52. En dyrestamme består av tre årskull. Vi regner med at 40% av dyrene i det yngste årskullet lever videre året etter, mens 70% i det nest yngste årskullet lever videre året etter. Ingen dyr lever mer enn tre år. Et individ i det andre årskullet blir i gjennomsnitt forelder til 1.5 individer som blir født året etter. Et individ i det eldste årskullet blir i gjennomsnitt forelder til 1.4 individer som blir født året etter. La x n, y n, z n være antall dyr i hvert årskull etter n år, og forklar hvorfor x n+1 = 1.5y n + 1.4z n y n+1 = 0.4x n z n+1 = 0.7y n a. Anta at det er 100 dyr av hvert årskull det første året. Lag et program som regner ut x n, y n og z n for 1 n 100. Plott alle tre kurvene i samme vindu. Lag et nytt vindu der du plotter alle de relative bestandene x n = x n x n +y n +z n, y n = y n x n +y n +z n, z n = z n x n +y n +z n. 26
b. Gjenta a., men bruk andre startverdier, f.eks. x 1 = 300, y 1 = 0, z 1 = 0. Sammenlign med resultatene i 1. Gjør oppgavene a en gang med et nytt sett av startverdier. Ser du et mønster? : %oppgave med 3 årskull % x er antall yngste, y antall mellomste, og z antall eldste % indeksen k representerer hvilket år man er i. nt = 100; %antall år x=zeros(1,nt); y=zeros(1,nt); z=zeros(1,nt); x(1)=100; % initialisering antall dyr y(1)=100; z(1)=100; for k=2:nt % regne ut utviklingen x(k)=1.5*y(k-1)+1.4*z(k-1); y(k)=0.4*x(k-1); z(k)=0.7*y(k-1); figure hold on plot(x, : ) plot(y, -- ) plot(z, - ) %beregne og plotte de relative bestandene xr=x./(x+y+z) yr=y./(x+y+z) zr=z./(x+y+z) figure hold on plot(xr, : ) plot(yr, -- ) plot(zr, - ) 53. For å finne vinkelen til sola, θ 0, i forhold til et sted på jorda må man ta hensyn til tre vinkler. De er breddegrad, timevinkel og deklinasjonsvinkel. Breddegraden kalles φ og sier hvor langt nord-syd vi er i forhold til ekvator. Timevinkelen, h, forteller oss hvilken tid på døgnet det er. Timevinkelen er lik null midt på 27
dagen, og man legger til 15 grader(evt trekker fra) for hver time etter 12 (for hver time tidligere enn 12). Deklinasjonsvinkelen, δ, forteller om helningen til jorda i forhold til sola. Den er størst ved sommer- og vintersolverv, ±23.45 grader, og 0 ved høst-og vårjevndøgn. Formelen for å regne ut θ 0 er som følger: cos(θ 0 ) = sin(φ)sin(δ) + cos(φ)cos(δ)cos(h) a. Regn ut θ 0 for følge steder: 1. Oslo: 60N, kl 15.00, ved sommersolverv 2. New York City: 40N, kl 09.00, ved høstjevndøgn 3. Singapore: 1N, kl 12.00 ved vårjevndøgn Løsningsforslag: Følge kode løser problemet: 1. Oslo: 60 N kl. 15:00, sommersolhverv f = 60; h = 45; delta = 23.45; Theta0 = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); og da er vinkelen θ 42 2. New York: 40 N kl. 15:00, høstjevndøgn f = 40; h = -45; delta = 0; Theta0 = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); og da er vinkelen θ 32.8 3. Singapore: 1 N kl. 12:00, vårjevndøgn f = 1; h = 0; delta = 0; Theta0 = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); og da er vinkelen θ 89 28
b. Nå skal vi se litt nærmere på når sola går opp og ned i Oslo og Tromsø: Oslo ligger 60N, mens Tromsø ligger 69N. I løpet av ett døgn varierer timevinkelen fra -180 ved midnatt til 180 ved midnatt ett døgn etter. Den skal være lik null kl 12.00. Timevinkelen øker 15 grader pr. time. 1. Lag et array med lengde 24 som inneholder timevinklene fra midnatt til midnatt ett døgn senere. Hint: la timevinkelen variere fra -165 til 180, med skritt på 15. 2. La det være sommersolverv. Regn ut solvinklene for ett døgn for både Oslo og Tromsø. Plot resultatet i samme figur. Husk navn på aksene! 3. Plot en linje for θ 0 lik 90 i samme figur som i 1. Hva representerer denne linja? 4. Finn ut når sola går opp i Oslo og i Tromsø, og når den går ned. 5. Hvorfor er ikke θ 0 lik null midt på dagen? 6. La det så være vintersolverv. Gjør tilsvare som i oppgave 1) til 4) 7. Hvorfor får Tromsø så ekstreme verdier i forhold til Oslo? Løsningsforslag: Soloppgang og solnedgang i Oslo og Tromsø: 1. Følge kode løser problemet: h = -165:15:180; 2. Følge kode løser problemet: h = -165:15:180; f = 60; delta = 23.45; ThetaOslo = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); f = 69; ThetaTromso = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); hold on plot(thetaoslo); plot(thetatromso, r ); axis tight xlabel( Tid [24 timer] ); ylabel( Solvinkelen ); Title( Solvinkel for Oslo og Tromsø ); 29
3. Følge kode løser problemet: x = 1:24; plot(1:24,90, k* ); ylim([-10 100]); 4. Vi ser av figuren at Oslo har soloppgang ca. kl 03:00 og solnedgang ca. kl. 21:00. Tromsø har midnattssol og har derfor ikke soloppgang og solnedgang. 5. θ 0 er null bare ved ekvator. I Norge står sola i sør kl. 12:00. 6. Her rere vi bare på delta variablen og gir den verdien -23.45 grader før vi kjører programmene på nytt. 7. Fordi Tromsø ligger nord for polarsirkelen. c. Vi skal nå la timevinkelen være konstant lik null, dvs. at det er midt på dagen. Nå skal deklinasjonsvinkelen variere gjennom et helt år. Vi starter på sommersolverv. Deklinasjonsvinkelen pr. dag kan regnes ut vha: δ = 23.45 cosd(m), der m = 0 : 360/364 : 360 1. Regn ut hvordan solvinkelen for Oslo varierer i løpet av ett år. Gjør tilsvare beregninger for Tromsø. Plot resultatet i samme figur. 2. Hvor mange dager er uten sol i Tromsø? Har vi tilsvare dager i Oslo? Om du synes dette er gøy, gjør gjerne tilsvare oppgaver med andre byer. Informasjon om breddegrad finner du lett på Wikipedia. Løsningsforslag: Konstant timevinkel på 0 grader. 1. Følge kode løser problemet: h = 0; f = 60; m = 0:360/364:360; delta = 23.45 * cosd(m); ThetaOslo = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); f = 69; ThetaTromso = asind(sind(f)*sind(delta) +cosd(f)*cosd(delta)*cosd(h)); hold on plot(thetaoslo); plot(thetatromso, r ); 30
axis tight xlabel( Dager [365] ); ylabel( Solvinkelen ); Title( Solvinkel for Oslo og Tromsø ); xlim([1 365]); ylim([-10 100]); plot(1:360,90, k ); 2. Tromsø har 53 dager uten sol og Oslo har ingen dager uten sol siden Oslo er sør for polarsirkelen. Vi kan lese dette ut fra figuren eller bruke en funksjon som heter find samt length slik length(find(thetatromso <= 0)) som gir antall dager der solvinkelen er mindre eller lik null (mørketid). 54. I denne oppgaven skal vi lage flere arrayer vi kan få bruk for. a. Lag et array x som går fra 0 til 2π, med 1000 punkter. Lag en figur der du plotter funksjonen S=sin(x). Løsningsforslag: Følge kode løser problemet: x = linspace(0,2*pi,1000); S = sin(x); plot(s); b. Man kan tilnærme funksjonen sin(x) med summen S m (x) = m j =0 ( 1) j 2j +1 x (2j + 1)!, der m er antall ledd i summen. Regn ut denne summen fra null til en gitt verdi m, som du setter i begynnelsen av programmet. m kan ha alle mulige positive verdier, men vi skal bruke verdier mellom 1 og 10. Bruk arrayen x som du definerte i a.. Selve for-løkka kan se slik ut: S_xm=0; for j = 1:m S_xm=S_xm+((-1)^(j-1)*(x.^(2*(j-1)+1))/factorial(2*(j-1)+1)); S_xm vil etter denne løkka være et array du kan plotte. factorial er Matlabfunksjonen for fakultet. Løsningsforslag: Følge kode løser problemet: 31
x = linspace(0,2*pi,1000); m = 10; S_xm = 0; for i = 1:m S_xm=S_xm+((-1)^(i-1)*(x.^(2*(i-1)+1))/factorial(2*(i-1)+1)); c. Lag en figur der du plotter sin(x) og S m (x). Ha ulik farge på de to grafene. Start med m = 1 og lag nye figurer for forskjellige m-verdier mellom 1 og 10. Forklar hva du ser. Hint: det kan være lurt å angi verdiene for y-aksen: ylim([min(s) max(s)]), der S=sin(x) fra a.. Løsningsforslag: Følge kode løser problemet: x = linspace(0,2*pi,1000); m = 10; S_xm = 0; for i = 0:m S_xm = S_xm+((-1)^(i)*(x.^(2*(i)+1))/factorial(2*(i)+1)); S = sin(x); plot(s); hold on; plot(s_xm, r ); ylim([min(s) max(s)]); Vi ser her at når m >= 10 så har vi en sammenfalle kurve med sin(x). 55. Kandidatene 1 til 10 har fått følge poengsum på eksamen: 51, 42, 70, 99, 65, 12, 78, 67, 33 og 90. Lag et program som skriver ut, med en linje per kandidat, kandidatnummer og hvor mange poeng kandidaten har fått. png=[51 42 70 99 65 1278 67 33 90]; %poeng per kandidat n=length(png); for j=1:n fprintf( Kandidat %i har fått %i poeng,j,png(j)) 32
Legg merke til at vi bruker indeksvariabelen j både til kandidatnummer og som indeks. 56. I denne oppgaven skal vi se mer på hvordan vi kan aksessere tegnene i en strengvariabel. a. Lag en strengvariabel az som inneholder alle bokstavene i alfabetet. az= abcdefghijklmnopqrstuvwxyz ; b. Hva blir H når: H(1)=az(8), H(2)= az(5), og H(3)= az(9)? Løsningsforslag: hei c. Skriv navnet ditt ved å trekke ut de riktige bokstavene fra az Hint: Trenger du mellomrom kan du legge til dette på slutten av alfabetet. disp([az(1),az(4),az(1)]) d. Bruk en løkke til å lage strengvariabelen za, som er alfabetet baklengs. n=length(az) for i=1:n za(i)=az(n+1-i); 57. gitt løkka: m=0; for i=1:10 m=m+i; a. Bruk sprintf til å skrive ut verdien til m for hvert steg i løkka sammen med hvilket steg det er i løkka Løsningsforslag: 33
m=0; for i=1:10 m=m+i; fprintf( verdien av m er %d og det er gått %d iterasjoner.,m,i) b. La m starte på 0.5, og gjenta det samme, slik at m får to desimaler. Løsningsforslag: m=0.5; fprintf( verdien av m er %.2f og det er gått %d iterasjoner.,m,i) 58. Gitt strengvariabelen tall = ( u2 liv3 4ever ). a. Bruk str2num til å legge sammen tallene i denne teksten. Løsningsforslag: a=str2num(tall(2))+str2num(tall(7))+str2num(tall(9)) b. Hva får du om du ikke bruker str2num? 59. Gitt strengvariablene dato1 = 19990115; dato2 = 2010.30.05 ; dato3 = 5/01/2008 ; a. Bruk num2str, str2num og fprintf til å skrive ut disse datoene på formen Denne datoen er fra året yyyy og dagen er dd i mm b. Vanskelig: istedenfor tallet til måneden, skriv forkortelsen på tre bokstaver til den aktuelle måneden, som jan, feb, mar, osv. Denne datoen er fra året yyyy og dagen er dd.mnd dato1 = 19990115; dato2 = ( 2010.30.05 ); dato3 = ( 5/01/2008 ); 34
dato = num2str(dato1); mnd1=str2num(dato(5:6)); dag1=str2num(dato(7:8)); aar1=str2num(dato(1:4)); fprintf( Denne datoen er fra året %d og dagen er %d i %2.d,aar1,dag1,mnd1) dag2=str2num(dato2(6:7)); mnd2=str2num(dato2(9:10)); aar2=str2num(dato2(1:4)); fprintf( Denne datoen er fra året %d og dagen er %d i %2.d,aar2,dag2,mnd2) dag=str2num(dato3(1)); mnd=str2num(dato3(3:4)); aar=str2num(dato3(6:9)); fprintf( Denne datoen er fra året %d og dagen er %d i %2.d,aar,dag,mnd) if mnd == 1 mnd= jan ; elseif mnd == 2 mnd = feb ; elseif mnd == 3; mnd = mar ; %osv fprintf( Denne datoen er fra året %d og dagen er %d.%s,aar,dag,mnd) 60. Skriv inn matrisene og A = B = 2 3 1 4 1 5 1 2 1 1 3 2 4 5 1 0 2 1 og gjennomfør operasjonene C=[A,B] C(2,4) C(:,[2 3]) 35
C([1 3],3:5) For å få noe ut av oppgaven bø den gjøres først uten å bruke Matlab. Løsningsforslag: Svarene er: C = 2-3 1-1 3 2 4 1-5 4 5 1 1 2-1 0 2-1 C(2,4) = 4 C(:,[2 3]) = -3 1 1-5 2-1 C([1 3],3:5) = 1-1 3-1 0 2 61. Undersøk hva kommandoen» [A;B] gjør når A og B er to matriser. 62. På begynnelsen av denne seksjonen har du fått oppgitt temperaturutviklingen på 4 målestasjoner. a. Regn ut temperaturforskjellene mellom stasjon 4 og stasjon 1 på alle dagene. b. Plott temperatur som en funksjon av tid på de fire målestasjonene i samme figur. Sett navn på begge aksene på figuren. T=[12.4 12.0 15.1 15.6 14.3 14.0 13.6; 13.4 15.3 16.1 16.6 14.9 13.0 13.6; 12.6 12.5 15.0 15.1 14.9 13.7 13.1; 12.9 12.1 15.6 14.6 14.0 14.0 13.2] t1=t(1,:) t2=t(2,:) t3=t(3,:) t4=t(4,:) figure hold on plot(t1, r ) 36
plot(t2, g ) plot(t3, k ) plot(t4, b ) xlabel( dag nummer ) ylabel( temperatur i Celsius grader ) 63. Gitt matrisen T=[0-3 -3-5 -7-8 -4-2 0 0-5 -6; 2 2 3 4 2 6 7 4 3 0-2 3] Matrisen T inneholder temperaturer fra 2 målestasjoner. Det er tatt en temperaturmåling pr. dag. Skriv matrisen inn i Matlab. Plott temperaturene fra de to stasjonene i samme figur, og bruk ulike farger på kurvene. Sett navn på aksene. La x-aksen gå fra 1 til 12. Lag stjerner i grønt som angir der temperaturen er lik null i figuren. Løsningsforslag: Følge kode løser problement: T = [0-3 -3-5 -7-8 -4-2 0 0-5 -6; 2 2 3 4 2 6 7 4 3 1-2 3]; x = 1:12; plot(x,t(1,:)); hold on plot(x,t(2,:), r ); plot(x,0, g* ); xlabel( Tid ); ylabel( Temperatur ); 64. Gitt matrisen A = [1 2 3 4; 6 7 8 9] B= [10 11; 12 13] a. Hvor mange rader/kolonner har A og B? Løsningsforslag: A har to rader og fire kolonner. B har to rader og to kolonner. b. Hvor mange rader/kolonner har C = [A, B]? Løsningsforslag: C = [A,B] har to rder og seks kolonner. c. Hvilken rad i C er lengst? Løsningsforslag: Radene i C er like lange. d. D = [C (:, 3 : 4)] Hvor mange rader/kolonner har D? Løsningsforslag: D har to rader og to kolonner. 37
65. Gitt matrisen P = [1 2; 3 4; 5 6; 7 8] Q= [10; 11; 12; 13] a. Hvor mange rader/kolonner har P og Q? Løsningsforslag: P har 4 rader og 2 kolonner. Q har 4 rader og 1 kolonne. b. Hvor mange rader/kolonner har R = [P,Q]? Løsningsforslag: R = [P,Q] har 4 rader og 3 kolonner. c. Hva blir P(1,2) +Q(2,1) Q(4,1)? Hvilke tall inngikk i regnestykket? Løsningsforslag: P(1,2) -> 2, Q(2,1) -> 11, Q(4,1) -> 13 så vi får 2 + 11 13 som blir 0. d. Lag arrayer av hver kolonne i R. Løsningsforslag: Følge kode løser problement: Rc1 = R(:,1); Rc2 = R(:,2); Rc3 = R(:,3); e. Lag arrayer av hver rad i R. Løsningsforslag: Følge kode løser problement: Rr1 = R(1,:); Rr2 = R(2,:); Rr3 = R(3,:); Rr4 = R(4,:); f. Vanskelig: Klarer du ved hjelp av disse arrayene å lage matrisene Z = P og Y = Q? Løsningsforslag: Z=[Rc1,Rc2]; Y=Rc3; 66. Lag en matrise der første kolonne inneholder temperaturene fra 0 til 40 grader i Celsius, andre kolonne inneholder de tilsvare temperaturer i Fahrenheit, og tredje kolonne inneholder tilsvare temperaturer i Kelvin. Sammenhengen mellom Celsius(C) og Fahrenheit(F) er F = 1.8C + 32, og mellom Celsius 38
(C) og Kelvin (K) K = C + 273,15. Nb: Gjør dette ved å programmere, ikke skriv inn alle verdiene for hånd! T=0:40; F=(T*1.8)+32; K=T-273; t=[t; F; K]; t eller T = zeros(41,3); T(:,1) = 0:40; T(:,2) = T(:,1).* 1.8 + 32; T(:,3) = T(:,1) + 273.15; 67. Lag en matrise med 5 rader og 5 kolonner der tallet i hvert punkt er gitt ved radnr*kolonnenr. Løsningsforslag: Følge kode løser problement: M = zeros(5,5); for j = 1:5 for i = 1:5 M(i,j) = i*j; 68. Vi definerer matrisen M = 1 2 3 0 1 2 1 2 3 a. Legg inn matrisen i Matlab. Løsningsforslag: M = [-1-2 -3; 0 1 2; 1 2 3]; b. Lag matrisen N som har radene til M som kolonner og kolonnene til M som rader. Løsningsforslag: 39
N = M ; c. Gir N(1:2, 2:3) og M(1:2, 2:3) det samme svaret? Løsningsforslag: Nei siden matrise N er den transponerte av matrise M. d. Gir N(1,1) og M(1:1,2:3) det samme svaret? Løsningsforslag: Nei siden vi bruker bare et element fra N og to elementer fra M. 69 (Flervalgsoppgave, kun ett riktig svar). For å få noe ut av oppgaven bør den gjøres uten å bruke Matlab. Hvilket av følge utsagn er sanne? Art = [1 1.2; 2.1 2; 7 8.9] Gir feilmelding siden dimensjonene ikke stemmer. 1 1.2 Ar t = 2.1 2 7 8.9 ( ) 1 2.1 7 Ar t = 1.2 2 8.9 Ar t(1 : 3) = 7 Løsningsforslag: Det andre alternativet er riktig. 70 (Flervalgsoppgave, kun ett riktig svar). Hvilket av følge utsagn er sanne? En matrise kan ikke ha forskjellig antall rader og kolonner. Antall rader i en matrise varierer med hvilken kolonne du er i. Matriser brukes sjelden av proffe programmerere siden du mister kontrollen over data. Matriser kan ha mange flere enn 3 dimensjoner. Løsningsforslag: Det fjerde alternativet er riktig. 71. Gitt matrisen T=[0-3 -3-5 -7-8 -4-2 0 0-5 -6; 2 2 3 4 2 6 7 4 3 0-2 3] Matrisen T inneholder temperaturer fra 2 målestasjoner over 12 dager. a. Lag et array av hver rad i matrisen. 40
b. Legg til en tredje målestasjon med målingene 1 1-2 -1 0 2 3 1-1 0-1 1 slik at T nå har 3 rader. c. Finn temperaturene på dag 7. d. Lag en matrise som kun inneholder en ukes observasjoner som starter på dag 3 e. Lagre arbeidet ditt i en m fil eller diary. : T=[0-3 -3-5 -7-8 -4-2 0 0-5 -6; 2 2 3 4 2 6 7 4 3 0-2 3]; T1=T(1,:); %a T2=T(2,:); T3=[1 1-2 -1 0 2 3 1-1 0-1 1]; %b T=[T;T3]; Tdag7=T(:,7); %c Tuke=T(:,3:9); %d 72. Opprett arrayen» G=linspace(0,10,100); a. Hva blir summen av denne? b. Hvor lang er denne arrayen? c. Del arrayen opp i to arrayer, E og F, der E inneholder den første halvdelen av G, og F den andre halvdelen. d. Hva blir gjennomsnittet av F E? G=linspace(0,10,100); sum(g) length(g) E=G(1:50); F=G(51:100); H=F-E; mean(h) 41
hvor svarene er 500 og 100 for a) og b) 73. På begynnelsen av seksjonen om matriser har du fått oppgitt temperaturutvikling i 7 dager fra 4 stasjoner som ligger i samme område. a. Lag en figur over temperaturen som en funksjon av tid ved de 4 stasjonene. figure(1) plot(t(:,1)) hold on plot(t(:,2), r ) plot(t(:,3), k ) plot(t(:,4), g ) leg( st.1, st.2, st.3, st.4 ) title( Temperatur for fire stasjoner ); xlabel( Tid ); ylabel( Temperatur ) b. Beregn den gjennomsnittlige temperaturen for hver dag i dette området. Beregn også standardavviket. Bruk figuren fra a. for å kontrollere om verdiene du får her virker korrekte. Tmean = mean(t); disp(tmean) Tstd = std(t); disp(tstd) 74. Legg vannførselen for elvene fra tabellen nedenfor inn i en vektor med navn Vann. a. Beregn kun ved hjelp av arrayoperasjoner: 1. Total vannførsel. 2. Gjennomsnittslig vannførsel for elvene. 3. gjennomsnittet og summen av vannførselen dersom vi ikke regner med Amazonas. 4. Siden Madeira renner ut i Amazonas ønsker vi også å beregne uten denne. Hva blir nå total vannmengde (inkl. Amazonas)? 42
Tabell 1: Verdens 12 største elver etter vannførsel [m 3 /s]: # Navn Vannførsel [m 3 /s] lengde [km] 1) Amazonas 2.19 10 5 7062 2) Congo 4.18 10 4 4371 3) Ganges 3.35 10 4 2948 4) Orinoco 3.30 10 4 2140 5) Yangtze 3.19 10 4 6380 6) Rio Negro 2.93 10 4 2230 7) Parana 25700 3998 8) Yenisei 19600 5550 9) Lena 17100 4260 10) Madeira 17000 3239 11) Mississipi 16200 6270 12) Mekong 16000 4023 5. VANSKELIG: Hva blir snittet uten Madeira (inkl.amazonas)? Legg så lengdene til elvene inn i en vektor ved navn Lengde. b. Hvor lange er elvene til sammen? c. Gjør følge: 1. Gang elvens lengde [km] med dens vannførsel og lagre resultatet i et array Vannlengde 2. Hva blir gjennomsnittet til Vannlengde? 3. Hvilken elv er minst ved denne måten å se det på? -og hvor stor er den? Løsningsforslag: Svarene er Vann= [219000 41800 33500 33000 31900 29300 25700... 19600 17100 17000 16200 16000]; 1.a) sum(vann) = 500100 [m^3/s] 1.b) mean(vann) = 41675 [m^3/s] 1.c) sum(vann(2:12)) = 281100 [m^3/s] mean(vann(2:12))= 25555 [m^3/s] 43
1.d) sum(vann(1:9))+sum(vann(11:12))= 483100 1.e) Feks: (sum(vann(1:9))+sum(vann(11:12)))/(length(vann)-1)= 43918 Lengde =[7062 4371 2948 2140 6380 2230 3998 5550 4260... 3239 6270 4023]; 2. sum(lengde) = 52471 3.a) Vann.*Lengde 3.b) mean(vannlengde)= 2.2274*10^8 3.c) min(vannlengde)= 5.5063*10^7 75. Befolkningstallene nedenforer hentet fra Wikipedia i April 2010. Tabell 2: Land med høyest befolkning # Land Befolkning % av verdens befolkning 1) Kina 1,337,030,000 19.62% 2) India 1,179,744,000 17.31% 3) USA 309,034,000 4.54% 4) Indonesia 231,369,500 3.39% 5) Brasil 192,801,000 2.83% 6) Pakistan 169,274,000 2.48% 7) Bangladesh 162,221,000 2.38% 8) Nigeria 154,729,000 2.27% 9) Russland 141,927,297 2.08% 10) Japan 127,380,000 1.87% 11) Mexico 107,550,697 1.59% 12) Filippinene 92,226,600 1.35% På samme tidspunkt var verdens befolkning totalt 6.816 milliarder. Legg tallene over befolkningen i de 12 landene inn i et array som du kaller populasjon. clear all close all befolkning=[1337030000 1179744000 309034000 231369500 192801000... 169274000 162221000 154729000 141927297 127380000 107550697 92226600]; prosent= [19.62 17.31 4.54 3.39 2.83 2.48 2.38 2.27 2.08 1.87 1.59 1.35]; land=char( Kina, India, USA, Indonesia, Brasil, Pakistan,... Bangladesh, Nigeria, Russland, Japan, Mexico, Filippinene ); 44
%oppg a bar(befolkning) set(gca, XTickLabel,land); ylabel( Befolkning ) title( De 12 mest befolkede landene i verden ) %oppg b summen = sum(befolkning); %oppg c snitt=mean(befolkning); avvik=std(befolkning); %oppg d andel =sum(prosent); %oppg e norge=4858200; del_12=norge/snitt; %oppg f verden = 6.816*1e9; del_verden=norge/verden; %oppg g befolkning2=befolkning(3:length(befolkning)); prosent2= prosent(3:length(prosent)); summen = sum(befolkning2); snitt=mean(befolkning2); avvik=std(befolkning2); andel =sum(prosent2); del_12=norge/snitt; a. Lag et søylediagram over befolkningen i de 12 landene. b. Finn summen av befolkningen i de 12 landene. Løsningsforslag: 4.2053 10 9 c. Finn gjennomsnittet og standardavviket. Løsningsforslag: Gjennomsnitt: 3.5044 10 8, standardavvik: 4.2930 10 8 d. Hvor stor del av jordas befolkning bor i de 12 mest befolkede landene? Løsningsforslag: 61.71% e. Pr. 1. Januar 2010 var befolkningen i Norge 4,858,200. Hvor mange prosent er dette i forhold til gjennomsnittet du fant i c.? Løsningsforslag: 0.014% 45
f. Hvor mange prosent er Norges befolkning av jordas befolkning? Løsningsforslag: 0.0007% g. Kina og India har stor innvirkning på tallene du får siden det bor så mange her. Gjør oppgave b.-e. en gang til uten tallene for Kina og India, og se om du får et veldig ulikt resultat. Løsningsforslag: Vi får nå svarene b 1.6885 10 9 c Gjennomsnitt: 1.6885 10 8, standardavvik: 6.364 10 7 d 24.78% e 0.0288% 76. Finn, uten å programmere, om det siste uttrykket er sant eller ikke. a=2; b=2*a; c=45; d=c-10*b; a<d & (b>c d<c) & ~(a==b) Kontroller med Matlab om du har riktig svar. Løsningsforslag: Hvordan man går fram: Regne ut verdiene: a=2 b=4 c=45 d=5 Sammenligne og kombinere sammenlignigene: 1.: a<d: sant 2.: b>c ikke sant; 3.: d<c sant; 4.: derfor blir 2. eller 3. sant 5.: a ulik b sant 6.: baade 1. og 4. og 5. er sant; derfor er det totale sant. 77. Skriv i en enklere form følge test: if ~(a>b) og test med noen verdier av a og b. 46
if a<=b 78. Funksjonen arcsin(a) er definert bare hvis verdien til a er mellom -1 og 1. Lag et program som tester verdien av a, tar arcsin hvis mulig, eller skriver ut en melding hvis det ikke går an å ta arcsin av a. if (abs(a)>1) disp ( arcsin kan ikke regnes ut for denne a ) else b=arcsin(a) 79. La oss lage et par typer enkle if-tester. a. Lag en if-test som tester om en tallvariabel er et heltall. a= 3.000; b= ceil(a); %fix, floor, round funker også if a==b disp( heltall ) else disp( ikke heltall ) b. Lag en if-test som tester om et heltall er partall eller oddetall. b=a/2; c=ceil(b); if a==b disp( partall ) else disp( oddetall ) c. Lag en if-test som tester hvilken variabel som er størst og deretter setter begge variablene lik hverandre. 47
if a <=b a=b else b=a 80. For å få noe utbytte av denne oppgaven må man la være å programmere den, og heller tenke gjennom den. a=2; b=3; if (a>1 & b<3) disp( ja ) else disp( nei ) a. Hva skrives ut? Hvorfor? Løsningsforslag: nei b. Hva skrives ut om a=0 og b=5? Løsningsforslag: nei c. Hva skrives ut dersom a=1 og b=4? Løsningsforslag: nei d. Hva skrives ut dersom a=2 og b=3? Løsningsforslag: nei 81. For å få noe utbytte av denne oppgaven må man la være å programmere den, og heller tenke gjennom den. a=2; b=3; if (a>1 b<3) disp( ja ) else disp( nei ) 48
a. Hva skrives ut? Hvorfor? Løsningsforslag: a>1 : sant; b<3 : feil, derfor feil; derfor nei. b. Hva skrives ut om a=0 og b=5? Løsningsforslag: a>1 : feil; b<3 : feil, derfor feil; derfor nei. c. Hva skrives ut dersom a=1 og b=4? Løsningsforslag: a>1 : feil; b<3 : feil, derfor feil; derfor nei. d. Hva skrives ut dersom a=2 og b=3? Løsningsforslag: a>1 : sant; b<3 : feil, derfor feil; derfor nei. 82. For å få noe utbytte av denne oppgaven må man la være å programmere den, og heller tenke gjennom den. a=1; b=3; if a>1 & b<3 disp( ja ) if a<1 & b>3 disp( hmm ) else disp( nei ) a. Hva skrives ut? Hvorfor? Løsningsforslag: nei b. Hva skrives ut om a=0 og b=5? Løsningsforslag: hmm c. Hva skrives ut dersom a=1 og b=4? Løsningsforslag: nei d. Hva skrives ut dersom a=2 og b=2? Løsningsforslag: ja nei e. Hva skrives ut dersom a=2 og b=3? Løsningsforslag: nei 49
f. Hvilke verdier kan a og b ha for at bare nei skal bli skrevet ut? Løsningsforslag: enten må a være lik 1 eller b lik 3. 83. Vi skal nå se litt på hvordan man kan bruke en if-test i en løkke. a. Lag en løkke som teller fra 1 til 100, og bruk denne løkken til å lage et array A, som inneholder verdiene 1 til 100 i stige rekkefølge. Løsningsforslag: Denne koden kan brukes: A = []; for i = 1:100 A(i) = i; b. Bruk samme løkke og en if-test til å lage et array B som inneholder alle tallene i løkka som går opp i 10. Løsningsforslag: Kode som løser problemet: B = []; j = 1; for i = 1:100 if(floor(i/10) == ceil(i/10)) B(j) = i; j = j + 1; c. Gjør om det inne i løkka slik at de tallene som er i B ikke er med i A. Hvor lange blir array A og B da? Løsningsforslag: Løsningsforslag: A = []; B = []; j = 1; k = 1; for i = 1:100 if(floor(i/10) == ceil(i/10)) B(j) = i; j = j + 1; else A(k) = i 50
k = k + 1; Lengdene : 10 og 90. 84. Kandidatene 1 til 10 har fått følge poengsum på eksamen: 51, 42, 70, 99, 65, 12, 78, 67, 33 og 90. Kandidatene står hvis de har minst 44 poeng. Lag et program som skriver ut, med en linje per kandidat, kandidatnummer og om han har stått eksamen eller ikke. png=[51 42 70 99 65 1278 67 33 90]; %poeng per kandidat grense=44; n=length(png); for i=1:n if png(i)<grense disp(sprintf( Kandidat %i har ikke bestått,i)) else disp(sprintf( Kandidat %i har bestått,i)) 85. Beregn snødybde ut fra følge meteorologiske data. Temperatur per dag i Celsius (0-2 -3 1 4-2 -5-6 -6-5 1 1) Nedbør per dag i millimeter (3 5 6 0 4 4 8 0 0 2 3 3) Anta at det ikke var snø da målingene startet og at nedbør kommer som snø når det er temperatur mindre eller lik 1 C (1 mm nedbør gir omtrent 1 cm snø). Anta videre at ingen snø smelter. Lag et søylediagram over snødybde som funksjon av tid. : temp=[2 1-3 3 4 0-2 -1 0 1 2 3]; ned=[3 5 6 0 4 4 8 0 0 2 3 3]; snotot=0; for i=1:length(temp); if (temp(i)<=1); 51
snotot=snotot+ned(i); sno(i)=snotot; bar(sno) ylabel snødypte (i cm) xlabel dag 86. Gitt en serie observasjoner av jordskjelv ved deres seismiske energi. Richter=[5.5, 5.3, 2.9, 3.6, 4.1, 5.2, 3.7, 4.4, 6.9, 5.8, 4.0]; Richters skala beskriver energien i et jordskjelv. a. Bruk en if-test til å legge disse jordskjelvene inn i 3 kategorier Lett skjelv ML <= 4 Medium skjelv 4 < ML < 5.5 Alvorlig skjelv M L >= 5.5 Løsningsforslag: Denne koden løser problemet: Ls = 0; Ms = 0; Ks = 0; for i = 1:length(Richter) if(richter(i) <= 4) Ls = Ls + 1; if(richter(i) > 4 & Richter(i) < 5.5) Ms = Ms + 1; if(richter(i) >= 5.5) Ks = Ks + 1; b. Skriv til skjerm hver gang det er et medium eller kraftig skjelv, og hvor mange slike skjelv det har vært tidligere. Løsningsforslag: Kode som løser problemet Ls = 0; Ms = 0; 52
Ks = 0; for i = 1:length(Richter) if(richter(i) <= 4) disp([ Et lett jordskjelv med styrke,num2str(richter(i))]); disp([ Det har vært,num2str(ls), slike skjelv tidligere ]); Ls = Ls + 1; disp( ) if(richter(i) > 4 & Richter(i) < 5.5) disp([ Et medium jordskjelv med styrke,num2str(richter(i))]); disp([ Det har vært,num2str(ms), slike skjelv tidligere ]); disp( ) Ms = Ms + 1; if(richter(i) >= 5.5) disp([ Et kraftig jordskjelv med styrke,num2str(richter(i))]); disp([ Det har vært,num2str(ks), slike skjelv tidligere ]); disp( ) Ks = Ks + 1; c. Forskjellen i energi mellom to skjelv kan beskrives ved E = 10 2 3 (m 1 m 2 ) Hvor mange ganger mer energi er det i det største skjelvet i serien enn i det minste? Løsningsforslag: Kode som løser problemet minste = min(richter); meste = max(richter); forskjell = exp((2/3)*(meste - minste)); Det er 14.4 ganger mer energi i det største i forhold til det minste. 87. Lage matriser ved hjelp av to for-løkker. a. Lag en 2 6-matrise M der verdien i hvert punkt er gitt av radnr. M=zeros(2,6); for j=1:6 for 1=1:2 53
M(i,j)= i; b. Lag en 6 2-matrise N der verdien i hvert punkt er gitt av kolonnenr i samme for-løkker som i a. M=zeros(2,6); N=zeros(6,2); for j=1:6 for 1=1:2 M(i,j)= i; N(j,i)= j; c. Lag en 5 3-matrise P der tallet i hvert punkt er gitt ved radnr*kolonnenr ved å bruke to for-løkker. P=zeros(5,3); for i=1:5 for j=1:5 P(j,i)= j*i; d (vanskelig). Lag matrisene fra a., b. og c. samtidig ved å bruke kun to for-løkker. Hint: bruk if-tester. M=zeros(2,6); N=zeros(6,2); P=zeros(5,3); for i=1:6 for j=1:6 if j<3 M(j,i)= j; 54
if i<3 N(i,j)= i; if j<6 & i<6 P(j,i)= j*i; 88. La oss igjen se på partall og oddetall. a. Lag en while-løkke som setter de n første oddetallene i et array. Sett n lik et tall i begynnelsen av programmet og lag så en while-løkke der du lager et array med n oddetall. n=10; odde=zeros(1,n); odde(1)=1; i=2; while i <= n odde(i)= odde(i-1)+2; i=i+1; b. Gjør om på programmet fra a. slik at while-løkken nå lager de n første partallene. n=10; par=zeros(1,n); par(1)=2; i=2; while i <= n par(i)= par(i-1)+2; i=i+1; 55
c. Bruk en for-løkke til å programmere de n første kvadrattallene. Legg tallene i et arrray som du kaller kvadrat. n=10; kvadrat = zeros(1,n); for i = 1:n kvadrat(i)=i^2; d. Bruk så en while-løkke til å løse c. Kall arrayet kvadrat2. Er kvadrat og kvadrat2 like? (Hvis ikke har du gjort noe feil;) n=10; kvadrat2 = zeros(1,n); i=1; while i <= n kvadrat2(i)=i^2; i=i+1; 89. I denne oppgaven skal vi lage arrayer fra noen mye brukte rekker. a. Bruk en løkke, for eller while, til å beregne M for M lik 100, 1000 og 10000? Løsningsforslag: Denne koden løser problemet: i=1 1 i. Hva blir summen S = zeros(1,3); M = [100, 1000, 10000]; for j = 1:length(M) S = 0; for i = 1:M(j) S(j) = S(j) + 1/i; disp([ For M =,num2str(m(j)), er summen, num2str(s(j))]); 56
For M = 100 er summen 5.1874 For M = 1000 er summen 7.4855 For M = 10000 er summen 9.7876 1 i 2 for de samme M-verdiene. Hva er forskjellen fra sum- b. Beregn så M men i a.? i=1 Løsningsforslag: Denne koden løser problemet: S = zeros(1,3); M = [100, 1000, 10000]; for j = 1:length(M) S = 0; for i = 1:M(j) S(j) = S(j) + 1/i^2; disp([ For M =,num2str(m(j)), er summen, num2str(s(j))]); figure hold on plot (S) plot (S2) hold off For M = 100 er summen 1.635 For M = 1000 er summen 1.6439 For M = 10000 er summen 1.6448 Om du vil kan du lage arrayer av de to rekkene i a. og b., og så plotte resultatet. Da ser du godt forskjellen. 90. Sett alle verdiene til matrisen gitt på begynnelsen av Kapittel?? i en fil som du kaller temp.dat, og les den inn i Matlab. Pass på at du ikke har noen andre tegn enn tallene og mellomrom i fila. Altså ingen semikolon, parenteser osv. 91. Les inn dataene fra fila glomma.dat (denne er i GEO1040-format). Løsningsforslag: Her må vi bruke read_1040 funksjonen for å laste inn verdiene fra glomma.dat. [H M] = read_1040( glomma.dat,3, ); der det første argumentet er filnavnet, det neste er antall headerlinjer og det siste er separatoren som i dette tilfellet er mellomrom. 57
92. les inn filene fil1.dat, fil2.dat, og fil3.dat som tre variable fil1, fil2, og fil3. a. Hvor mange rader har henholdsvis fil1, fil2, og fil3? Løsningsforslag: fil1:4, fil2:16, fil3:4 b. Hvor mange kolonner har henholdsvis fil1, fil2, og fil3? Løsningsforslag: fil1:18, fil2:1, fil3:4 c. Hvor mange tall er det i hver av de tre filene? Løsningsforslag: fil1.dat: 4x18, fil2.dat: 16x1, fil3.dat: 4x4 d. Legg radene i fil1 inn i arrayer. rad1=fil1(1,:),rad2=fil1(2,:),rad3=fil1(3,:),rad4=fil1(4,:) e. Legg kolonnene i fil3 inn i arrayer. kolonne1=fil3(:,1),kolonne2=fil3(:,2),kolonne3=fil3(:,3),kolonne4=fil3(:,4) f. Finn summen av kolonnene i fil3. sum1=sum(rad1)=69, osv g. Finn summen av radene i fil1. sum1=sum(kolonne1)=242, osv. h. Finn summen av alle tallene i fil2. sum(fil2)=185 i. Hva er gjennomsnittet av kolonnene i fil1? snitt1=mean(fil1(:,1))=2.5, osv 58
j. Hva er gjennomsnittet av radene i fil3? snitt1=mean(fil3(1,:))=1423.2, osv. k. Hva er gjennomsnittet av fil2? snitt=mean(fil2)=11.56 l. Hva er summen av alle tallene i de tre filene til sammen? sum(sum(fil1))+sum(fil2)+sum(sum(fil3))=11827 m. Hva er gjennomsnittet av alle tallene i de tre filene til sammen? mean(mean(mean(fil1))+mean(fil2)+mean(mean(fil3)))=720 93. Les inn filen temp.dat. Lag en figur der du plotter temperatur, og en linje som markerer null grader. Sett navn på aksene og en tittel på grafen. load temp.dat plot(temp) hold on plot(1:length(temp),0, g ) xlabel( dager ) ylabel( grader ) title( Temperaturdata ) 94. Filen TempNedborVind.dat inneholder temperatur-, nedbør- og vinddata for ett år. De 365 plassene inneholder temperaturer i Celsius, de neste 365 plassene inneholder nedbør i mm og de siste 365 plassene inneholder vindstyrke gitt i m/s. Du skal lese inn filen og lage tre arrayer, med henholdsvis temperatur, nedbør, og vind. Lag så tre figurer der du plotter arrayene. Husk navn på akser og tittel. 59
load TempNedborVind.dat temperatur=tempnedborvind(1:365); nedbor=tempnedborvind(365:730); vind=tempnedborvind(730:1095); subplot(1,3,1) plot(temperatur) xlabel( dager ) ylabel( grader [C] ) title( temperatur ) subplot(1,3,2) plot(nedbor, g ) xlabel( dager ) ylabel( [mm] ) title( nedb{\o}r ) subplot(1,3,3) plot(vind, r ) xlabel( dager ) ylabel( [m/s] ) title( vind ) 95. Les inn filen dallas_temp.dat. Første kolonne inneholder måned, andre kolonne dag, tredje kolonne år, og siste kolonne temperatur i Fahrenheit. a. Les inn de fire kolonnene og legg dem i fire forskjellige arrayer som du kaller mnd, dag, aar, og temp. load dallas_temp.dat mnd = dallas_temp(:,1); dag = dallas_temp(:,2); aar=dallas_temp(:,3); temp = dallas_temp(:,4); b. Gjør om temperaturene i temp fra Fahrenheit til Celsius ved hjelp av formelen C = (F 32)/1.8. Kall den nye temperaturarrayen temp2. for i = 1:length(temp) temp2(i)=(temp(i)-32)/1.8; 60
c. Lag en figur der du plotter temp2. Lag en linje i samme figur som markerer null grader. Sett navn på akser, og en tittel på figuren. plot(temp2) hold on plot(1:length(temp2),0, g ) d. To steder ser du målefeil. Der er temperaturen lik 99 Fahrenheit, eller 72.778 Celsius. Lag en løkke der du løper gjennom temp, tester om temperaturen er 99F, og om den er det erstatter du temperaturen med temperaturen fra dagen før. Gjør så b. og c. om igjen. Hint: Det er mye lettere å gjøre dette med temp enn med temp2, siden temp har eksakt 99F som verdi for målefeil. for i = 1:length(temp) if temp(i)==-99 temp(i)=temp(i-1); for i = 1:length(temp) temp2(i)=(temp(i)-32)/1.8; plot(temp2) 96. Tegn grafene til disse funksjonene: f (x, y) = x 2 y 2, g (x, y) = sin x y 2 +x 2, h(x, y) = sin(e x+y ) for x mellom 0 og 2 og y mellom 1 og 2. Finn selv hvilken inndeling av aksene som trengs for at alle funksjonene skal være bra representert. Vri på flatene for å få et best mulig inntrykk. Løsningsforslag: Vi prøver forskjellige inndelinger. Funksjonen h trenger at x- og y-aksene er findelt for at grafen skal kunne se bra ut. X = 0:0.01:2; Y = 1:0.01:2; [x,y]=meshgrid(x,y); 61
f = x.^2.* y.^2; g = (sin(x)./y.^2) + x.^2; h = sin(exp(x+y)); figure(1) mesh(x,y,f) title( funksjon f ) xlabel( x ) ylabel( y ) zlabel( f ) figure(2) mesh(x,y,g) title( funksjon g ) xlabel( x ) ylabel( y ) zlabel( g ) figure(3) mesh(x,y,h) title( funksjon h ) xlabel( x ) ylabel( y ) zlabel( h ) 97. Tegn kurvene r 1 (t) = (t, t 2,sin t) og r 2 (t) = (sin 2 t,cos 2 t,e t ) for t fra 0 til 10π. Velg selv inndeling av t-intervallet. Vri på koordinatsystemet for å se kurvene best mulig. Løsningsforslag: Mulig kode: t = linspace(0,10*pi,100); figure(1) plot3(t,t.^2, sin(t)) xlabel( t ) ylabel( t squared ) zlabel( sin(t) ) figure(2) plot3(sin(t).^2, cos(t).^2,exp(-t)) xlabel( sin(t) squared ) ylabel( cos(t) squared ) zlabel( exp(-t) ) 98. Bruk kommandoen plot3 til å lage en tredimensjonal strektegning av en terning. 62
99. Tegn grafen til funksjonen s(x, y) = sin(πx) sin(πy). La x=y=linspace(0,4,n). Varier antall punkter, n, for å se hvordan dette rer flaten. Løsningsforslag: Mulig kode for eggboks funksjonen: n=100; x=linspace(0,4,n); y=linspace(0,4,n); [X,Y]=meshgrid(x,y); s = sin(pi*x).*sin(pi*y); figure mesh(x,y,s) title( funksjon sin*sin ) xlabel( x ) ylabel( y ) zlabel( s ) 100. Lag en funksjon som returner minimumsverdien i en 3 3-matrise. function [amin]=minmat3(a) b=min(a); c=min(b); amin=min(c); eller function [amin]=minmat3(a) amin=min(min(min(a))); 101. Lag en funksjon som returner både gjennomsnitt og standardavvik av verdiene i et array. Sjekk at dine resultater er riktig ved hjelp av de to innebygde funksjonene mean(x) og std(x), men ikke bruk dem i din egen funksjon. function [g,s]=gjennom(a) n=length(a) temp=0; for i=1:n temp=temp+a(i); g=temp/n temp=0; 63
for i=1:n temp=temp+(a(i)-g)^2; s=sqrt(temp/(n-1)) 102. Lag en funksjon som regner ut leddene i følgen {x n } gitt ved: x n+2 = ax n+1 + bx n x 1 = c, x 2 = d Filen skal ha inn-parametre a,b,c,d,m, og skal returnere de m første verdiene i følgen. x_1=c; x_2=d s=folge(a,b,c,d,m) function s=folge(a,b,c,d,m) s(1)=c; if (m==1); return; ; s(2)=d; if (m==2); return; ; for i=3:m s(i)=a*s(i-2)+b*s(i-1); 103. Lag en funksjon som regner ut leddene i følgen {x n } gitt ved: x n+1 = ax n (1 x n ) x 1 = b Funksjonen skal ha inn-parametre a,b,m, og skal returnere de m første verdiene i følgen. Sett m = 100, se på tilfellene b = 0.2 og b = 0.8, og kjør programmet for hhv. a = 1.5, a = 2.8, a = 3, a = 3.1, a = 3.5, a = 3.9. Plott resultatene. Eksperimenter videre hvis du har lyst, men behold humøret selv om du ikke finner noe mønster; fenomenet du ser på er et av utgangspunktene for det som kalles kaos-teori! opp3 regne ut m ledd i x_n+1 = a x_n (1-x_n) x_1=b; [s]=folgekaos(a,b,m) function [s]=folgekaos(a,b,m) s(1)=b; 64
if (m==1); return; ; for i=2:m s(i)=a*s(i-1)*(1-s(i-1)); m=100; b=[0.2 0.8]; a=[1.5 2.8 3 3.1 3.5 3.9]; for j=1:2; for i=1:6 s=folgekaos(a(i),b(j),m); figure plot(s) 104. La oss se på flere funksjoner som har flere ut-parametre. a. Lag en funksjon som tar inn et vilkårlig array som inn-parameter, og returnerer maks, min, gjennomsnitt, og lengde. function[lengde, gjennomsnitt, maks, mini] = array_funk(arr) lengde=length(arr); gjennomsnitt=mean(arr); maks=max(arr); mini=min(arr); b. Test at funksjonen virker ved å lagre svarene som feks m, mi, gj og l for arrayer fra noen tidligere oppgaver. [l,g,m,i]=array_funk(arr) 105. La oss lage oss flere nye funksjoner. a. Lag en funksjon som tester om en tallvariabel er et heltall og returnerer svaret. 65
function[svar]= heltall(a) a= 3.000; b= ceil(a); if a==b Svar=( heltall ) else Svar=( ikke heltall ) b. Lag en funksjon som tester om en tallvariabel er partall eller oddetall og returnerer svaret function[svar]= partall(a) b=a/2; c=ceil(b); if a==b Svar=( partall ) else Svar=( oddetall ) c. Lag en funksjon som tester hvilken av 2 variable som er størst og returnerer kun den største. function[svar]= storst(a,b) if a>b Svar=a else Svar=b d. Lag en funksjon som tester hvilket av 2 arrayer som er lengst og returnerer det korteste. 66
function[svar]= kortest(a,b) d=length(a) e=length(b) if d>e Svar=b else Svar=a 106. Lag en funksjon fakultet, som tar inn et heltall n, og returnerer n! = 1 2 3 4... n. function[n_fakultet]=fakultet(n) n_fakultet=1; if n==0 n_fakultet=1; return; for i=1:n n_fakultet=n_fakultet*i; 107. La oss se nærmere på omregning mellom Fahrenheit og Celsius. a. Lag en funksjon som regner om fra Fahrenheit til Celsius. function[f] = celcius_fahrenheit(t) F= 32+(9/5)*T; b. og en som regner om fra Celsius til Fahrenheit. function[c] = fahrenheit_celsius(t) C= (T-32)*(9/5); 67
c. Lag en funksjon som tar inn en temperatur og en strengvariabel som sier hva slags temperatur det er f.eks (K,F eller C), og returnerer temperaturen i både Kelvin, Celsius og Fahrenheit. function[celsius, Fahrenheit, Kelvin] = celsius_fahrenheit_kelvin(t,enhet) if enhet== K Kelvin=T; Celsius= T-273.15; Fahrenheit= 32+(9/5)*Celsius; return elseif enhet== C Celsius=T; Kelvin= T+273.15; Fahrenheit=32+(9/5)*T; return elseif enhet== F Fahrenheit= T; Celsius= (T-32)*(9/5); Kelvin= Celsius-273.15; return else disp( invalid option for enhet, must be one of C,K,F ); d. Lag funksjonen din fra c. slik at temperaturene er arrayer. Tips: Dette er en nyttig funksjon som er grei å ha lagret. function[celsius, Fahrenheit, Kelvin] = celsius_fahrenheit_kelvin(t,enhet) if enhet== K Kelvin=T; Celsius= T-273.15; Fahrenheit= 32+(9/5).*Celsius; return elseif enhet== C Celsius=T; Kelvin= T+273.15; Fahrenheit=((9/5).*T)+32; 68
return elseif enhet== F Fahrenheit= T; Celsius= (T-32).*(9/5); Kelvin= Celsius-273.15; return else disp( invalid option for enhet, must be one of C,K,F ); 108. La oss lage oss flere funksjoner. function[toer]= to(n) toer=zeros(n,1); for i=1:n toer(i)=2^(i-1); a. I kapitlet om arrayer og løkker lagde du et array (1,2,4,8,16,...,4096). Nå skal du lage en funksjon som tar imot antall plasser du vil ha i arrayet (i dette tilfellet 13), og ser tilbake arrayet du ser over. b. Gjør om funksjonen slik at den kan ta imot enhver lengde, og slik at den ser tilbake arrayen. 109. Vi skal se på utviklingen til tre generasjoner av en dyrepopulasjon. Den første generasjonen kalles x, den midterste y og den eldste z. 40% av dyrene i generasjon x overlever til generasjon y, og 70% av dyrene i generasjon y overlever til generasjon z pr. år. Dyrene i generasjon y får gjennomsnittlig 1.5 barn hver pr. år, og dyrene i generasjon z får 1.4 barn hver pr. år. Løsningsforslag: a. og b.: function[x,y,z,b] = populasjon(x1,y1,z1,b1,t) x(1)=x1; y(1)=y1; z(1)=z1; b(1)=b1; for i=1:t 69
x(i+1)=1.5*y(i)+1.4*z(i)+0.5*b(i); y(i+1)=0.4*x(i); z(i+1)=0.7*y(i); b(i+1)=0.2*z(i); a. Du skal lage en funksjon som tar i mot hvor mange dyr det er i hver generasjon ved tiden t=1, og ser tilbake tre arrayer som inneholder utviklingen til hver generasjon. I tillegg skal funksjonen også ta imot hvor mange tidsskritt(år) frem i tid du vil se på. Første linje i programmet ditt skal se slik ut: function[x,y,z] = populasjon(x1,y1,z1,t) Her er x1, y1, z1, og t vanlige tall, mens x, y, og z er arrayer. b. I denne funksjonen var z den eldste generasjonen. Under studiet av denne dyrepopulasjonen fant du ut at det var en generasjon til som var a eldre enn z, nemlig generasjon b! Det var 20% av dyrene som var i generasjon z som overlevde til generasjon b, og annethvert dyr i generasjon b fikk ett barn pr. år. Gjør ringene som trengs i funksjonen for at den skal beregne utviklingen til bestanden inkludert generasjon b. Første linje i programmet ditt skal nå se slik ut: function[x,y,z,b] = populasjon(x1,y1,z1,b1,t) c. Lag en ny funksjon der du ser inn arrayene x,y,z, og b. Funksjonen skal lage et plot som viser utviklingen til populasjonene. Figuren skal ha navn på aksene, tittel og de fire grafene skal ha ulike farger. Første linje i programmet ditt skal se slik ut: function figur(x,y,z,b) function figur(x,y,z,b) plot(x) hold on plot(y, r ) plot(z, g ) 70
plot(b, k ) xlabel( {\aa}r ) ylabel( antall dyr ) title( Populasjon ) leg( x, y, z, b ) 110 (Vanskelig). Lotto er spillet der du vinner førstepremien hvis du har tippet de 7 tallene som blir trukket blant 34 tall. Løsningsforslag: a. og b.: function[dagens_tall, tilleggstall] =Lotto(a,n) % 1. c = randperm(n); dagens_tall = sort(c(1:a)); % 2. tilleggstall =sort(c(a+1:a+3)); a. Lag en funksjon, Lotto, som trekker ut a vilkårlige tall mellom 1 og n, og ut fra inputene returnerer et array, dagens tall, med de utvalgte tallene i stige rekkefølge. Hint: funksjonen randperm(10) trekker tallene fra 1 til 10 i tilfeldig rekkefølge. Man kan evt bruke rand og ceil, men må da passe på å ikke ha flere like tall b. Gjør om funksjonen Lotto slik at den i tillegg til å returnere dagens tall også returnerer arrayen tilleggstall der tre ekstra tall er blitt trukket ut. c. Vi skal nå lage en ny funksjon, Mulige, der vi skal se litt på vinnersjansene til rekker i lotto. Opprett funksjonen Mulige som tar inn a og n som i a., og ut fra disse returnerer antall mulige rekker funksjonen fra a. kan ha. Hint: Antall rekker for n = 10 og a = 3 er (10 9 8)/(1 2 3) = n!/((n a)!a!) = ( n ) a, evt. se oppgave fra kapitlet om løkker. function[ant_rekker] =Mulige(a,n) teller=1; nevner=1; for i=1:a teller= teller*(n-i+1); nevner= nevner*i; 71
ant_rekker = teller/nevner; d. I viking-lotto vinner man førstepremien ved å trekke ut 6 tall blant 46 mulige, dvs n = 46 og a = 6. Bruk funksjonen Mulige til å beregne hvor mye vanskeligere det er å vinne i viking-lotto enn i vanlig lotto. Hva hvis du trengte 7 rette der og? Løsningsforslag: t=mulige(6,46)/mulige(7,34) % 1,7 e. Lag et program som kaller funksjonen Mulige, og plotter mulige utfall for forskjellige verdier av antall rette man må ha for å vinne for hhv. lotto og viking-lotto. Hvor mange rette er det vanskeligst å få i de to spillene? n=34; nv=46; for i=1:n lotto(i)=mulige(i,n); for i=1:nv vlotto(i)=mulige(i,nv); lotto=lotto/max(lotto); vlotto=vlotto/max(vlotto); plot(lotto, k ) hold on; plot(vlotto, b ) f (Vanskelig). Lag et program som ser inn dine lotto-rekker, og som trekker ut en Lottorekke og gir deg antall riktige i din rekke. Hvor mange rette klarer du? (ignorer tilleggstall). Hint: Du kan bruke funksjonen Lotto til å lage rekkene dine. Denne oppgaven trenger god kjennskap til for-løkker. 72
n=34; % antall tall m=5; % antall innleverte rekker a=7; % antall tall per rekke % genererer mine rekker for i=1:m mine_rekker(i,:)=lotto(a,n); % trekker vinnertallene: [vinnertall, tilleggstall]=lotto(a,n); rette_tall=zeros(1,m); for i=1:m for j=1:a tall=vinnertall(j); for k=1:a if tall==mine_rekker(i,k) rette_tall(i)=rette_tall(i)+1; vinnertall; mine_rekker; rette_tall 111. koden er a=1:10; sum=0; for k=1:11 sum=sum+a(k); 112. koden er function fak=fakultet(n) fak=n*fakultet(n-1); 73
113. koden er A=[1 2 3; 4 5 6]; B=[1 2; 3 4]; A*B 114. Dette programmet lager et array med n oddetall: n=10; odde=zeros(1,n); odde(1)=1; i=2; while i <= n odde= odde(i-1)+2; i=i+1; 115. Plot de to funksjonene f (x) = e 0.5x2 og h(x) = e (x 3t)2 : f=exp(-0.5*x.^2); t=0.5; h_xt=exp(-(x-3*t).^2); figure(1) plot(f) hold on plot(h_xt, g ) 116. Vi skal se på utviklingen av tre generasjoner av en dyrepopulasjon. Vi skal lage en funksjon som tar som inn-parametre hvor mange dyr det er i hver generasjon ved tiden t = 1, og returnerer tre arrayer som inneholder utviklingen til hver generasjon: function[x,y,z] = populasjon(x1,y1) x(1)=x1; y(1)=y1; z(1)=z1; % ser på 100 år frem i tid: for n=1:100 x(t+1)=1.5*y(t)+1.4*z(t); 74
y(t+1)=0.4*x(t); z(t+1)=0.7*y(t); 117. Denne funksjonen tar imot 3 arrayer og plotter dem: function figur(x,y,z) plot(x) hold on plot(y, r ) plot(z, g ) plot(b, k ) leg( x, y, z, b ) 118. Funksjonen variabler tar som inn-parametre a, b, og antall elementer, N, som arrayene skal inneholde. Funksjonen ser tilbake to arrayer x og y. function [a,b,n]= variabler(x,y) x = linspace(0,a,n); y = linspace(0,b,n); 119. Jeg har en fil T.dat som inneholder måledata fra 4 stasjoner med en måling pr. dag i tre mnd(jan,feb,mars). size(t)= 4 90 Jeg har en tilsvare fil, P.dat, med nedbørsdata fra de samme stasjonene og de samme tidspunktene. size(p)= 4 90 Jeg antar at det faller snø hvis temperaturen er lik eller under null. Jeg skal lage et program som beregner snødybden for de 4 stedene jeg antar at snøen blir ligge om temperaturen er under eller lik null, og at alt smelter om temperaturen er over null Virker dette programmet? Hvis ikke, hva gjør jeg feil? load P.dat; load T.dat; sno0=0; for j=1:4 for i=1:90 if T(i)<=0 snodybde(j,i)=p(i)+sno0; sno0=snodybde; else snodybde(j,i)=0; sno0=0; 75
plot(snodybde, r ) load T.dat; load P.dat; sno0=0; for j=1:4 for i=1:90 if T(j,i)<=0 snodybde(j,i)=p(j,i)+sno0; sno0=snodybde(j,i); else snodybde(j,i)=0; sno0=0; plot(snodybde(1,:), r ) hold on plot(snodybde(2,:), g ) plot(snodybde(3,:), b ) plot(snodybde(4,:), k ) 76