## Jupyter Snippet CB2nd 02_minimize

Jupyter Snippet CB2nd 02_minimize

# 9.2. Minimizing a mathematical function

``````import numpy as np
import scipy as sp
import scipy.optimize as opt
import matplotlib.pyplot as plt
%matplotlib inline
``````
``````def f(x):
return 1 - np.sin(x) / x
``````
``````x = np.linspace(-20., 20., 1000)
y = f(x)
``````
``````fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(x, y)
``````

``````x0 = 3
xmin = opt.minimize(f, x0).x
``````
``````fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(x, y)
ax.scatter(x0, f(x0), marker='o', s=300)
ax.scatter(xmin, f(xmin), marker='v', s=300,
zorder=20)
ax.set_xlim(-20, 20)
``````

``````x0 = 10
xmin = opt.minimize(f, x0).x
``````
``````fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(x, y)
ax.scatter(x0, f(x0), marker='o', s=300)
ax.scatter(xmin, f(xmin), marker='v', s=300,
zorder=20)
ax.set_xlim(-20, 20)
``````

``````# We use 1000 iterations.
xmin = opt.basinhopping(f, x0, 1000).x
``````
``````fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(x, y)
ax.scatter(x0, f(x0), marker='o', s=300)
ax.scatter(xmin, f(xmin), marker='v', s=300,
zorder=20)
ax.set_xlim(-20, 20)
``````

``````def g(X):
# X is a 2*N matrix, each column contains
# x and y coordinates.
x, y = X
return (np.sin(3*np.pi*x)**2 +
(x-1)**2 * (1 + np.sin(3*np.pi*y)**2) +
(y-1)**2 * (1 + np.sin(2*np.pi*y)**2))
``````
``````n = 500
k = 10
X, Y = np.mgrid[-k:k:n * 1j,
-k:k:n * 1j]
``````
``````Z = g(np.vstack((X.ravel(), Y.ravel()))).reshape(n, n)
``````
``````fig, ax = plt.subplots(1, 1, figsize=(3, 3))
# We use a logarithmic scale for the color here.
ax.imshow(np.log(Z), cmap=plt.cm.hot_r,
extent=(-k, k, -k, k), origin=0)
ax.set_axis_off()
``````

``````# We use the Powell method.
x0, y0 = opt.minimize(g, (8, 3),
method='Powell').x
x0, y0
``````
``````(1.000, 1.000)
``````
``````fig, ax = plt.subplots(1, 1, figsize=(3, 3))
ax.imshow(np.log(Z), cmap=plt.cm.hot_r,
extent=(-k, k, -k, k), origin=0)
ax.scatter(x0, y0, s=100)
ax.set_axis_off()
``````