We explore`Optim`

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.