La grandezza B è legata alla grandezza A secondo la relazione: B = A3 - 6 A2 + 11 A. Nel caso in cui A = 2 ± 1 quanto vale B, ovvero qual è l'intervallo costituito dai valori di B al variare di A tra 2 1 e 2 + 1?
Per A = 1 e per A = 3 B vale 6, ma ciò non significa che in tutto l'intervallo valga 6: ciò accadrebbe solo se ivi B fosse costante, e questo non può essere in quanto B varia come una funzione cubica di A. | |
Dobbiamo studiare l'andamento di questa funzione. d(A3 - 6 A2 + 11 A) / dA = 3A2 - 12A + 11. È una quadratica con coefficiente direttivo positivo. La nostra funzione ha quindi pendenza negativa tra le due eventuali soluzioni di 3A2-12A+11 = 0; cerchiamole. | |
12/6 - √(122-3·4·11)/6 = 2 - 2√(62-3·11)/6 = 2 - √3/3 = 2 - 1/√3, 2 + 1/√3 B assume valore massimo in 2 - 1/√3 e valore minimo in 2 + 1/√3. Con la calcolatrice o ad es. con R calcolo questi valori: x <- c(2+1/sqrt(3),2-1/sqrt(3)); x^3-6*x^2+11*x 5.6151 6.3849 e concludo che per A in [1,3] B sta in [5.615 , 6.384 ] che è contenuto in [5.6, 6.4]. Posso dire che per A = 2 ± 1 B = 6.0 ± 0.4. |
Posso risolvere facilmente il problema anche con questi script, e trovare per A l'intervallo [1.422, 2.578] e per B [5.615, 6.386].
Anche con R (caricata con "source" una libreria) posso procedere molto facilmente:
source("http://macosa.dima.unige.it/r.R")
A=2+EPS(1); B=A^3-6*A^2+11*A; range(B)
# 5.6151 6.3849
Con R potrei anche cercare minimo/massimo calcolando la derivata di f, o direttamente, con un algoritmo:
f <- function(x) x^3-6*x^2+11*x a <- 1; b <-2 for(i in 1:20) { h <- (b-a)/3;y1 <- f(a); y2 <- f(a+h); y3 <- f(a+2*h) if(y1 < y2 & y2 < y3) a <- a+h else b <- b-h }; c(a,b); f(c(a,b)) 1.422453 1.422753 6.3849 6.3849 a <- 2; b <-3 for(i in 1:20) { h <- (b-a)/3;y1 <- f(a); y2 <- f(a+h); y3 <- f(a+2*h) if(y1 < y2 & y2 < y3) b <- b-h else a <- a+h }; c(a,b); f(c(a,b)) 2.584819 2.585120 5.615197 5.615205
Con altri cicli potrei trovare più cifre, ma queste sono sufficienti.
Potrei, anche, usare un algoritmo per trovare minimo e massimo che impieghi il generatore di numeri casuali:
x <- NULL; y <- NULL; e <- NULL x[1] <- 2; e[1] <- 1 # se avessi altri dati con altre precisioni li aggiungerei # con x[2] <- ..., e[2] <- ... dati <- 1; n <- 1e5 # se i dati sono di più posso diminuire n min <- 1e100; max <- -1e100 for(j in 1:n) {for(k in 1:dati) y[k] <- x[k] + runif( 1,min=-e[k],max=e[k]); u <- y[1]^3-6*y[1]^2+11*y[1] if (u < min) min <- u; if (u > max) max <- u} min; max # 5.6151 6.3849