Notat 2, ST januar 2005

Like dokumenter
Notat 2, ST Sammensatte uttrykk. 27. januar 2006

Programmering i R. 6. mars 2004

Notat 4 - ST februar 2005

Bioberegninger, ST1301 Onsdag 1. juni 2005 Løsningsforslag

Betinget eksekvering og logiske tester i shell

Programmering i R - del 2

Notat 3 - ST februar 2005

Tall, vektorer og matriser

Matematikk Øvingsoppgaver i numerikk leksjon 4 Løsningsforslag

TDT4110 IT Grunnkurs Høst 2016

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

ST1301 Bioberegninger - Introduksjon

Læringsmål og pensum. if (be): else (not_to_be):

Notat 6 - ST februar 2005

Øving 12, ST1301 A: B:

Løsningsforslag øving 5, ST1301

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF 1000 høsten 2011 Uke september

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2015

Læringsmål og pensum. Oversikt

TDT4110 IT Grunnkurs Høst 2016

Norsk informatikkolympiade runde

Oppsummering fra sist

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

Øvingsforelesning TDT4105 Matlab

løsningsforslag-uke5.txt

Løsningsforslag øving 8, ST1301

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 IT Grunnkurs Høst 2015

Matematikk Øvingsoppgaver i numerikk leksjon 5 Løsningsforslag

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Bioberegninger - notat 4: Mer om sannsynlighetsmaksimering

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

MAT1030 Plenumsregning 1

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

Matematikk Øvingsoppgaver i numerikk leksjon 5 for-løkker

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Ta kontakt i pausen. Viktig at vi kommer i gang med dette arbeidet!

Norsk informatikkolympiade runde

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

Kapittel 1 En oversikt over C-språket

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Oblig 4 Undervisningshefte i grunnleggende JavaScript programmering

MAT1030 Diskret Matematikk

C# (.Net) Tema: Loops (Løkker) Leksjon 7 Kap 18

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger. - 3rd edition: Kapittel 8. Professor Alf Inge Wang

Leksjon 3. Kontrollstrukturer

Python: Strenger 3. utgave: Kapittel 8

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Programmering Høst 2017

TDT4110 Informasjonsteknologi grunnkurs: Tema: Lister og tupler. - 3rd edition: Kapittel 7. Professor Alf Inge Wang

PROGRAMMERING I MAPLE

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Løsningsforslag øving 12, ST1301

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Informasjon Prøveeksamen i IN1000 høsten 2018

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

INF1000 Behandling av tekster

Finne løsninger på ligninger numerisk: Newton-Raphson metoden og Fikspunktiterasjon MAT111, høsten 2017

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

Øvingsforelesning TDT4105 Matlab

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

Høyere-ordens prosedyrer

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

Vær OBS på at svarene på mange av oppgavene kan skrives på flere ulike måter!

JS: Grunnleggende JavaScript

INF-5110 Oppgaver kodegenerering etc. INF-5110, vår 2011

Del 1 En oversikt over C-programmering

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Norsk informatikkolympiade runde

Programmeringsspråket C

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre,

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

Jentetreff INF1000 Debugging i Java

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

MAT1030 Plenumsregning 3

INF1000 : Forelesning 4

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Informasjon Eksamen i IN1000 høsten 2017

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Python: Variable og beregninger, innlesing fra tastatur utskrift til skjerm. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

Excited. Hvordan komme i gang med tekstbasert programmering? Centre for Excellent IT Education. Guttorm Sindre

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Transkript:

