Ipotizziamo che uno scout si trovi su una collina vicino ad un ruscello e
stia esaminando la mappa della zona. Supponiamo che la quota del terreno, in quella zona,
sia descrivibile, in metri, con l'equazione
(1) Faccio calcoli e figure con R, ma si potrebbe usare altro software.
# Il grafico di sinistra, trasformando le quote in km: F <- function(x,y) 5/(3+4*x^2+8*y^2) x1 <- -2; x2 <- 2; y1 <- -2; y2 <- 2 x <- seq(x1,x2,len=41); y <- seq(y1,y2,len=41); z <- outer(x,y,F) # Con scale=FALSE ottengo un sistema monometrico # Memorizzo il grafico con un nome (fig) in modo da ... fig <- persp(x,y,z, theta=70,phi=20,col="yellow",ticktype="detailed",shade=0.3,cex.axis=0.75,cex.lab=0.8,scale=FALSE) # ... aggiungervi le curve sulla superf. che individuano il punto (1, 1/4) lines (trans3d(x, y=1/4, z=F(x,1/4), pmat=fig), col="red") lines (trans3d(x=1, y, z=F(1,y), pmat=fig), col="red") points(trans3d(x=1, y=1/4, z=F(1,1/4), pmat=fig), col="blue", pch=16) F(1,1/4) # 0.6666667 # In un altra finestra il grafico a destra (escluse frecce e curva che rappresentano il ruscello) dev.new() # Alcune curve di livello (a 200, 500, ... metri) contour(x,y,z, levels=c(200,500,800,1100)/1000 ) abline(v=axTicks(1),h=axTicks(2),lty=3,col="grey70") # e il punto e la sua cruva di livello points(1,1/4,pch=19,col="red") contour(x,y,z, levels=F(1,1/4), add=TRUE, lty=3 ) # Il resto lo spieghiamo successivamente
(2) Il ruscello in (1,1/4) scorre nella direzione opposta a quella del gradiente di F, perpendicolarmente alla curva di livello passante per tale punto.
# Il calcolo (fattibile a mano) del gradiente: fxy <- expression( 5/(3+4*x^2+8*y^2) ) D(fxy,"x"); D(fxy,"y") # -40x/(3+4x^2+8y^2)^2 -80y/(3+4x^2+8y^2)^2 grad <- function(x,y) c(eval(D(fxy,"x")),eval(D(fxy,"y"))) grad(1, 1/4) # -0.7111111 -0.3555556 # Esprimiamolo in forma frazionaria: library(MASS); fractions( grad(1,1/4) ) # -32/45 -16/45 # Il ruscello scende, quindi, nella direzione opposta, (32/45,16/45): arrows(1,1/4,1+32/45,1/4+16/45,length=0.15,col="red")Non era richiesto dal quesito, ma vediamo anche la traiettoria del ruscello, prolugandola come se il torrente sgorgasse dalla cima. È la curva tratteggiata lungo le curve di livello che passa per il punto (1,1/4). Il ruscello è diretto in direzione opposta al gradiente. In un punto generico (x,y) del piano la pendenza del gradiente è:
L <- function(x) x^2/4 plot(L,0,2, add=TRUE, lty=2)
(3)
Il modulo del gradiente di F in (x,y) rappresenta la velocità della variazione massima di F a partire da (x,y),
ovvero la pendenza della superficie lungo la direzione indicata dal gradiente. La risposta al quesito è quindi
dist <- function(P1,P2) sqrt(sum((P1-P2)^2)) dist( 0, grad(1,1/4) ) # 0.7950464 (la pendenza) atan( dist( 0, grad(1,1/4) ) )*180/pi # 38.48633 (l'inclinazione in gradi)
Posso controllare la sensatezza della risposta trovata sul grafico:
a <- atan(1/2)*180/pi fig <- persp(x,y,z, theta=a,phi=0,col="yellow",ticktype="detailed",shade=0.3,cex.axis=0.75,cex.lab=0.8,scale=FALSE,d=1000) lines (trans3d(x, y=1/4, z=F(x,1/4), pmat=fig), col="red") lines (trans3d(x=1, y, z=F(1,y), pmat=fig), col="red") points(trans3d(x=1, y=1/4, z=F(1,1/4), pmat=fig), col="blue", pch=16)
Per approfondimenti vedi qui.