
# Algoritmo di minimizzazione a 'scivolamento'

pausa <- function() readline(prompt="\nDai Enter per continuare")

fun  <- function(x) 0.3*x^3 + 3*x^2 + 3*x -10 
dfun <- function(x) 3*0.3*x^2 + 2*3*x + 3

alpha = 0.2
x    <- seq(-8, 3, len=101)
main <- sprintf("Algoritmo di minimizzazione (alpha = %.2f)", alpha)
plot(x, fun(x), ty='l', col='blue', ylab='f(x)', main=main)
abline(h=0, col='gray')
abline(v=0, col='gray')

cat(sprintf("Clicca su un punto delle ascisse in 'prossimità' del minimo"))
p0 = locator(1)
x  = p0$x

i=0
x0 = Inf
while( abs(x-x0) > 0.000001  ) {
  cat(sprintf(" x = %f\n", x))     
  points(x, 0, pch=19)    
  points(x, fun(x), pch=19, col='blue')
  lines(c(x,x), c(0,fun(x)), lty=2, col='orange')

  m = dfun(x)
  c = fun(x) - m*x
  abline(c, m, col='red', lty=2)
  
  pausa()
  x0 = x  
  x = x - alpha*m  
  
  i = i+1
}

cat(sprintf("minimo in x=%f raggiunto in %d step\n", x, i)) 
text(-2.5, 30, sprintf("minimo in x=%f\nraggiunto in %d step\n", x, i), cex=1.5)