Notat 2, ST1301 25. januar 2005 1 Sammensatte uttrykk Vi har sett at funksjoner ikke trenger å bestå av annet enn ett enkeltuttrykk som angir hva funksjonen skal returnere uttrykkt ved de variable funksjonen tar som argument. I mange sammenhenger vil det imidlertid være nødvendig å sette sammen flere uttrykk for å beregne funksjonens utdata. Også i andre sammenhenger (se nedenfor) vil vi ha bruk for såkalte sammensatte uttrykk. Et sammensatt uttrykk kan skrives på en eller flere linjer, f.eks. slik {a <- 3; b <- 2; a*b; a+b eller slik { a <- 3 b <- 2 a*b a+b Hvis flere deluttrykk står på samme linje må disse skilles med tegnet semikolon. Plasseringen av klammeparantesene er ikke vesentlig for annet enn lesbarheten av programkoden (dette kommer vi tilbake til). Verdien av sammensatte uttrykk er lik verdien av siste deluttrykk i det sammensatte uttrykket. Om skriver inn uttrykket ovenfor i R-skallet får vi dermed > {a <- 3; b <- 2; a*b; a+b [1] 5 La oss anta at vi ønsker å lage en funksjon som skal beregne løsningene av en annengradsligning på formen ax 2 + bx + c = 0. (1) 1

Denne har to løsninger på formen x = b + b 2 4ac 2a (2) x = b b 2 4ac, (3) 2a gitt at uttykket under rot-tegnet er positivt. Fordi de samme leddene inngår i begge løsningene kan det være hensiktsmessig å beregne disse først i to tilordningsuttrykk og så beregne de to løsningene. Setter vi disse operasjonene sammen får vi følgende funksjonsdefinisjon. annengradsligning <- function(a,b,c) { ledd1 <- -b/(2*a) ledd2 <- sqrt(b^2-4*a*c)/(2*a) c(ledd1-ledd2,ledd1+ledd2) Merk at det siste uttrykket (som returneres som funksjonsverdi) her består av et kall til funksjonene c som setter sammen en vektor bestående av verdien til til to løsningene av annengradsligningen. Tester vi funksjonen får vi > annengradsligning(1,-3,2) [1] 1 2 som er riktig fordi x 2 3x + 2 = (x 2)(x 1). 2 If-setninger If-setninger får vi bruk for når de uttrykk vi ønsker å utføre avhenger av verdien på andre variable. I eksempelet over kan det tenkes at annengradsligningen (for gitte argument) også kan ha én eller ingen løsninger. Dette vil avhenge av verdien av uttrykket under rot-tegnet. Generellt har en if-setning syntaxen eller bare if (logisk uttrykk) gren 1 else gren 2 if (logisk uttrykk) gren 1 2

hvor logisk uttrykk er et uttrykk med verdi av logisk datatype (verdi lik TRUE eller FALSE). gren 1 er et uttrykk som utføres hvis det logiske uttrykket har verdien TRUE, hvis ikke utføres gren 2. Alle uttrykk som inngår i if-setningen kan være sammensatte. Hele if-setningen er i seg selv å betrakte som et uttrykk som får verdi lik verdien av gren 1 eller gren 2. Merk også at hver gren selv kan være egne if-setninger (if-setninger kan være nøstede). Gjør vi følgende > if (3>2) z <- "sant" else z <- "usant" > z [1] "sant" utføres tilordningsuttrykket z <- "sant" fordi det logiske uttrykket 3>2 har verdi TRUE. Bruker vi vanlige uttrykk og ikke tilordningsuttrykk i hver gren vil i stedet hele if-setningen få verdi lik uttrykket i den grenen som blir utført: > if (3>2) "sant" else "usant" [1] "sant" Derfor kan hele if-setningen brukes på høyre side i tilordningsuttrykk: > z <- if (3>2) "sant" else "usant" > z [1] "sant" La oss skrive om funksjonen annengradsligning slik at denne fungerer også når uttrykket under rot-tegnet er null eller negativt. Dette kan vi gjøre ved først å beregne verdien av uttrykket under rot-tegnet og så spesifisere uttrykk for løsningene i forskjellige situasjoner som grener i en if-setning. annengradsligning <- function(a,b,c) { rot.uttrykk <- b^2-4*a*c if (rot.uttrykk < 0) # Negativt rotuttrykk NULL # Ingen reelle løsninger else { # Rotuttrykk lik null eller positivt ledd1 <- -b/(2*a) # ledd1 trengs i begge undergrener if (rot.uttrykk > 0) { # Positivt rotuttrykk ledd2 <- sqrt(rot.uttrykk)/(2*a) c(ledd1-ledd2,ledd1+ledd2) # To løsninger else # Rotuttrykk må være lik null ledd1 # Én reell løsning (lik ledd1) 3

Her bruker vi en nøstet if-setning for å håndtere de tre tilfellene hvor uttrykket under rot-tegnet er henholdsvis mindre, større, eller lik 0. Merk bruken av sammensatte uttrykk og at ledd1 og ledd2 bare beregnes i de grener av if-setningen hvor de trengs i senere uttrykk. NULL gir oss en vektor av lengde null. Merk også bruken av innrykk for å markere ulike blokker av koden (hele funsksjonskroppen, og de nøstede if-grenene. Ved design av funksjoner som utfører ulike operasjoner for ulik verdier av innargumentene (betingede funksjoner) vil designplanen se ut som som i tabell 1. Fase Mål Aktivitet Dataanalyse Identifisere distinkte Lete i oppgaveteksten etter distinkte situasjoner. situasjoner som funksjonen må håndtere Eksempler Lage eksempler for hver distinkt situasjon Kropp Å definere funksjonen Her kan det være spesielt viktig å se på unntakssituasjoner eller situasjoner på grensen mellom to intervaller. Skrive ned skjelettet av en if-setning eller en nøstet if-setning hvor hver ifgren svarer til hver distinkt situasjon. Utvikle uttrykk for de situasjoner som skal håndteres i hver gren av ifuttrykket. Tabell 1: Utvidelser av designplanen for betingede funksjoner. 3 For-løkker Vi har sett at ulike aritmetiske operasjoner og de fleste funkjoner kan virke elementvis på vektorer slik at vi i realiteten kan utføre mange regneoperasjoner ved hjelp av ett uttrykk. Noen operasjoner er imidlertid genuint iterative og i slike tilfeller er det helt nødvendig å bruke såkalte løkker. Vi vil også bruke løkker i en del tilfeller hvor løkkebruk ikke er strengt tatt nødvendig men hvor bruk av løkker er enklere å forstå. I tillegg til for-løkker som vil bli introdusert nedenfor har vi også while-løkker og repeat-løkker i R (se Dalgaard, 2002) En for-løkke har syntaxen for (løkkevariabel in vektor) kropp 4

hvor vektor er et uttrykk med verdi av datatypen vektor, løkkevariabel er navnet vi velger på en variabel som ved gjentatt utførelse av kropp vil ta verdier fortløpende fra elementene i vektor. For-løkkens kropp kan være et uttrykk av en hvilken som helst type (sammensatt uttrykk eller tilordningsuttrykk) hvor løkkevariabel gjerne inngår. Her er et eksempel: > for (i in 1:5) x[i] <- i^2 > x [1] 1 4 9 16 25 Tilordningsuttrykket x[i] <- i^2 (løkkekroppen) vil her utføres fem ganger; ved hver enkeltutførelse tar løkkevariabelen i verdier hentet fra verdien av uttrykket 1:5 som jo blir en vektor med elementer lik 1, 2,..., 5. Resultatet blir at kvadratet av heltallene fra 1 til 5 blir tilordnet til de fem første elementene i vektor x. En teknikalitet vi bør merke oss er at variablen x allerede må eksistere hvis vi ønsker å gjøre tilordning til enkeltelementer av x (ved bruk av indeksering), hvis ikke får vi en feilmelding. > x[1] <- 1 Error: Object "x" not found Et tomt men eksisterende objekt kan vi opprette slik > x <- NULL > x[1] <- 1 > x[2] <- 2 Dette ligner på deklarering i av variable i andre programmeringsspråk som C og Pascal. Vi kan og merke oss at vi kunne ha oppnådd samme resultat som over uten bruk av for-løkke ved å skrive > x <- (1:5)^2 > x [1] 1 4 9 16 25 La oss se på et eksempel hvor de operasjoner vi må utføre er genuint iterative. I økologi brukes den logistiske modellen ofte som modell for hvordan en populasjon endrer seg i størrelse fra år til år. Denne modellen (se Neuhauser, 2004, side 104) kan skrives på formen ( N t = N t R 1 N ) t, (4) K 5

eller, etter litt omskriving, N t+1 = N t [1 + R ( 1 N )] t. (5) K R er her en parameter som angir vekstraten til populasjonen; vi ser fra ligning (4) at N t = 0 for R = 0 men populasjonen vil vokse for positive R og N t < K. Dersom N K og R = 1 vil populasjonen dobles i størrelse hvert år ( N t N t R = N t ). La oss lage en funksjon som beregner N t fra t = 2 opptil t = 10 gitt N 1, vekstraten R, og bærekapasiteten K. Vi følger designplanen. # logistisk : flyttall, flyttall, flytall -> vektor # # Hensikt: Beregne utviklingen i populasjonsstørrelse N gitt N ved # t=1, bæreevne, og vektsrate. # # Eksempeler: # logistisk(r=1,k=1000,n1=1) skal returnere tilnærmet 1,2,4,8,16 # o.s.v. siden vi er langt under bæreevnen K=1000 # logistisk <- function(r,k,n1) { N <- N1 for (t in 2:10) N[t] <- N[t-1]*(1+R*(1-N[t-1]/K)) N # Tester: logistisk(1,1000,1) logistisk(1,10,1) plot(logistisk(1,10,1)) Ved vær utførelse av løkke-kroppen vil nå vektoren N utvides med ett element i posisjon t. Igjen må variabelen N eksistere før vi kan tilordne enkeltelementer. I og med initialbetingelsen N 1 = 1 gir det seg selv at N må tilordnes N1 i første linje. Testing av funksjonen viser at den fungerer som forventet; dersom N K vil populasjonsstørrelsen tilnærmet dobles de første årene dersom R = 1. Plotting av populasjonsutviklingen kan gjøres på følgende måte: plot(1:10,logistisk(1,10,1),xlab="tid t", ylab="populasjonsstoerrelse N",type="l") 6

Populasjonsstoerrelse N 2 4 6 8 10 2 4 6 8 10 Tid t Figur 1: Populasjonsutvikling til populasjon med bæreevne K=10, R = 1 og N 1 = 1 Se hjelpesidene til plot.default for mer informasjon. Selv om (5) ser ut som en enkel modell er det ikke mulig å uttrykke N t ved N 1, R, og K på noen enkel måte vi er nødt til å beregne løsningen iterativt numerisk. Referanser Dalgaard, P., 2002. Introductory Statistics with R. Springer Verlag, New York. Neuhauser, C., 2004. Calculus for Biology and Medicine. Pearson Education. 7