We exploreOptim package.

We will first load Optim and Gadfly package. Optim is to use optimize and Gadfly is to plot a graph.

Univariate

Here, I create a quartric function, a fourth-degree polynomial to test optimize function. From the graph that plots the quartric function, the minimum of the function should lie within the range of 0 and 5.

using Optim, Gadfly 
# univariate 
f1(x) = (x-1)*(x-2)*(x-3)*(x-4)
plot(1:10, x-> f(x))

Let’s test optimize.

optimize(f1, -10.0, 10.0)

Output looks as follows:

Results of Optimization Algorithm
 * Algorithm: Brent's Method
 * Search Interval: [-10.000000, 10.000000]
 * Minimizer: 3.618034e+00
 * Minimum: -1.000000e+00
 * Iterations: 14
 * Convergence: max(|x - x_upper|, |x - x_lower|) <= 2*(1.5e-08*|x|+2.2e-16): true
 * Objective Function Calls: 15

It used Brent’s Method as optimizing algorithm. It searched the minimizer from the search interval that I pre-specified, -10.0 and 10.0. The minimizer is approximately 3.6 and the minimum of the function is -1. The convergence reached with 14 iterations.

Multivariate

We can use optimize for optimizing multivariate function. For example, below I create \( f(x, y)= 1-x^2 - y^2+2x + 4y \). Note that x and y are stored for each element of vectior x below. Also note that optimize finds minimizer. Therefore, depending on how the function looks like, we may need to multiply the function by -1 to make it into a minimization problem. Original f(x,y) looks as follows:

Therefore as can be seen from below code, I’ve multiplied the function by -1 to make it into a minimization problem.

f2(x) =-1*( 1-x[1]^2-x[2]^2+2*x[1]+4*x[2])
x0=[0.0, 0.0]
res=optimize(f2, x0)
minimum(res)
Optim.minimizer(res)

Then output looks as follows:

-5.999999998433191

2-element Vector{Float64}:
 1.0000224551384378
 2.000032597159347

This implies that when x=1 and y=2, -f(x,y) reaches its minimum or in other words, f(x,y) reaches its maximum.

Reference

http://julianlsolvers.github.io/Optim.jl/v0.9.3/