# Løsnings-scripts til "Noter om R" version 6.0 (2010-11-25) # Opgave 2 # delopgave (1) f <- function(x) { x^2 + 3*x - 7 } f(1) f(7) # delopgave (2) f <- function(x) { 2*x^2 + 3*x - 7 } f(1) f(7) # delopgave (3) g <- function(x) { 4*x^2 - 2*x + 3 } g(1) g(7) # delopgave (4) h <- function(x) { x^3 + 2*x^2 + 3*x - 7 } h(1) h(7) # Opgave 3 f <- function(x) { 3*exp(-2*(x-1)^2) } f(-1) f(0) f(1) # Opgave 4 # delopgave (1) f <- function(x) { 2*cos(x/2)+x } f(-1) f(0) f(1) # delopgave (2) plot(f, -10, 10) # delopgave (3) plot(f, -20, 20, main="Funktionen f", xlab="x", ylab="y", col="blue") # Opgave 5 f <- function(x) { x^a } f(2) # Giver fejl: Error in f(2) : object "a" not found a<-3 f(2) f(-2) a<-0.5 f(2) # Giver kvadratrod 2 f(-2) # Giver NaN fordi kvadratroden af et negativt tal ikke er defineret # Opgave 6 # delopgave (1) f <- function(x) { x^3+4*x^2-17 } f(1) f(-8/3) f(-4) # delopgave (2) plot(f, -5, 5) plot(f, -3, 2) # delopgave (3) uniroot(f, c(1,2)) # Opgave 7 f <- function(x) { -2*x^3 + 6*x^2 - 5 } plot(f, -5, 5) plot(f, -2, 4) uniroot(f, c(-2,0)) $ root uniroot(f, c(0,2)) $ root uniroot(f, c(2,4)) $ root # Opgave 8 f <- function(x) { x^2 - 4*sin(3*x) - 1 } plot(f, -5, 5) uniroot(f, c(-2,-1.5)) $ root uniroot(f, c(-1.5,-0.5)) $ root uniroot(f, c(-0.5,0.5)) $ root uniroot(f, c(0.5,2)) $ root # Opgave 9 g <- function(x) { 0.6*exp(-x^2) } h <- function(x) { 1 - g(x+2) } plot(g,-5,5) # Dette og det næste plot er til for at finde y-intervallet plot(h,-5,5) # Nu kommer det rigtige plot: plot(g,-5,5,ylim=c(0,1),col="red",ylab="y") plot(h,-5,5,col="blue",add=TRUE) # Opgave 10 f <- function(x) { a^(b-x) } a <- 0.8 b <- 1 plot(f, 0, 5, ylim=c(0,5), col="red") a <- 0.7 plot(f, 0, 5, col="blue", add=TRUE) a <- 0.75 b <- 4 plot(f ,0 ,5 ,col="green", add=TRUE) # Tekster: text(4.5, 2.5, "a=0.8, b=1", col="red") text(4, 4, "a=0.7, b=1", col="blue") text(4.5, 0.75, "a=0.75, b=4", col="green") # Plottet vist i opgaven har denne titel: title(main="Tre udgaver af f(x)") # Opgave 11 # Den nemme udgave, da exp er en indbygget funktion: integrate(exp, 1, 5) # Mere generel form, med anonym funktion: integrate(function(x) { exp(x) }, 1, 5) # Det samme, men med separat definition af funktionen: f <- function(x) { exp(x) } integrate(f, 1, 5) # Opgave 12 # delopgave (1) T <- function(t) { 8 + 8*sin(2*pi/365*t) } plot(T, 0, 365) # delopgave (2) Graddage <- function(t2) { integrate(T, 0, t2) $ value } Graddage(10) # Følgende er ikke en del af opgaven men medtages her for at vise hvordan # Graddage kan komme til at fungere på en vektor af værdier t2 og dermed # kan blive tegnet med plot: Graddage <- function(t2){ sapply(t2, function(t){ integrate(T,0,t) $ value }) } plot(Graddage, 0, 365) # delopgave (3) f <- function(t2) { Graddage(t2) - 350 } uniroot(f, c(0,100)) # Opgave 13 # delopgave (1) v <- function(t) { (1.1 + 3.5*t)*exp(-1.5*t) } plot(v, 0, 3, xlab="t", ylab="v") # delopgave (2) integrate(v, 0, Inf) # 2.288889 # Opgave 14 # delopgave (2) data <- read.table("reaktion.txt", dec=",", header=TRUE) summary(data) # delopgave (3) plot(data$Tid, data$S2) # delopgave (4) plot(data$Tid, sqrt(data$S1)) f <- function(t) { 2.66 - 0.025*t } plot(f, 2, 100, add=TRUE) # delopgave (5) plot(data$Tid, log(data$S1)) g <- function(t) { 2.3 - 0.04*t } plot(g, 2, 100, add=TRUE) # Opgave 15 # delopgave (2) data <- read.table("Grise2Fast.txt", dec=",", header=TRUE) summary(data) # delopgave (3) plot(data$Tid, data$Kontrol, col="red", ylim=c(5.31,6.45), xlab="Minutter", ylab="pH") points(data$Tid, data$Vaekst, col="blue") # delopgave (4) legend(800, 6.4, c("Kontrolgruppe", "Væksthormon"), col=c("red","blue"), pch=1) # Opgave 16 # delopgave (1) flueaeg <- read.table("flueaeg.txt", header=TRUE) # delopgave (2) plot(flueaeg$L, flueaeg$U) # delopgave (3) lreg <- lm(flueaeg$U~flueaeg$L) lreg # delopgave (4) abline(lreg) # Opgave 17 # delopgave (1) andemad <- read.table("andemad.txt", header=TRUE) # delopgave (2) plot(andemad$t, log(andemad$N)) # delopgave (3) andemad$logN <- log(andemad$N) # Alternativt: logN <- log(andemad$N) lreg <- lm(andemad$logN~andemad$t) lreg # b = exp(4.4555) = 86.09522, r = 0.3486 # delopgave (4) abline(lreg) # delopgave (5) f <- function(t) { 86.09522*exp(0.3486*t) } plot(andemad$t, andemad$N) plot(f, 0, 13, add=TRUE) # Opgave 18 # delopgave (1) stofskifte <- read.table("stofskifte.txt", header=TRUE) # delopgave (2) stofskifte$logK <- log(stofskifte$K) # Alternativt: logK <- log(stofskifte$K) stofskifte$logS <- log(stofskifte$S) # Alternativt: logS <- log(stofskifte$S) lreg <- lm(stofskifte$logS~stofskifte$logK) # Alternativt: logS~LogK lreg # b = exp(-0.9365) = 0.3920062, a = 0.7509 # delopgave (3) plot(stofskifte$logK, stofskifte$logS) abline(lreg) # delopgave (4) f <- function(K) { 0.3920062*K^0.7509 } plot(stofskifte$K, stofskifte$S) plot(f, 0, 50, add=TRUE) # Opgave 19 # delopgave (2) data <- read.table("powerdata.csv", sep=",", header=TRUE) summary(data) # delopgave (3) plot(data$N, data$TidA, col="red", ylim=c(0,6626.8), xlab="N", ylab="Tid") points(data$N, data$TidB, col="blue") # delopgave (4) lreg <- lm(data$TidA~data$N) plot(data$N, data$TidA) abline(lreg) # delopgave (5) data$logN <- log(data$N) # Alternativt: logN <- log(data$N) data$logA <- log(data$TidA) # Alternativt: logA <- log(data$TidA) data$logB <- log(data$TidB) # Alternativt: logB <- log(data$TidB) plot(data$logN, data$logA, col="red", ylim=c(-1.204,8.799), xlab="ln(N)", ylab="ln(Tid)") points(data$logN, data$logB, col="blue") # delopgave (6) lregA <- lm(data$logA ~ data$logN) lregB <- lm(data$logB ~ data$logN) abline(lregA, col="red") abline(lregB, col="blue") # delopgave (7) legend(5.5, 8, c("Data A","Data B","Regression A","Regression B"), col=c("red","blue","red","blue"), pch=c(1,1,-1,-1), lty=c("blank","blank","solid","solid")) # Opgave 20 # delopgave (1) seq(1, 10) seq(10, 1) seq(0.25, 5, by=0.25) seq(1, 29, by=2) # delopgave (2) 1:10 -1:-10 # Eller: -(1:10) 6.4:19.4 # Opgave 21 # delopgave (1) seq(0.1, 1, by=0.1) seq(5, 100, by=5) seq(1.5, 9.5) seq(100, 0, by=-10) # delopgave (2) (1:10)/10 (1:20)*5 1.5:9.5 # Eller: (1:9)+0.5 (10:0)*10 # Opgave 22 (10:1)^2 (1:10)-(1:2) # Her anvendes gentagereglen... (1:10)+(1:5) # Her anvendes gentagereglen... (1:9)*(-1:1) # Her anvendes gentagereglen... (1:10)^(2:1) # Her anvendes gentagereglen... # Opgave 23 # delopgave (1) A <- matrix(c(1, 5, 2, 3), 2) B <- matrix(c(4, 7, 6, 8), 2) # delopgave (2) A%*%B B%*%A # Opgave 24 # delopgave (1) solve(matrix(c(1, 9, 7, 13), 2)) # delopgave (2) solve(matrix(c(1, 9, 7, 13), 2), c(3, -2)) # Opgave 25 # delopgave (1) A <- matrix(1:20, 4) # delopgave (2) A[1, 3] # række 1, søjle 3 A[4, 2] # række 4, søjle 2 A[3,] # hele 3. række A[, 4] # hele 4. søjle A[, 1:3] # tre første søjler A[3:4,] # hele række 3 og 4 A[3:4, 4:5] # to sidste rækker og søjler A[, c(1, 2, 4, 5)] # alle søjler undt. 3. A[, -3] # samme, alternativ måde # Opgave 26 # delopgave (1) A <- matrix(c(0.2, 0.9, 0.8, 0.15), 2) v0 <- c(100, 0) v1 <- A%*%v0 v2 <- A%*%v1 v3 <- A%*%v2 v4 <- A%*%v3 v5 <- A%*%v4 V <- cbind(v0, v1, v2, v3, v4, v5) # delopgave (2) # Det er ikke eksplicit krævet i opgaven, men man er nødt til at angive # ylim for ikke at skære datapunkter i anden serie væk. # De tomme aksetekster er angivet fordi de automatisk valgte ser bøvede ud. plot(0:5, V[1,], type="o", col="red", ylim=c(0, 100), xlab="", ylab="") points(0:5, V[2,], type="o", col="blue") # Opgave 27 plot(sin, -5, 5, axes=FALSE) axis(1, pos=0, at=-5:5) axis(2, pos=0, at=c(-4:-1, 1:4)/4) # Tricky at undgå mærke for y=0 ... # Opgave 28 # delopgave (1) M <- matrix(c(0.2, 0.9, 0.8, 0.0), 2) q <- c(10, 0) v0 <- c(100, 0) # Initialisering: v <- v0 V <- matrix(v0, 2) # Fremskrivninger: for(i in 1:20) { v <- M%*%v + q ; V <- cbind(V, v) } # Vis resultatet: V # delopgave (2) # Det er ikke eksplicit krævet i opgaven, men man er nødt til at angive # ylim for ikke at skære datapunkter i anden serie væk. # De tomme aksetekster er angivet fordi de automatisk valgte ser bøvede ud. plot(0:20, V[1,], type="o", col="red", xlab="", ylab="", ylim=c(0, 100)) points(0:20, V[2,], type="o", col="blue") # Opgave 29 # delopgave (1) M <- matrix(c(0.7, 0.15, 0.2, 0.45), 2) q <- c(0, 900) v1992 <- c(500, 1400) # Initialisering: v <- v1992 V <- matrix(v1992, 2) # Fremskrivninger: for(i in 1993:2023) { v <- M%*%v + q ; V <- cbind(V, v) } # Vis resultat: V # delopgave (2) plot(1992:2023, V[1,], pch=1, type="o", xlab="år", ylab="bestand", ylim=c(0, 2000)) points(1992:2023, V[2,], pch=2, type="o", lty="dashed") title(main="Udvikling af fårebestand") legend(2010, 750, c("Klasse I", "Klasse II"), pch=1:2, lty=c("solid", "dashed")) # Opgave 30 u <- rep(3, 10) for (i in 2:10) { u[i] <- u[i-1]+i } u # Viser resultatet v <- rep(1, 10) for (i in 2:10) { v[i] <- i-2*v[i-1] } v # Viser resultatet w <- rep(10, 10) for (i in 3:10) { w[i] <- w[i-2]-w[i-1] } w # Viser resultatet z <- rep(1, 10) for (i in seq(3, 9, by=2)) { z[i] <- z[i-2]+i^2 } for (i in seq(2, 10, by=2)) { z[i] <- z[i-1]+3 } z # Viser resultatet # Opgave 31 v <- 1:10 for (i in 1:5) { h <- v[i] ; v[i] <- v[11-i] ; v[11-i] <- h } v # Viser resultatet # Opgave 32 # delopgave (1) # Initialisering x <- 0 y <- 0 X <- rep(0, 100) Y <- rep(0, 100) # Simulation af 100 trin for ( t in 1:100 ) { v <- runif(1, 0, 2*pi) d <- runif(1, 0 , 1) x <- x + cos(v) y <- y + sin(v) X[t] <- x Y[t] <- y } # delopgave (2) plot(c(0, X), c(0, Y), asp=1, type="l", xlab="x", ylab="y") points(0, 0) points(x, y, pch=16) # Opgave 33 negativ <- function(x) { x<0 } negativ(-2:2) lille <- function(x) { x<10 } lille(8:12) stort <- function(x) { x>100 } stort(98:102) mellem <- function(x) { x>=10 & x<=100 } mellem(8:12) mellem(98:102) # Opgave 34 num <- function(a) { if (a>0) a else -a } num(3) num(-3) # Opgave 35 # delopgave (1) y <- function(t) { if (t<15) 7*t/15+3 else 10 } y(0) y(6) y(15) y(16) # delopgave (2) y <- function(t) { ifelse(t<15, 7*t/15+3, 10) } plot(y, 0 , 20, xlab="t", ylab="y(t)") # Opgave 36 fortegn <- function(x) { if (x < 0) -1 else if (x == 0) 0 else 1 } fortegn(3) fortegn(0) fortegn(-3) # Opgave 37 x <- runif(100) sum(x<0.1) # Forventet: 10 sum(0.250) # Forventet: 78 # Opgave 38 data <- read.table("reaktion.txt", header=TRUE, dec=",") data1 <- subset(data, Tid<=50) nrow(data1) data2 <- subset(data, S2>S1) nrow(data2) data3 <- subset(data, abs(S2-S1)<0.1) nrow(data3) data4 <- subset(data, 2<=S3 & S3<=6) nrow(data4) # Opgave 40 midt <- function(a,b,c) { if (a > b) { if (a < c) a else { if (c > b) c else b } } else { if (a > c) a else { if (c < b) c else b } } } # alternativ, mindre effektiv men mere kompakt udgave: midt <- function(a,b,c) { if ( (a >= b && b >= c) || (a <= b && b <= c) ) b else if ( (a >= c && c >= b) || (a <= c && c <= b) ) c else a } # afprøvning: midt(1,2,3) midt(1,3,2) midt(2,1,3) midt(2,3,1) midt(3,1,2) midt(3,2,1) # Opgave 41 # delopgave (2) fib <- function(n) { if (n <= 2) 1 else fib(n-1)+fib(n-2) } # delopgave (3) sfd <- function(a,b) { if (b==0) a else sfd(b, a %% b) } # Afprøvning: sfd(34, 119) sfd(12, 20) sfd(53, 1016) # Opgave 42 # delopgave (1) til0 <- function(a) { if (a<0) c(a,til0(a+1)) else 0 } # Afprøvning: til0(-4) # delopgave (2) # Den foretrukne løsning: med0 <- function(a) { if (a<0) c(a,med0(a+1)) else if (a>0) c(med0(a-1),a) else 0 } # Afprøvning: med0(8) med0(-4) # Alternativ løsning der benytter fra0 og til0: med0 <- function(a) { if (a>0) fra0(a) else til0(a) } # Så er man også nødt til at indtaste fra0 fra opgaven: fra0 <- function(a) { if (a>0) c(fra0(a-1),a) else 0 } # Opgave 43 n <- 1 while (n^2 <= 500) { n <- n+1 } n # vis resultatet sqrt(500) # kontrol # Opgave 44 n <- 0 s <- 0 while (s < 10) { n <- n+1 ; s <- s+1/n } n # vis resultatet # Opgave 46 # delopgave (1) terning <- function(n) { floor(runif(n,1,7)) } terning(1) terning(10) terning(10) # Tjek af at vi ikke får det samme igen # delopgave (2) antalslag <- function() { n <- 1 # Vi slår mindst 1 slag. while ( sum(terning(2)) != 2 ) { n <- n+1 } n # Efter løkken er antallet af slag optalt i variabel n } # Afprøvning: antalslag() antalslag() # delopgave (3) x <- replicate(1000, antalslag()) summary(x) hist(x, plot=TRUE) # Opgave 47 # delopgave (1) x <- 0 antal <- 0 while ( x>-5 & x<5 ) { x <- x + runif(1, -1, 1) antal <- antal + 1 } # Undersøgelse af hvad x og antal er blevet efter løkken: x antal # delopgave (2) antaltrin <- function () { x <- 0 antal <- 0 while ( x>-5 & x<5 ) { x <- x + runif(1, -1, 1) antal <- antal + 1 } antal # Returværdi } # Afprøvning: antaltrin() antaltrin() # delopgave (3) a <- replicate(1000, antaltrin()) summary(a) hist(a, plot=TRUE, breaks=50)