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 h(x,y) = 5000/(4x²+8y²+3), dove x e y sono le coordinate, in km, espresse prendendo l'origine dove la collina ha la vetta. Lo scout si trova nel punto (1,1/4). (1) Fai (col computer) un disegno che rappresenti la collina ed uno che presenti alcune curve di livello della zona (entrambi con la evidenziazione del punto in cui si trova lo scout) simili a quelli sottostanti. (2) In quale direzione scorre il ruscello in quel punto? (3) Con quale pendenza e quale inclinazione?  [utilizza opportunamente il concetto di gradiente]

(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 è:
-80y/(3+4x^2+8y^2)^2 / ( -40x/(3+4x^2+8y^2)^2 ) = 2y/x.
Quindi  dy/dx = 2y/x, ossia dy/y = 2dx/x,  quindi, integrando,  log(y) = 2·log(x) + log(C),  ossia:  y = C·x².
Questo è l'andamento del ruscello. Ora impongo che passi per (1,1/4):  1/4 = C·1, da cui C = 1/4.
Quindi la traiettoria del ruscello è y = x²/4.  Sotto come è stata tracciata:
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 |∇F(1,1/4)|.  Per fare i calcoli uso una funzione per determinare la distanza tra due punti (il modulo è infatti la distanza da O).

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.