12 Optimization

  • The base R function for finding minima (the default) or maxima of functions of a single variable is optimize(). Eg:
> f <- function(x) {
+     x * (20 - 2 * x) * (16 - 2 * x)
+ }
> 
> optimize(f, c(0, 8), maximum = TRUE)
## $maximum
## [1] 2.945
## 
## $objective
## [1] 420.1
  • Another example:
> g <- function(x) {
+     x * sin(4 * x)
+ }
> 
> curve(g, 0, 3)

> 
> # the algorithm gives the first minimum encountered
> optimize(g, c(0, 3))
## $minimum
## [1] 1.228
## 
## $objective
## [1] -1.204
> 
> # excluding the first minimum...
> optimize(g, c(1.5, 3))
## $minimum
## [1] 2.771
## 
## $objective
## [1] -2.76
> 
> # to find the global maximum
> optimize(g, c(1, 3), maximum = TRUE)
## $maximum
## [1] 1.995
## 
## $objective
## [1] 1.979
> 
> # or...
> minusg <- function(x) {
+     -g(x)
+ }
> optimize(minusg, c(1, 3))
## $minimum
## [1] 1.995
## 
## $objective
## [1] -1.979
> 
> # to find the global minimum
> curve(minusg, 0, 3)

> optimize(minusg, c(1, 3), maximum = TRUE)
## $maximum
## [1] 2.771
## 
## $objective
## [1] 2.76
  • The pracma package contains the function findmins(), which finds the positions of all the minima in the search interval:
> library(pracma)
## 
## Attaching package: 'pracma'
## The following objects are masked from 'package:magrittr':
## 
##     and, mod, or
> curve(g, 0, 3)

> 
> g.mins <- findmins(g, 0, 3)
> g.mins  # minima values
## [1] 1.228 2.771
> 
> g(g.mins)  # minima values
## [1] -1.204 -2.760