Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Lezione 1
> runif(10) #runif estrae numeri casuali tra 0 e 1 da una distribuzione uniforme
> # Vettori
> # l'operatore c() sta per concatenate
> v <- c(1,2,33)
> str(v)
num [1:3] 1 2 33
#T (VERO) in ordine per righe – (numero maggiore di 0); F (FALSO) in ordine per colonne
>A
[,1] [,2] [,3]
[1,] -2 3 4
[2,] -3 2 4
[3,] 0 1 1
> A <- matrix(c(-2,3,4,-3,2,4,0,1,1),3,3,byrow=F)
>A
[,1] [,2] [,3]
[1,] -2 -3 0
[2,] 3 2 1
[3,] 4 4 1
> A <- matrix(c(-2,3,4,-3,2,4,ciao,1,1),3,3,byrow=F)
DETERMINANTE
> det(A)
[1] 1
.MEDIA
> mean(A)
[1] 1.111111
Lezione 2
> runif(10,-1,1) #cambiare l'interavallo per l'estrazione di numeri causali --> di default è fra 0 e 1
# OPERATORI
> #operatori aritmetici
DEFINISCO LE VARIABILI
> x<-5
> y<-16
# operatori relazionali
>x
[1] 1 0 0 6
> x & y # E logico (sia x che y sono vere perché x e y sia vera)
> x | y # O logico
[1] FALSE
[1] TRUE
>B
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA
#1 rappresenta è il primo parametro (data) che viene riciclato per riempire la matrice
#2 il numero di righe
#3 il numero di colonna
#4 un numero diverso da 0, interpretato da R come TRUE per il quarto parametro
> m<-matrix(c(1,33,0,2,-3,10),2,3,byrow=T)
> det(m)
>A
[,1] [,2] [,3]
[1,] -2 3 4
[2,] -3 2 4
[3,] 0 1 1
>b
[1] -3 0 1
> sol
[1] 10 -13 14
> A %*% sol # siccome sol è la soluzione di Ax=b il prodotto matriciale A%*%sol restituisce b
(approssimato molto precisamente) doppia % per riottenere il vettore
[,1]
[1,] -3.000000e+00
[2,] -7.105427e-15
[3,] 1.000000e+00
> A * sol # questo invece è il risultato della moltiplicazione elemento per elemento con
l'operatore *
[,1] [,2] [,3]
[1,] -20 30 40
[2,] 39 -26 -52
[3,] 0 14 14
>A
[,1] [,2] [,3]
[1,] -2 3 4
[2,] -3 2 4
[3,] 0 1 1
> A[2,3] # per selezionare un valore
[1] 4
# se sovrascrivo il valore di una variabile, il vecchio valore viene perso a meno che non
venga salvato in una variabile ancillare
>y
[1] 1
> A[3] # omettendo la virgola, R eSTRAe il valore corrispondente come se se i valori fossero
inseriti in un vettore invece che una matrice (default colonna 1 per il vettore).
[1] 0
> A[4]
[1] 3
> ??'transpose' #doppio punoto di domanda per sapere qualcosa (tipo help)
Lezione 3:
# UNA VALIDA ALTERNATIVA è ifelse che esegue l'if per ognuno dei valori di verità generati
dalla condizione.
> # ifelse(vb,vt,vf)
> ifelse(c(T,F),'ciao','miao')
[1] "ciao" "miao"
# ESERCIZIO 1:
> #1:4 + exp(-2:2)
> 1:4 + exp(-2:2)
[1] 1.135335 2.367879 4.000000 6.718282 8.389056
Warning message:
In 1:4 + exp(-2:2) :
longer object length is not a multiple of shorter object length
> -2:2
[1] -2 -1 0 1 2
> 1:4 # create a sequence
[1] 1 2 3 4
Lezione 4:
> # Lezione 4 - (Grafici 2d)
> # Esercizio 1
>
> set.seed(123)
> x<-sample(-5:5,4)
> y<-sample(-2:2,4)
> x
[1] -2 2 5 4
>y
[1] 2 -2 -1 0
> # per avere gli stessi numeri se avete una versione diversa
> x<-c(-2,2,5,4)
> y<-c(2,-2,-1,0)
> #potevo usare lines ma in questo modo mi tengo anche la possibità di manipolare i punti.
> lines(c(-2,4),c(2,0),lwd=3,col="red") # una digressione per mostrare un'altro tipo di riga (non
richiesta). Lty “tratteggiata”; col “COLORE”; lwd “spessore)
> text(-1,0,'A message for u') #testo per descrivere un punto in particolare
> # volendo colorare il punto della legenda del colore corretto (quello del poligono):
> legend(3,2,"color is tomato3",pch=19, col="tomato3")
>
>
> # ESERCIZIO 3:
>
> x<- runif(100,-1,1)
> y<- rnorm (100)
> plot(x,y)
> # come caratterizzare i quadranti? Beh... con condizioni logiche e relazionali
> Q1 <- x>0 & y >0 # primo quadrante
> Q2 <- x<0 & y >0 # secondo quadrante
> Q3 <- x<0 & y <0 # secondo quadrante
> Q4 <- x>0 & y <0 # quarto quadrante
Lezione 5:
> # Definisco una funzione g, di due variabili x e y
> g<- function(x,y) x^2 +y^2 -2*x +3*y-1
> x<-seq(-3,3,len=31)
>x
[1] -3.0 -2.8 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0
[12] -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2
[23] 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0
# e una sequenza di valori y:
> y<-seq(-3,3,len=31)
>y
[1] -3.0 -2.8 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0
[12] -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2
[23] 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0
> # infine attraverso la funzione outer posso calcolare la zeta: valore della funzione z
> z<-outer(x,y,g)
> str(z)
num [1:31, 1:31] 14 12.44 10.96 9.56 8.24 ...
> # Come funziona outer (vedere anche help)?
> #dato un vettore di lunghezza m e un vettore di lunghezza n
> # calcola il outer product.
Genera una matrice di lunghezza mxn dove gli elementi della matrice sono:
A(i,j)=fun(X(i),Y(j))
Graifici 3d
> # un grafico di tipo Heatmap, tre input le x, le y e i valori della funzione (assegnati a
variabile z.
> image(x,y,z)
> # Sono naturalmente disponibili parametri, come quelli per cambiare la palette (tavolozza di
colori):
> image(x,y,z,col= rainbow(12))
> d<-read.table("http://virgo.unive.it/paolop/papers/grades.txt")
> str(d)
'data.frame':167 obs. of 1 variable:
$ V1: Factor w/ 53 levels "-1","-1.5","0",..: 53 17 41 41 38 22 11 34 33 35 ...
# R non ha riconosciuto che il primo valore era il titolo della variabile (header)
# Per esplicitare la presenza di un header:
> d<-read.table("http://virgo.unive.it/paolop/papers/grades.txt",header=T)
> str(d)
'data.frame':166 obs. of 1 variable:
$ grade: num 16 28.5 28.5 26.5 18.5 13 24 23.5 24.5 3 ...
> d$grade
[1] 16.0 28.5 28.5 26.5 18.5 13.0 24.0 23.5 24.5 3.0 11.0
[12] 16.0 16.5 15.5 24.0 22.5 31.0 31.0 18.5 8.5 17.0 18.5
[23] 29.0 26.5 14.5 28.5 18.0 31.0 13.5 29.0 18.0 25.0 21.0
[34] 13.0 12.5 31.0 -1.0 31.0 3.5 24.0 22.0 31.0 9.5 26.0
[45] 19.5 13.5 9.5 17.0 31.0 26.5 22.0 23.5 19.5 31.0 31.0
[56] 26.5 28.5 12.5 26.0 28.0 24.5 0.0 16.5 4.5 24.0 28.5
[67] 12.0 24.0 29.0 5.0 24.0 20.5 4.5 13.0 -1.0 18.5 31.0
[78] 15.0 31.0 11.0 5.0 26.0 20.0 29.0 18.0 18.0 31.0 7.5
[89] 14.0 24.0 19.0 0.0 31.0 26.0 22.0 26.0 10.0 11.5 15.5
[100] 24.0 24.0 -1.5 26.0 23.5 18.0 23.5 21.0 17.5 5.0 18.0
[111] 14.5 8.5 10.5 18.5 15.0 16.5 3.0 23.5 13.5 1.5 24.5
[122] 21.5 26.5 26.0 14.5 31.0 31.0 2.5 3.0 24.0 24.0 15.5
[133] 24.0 26.5 28.5 10.0 10.5 29.0 17.5 22.0 15.0 12.5 19.5
[144] 22.0 10.5 28.5 31.0 28.5 8.5 31.0 18.5 16.5 26.0 13.0
[155] 27.0 31.0 17.0 22.0 9.0 2.0 5.5 4.5 22.0 26.5 31.0
[166] 29.0
# set.seed blocca il generatore di numeri casuali per avere sempre le stesse sequenze di
valori casuali.
> set.seed(123)
> x<- sample(-5:5,4)
>x
[1] -2 2 5 4
Lezione 6:
> # Esercizio 1
> f<- function(x) x^4-3*x**3-3*x^2-3*x-2 # creo la funzione f
> curve(f,-10,10) # faccio esperimenti per visualizzarla al meglio
> curve(f,-5,5, ylim=c(-50,100))
> grid(col=4) # una griglia rende più chiari i punti chiave
> abline(h=0,col=2) # per chiarire dove la funzione assume valore zero, disegno linea
orizziontare,
# ho due soluzioni una tra -2 e 0 e una tra 2 e 5
$init.it # questo è un place-holder per cose che potrebbero essere aggiunte in futuro agli
output della funzione
[1] NA
Lezione 7:
> # ottimizzazione di funzioni di una variabile.
$objective
[1] -34.39441 # valore al minimo della funzione obbiettivo.
# Rimane in capo a noi indicare un intervallo dove un minimo esiste. In questo intervallo (-1,1)
esiste solo un minimizer (un minimizzatore) non un minimo:
> optimize(f,c(-1,1))
$minimum
[1] 0.999959
$objective
[1] -5.999426
> # per calcolare il massimo uso il comando maximum=T
> optimize(f,c(-1,0.5),maximum=T)
$maximum
[1] -0.9999415
$objective
[1] 5.999415
$objective
[1] -0.6387168
Troppi minimi locali! Resta in capo a noi posizionarci in un intervallo tale da rendere a R
possibile calcolare il minimo.
> res<-optimize(gg,c(-10,10)) # possiamo assegnare il risultato di optimize ad una variabile
> res
$minimum
[1] -1.318105
$objective
[1] -0.6387168
> char_vec<-c("a","b","c","d")
> logic_vec<- c(T,F,T)
> our_list<- list(vec, char_vec, logic_vec) # definire una lista
> our_list
[[1]]
[1] 1 2 3
[[2]]
[1] "a" "b" "c" "d"
[[3]]
[1] TRUE FALSE TRUE
$testo
[1] "a" "b" "c" "d"
$logico
[1] TRUE FALSE TRUE
>
> our_list$numeri
[1] 1 2 3
> altro caso: rifersi ad un elemento di uno dei vettori nella lista:
> our_list$testo[2]
[1] "b"
Lezione 8:
# Esercizio 1:
> f<- function(x,y) 5*x^2 + x*y+y^2-4*x+3*y-5 # definisco la funzione in R
>f
function(x,y) 5*x^2 + x*y+y^2-4*x+3*y-5
# mi preparo una visualizzazione per esplorare la natura di questa funzioen
> x<-seq(-3,3,length=31); y<-seq(-3,3,length=31)
> z<-outer(x,y,f)
> image(x,y,z)
> contour(x,y,z) # esploro vari tipi di visualizzazione
> fb<-function(x) f(x[1],x[2]) # definisco la funzione fb come funzione di una variabile vettoriale
e utilizzo la definizione di f per rendere più chiara e meno prona ad errori la definizione della
fb vettoriale.
> # come computare un valore della funzione fb vettoriale:
> f(1,2)
[1] 8
> fb(1,2) # no!
Error in fb(1, 2) : unused argument (2)
>
> fb(c(1,2)) # Si. Con fb uso il comando c
[1] 8
# posso finalmnete provare a minimizzare avendo intuito dall'analisi grafica dove si trova il
minimo e partendo da un punto di partenza adeguatamente vicino.
> optim(c(1,2),fb)
$par # coordinate del minimo
[1] 0.5788665 -1.7894556
$message
NULL
$value
[1] 1.504585e+112 # il valore della funzione è corrispondentemente enorme...
Lezione 9:
$value
[1] -0.5 # valore della funzione al minimo
$counts
function gradient
106 NA
$convergence
[1] 0
$message
NULL
$outer.iterations
[1] 3
$barrier.value
[1] -2.163737e-05
Lezione 10:
> #Abbiamo bisogno del teorema di Rouche-Capelli, che è basato sul Rango (rank).
> #Utilizzeremo la funzione di R e in particolare il suo componente $rank.
In alcuni casi (ad esempio matrici quadrate con determinante non zero), la soluzione può
essere calcolata utilizzando l’inverso della matrice.
Appunti Lezione 10
qr(A)$rank # Calcolo il rango della matrice A
qr(cbind(A,b))$rank # Calcolo il rango della matrice completa
library(MASS) # Per usare ginv,devi prima caricare una libreria che si chiama library(MASS)
ginv(A) # Mentre solve(A) dava errore, ginv(A) mostra l’inversa generalizzata. Che dà
sempre soluzione
Lezione 11:
Lezione 12:
> #arbitraggio: Situazione in cui puoi fare soldi senza rischio (ci sono due asset uguali a
prezzi diversi).
> # in questo caso è possibile intascarsi la differenza
> # si vedano le note e le slides
> # Una economia:
> Y <- matrix(c(104,104,104,108,102,100,112,106,104),3,3)
>Y
[,1] [,2] [,3]
[1,] 104 108 112
[2,] 104 102 106
[3,] 104 100 104
> pai <- c(100,100,104) # prezzi
> # Io posso comprare la terza colonna (asset) per 104,
#ma posso anche replicarla utilizzando le prime due colonne.
——
#Giulia ha chiesto:SET.SEED:
# prova A
set.seed(107)
v <- rnorm(100, mean=5, sd= 2)
sum(v[51:58])
# [1] 34.27003
.
# prova B
set.seed(107)
rnorm(100, mean=5, sd= 2)
v <-rnorm(100, mean=5, sd= 2)
sum(v[51:58])
# [1] 31.90451
#perché non è uguale? Perché set seed inizializza i numeri causali per partire dallo stesso
punto
#Ma in “prova b” hai già creato numero diversi prima di procedere con l’assegnazione alla
variabile v
> # Simulazioni
> # Utilizzate per risolvere problemi "difficili" generando scenari per ottenere informazione
>
> # Di solito usiamo le simulazioni per 2 motivi:
> # 1) quanto è probabile ottenere un risultato "soddisfacente"?
> # 2) Quale è il risultato medio dei miei esperimenti?
> # Ci restituisce un numero di sintesi, per capire il risultato medio (tipicamente si usa la
media, a volte la deviazione standard)
>
>
> # Le simulazioni sono basate su numeri random
# Un numero random è il risultato numerico di un esperimento casuale, come tirare un
dado.
> runif(3)
[1] 0.58297886 0.06174449 0.46996278
> runif(3)
[1] 0.06649013 0.18071290 0.76397416
>
> runif(2,min=-3,max=3) # 2 experimenti estraendo dall'intervallo [-3,3]
[1] -1.976554 -1.183906
> runif(2,min=-3,max=3)
[1] -1.2725842 0.6776299
>
> help(runif) # per esplorare eventuali altri parametri aggiuntivi
starting httpd help server ... done
# Possiamo comunque calcolare la probabilità di essere tra due valori con la funzione
pnorm(q). Che calcola (numericamente) l'integrale tra meno infinito e q. Per calcolare la
massa sotto la curva (in questo esempio, distribuzione normale, media zero, sd 1) tra due
estremi a= e b:
> pnorm(3) # integrale della distribuzione normale standard(mean=0,sd=1) tra -inf e 3
[1] 0.9986501
> pnorm(-3) # integrale della distribuzione normale standard(mean=0,sd=1) tra -inf e -3
[1] 0.001349898
> pnorm(3)-pnorm(-3) l'area tra -3 e 3 sarà data dalla differenza dei due integrali (disegnate la
curva per averne un'intuizione)
[1] 0.9973002
>
> # sample può essere usato per interessanti esperimenti random
> # sample fa dei campionamenti!
> # sample(x, size, options)
> # x è l'insieme da cui fai campionamento
> # size è il numero di estrazioni
> # sample(x, size, replace=T/F, prob=NULL)
> # se prob=NULL, di default, allora tutti gli oggetti in x sono campionati con la stessa
probabilità> # sample(x,size,options)
> # sample(x,size,replace=F,prob=NULL)
> sample(c(0,1,5),2)# campiona senza reintroduzione 2 numeri dalla lista 0,1,5
[1] 5 1
> sample(c(0,1,5),2)
[1] 5 1
>
> sample(c(0,1,5),2)
[1] 1 0
>
>
> sample(c(0,1,5),10) # non posso campionare senza reintroduzione più valori di quelli che
ho ne set:
Error in sample.int(length(x), size, replace, prob) :
cannot take a sample larger than the population when 'replace = FALSE'
> sample(c(0,1,5),10,replace=T) # con reintroduzione
[1] 1 5 5 1 5 0 0 0 5 0
> sample(c(0,1,5),10,rep=T)
[1] 5 0 0 1 5 0 1 0 1 1
>
> # simuliamo un dado
> sample(1:6,1) # campiona un valore intero tra 1 e 6, con prob uniforme per tutti i valori
[1] 1
> sample(1:6,1)
[1] 5
>
# campiona 2 valori interi tra 1 e 6, con reintroduzione e con prob uniforme per tutti i valori
> sample(1:6,2,rep=T) # naturalmente simulare più dadi richiede di introdurre la
reintroduzione (replacement)
[1] 4 5
> sample(1:6,10,rep=T) # uguale ma 10 dadi
[1] 6 5 5 3 2 1 1 6 6 2
Lezione 14:
> #La qualità di un nuovo bene può essere valutata con 2 misure numeriche.
> #Assumi che siano numeri random uniformi. Stima quanto probabile sia che il massimo
delle misure ecceda 0.5.
> # a) About 0.22; b) About 0.75; c) About 0.9; d) About 0.39.
>
>
> # Un modo alternativo di risolvere:
# Definisco una funzione con un singolo esperimento:
> experiment<-function() max(runif(2))>0.5
> experiment()
[1] TRUE
# Poi uso il comando “replicate” per replicare molti esperimenti.
# struttura di replicate: replicate(number, experiment())
> res<-replicate(1000,experiment())
> res
[1] TRUE FALSE FALSE TRUE TRUE TRUE
[7] TRUE TRUE TRUE TRUE TRUE FALSE
[13] TRUE TRUE .... (omesso il resto per compattezza del file di output
> # replicate(number,funzione)
> sum(res)/1000 # ricordiamoci che a TRUE è associato il valore 1 e a FALSE il valore 0.
[1] 0.779
> sum(res==FALSE) # per contare i falsi invece che i veri
[1] 221
>
# Cosa abbiamo imparato:
# Posso utilizzare loop espliciti per programmare degli esperimenti, ma posso anche #
definire un singolo esperimento e replicarlo tante volte.
# ---------
>
>Tornando al esercizio del comitato:
Ho lavoratori di diversi tipi e voglio formare comitati di 4 persone, quale probabilità che
almeno tree skills siano rappresentati.
> hist(res)
>
Lezione 15:
> #Si paga un prezzo 100 per ottenere un valore casuale tra (1000,100,1) con probabilità
1/6,2/6,3/6. quale è il guadagno medio?
> revenues<-sample(c(1000,100,1),1000,rep=T,prob=c(1/6,2/6,3/6))
> revenues[1:10]
[1] 1 100 1 100 1 100 100 100 1 100
> mean(revenues)-100 # guadagno è entrate meno costi:
[1] 115.785
> days<-1:365
> birthdays<-sample(days,10,rep=T) # compleanni di un gruppo di 10 persone
> birthdays
[1] 122 365 278 250 302 72 91 104 136 241
> # duplicated
> # Dall’help: duplicated determines which elements of a vector or data frame are duplicates
of elements with smaller subscripts, and returns a logical vector indicating which elements
(rows) are duplicates.
> duplicated(birthdays)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[8] FALSE FALSE FALSE
> sum(duplicated(birthdays))
[1] 0
> # definire innanzitutto un singolo esperimento
> experiment<-function(n) {# n numero di persone nel gruppo
+ days<-1:365
+ birthdays<-sample(days,n,rep=T)
+ sum(duplicated(birthdays))
+}
> experiment(10)
[1] 0
> experiment(56) # n=56 persone
[1] 4
# Possiamo usare “replicate” per replicare questo esperimento.
> res<-replicate(1000,experiment(56))
> res
[1] 4 5 6 3 3 3 9 2 4 5 8 6 3
[14] 1 4 7 4 3 6 2 1 8 6 2 5 4
[27] 3 2 3 2 1 4 4 4 4 4 4 7 6
[40] 5 7 4 2 3 ... (output tagliato per pulire il file
# 99% delle volte c’è un compleanno comune in un gruppo di 56:
> sum(res>=1)/1000
[1] 0.99
> # 56 persone, la probabilità di 0.99
> # 99%!
>
> # E se tu volessi sapere come cambia la probabilità per diversi n (diciamo da 1 a 60)?
> # 1. definire una funzione per calcolare la probabilità di un compeanno in comune per dato
n.
> comple<-function(n){
+ res<-replicate(1000,experiment(n))
+ sum(res>=1)/1000
+}
> comple(56)
[1] 0.994
> comple(10)
[1] 0.142
>
> # 2. chiedere a R di replicare questa operazione comple(n) per n da 1 a 60
> # sapply: simply apply
> # sapply(x,function): applica la funzione a tutti gli elementi di x e ritorna un vettore con i
risultati.
# Noi vogliamo applicare "comple" al vettore con le dimensioni del gruppo n per cui
vogliamo calcolare la probabilità di avere compleanni comuni
> x<-1:60
> y<-sapply(x,comple)
> plot(x,y,xlab="x-Dimensione del gruppo",ylab="Prob. di un comple comune")
>
>
>
> # PROBLEMA DI MONTY HALL
> # Il problema di Monty Hall (vedere anche slides Lezione 13-14-15): l’idea è di utilizzare le
simulazioni per comparare due strategie:
> # - tieni
> # - cambia
>
> # Assumeremo (senza perdere di generalità), che la macchina sia sempre nella prima
porta (ma che noi non lo si sappia quando prendiamo la decisione).
>
> # KEEP: TIENI LA PORTA SCELTA
> # programmare un singolo esperimento
> if(sample(1:3,1)==1) 1 else 0 # se estriamo 1 vinciamo altrimenti perdiamo
[1] 0
# Ricordiamoci il comando replicate: replicate(1000 volte, il precedente esperimento):
> res<-replicate(1000,if(sample(1:3,1)==1) 1 else 0)
> sum(res)/1000
[1] 0.352
# Quindi la probabilità di successo è circa 352/1000 ~ 1/3
>
> # Vediamo ora la Probabilità di vincere con la strategia Switch (cambia la porta):
> expswitch<-function() {
+ pick<-sample(1:3,1)
+ # il presentatore ora ci mostra una porta con la capra
+ if(pick==1) show<-sample(2:3,1)
+ if(pick==2) show<-3
+ if(pick==3) show<-2
+ # noi prendiamo sistematicamente la porta che rimane
+ taken<-(1:3)[c(-pick,-show)]
+ if(taken==1) 1 else 0
+}
# testiamo che funzioni:
> expswitch()
[1] 1
> expswitch()
[1] 0
>
# Ora faccio 1000 iterazioni: dell’esperimento:
> res<-replicate(1000,expswitch())
> sum(res)/1000
[1] 0.648
# La probabilità di vincere è 665/1000 ~ 2/3
# Conviene sempre cambiare porta (dato che il presentatore ci ha mostrato una porta
contendente una "capra")
>
>
>
> # SIMULAZIONI PER RISOLVERE PROBLEMI DI MATEMATICA
> #Consideriamo questo quadro di Mirò:
> curve(x^2,-2,2,ylim=c(0,2))
> curve(log(x+4),add=T)
# voglio calcolare l’area della “lingua” tra le due funzioni
> # METODO 1: integrali
# Vediamo come usare le simulazioni per affrontare questo problema
# L’area di cui calcolare il valore sta tra le due curve e si può calcolare utilizzando l’integrale
di una funzione.
# Che funzione? Quella che descrive il valore della differenza tra le 2 (dato che la prima sta
sempre sotto la seconda):
> diff<- function(x) log(x+4)-x^2 # scrivo una funzione come differenza delle 2
# Innanzitutto
mi computo le due intersezioni:
> uniroot(diff,c(-1.5,0.5))
$root
[1] -1.041483
> uniroot(diff,c(1,1.5))
$root
[1] 1.290722
# L’area sotto la curva è l’integrale dal primo al secondo valore della funzione “diff”:
> integrate(diff,-1.041483,1.290722)
2.179504 with absolute error < 2.4e-14
>
> # METODO 2: con le simulazioni
# Proviamo ora a computare questo numero con una simulazione: