Ex1 Write down Newton’s formula for finding the minimum of \(f(x)=\frac{3x^4-4x^3}{12}\). Then implement in R.

Newton’s Formula is \(x_{k+1} = x_k - \frac{x_k^3 - x_{k-2}x_k}{3x_{k-2}}\)

f <- function(x) {
  numerator <- 3 * x^4 - 4 * x^3
  denominator <- 12
  result <- numerator / denominator
  return(result)
}

f_prime <- function(x) {
  result <- 3 * x^3 - 3 * x^2
  return(result)
}

newton_min <- function(initial_x, tolerance = 1e-6, max_iterations = 100) {
  x <- initial_x
  for (i in 1:max_iterations) {
    f_value <- f(x)
    f_prime_value <- f_prime(x)
   
    if (abs(f_prime_value) < tolerance) {
      break
    }
   
    delta_x <- f_value / f_prime_value
    x <- x - delta_x
   
    if (abs(delta_x) < tolerance) {
      break
    }
  }
 
  return(x)
}

initial_guess <- 1
minimum <- newton_min(initial_guess)
print(minimum)
## [1] 1

Ex2 Explore optimize() in R and try to solve the previous problem.

minimum <- optimize(f, interval = c(-10, 10), maximum = FALSE)
print(minimum$minimum)
## [1] 0.9999986

Ex 3 Use any optimation algorithm to find the minimum of \(f(x,y) = ((x-1)^2 +100(y-x^2)^2\)

g <- function(x, y) {
  result <- (x - 1)^2 + 100 * (y - x^2)^2
  return(result)
}

find_minimum <- function() {
  minimum <- optimize(g, interval = c(-10, 10), maximum = FALSE, y = 0)
  return(minimum$minimum)
}

minimum <- find_minimum()
print(minimum)
## [1] 0.1612531

Explore the optimr package for R and try to solve the previous problem.

g <- function(x) {
  result <- (x[1] - 1)^2 + 100 * (x[2] - x[1]^2)^2
  return(result)
}

find_minimum <- function() {
  result <- optim(par = c(0, 0), fn = g, method = "L-BFGS-B", lower = c(-10, -10), upper = c(10, 10))
  return(result$par)
}

minimum <- find_minimum()
print(minimum)
## [1] 0.9998008 0.9996016