<- function(x) {
f <- -8 - 2 * x + x^2
y return(y)
}
17 Univariate Unconstrained Optimization
In Chapter 16 we learned how to make our own functions. We learned how to write a function to calculate:
f(x) = -8 -2x +x^2
The function was:
In this chapter we will learn how to find the extreme point (maximum/minimum) of this univariate function (function with only one variable).
17.1 Plotting Approach
In Chapter 16, we also learned how to plot the function with ggplot()
. We can get a visual view of the extreme point:
library(ggplot2)
<- seq(from = -4, to = 6, length.out = 200)
x <- data.frame(x, y = f(x))
df ggplot(df, aes(x, y)) +
geom_line()
From the plot we can see the following that the function achieves a minimum at x=1.
17.2 Analytic Solution
We could have found this number analytically using calculus. Let’s do that before doing it in R. The first derivative of the function is:
f^\prime(x) = -2 + 2x To find the extreme point of the function we find the value of x where f^\prime(x)=0. This happens when: -2 + 2x = 0 Solving for x yields x=1. To see if this is a maximum or a minimum we check the second derivative: f^{\prime\prime}(x) = +2 This is positive, so we know it is a minimum. A minimum at x=1 is exactly what we see in the plot.
17.3 Using Optimization
We will now use R to find the extreme point using optimization. We can use the optimize()
function to find the minimum of a univariate function in R. To do that we need to specify first the function we want to minimize and an interval to search over. We specify the interval as a vector with two elements, the lower bound and the upper bound. We will use a wide interval of [-100,+100]. We also need to specify if we are looking for a maximum or a minimum. We do that with the maximum
option and set it to FALSE
when looking for a minimum:
optimize(f, interval = c(-100, 100), maximum = FALSE)
$minimum
[1] 1
$objective
[1] -9
We can see that we get the same result as the plot and the analytic solution. The minimum value occurs at x=1 and the value of the function is -9 at that point.
If you want to maximize a function instead, we need to set maximum = TRUE
.
The optimize()
function returns a named list
. Suppose we assign the output of the optimize()
function to f_min
:
<- optimize(f, interval = c(-100, 100), maximum = FALSE)
f_min class(f_min)
[1] "list"
To extract the minimum from this list we can use f_min$minimum
. The $
works for extraction with named lists the same way as with dataframes. To extract the value of the function at the minimum, we can use f_min$objective
:
$minimum f_min
[1] 1
$objective f_min
[1] -9