BYFE/EMFE 1000, 2012/2013 Numerikkoppgaver uke 33 Oppgave 2 Litt aritmetikk a) Her har vi skrevet ut det som kommer opp i Octave-vinduet når vi utfører operasjonene. octave-3.2.4.exe:9> 2+2 4 octave-3.2.4.exe:10> 3-2 1 octave-3.2.4.exe:11> 3*2 6 octave-3.2.4.exe:12> 6^2 36 octave-3.2.4.exe:13> 6/2 3 Vi kan gjerne utføre kompliserte og styggere utregninger også: octave-3.2.4.exe:14> 3^2.12*(2+4*(-3.1))/(2^2-1) -35.597 b) octave-3.2.4.exe:23> 1/0 warning: division by zero Inf octave-3.2.4.exe:24> 0^0 1 octave-3.2.4.exe:25> 5/Inf 0 octave-3.2.4.exe:26> 0*Inf NaN octave-3.2.4.exe:27> Inf/Inf NaN octave-3.2.4.exe:28> 10^999 Inf octave-3.2.4.exe:29> 1.2e4 12000 1
octave-3.2.4.exe:30> NaN+1 NaN Vi ser at Octave tolker 1/0 som uendelig. Matematisk gir ikke uttrykket 1/0 noen mening. Vi kan si noe om hva 1/x næremer seg når x næremer seg 0, men utrykket kan like gjerne gå mot minus uendelig som uendelig. Hvilken verdi vi skal gi til 0 0 er et denisjonsspørsmål; man kan både argumentere for at det skal være 0 og for at det skal være 1. Octave har tydeligvis valgt den siste varianten. At 5/Inf blir gitt verdien 0, virker jo rimelig; selv om 5/ ikke er denert, vil 5 delt på et veldig stort tall bli et veldig lite tall. Det virker også rimelig at hverken 0 eller / blir gitt noen verdi; disse uttrykken gir ikke mening matematisk. Derimot er det ikke rimelig å si at 10 999 er det samme som uendelig. Men det sier seg selv at der må være en øvre grense for hvor store tall datamaskninen kan regne med. At et udenert tall pluss én forblir et udenert tall er i grunn ganske opplagt. c) octave-3.2.4.exe:31> pi 3.1416 octave-3.2.4.exe:32> e 2.7183 octave-3.2.4.exe:33> i 0 + 1i octave-3.2.4.exe:34> eps 2.2204e-016 Det bør her legges til at Octave opererer med en langt mer nøyaktig verdi av π enn det antall desimaler tilsier her (og tilsvarende for Eulers tall e). Bare et visst antall desimaler blir skrevet til skjermen. Vi kan endre formatet til det som skrives til skjer. Om vi gjør det, kan vi få opp ere desimaler: octave-3.2.4.exe:94> format long octave-3.2.4.exe:95> pi 3.14159265358979 Oppgave 3 Tilordning a) Slik vil det se ut når vi sier at variabelen x skal ha verdien 7: octave-3.2.4.exe:37> x=7 x = 7 Merk at vi nå i tillegg til selve tilordninga også har sagt at der skal vere ein variabel som heiter x. Vi seier at vi har initiert variabelen. Resultatene av reknestykkene blir: 2
octave-3.2.4.exe:101> x=7 x = 7 octave-3.2.4.exe:102> x*2 14 octave-3.2.4.exe:103> x^2 49 octave-3.2.4.exe:104> y=2 y = 2 octave-3.2.4.exe:105> x/y 3.5000 Dette skjer om vi skriver 'who': octave-3.2.4.exe:55> who Variables in the current scope: ans x y b) Symbolet '=' betyr ikke helt det samme i Octave-sammenheng som det gjør i matematisk notasjon; her er likhetstegnet brukt som tilordning; altså for å gi en variabel en verdi. Derfor vil følgende gi mening i Octave: octave-3.2.4.exe:58> x=2 x = 2 octave-3.2.4.exe:59> x=x+1 x = 3 Vi ser at den siste kommandoen la én til variabelen x og tilordna svaret tilbake til x; den gamle x var 2 og den nye x ble 3. Matematisk er den siste linja meningsløs siden den gir at 0 = 1 om vi forsøker å løse den som en ligning. Om vi ønsker å uttrykke likhet, ikke tilordning, i Octave, skriver vi '==' - altså et dobbelt likhetstegn. Dette skal vi komme tilbake til senere. c) octave-3.2.4.exe:61> e 2.7183 octave-3.2.4.exe:62> e=10 e = 10 Vi ser at e, som hadde verdien av Eulers tall, nå har fått verdien 10. Tilsvarende skjer også med pi og i. Vi ser at våre tilordninger overstyrer de som Octave måtte ha fra før. 3
Oppgave 4 Vektorer a) Variablene i Octave kan være tall, vektorer eller matriser. Vi kan for eksempel gi vektoren x = [1, 0, 3] på denne måten: octave-3.2.4.exe:63> x=[1, 0, -3] x = 1 0-3 octave-3.2.4.exe:64> x(2) 0 Vi ser at om vi avslutter en kommandolinje med semikolon, vil ikke noe bli skrevet til skjerm. Det betyr ikke at kommandoen ikke har blitt utført. b) octave-3.2.4.exe:65> x^2 error: for A^b, A must be square Vi ser at Octave nekter å regne ut x 2. Og det er ikke så rart; operasjonen er ikke denert. Octave tolker det som en matrise-opersjon, og gitt at x er en vektor, er ikke dette en meningsful multiplikasjon. Om vi tar med punktum foran potens-sybolet, derimot, tolker Octave det som at man skal kvadrere elementvis: octave-3.2.4.exe:66> x.^2 1 0 9 c) 1:5 gir som svar 1 2 3 4 5. Tilsvarende kan heltallene fra og med -3 til og med 3 skrives slik: -3:3. En vektor bestående av tallene 0, 0.25, 0.5,..., 1.75, 2 kan uttrykkes slik: 0:.25:2 (.25 betyr det samme som 0.25). d) Vektoren y kan tilordnes slik: octave-3.2.4.exe:70> y=2:2:10 y = 2 4 6 8 10 Kommandoen fliplr vil snu rekkefølgen elementene kommer i: octave-3.2.4.exe:71> fliplr(y) 10 8 6 4 2 4
help-funksjonen er som sagt nyttig. Den forklarer hva en Octave-funksjon gjør gjerne også med bruk av eksempler. Den angir også andre funskjoner som ligner. For fliplr får vi opp dette: `fliplr' is a function from the file C:\Octave\3.2.4_gcc-4.4.0\share\octave\3.2. 4\m\general\fliplr.m -- Function File: fliplr (X) Return a copy of X with the order of the columns reversed. example, For fliplr ([1, 2; 3, 4]) => 2 1 4 3 Note that `fliplr' only work with 2-D arrays. use `flipdim' instead. To flip N-d arrays See also: flipud, flipdim, rot90, rotdim Additional help for built-in functions and operators is available in the on-line version of the manual. Use the command `doc <topic>' to search the manual index. Help and information about Octave is also available on the WWW at http://www.octave.org and via the help@octave.org mailing list. lines 1-24/24 (END) -- (f)orward, (b)ack, (q)uit e) Tilordning: octave-3.2.4.exe:74> Vektor=[9 pi -2 100 8] Vektor = 9.0000 3.1416-2.0000 100.0000 8.0000 Sortering heter sort på engelsk. Så vi ser etter ei rutine som sorterer: octave-3.2.4.exe:75> lookfor sort sort issorted sortrows Tre tre. Vi forsøker å nne ut mer om sort-funksjonen. help sort gir: 5
`sort' is a built-in function -- Loadable Function: [S, I] = sort (X) -- Loadable Function: [S, I] = sort (X, DIM) -- Loadable Function: [S, I] = sort (X, MODE) -- Loadable Function: [S, I] = sort (X, DIM, MODE) Return a copy of X with the elements arranged in increasing order. For matrices, `sort' orders the elements in each column. For example, sort ([1, 2; 2, 3; 3, 1]) => 1 1 2 2 3 3 The `sort' function may also be used to produce a matrix containing the original row indices of the elements in the sorted matrix. For example, [s, i] = sort ([1, 2; 2, 3; 3, 1]) => s = 1 1 2 2 3 3 => i = 1 3 2 1 3 2 If the optional argument DIM is given, then the matrix is sorted along the dimension defined by DIM. The optional argument `mode' defines the order in which the values will be sorted. Valid values of `mode' are `ascend' or `descend'. For equal elements, the indices are such that the equal elements are listed in the order that appeared in the original list. The `sort' function may also be used to sort strings and cell arrays of strings, in which case the dictionary order of the strings is used. The algorithm used in `sort' is optimized for the sorting of partially ordered lists. Additional help for built-in functions and operators is available in the on-line version of the manual. Use the command `doc <topic>' to search the manual index. 6
Additional help for built-in functions and operators is available in the on-line version of the manual. Use the command `doc <topic>' to search the manual index. Help and information about Octave is also available on the WWW at http://www.octave.org and via the help@octave.org mailing list. lines 28-51/51 (END) -- (f)orward, (b)ack, (q)uit Vi kan gå fram på same måte for å nne ei summeringsrutine. Summere heiter sum på engelsk: octave-3.2.4.exe:78> lookfor sum cumsum sum sumsq md5sum spcumsum spsum spsumsq summer sum-funksjonen gjør jobben: octave-3.2.4.exe:87> sum(vektor) 118.14 Oppgave 5 Litt mer om multiplikasjon a) Vi kan for eksempel velge at Vek1 og Vek2 skal være slik: octave-3.2.4.exe:88> Vek1=5:(-1):3 Vek1 = 5 4 3 octave-3.2.4.exe:89> Vek2=[7, -3, 1] Vek2 = 7-3 1 b) Akkurat som i oppg. 4 b) får vi ei feilmelding når vi skriver Vek1*Vek2: octave-3.2.4.exe:3> Vek1*Vek2 error: operator *: nonconformant arguments (op1 is 1x3, op2 is 1x3) 7
Med punktum-skrivemåten, derimot, blir vektorene multiplisert elementvis: octave-3.2.4.exe:3> Vek1.*Vek2 35-12 3 c) Apostroen gjør at svaret du får ut, er den samme vektoren men som ei søyle i stedet for ei rekke: octave-3.2.4.exe:90> Vek1' 5 4 3 d) Vi får følgende resultat: octave-3.2.4.exe:91> Vek1*Vek2 error: operator *: nonconformant arguments (op1 is 1x3, op2 is 1x3) octave-3.2.4.exe:91> Vek1*Vek2' 26 octave-3.2.4.exe:92> Vek1'*Vek2 35-15 5 28-12 4 21-9 3 octave-3.2.4.exe:93> Vek1'*Vek2' error: operator *: nonconformant arguments (op1 is 3x1, op2 is 3x1) Svarene vi får her, blir forståelige når vi har lært om matrisemultiplikasjon. (Resultatet av mulitplikasjonen Vek1*Vek2' blir det velkjente skalarproduktet av vektorene, mens resultatet av multiplikasjonen Vek1'*Vek2 blir ei 3 3-matrise.) 8