Optimization: principles and algorithms

Bierlaire, M. (2015). Optimization: Principles and Algorithms. EPFL Press.
The numbering of the algorithms, tables and page refer to the book.

Chapter 15: Direct search method

Algorithm 15.1: Nelder-Mead

In [1]:
import numpy as np
from scipy import linalg
# Define a function simple to call for the inner product
def scalarInner(a,b):
    return(np.asscalar(a.T.dot(b)))
In [2]:
import optimizationExceptions

def nelderMead(obj,x0,eps=1.0e-5,maxiter=100):
    n,m = x0.shape
    x = x0
    it = 0
    if m != n+1: 
        raise OptimizationInputError("Incorrect size")
    iters=list()
    while True:  
        it = it + 1
        f = [obj(x[:,k]) for k in range(m)]
        ## Worst value
        worst = max(f)
        worstindex = np.argmax(f)
        xworst = x[:,[worstindex]]
        ## Best value
        best = min(f)
        bestindex = np.argmin(f) 
        tmp = f
        tmp[worstindex] = -np.inf
        secondworst = max(tmp)
        secondworstindex = np.argmax(tmp)
        xc = (np.sum(x,axis=1,keepdims=True) - xworst) / n
        d = xc - x[:,[worstindex]]
        xr = 2 * xc - xworst
        fxr = obj(xr) 
        if fxr < best:
          xe = 2 * xr - xc
          fxe = obj(xe)
          if fxe < fxr:
            xnew = xe
          else:
            xnew = xr 
        elif secondworst > fxr:
            xnew = xr
        elif fxr >= worst:
            xnew = 0.5 * (xworst + xc)
        else:
            xnew = 0.5 * (xr + xc)
        fxnew = obj(xnew)
        iters.append([x.copy(),xworst.copy(),xnew.copy(),xr])
        x[:,[worstindex]] = xnew
        if linalg.norm(d) < eps or it >= maxiter:
            break

    return x[:,bestindex],iters

Example 15.2, page 350

In [3]:
def f(x):
    f = 0.5 * x.item(0) * x.item(0) + 4.5 * x.item(1) * x.item(1)
    return f
In [4]:
x0 = np.array([[1, 2 , 1.1],[ 1, 1.1, 2]])
x0
(sol,iters) = nelderMead(f,x0)
sol
Out[4]:
array([-5.71073706e-06,  6.14849584e-08])

Table 15.1, page 352

In [5]:
for k in range(len(iters)):
    print("{}\t{:+E}\t{:+E}\t{:+E}\t{:+E}\t{:+E}".format(k+1,iters[k][0][0,0],iters[k][0][0,1],iters[k][0][0,2],iters[k][3].item(0),iters[k][2].item(0)))
    print("\t{:+E}\t{:+E}\t{:+E}\t{:+E}\t{:+E}".format(iters[k][0][1,0],iters[k][0][1,1],iters[k][0][1,2],iters[k][3].item(1),iters[k][2].item(1)))
    print("_________________________________________________________________________________________")
    print("\t{:+E}\t{:+E}\t{:+E}\t{:+E}\t{:+E}".format(f(iters[k][0][:,0]),f(iters[k][0][:,1]),f(iters[k][0][:,2]),f(iters[k][3]),f(iters[k][2])))
    print("_________________________________________________________________________________________")
   
    
1	+1.000000E+00	+2.000000E+00	+1.100000E+00	+1.900000E+00	+1.900000E+00
	+1.000000E+00	+1.100000E+00	+2.000000E+00	+1.000000E-01	+1.000000E-01
_________________________________________________________________________________________
	+5.000000E+00	+7.445000E+00	+1.860500E+01	+1.850000E+00	+1.850000E+00
_________________________________________________________________________________________
2	+1.000000E+00	+2.000000E+00	+1.900000E+00	+9.000000E-01	+9.000000E-01
	+1.000000E+00	+1.100000E+00	+1.000000E-01	-4.440892E-16	-4.440892E-16
_________________________________________________________________________________________
	+5.000000E+00	+7.445000E+00	+1.850000E+00	+4.050000E-01	+4.050000E-01
_________________________________________________________________________________________
3	+1.000000E+00	+9.000000E-01	+1.900000E+00	+1.800000E+00	+1.200000E+00
	+1.000000E+00	-4.440892E-16	+1.000000E-01	-9.000000E-01	+5.250000E-01
_________________________________________________________________________________________
	+5.000000E+00	+4.050000E-01	+1.850000E+00	+5.265000E+00	+1.960312E+00
_________________________________________________________________________________________
4	+1.200000E+00	+9.000000E-01	+1.900000E+00	+1.600000E+00	+1.300000E+00
	+5.250000E-01	-4.440892E-16	+1.000000E-01	-4.250000E-01	+2.875000E-01
_________________________________________________________________________________________
	+1.960312E+00	+4.050000E-01	+1.850000E+00	+2.092813E+00	+1.216953E+00
_________________________________________________________________________________________
5	+1.300000E+00	+9.000000E-01	+1.900000E+00	+3.000000E-01	+3.000000E-01
	+2.875000E-01	-4.440892E-16	+1.000000E-01	+1.875000E-01	+1.875000E-01
_________________________________________________________________________________________
	+1.216953E+00	+4.050000E-01	+1.850000E+00	+2.032031E-01	+2.032031E-01
_________________________________________________________________________________________
6	+1.300000E+00	+9.000000E-01	+3.000000E-01	-1.000000E-01	-1.000000E-01
	+2.875000E-01	-4.440892E-16	+1.875000E-01	-1.000000E-01	-1.000000E-01
_________________________________________________________________________________________
	+1.216953E+00	+4.050000E-01	+2.032031E-01	+5.000000E-02	+5.000000E-02
_________________________________________________________________________________________
7	-1.000000E-01	+9.000000E-01	+3.000000E-01	-7.000000E-01	-3.000000E-01
	-1.000000E-01	-4.440892E-16	+1.875000E-01	+8.750000E-02	+6.562500E-02
_________________________________________________________________________________________
	+5.000000E-02	+4.050000E-01	+2.032031E-01	+2.794531E-01	+6.437988E-02
_________________________________________________________________________________________
8	-1.000000E-01	-3.000000E-01	+3.000000E-01	-7.000000E-01	+5.000000E-02
	-1.000000E-01	+6.562500E-02	+1.875000E-01	-2.218750E-01	+8.515625E-02
_________________________________________________________________________________________
	+5.000000E-02	+6.437988E-02	+2.032031E-01	+4.665283E-01	+3.388214E-02
_________________________________________________________________________________________
9	-1.000000E-01	-3.000000E-01	+5.000000E-02	+2.500000E-01	+1.125000E-01
	-1.000000E-01	+6.562500E-02	+8.515625E-02	-8.046875E-02	-4.394531E-02
_________________________________________________________________________________________
	+5.000000E-02	+6.437988E-02	+3.388214E-02	+6.038849E-02	+1.501848E-02
_________________________________________________________________________________________
10	-1.000000E-01	+1.125000E-01	+5.000000E-02	+2.625000E-01	-9.375000E-03
	-1.000000E-01	-4.394531E-02	+8.515625E-02	+1.412109E-01	-3.969727E-02
_________________________________________________________________________________________
	+5.000000E-02	+1.501848E-02	+3.388214E-02	+1.241855E-01	+7.135373E-03
_________________________________________________________________________________________
11	-9.375000E-03	+1.125000E-01	+5.000000E-02	+5.312500E-02	+5.078125E-02
	-3.969727E-02	-4.394531E-02	+8.515625E-02	-1.687988E-01	+2.166748E-02
_________________________________________________________________________________________
	+7.135373E-03	+1.501848E-02	+3.388214E-02	+1.296298E-01	+3.402026E-03
_________________________________________________________________________________________
12	-9.375000E-03	+1.125000E-01	+5.078125E-02	-7.109375E-02	-7.109375E-02
	-3.969727E-02	-4.394531E-02	+2.166748E-02	+2.591553E-02	+2.591553E-02
_________________________________________________________________________________________
	+7.135373E-03	+1.501848E-02	+3.402026E-03	+5.549426E-03	+5.549426E-03
_________________________________________________________________________________________
13	-9.375000E-03	-7.109375E-02	+5.078125E-02	-1.093750E-02	-9.765625E-03
	-3.969727E-02	+2.591553E-02	+2.166748E-02	+8.728027E-02	-7.952881E-03
_________________________________________________________________________________________
	+7.135373E-03	+5.549426E-03	+3.402026E-03	+3.434012E-02	+3.323011E-04
_________________________________________________________________________________________
14	-9.765625E-03	-7.109375E-02	+5.078125E-02	+1.121094E-01	-2.529297E-02
	-7.952881E-03	+2.591553E-02	+2.166748E-02	-1.220093E-02	+1.638641E-02
_________________________________________________________________________________________
	+3.323011E-04	+5.549426E-03	+3.402026E-03	+6.954138E-03	+1.528183E-03
_________________________________________________________________________________________
15	-9.765625E-03	-2.529297E-02	+5.078125E-02	-8.583984E-02	+1.662598E-02
	-7.952881E-03	+1.638641E-02	+2.166748E-02	-1.323395E-02	+1.294212E-02
_________________________________________________________________________________________
	+3.323011E-04	+1.528183E-03	+3.402026E-03	+4.472358E-03	+8.919551E-04
_________________________________________________________________________________________
16	-9.765625E-03	-2.529297E-02	+1.662598E-02	+3.215332E-02	+1.779175E-02
	-7.952881E-03	+1.638641E-02	+1.294212E-02	-1.139717E-02	-4.451275E-03
_________________________________________________________________________________________
	+3.323011E-04	+1.528183E-03	+8.919551E-04	+1.101448E-03	+2.474355E-04
_________________________________________________________________________________________
17	-9.765625E-03	+1.779175E-02	+1.662598E-02	-8.599854E-03	+1.031952E-02
	-7.952881E-03	-4.451275E-03	+1.294212E-02	-2.534628E-02	+3.370023E-03
_________________________________________________________________________________________
	+3.323011E-04	+2.474355E-04	+8.919551E-04	+2.927931E-03	+1.043530E-04
_________________________________________________________________________________________
18	-9.765625E-03	+1.779175E-02	+1.031952E-02	+3.787689E-02	+2.145004E-03
	-7.952881E-03	-4.451275E-03	+3.370023E-03	+6.871629E-03	-4.246753E-03
_________________________________________________________________________________________
	+3.323011E-04	+2.474355E-04	+1.043530E-04	+9.298162E-04	+8.345764E-05
_________________________________________________________________________________________
19	+2.145004E-03	+1.779175E-02	+1.031952E-02	-5.327225E-03	-5.327225E-03
	-4.246753E-03	-4.451275E-03	+3.370023E-03	+3.574544E-03	+3.574544E-03
_________________________________________________________________________________________
	+8.345764E-05	+2.474355E-04	+1.043530E-04	+7.168781E-05	+7.168781E-05
_________________________________________________________________________________________
20	+2.145004E-03	-5.327225E-03	+1.031952E-02	-1.350174E-02	+4.364204E-03
	-4.246753E-03	+3.574544E-03	+3.370023E-03	-4.042232E-03	+1.516959E-03
_________________________________________________________________________________________
	+8.345764E-05	+7.168781E-05	+1.043530E-04	+1.646769E-04	+1.987838E-05
_________________________________________________________________________________________
21	+2.145004E-03	-5.327225E-03	+4.364204E-03	-3.108025E-03	+8.317471E-04
	-4.246753E-03	+3.574544E-03	+1.516959E-03	+9.338257E-03	-8.505009E-04
_________________________________________________________________________________________
	+8.345764E-05	+7.168781E-05	+1.987838E-05	+3.972436E-04	+3.600985E-06
_________________________________________________________________________________________
22	+8.317471E-04	-5.327225E-03	+4.364204E-03	+1.052318E-02	-1.364625E-03
	-8.505009E-04	+3.574544E-03	+1.516959E-03	-2.908086E-03	+1.953887E-03
_________________________________________________________________________________________
	+3.600985E-06	+7.168781E-05	+1.987838E-05	+9.342496E-05	+1.811063E-05
_________________________________________________________________________________________
23	+8.317471E-04	-1.364625E-03	+4.364204E-03	-4.897082E-03	-4.897082E-03
	-8.505009E-04	+1.953887E-03	+1.516959E-03	-4.135733E-04	-4.135733E-04
_________________________________________________________________________________________
	+3.600985E-06	+1.811063E-05	+1.987838E-05	+1.276040E-05	+1.276040E-05
_________________________________________________________________________________________
24	+8.317471E-04	-1.364625E-03	-4.897082E-03	-2.700710E-03	-1.698646E-03
	-8.505009E-04	+1.953887E-03	-4.135733E-04	-3.217961E-03	+6.609248E-04
_________________________________________________________________________________________
	+3.600985E-06	+1.811063E-05	+1.276040E-05	+5.024564E-05	+3.408396E-06
_________________________________________________________________________________________
25	+8.317471E-04	-1.698646E-03	-4.897082E-03	+4.030183E-03	+1.798367E-03
	-8.505009E-04	+6.609248E-04	-4.135733E-04	+2.239972E-04	+6.460455E-05
_________________________________________________________________________________________
	+3.600985E-06	+3.408396E-06	+1.276040E-05	+8.346974E-06	+1.635843E-06
_________________________________________________________________________________________
26	+8.317471E-04	-1.698646E-03	+1.798367E-03	-7.320262E-04	+4.408037E-04
	-8.505009E-04	+6.609248E-04	+6.460455E-05	+1.576030E-03	-2.438681E-04
_________________________________________________________________________________________
	+3.600985E-06	+3.408396E-06	+1.635843E-06	+1.144535E-05	+3.647765E-07
_________________________________________________________________________________________
27	+4.408037E-04	-1.698646E-03	+1.798367E-03	+3.937816E-03	-2.895304E-04
	-2.438681E-04	+6.609248E-04	+6.460455E-05	-8.401883E-04	+2.856465E-04
_________________________________________________________________________________________
	+3.647765E-07	+3.408396E-06	+1.635843E-06	+1.092982E-05	+4.090865E-07
_________________________________________________________________________________________
28	+4.408037E-04	-2.895304E-04	+1.798367E-03	-1.647093E-03	-7.857283E-04
	-2.438681E-04	+2.856465E-04	+6.460455E-05	-2.282620E-05	-9.685116E-07
_________________________________________________________________________________________
	+3.647765E-07	+4.090865E-07	+1.635843E-06	+1.358803E-06	+3.086887E-07
_________________________________________________________________________________________
29	+4.408037E-04	-2.895304E-04	-7.857283E-04	-5.539426E-05	-2.309963E-04
	-2.438681E-04	+2.856465E-04	-9.685116E-07	-5.304831E-04	+8.161408E-05
_________________________________________________________________________________________
	+3.647765E-07	+4.090865E-07	+3.086887E-07	+1.267890E-06	+5.665351E-08
_________________________________________________________________________________________
30	+4.408037E-04	-2.309963E-04	-7.857283E-04	-1.457528E-03	-3.377930E-05
	-2.438681E-04	+8.161408E-05	-9.685116E-07	+3.245137E-04	-1.017727E-04
_________________________________________________________________________________________
	+3.647765E-07	+5.665351E-08	+3.086887E-07	+1.536086E-06	+4.718007E-08
_________________________________________________________________________________________
31	-3.377930E-05	-2.309963E-04	-7.857283E-04	+5.209527E-04	+1.942824E-04
	-1.017727E-04	+8.161408E-05	-9.685116E-07	-1.919008E-05	-1.463469E-05
_________________________________________________________________________________________
	+4.718007E-08	+5.665351E-08	+3.086887E-07	+1.373530E-07	+1.983662E-08
_________________________________________________________________________________________
32	-3.377930E-05	-2.309963E-04	+1.942824E-04	+3.914995E-04	-7.537238E-05
	-1.017727E-04	+8.161408E-05	-1.463469E-05	-1.980214E-04	+1.170520E-05
_________________________________________________________________________________________
	+4.718007E-08	+5.665351E-08	+1.983662E-08	+2.530921E-07	+3.457051E-09
_________________________________________________________________________________________
33	-3.377930E-05	-7.537238E-05	+1.942824E-04	+1.526894E-04	+1.283786E-05
	-1.017727E-04	+1.170520E-05	-1.463469E-05	+9.884319E-05	-5.161871E-05
_________________________________________________________________________________________
	+4.718007E-08	+3.457051E-09	+1.983662E-08	+5.562191E-08	+1.207261E-08
_________________________________________________________________________________________
34	+1.283786E-05	-7.537238E-05	+1.942824E-04	-2.568170E-04	+8.150759E-05
	-5.161871E-05	+1.170520E-05	-1.463469E-05	-2.527882E-05	-1.729572E-05
_________________________________________________________________________________________
	+1.207261E-08	+3.457051E-09	+1.983662E-08	+3.585306E-08	+4.667883E-09
_________________________________________________________________________________________
35	+1.283786E-05	-7.537238E-05	+8.150759E-05	-6.702650E-06	-1.817522E-06
	-5.161871E-05	+1.170520E-05	-1.729572E-05	+4.602819E-05	+2.161646E-05
_________________________________________________________________________________________
	+1.207261E-08	+3.457051E-09	+4.667883E-09	+9.556136E-09	+2.104374E-09
_________________________________________________________________________________________
36	-1.817522E-06	-7.537238E-05	+8.150759E-05	-1.586975E-04	+2.145632E-05
	+2.161646E-05	+1.170520E-05	-1.729572E-05	+5.061739E-05	-3.174437E-07
_________________________________________________________________________________________
	+2.104374E-09	+3.457051E-09	+4.667883E-09	+2.412199E-08	+2.306403E-10
_________________________________________________________________________________________
37	-1.817522E-06	-7.537238E-05	+2.145632E-05	+9.501118E-05	-3.277649E-05
	+2.161646E-05	+1.170520E-05	-3.174437E-07	+9.593820E-06	+1.117736E-05
_________________________________________________________________________________________
	+2.104374E-09	+3.457051E-09	+2.306403E-10	+4.927748E-09	+1.099349E-09
_________________________________________________________________________________________
38	-1.817522E-06	-3.277649E-05	+2.145632E-05	-9.502647E-06	-9.502647E-06
	+2.161646E-05	+1.117736E-05	-3.174437E-07	-1.075655E-05	-1.075655E-05
_________________________________________________________________________________________
	+2.104374E-09	+1.099349E-09	+2.306403E-10	+5.658155E-10	+5.658155E-10
_________________________________________________________________________________________
39	-9.502647E-06	-3.277649E-05	+2.145632E-05	+4.473016E-05	-1.339983E-05
	-1.075655E-05	+1.117736E-05	-3.174437E-07	-2.225135E-05	+2.820179E-06
_________________________________________________________________________________________
	+5.658155E-10	+1.099349E-09	+2.306403E-10	+3.228446E-09	+1.255680E-10
_________________________________________________________________________________________
40	-9.502647E-06	-1.339983E-05	+2.145632E-05	+1.755914E-05	-2.737200E-06
	-1.075655E-05	+2.820179E-06	-3.174437E-07	+1.325929E-05	-4.752592E-06
_________________________________________________________________________________________
	+5.658155E-10	+1.255680E-10	+2.306403E-10	+9.453009E-10	+1.053882E-10
_________________________________________________________________________________________
41	-2.737200E-06	-1.339983E-05	+2.145632E-05	-3.759335E-05	+6.693904E-06
	-4.752592E-06	+2.820179E-06	-3.174437E-07	-1.614970E-06	-6.418253E-07
_________________________________________________________________________________________
	+1.053882E-10	+1.255680E-10	+2.306403E-10	+7.183665E-10	+2.425791E-11
_________________________________________________________________________________________
42	-2.737200E-06	-1.339983E-05	+6.693904E-06	+1.735653E-05	-5.710737E-06
	-4.752592E-06	+2.820179E-06	-6.418253E-07	-8.214597E-06	+6.148496E-08
_________________________________________________________________________________________
	+1.053882E-10	+1.255680E-10	+2.425791E-11	+4.542828E-10	+1.632327E-11
_________________________________________________________________________________________
43	-2.737200E-06	-5.710737E-06	+6.693904E-06	+3.720367E-06	+2.105975E-06
	-4.752592E-06	+6.148496E-08	-6.418253E-07	+4.172252E-06	+1.941041E-06
_________________________________________________________________________________________
	+1.053882E-10	+1.632327E-11	+2.425791E-11	+8.525516E-11	+1.917195E-11
_________________________________________________________________________________________

Figure 15.2 (a), page 350

In [6]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    return 0.5 * x * x + 4.5 * y * y
xmin = -0.1
xmax = 2.1
ymin = -0.1
ymax = 2.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
iter = 0
xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
xarrow = [iters[iter][1].item(0),iters[iter][2].item(0)]
yarrow = [iters[iter][1].item(1),iters[iter][2].item(1)]
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.plot(xarrow,yarrow,linewidth=3,color='b')
plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.show()

Figure 15.2 (b), page 350

In [7]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    return 0.5 * x * x + 4.5 * y * y
xmin = -0.1
xmax = 2.1
ymin = -0.1
ymax = 2.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
iter = 1
xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
xarrow = [iters[iter][1].item(0),iters[iter][2].item(0)]
yarrow = [iters[iter][1].item(1),iters[iter][2].item(1)]
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.plot(xarrow,yarrow,linewidth=3,color='b')
plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.show()

Figure 15.2 (c), page 350

In [8]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    return 0.5 * x * x + 4.5 * y * y
xmin = -0.1
xmax = 2.1
ymin = -0.1
ymax = 2.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
iter = 2
xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
xarrow = [iters[iter][1].item(0),iters[iter][2].item(0)]
yarrow = [iters[iter][1].item(1),iters[iter][2].item(1)]
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.plot(xarrow,yarrow,linewidth=3,color='b')
plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.show()

Figure 15.2 (d), page 350

In [9]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    return 0.5 * x * x + 4.5 * y * y
xmin = -0.1
xmax = 2.1
ymin = -0.1
ymax = 2.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
iter = 3
xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
xarrow = [iters[iter][1].item(0),iters[iter][2].item(0)]
yarrow = [iters[iter][1].item(1),iters[iter][2].item(1)]
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.plot(xarrow,yarrow,linewidth=3,color='b')
plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.show()

Figure 15.3 (a), page 351

In [10]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    return 0.5 * x * x + 4.5 * y * y
xmin = -0.5
xmax = 2.1
ymin = -0.2
ymax = 2.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
for iter in range(len(iters)):
    xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
    yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
    plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.show()

Figure 15.3 (b), page 351

In [11]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    return 0.5 * x * x + 4.5 * y * y
xmin = -0.2
xmax = 0.2
ymin = -0.1
ymax = 0.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
for iter in range(len(iters)):
    xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
    yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
    plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.show()

Example 15.3, page 352

In [12]:
def mckinnon(x):
    x1 = x.item(0)
    x2 = x.item(1)
    return (x1 <= 0) * (360 * x1 * x1 + x2 + x2 * x2) + (x1 > 0) * (6 * x1 * x1 + x2 + x2 * x2)
In [13]:
x0 = np.array([[1, (1+np.sqrt(33))/8 , 0],[ 1, (1-np.sqrt(33))/8, 0]])
x0
(sol,iters) = nelderMead(mckinnon,x0)
sol
Out[13]:
array([0., 0.])

Figure 15.4, page 353

In [14]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    res = (x <= 0) * (360 * x * x + y + y * y) + (x > 0) * (6 * x * x + y + y * y)
    return res
xmin = -0.2
xmax = 1.2
ymin = -0.7
ymax = 1.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
for iter in range(len(iters)):
    xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
    yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
    plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.show()

Figure 15.5 (a), page 354

In [15]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    res = (x <= 0) * (360 * x * x + y + y * y) + (x > 0) * (6 * x * x + y + y * y)
    return res
xmin = -0.5
xmax = 1.5
ymin = -2
ymax = 2
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
for iter in range(4):
    xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
    yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
    plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.show()

Figure 15.5 (b), page 354

In [16]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    res = (x <= 0) * (360 * x * x + y + y * y) + (x > 0) * (6 * x * x + y + y * y)
    return res
xmin = -0.1
xmax = 0.1
ymin = -0.1
ymax = 0.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
for iter in range(20,21):
    xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
    yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
    plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.show()
In [17]:
for k in range(len(iters)):
    print("{}\t{:+E}\t{:+E}\t{:+E}\t{:+E}\t{:+E}".format(k+1,iters[k][0][0,0],iters[k][0][0,1],iters[k][0][0,2],iters[k][3].item(0),iters[k][2].item(0)))
    print("\t{:+E}\t{:+E}\t{:+E}\t{:+E}\t{:+E}".format(iters[k][0][1,0],iters[k][0][1,1],iters[k][0][1,2],iters[k][3].item(1),iters[k][2].item(1)))
    print("_________________________________________________________________________________________")
    print("\t{:+E}\t{:+E}\t{:+E}\t{:+E}\t{:+E}".format(f(iters[k][0][:,0]),f(iters[k][0][:,1]),f(iters[k][0][:,2]),f(iters[k][3]),f(iters[k][2])))
    print("_________________________________________________________________________________________")
   
    
1	+1.000000E+00	+8.430703E-01	+0.000000E+00	-1.569297E-01	+7.107676E-01
	+1.000000E+00	-5.930703E-01	+0.000000E+00	-1.593070E+00	+3.517324E-01
_________________________________________________________________________________________
	+5.000000E+00	+1.938180E+00	+0.000000E+00	+1.143274E+01	+8.093159E-01
_________________________________________________________________________________________
2	+7.107676E-01	+8.430703E-01	+0.000000E+00	-1.323027E-01	+5.992271E-01
	+3.517324E-01	-5.930703E-01	+0.000000E+00	+9.448027E-01	-2.086021E-01
_________________________________________________________________________________________
	+8.093159E-01	+1.938180E+00	+0.000000E+00	+4.025687E+00	+3.753532E-01
_________________________________________________________________________________________
3	+7.107676E-01	+5.992271E-01	+0.000000E+00	-1.115405E-01	+5.051906E-01
	+3.517324E-01	-2.086021E-01	+0.000000E+00	-5.603345E-01	+1.237157E-01
_________________________________________________________________________________________
	+8.093159E-01	+3.753532E-01	+0.000000E+00	+1.419107E+00	+1.964838E-01
_________________________________________________________________________________________
4	+5.051906E-01	+5.992271E-01	+0.000000E+00	-9.403650E-02	+4.259112E-01
	+1.237157E-01	-2.086021E-01	+0.000000E+00	+3.323178E-01	-7.337211E-02
_________________________________________________________________________________________
	+1.964838E-01	+3.753532E-01	+0.000000E+00	+5.013793E-01	+1.149258E-01
_________________________________________________________________________________________
5	+5.051906E-01	+4.259112E-01	+0.000000E+00	-7.927939E-02	+3.590731E-01
	+1.237157E-01	-7.337211E-02	+0.000000E+00	-1.970878E-01	+4.351482E-02
_________________________________________________________________________________________
	+1.964838E-01	+1.149258E-01	+0.000000E+00	+1.779388E-01	+7.298766E-02
_________________________________________________________________________________________
6	+3.590731E-01	+4.259112E-01	+0.000000E+00	-6.683810E-02	+3.027239E-01
	+4.351482E-02	-7.337211E-02	+0.000000E+00	+1.168869E-01	-2.580735E-02
_________________________________________________________________________________________
	+7.298766E-02	+1.149258E-01	+0.000000E+00	+6.371516E-02	+4.881795E-02
_________________________________________________________________________________________
7	+3.590731E-01	+3.027239E-01	+0.000000E+00	-5.634922E-02	+2.552175E-01
	+4.351482E-02	-2.580735E-02	+0.000000E+00	-6.932217E-02	+1.530557E-02
_________________________________________________________________________________________
	+7.298766E-02	+4.881795E-02	+0.000000E+00	+2.321265E-02	+3.362216E-02
_________________________________________________________________________________________
8	+2.552175E-01	+3.027239E-01	+0.000000E+00	-4.750635E-02	+2.151663E-01
	+1.530557E-02	-2.580735E-02	+0.000000E+00	+4.111292E-02	-9.077281E-03
_________________________________________________________________________________________
	+3.362216E-02	+4.881795E-02	+0.000000E+00	+8.734652E-03	+2.351906E-02
_________________________________________________________________________________________
9	+2.552175E-01	+2.151663E-01	+0.000000E+00	-4.005120E-02	+1.814003E-01
	+1.530557E-02	-9.077281E-03	+0.000000E+00	-2.438285E-02	+5.383466E-03
_________________________________________________________________________________________
	+3.362216E-02	+2.351906E-02	+0.000000E+00	+3.477405E-03	+1.658346E-02
_________________________________________________________________________________________
10	+1.814003E-01	+2.151663E-01	+0.000000E+00	-3.376598E-02	+1.529332E-01
	+5.383466E-03	-9.077281E-03	+0.000000E+00	+1.446075E-02	-3.192774E-03
_________________________________________________________________________________________
	+1.658346E-02	+2.351906E-02	+0.000000E+00	+1.511080E-03	+1.174016E-02
_________________________________________________________________________________________
11	+1.814003E-01	+1.529332E-01	+0.000000E+00	-2.846709E-02	+1.289335E-01
	+5.383466E-03	-3.192774E-03	+0.000000E+00	-8.576240E-03	+1.893540E-03
_________________________________________________________________________________________
	+1.658346E-02	+1.174016E-02	+0.000000E+00	+7.361712E-04	+8.328055E-03
_________________________________________________________________________________________
12	+1.289335E-01	+1.529332E-01	+0.000000E+00	-2.399976E-02	+1.087000E-01
	+1.893540E-03	-3.192774E-03	+0.000000E+00	+5.086314E-03	-1.123002E-03
_________________________________________________________________________________________
	+8.328055E-03	+1.174016E-02	+0.000000E+00	+4.044119E-04	+5.913518E-03
_________________________________________________________________________________________
13	+1.289335E-01	+1.087000E-01	+0.000000E+00	-2.023349E-02	+9.164173E-02
	+1.893540E-03	-1.123002E-03	+0.000000E+00	-3.016542E-03	+6.660192E-04
_________________________________________________________________________________________
	+8.328055E-03	+5.913518E-03	+0.000000E+00	+2.456449E-04	+4.201100E-03
_________________________________________________________________________________________
14	+9.164173E-02	+1.087000E-01	+0.000000E+00	-1.705825E-02	+7.726042E-02
	+6.660192E-04	-1.123002E-03	+0.000000E+00	+1.789021E-03	-3.949963E-04
_________________________________________________________________________________________
	+4.201100E-03	+5.913518E-03	+0.000000E+00	+1.598947E-04	+2.985289E-03
_________________________________________________________________________________________
15	+9.164173E-02	+7.726042E-02	+0.000000E+00	-1.438131E-02	+6.513597E-02
	+6.660192E-04	-3.949963E-04	+0.000000E+00	-1.061015E-03	+2.342606E-04
_________________________________________________________________________________________
	+4.201100E-03	+2.985289E-03	+0.000000E+00	+1.084769E-04	+2.121594E-03
_________________________________________________________________________________________
16	+6.513597E-02	+7.726042E-02	+0.000000E+00	-1.212445E-02	+5.491421E-02
	+2.342606E-04	-3.949963E-04	+0.000000E+00	+6.292568E-04	-1.389330E-04
_________________________________________________________________________________________
	+2.121594E-03	+2.985289E-03	+0.000000E+00	+7.528302E-05	+1.507872E-03
_________________________________________________________________________________________
17	+6.513597E-02	+5.491421E-02	+0.000000E+00	-1.022177E-02	+4.629654E-02
	+2.342606E-04	-1.389330E-04	+0.000000E+00	-3.731935E-04	+8.239703E-05
_________________________________________________________________________________________
	+2.121594E-03	+1.507872E-03	+0.000000E+00	+5.286899E-05	+1.071715E-03
_________________________________________________________________________________________
18	+4.629654E-02	+5.491421E-02	+0.000000E+00	-8.617668E-03	+3.903124E-02
	+8.239703E-05	-1.389330E-04	+0.000000E+00	+2.213300E-04	-4.886724E-05
_________________________________________________________________________________________
	+1.071715E-03	+1.507872E-03	+0.000000E+00	+3.735254E-05	+7.617295E-04
_________________________________________________________________________________________
19	+4.629654E-02	+3.903124E-02	+0.000000E+00	-7.265300E-03	+3.290608E-02
	+8.239703E-05	-4.886724E-05	+0.000000E+00	-1.312643E-04	+2.898171E-05
_________________________________________________________________________________________
	+1.071715E-03	+7.617295E-04	+0.000000E+00	+2.646983E-05	+5.414088E-04
_________________________________________________________________________________________
20	+3.290608E-02	+3.903124E-02	+0.000000E+00	-6.125159E-03	+2.774214E-02
	+2.898171E-05	-4.886724E-05	+0.000000E+00	+7.784894E-05	-1.718819E-05
_________________________________________________________________________________________
	+5.414088E-04	+7.617295E-04	+0.000000E+00	+1.878606E-05	+3.848144E-04
_________________________________________________________________________________________
21	+3.290608E-02	+2.774214E-02	+0.000000E+00	-5.163940E-03	+2.338857E-02
	+2.898171E-05	-1.718819E-05	+0.000000E+00	-4.616990E-05	+1.019381E-05
_________________________________________________________________________________________
	+5.414088E-04	+3.848144E-04	+0.000000E+00	+1.334273E-05	+2.735131E-04
_________________________________________________________________________________________
22	+2.338857E-02	+2.774214E-02	+0.000000E+00	-4.353565E-03	+1.971821E-02
	+1.019381E-05	-1.718819E-05	+0.000000E+00	+2.738200E-05	-6.045644E-06
_________________________________________________________________________________________
	+2.735131E-04	+3.848144E-04	+0.000000E+00	+9.480136E-06	+1.944041E-04
_________________________________________________________________________________________
23	+2.338857E-02	+1.971821E-02	+0.000000E+00	-3.670361E-03	+1.662384E-02
	+1.019381E-05	-6.045644E-06	+0.000000E+00	-1.623945E-05	+3.585492E-06
_________________________________________________________________________________________
	+2.735131E-04	+1.944041E-04	+0.000000E+00	+6.736962E-06	+1.381761E-04
_________________________________________________________________________________________
24	+1.662384E-02	+1.971821E-02	+0.000000E+00	-3.094373E-03	+1.401507E-02
	+3.585492E-06	-6.045644E-06	+0.000000E+00	+9.631136E-06	-2.126449E-06
_________________________________________________________________________________________
	+1.381761E-04	+1.944041E-04	+0.000000E+00	+4.787988E-06	+9.821106E-05
_________________________________________________________________________________________
25	+1.662384E-02	+1.401507E-02	+0.000000E+00	-2.608774E-03	+1.181569E-02
	+3.585492E-06	-2.126449E-06	+0.000000E+00	-5.711941E-06	+1.261134E-06
_________________________________________________________________________________________
	+1.381761E-04	+9.821106E-05	+0.000000E+00	+3.402997E-06	+6.980523E-05
_________________________________________________________________________________________
26	+1.181569E-02	+1.401507E-02	+0.000000E+00	-2.199380E-03	+9.961455E-03
	+1.261134E-06	-2.126449E-06	+0.000000E+00	+3.387583E-06	-7.479410E-07
_________________________________________________________________________________________
	+6.980523E-05	+9.821106E-05	+0.000000E+00	+2.418687E-06	+4.961529E-05
_________________________________________________________________________________________
27	+1.181569E-02	+9.961455E-03	+0.000000E+00	-1.854232E-03	+8.398207E-03
	+1.261134E-06	-7.479410E-07	+0.000000E+00	-2.009075E-06	+4.435816E-07
_________________________________________________________________________________________
	+6.980523E-05	+4.961529E-05	+0.000000E+00	+1.719106E-06	+3.526494E-05
_________________________________________________________________________________________
28	+8.398207E-03	+9.961455E-03	+0.000000E+00	-1.563248E-03	+7.080279E-03
	+4.435816E-07	-7.479410E-07	+0.000000E+00	+1.191523E-06	-2.630751E-07
_________________________________________________________________________________________
	+3.526494E-05	+4.961529E-05	+0.000000E+00	+1.221878E-06	+2.506518E-05
_________________________________________________________________________________________
29	+8.398207E-03	+7.080279E-03	+0.000000E+00	-1.317928E-03	+5.969173E-03
	+4.435816E-07	-2.630751E-07	+0.000000E+00	-7.066567E-07	+1.560220E-07
_________________________________________________________________________________________
	+3.526494E-05	+2.506518E-05	+0.000000E+00	+8.684691E-07	+1.781551E-05
_________________________________________________________________________________________
30	+5.969173E-03	+7.080279E-03	+0.000000E+00	-1.111106E-03	+5.032433E-03
	+1.560220E-07	-2.630751E-07	+0.000000E+00	+4.190971E-07	-9.253204E-08
_________________________________________________________________________________________
	+1.781551E-05	+2.506518E-05	+0.000000E+00	+6.172789E-07	+1.266269E-05
_________________________________________________________________________________________
31	+5.969173E-03	+5.032433E-03	+0.000000E+00	-9.367404E-04	+4.242695E-03
	+1.560220E-07	-9.253204E-08	+0.000000E+00	-2.485541E-07	+5.487801E-08
_________________________________________________________________________________________
	+1.781551E-05	+1.266269E-05	+0.000000E+00	+4.387415E-07	+9.000230E-06
_________________________________________________________________________________________
32	+4.242695E-03	+5.032433E-03	+0.000000E+00	-7.897380E-04	+3.576890E-03
	+5.487801E-08	-9.253204E-08	+0.000000E+00	+1.474101E-07	-3.254652E-08
_________________________________________________________________________________________
	+9.000230E-06	+1.266269E-05	+0.000000E+00	+3.118432E-07	+6.397071E-06
_________________________________________________________________________________________
33	+4.242695E-03	+3.576890E-03	+0.000000E+00	-6.658047E-04	+3.015570E-03
	+5.487801E-08	-3.254652E-08	+0.000000E+00	-8.742453E-08	+1.930237E-08
_________________________________________________________________________________________
	+9.000230E-06	+6.397071E-06	+0.000000E+00	+2.216480E-07	+4.546831E-06
_________________________________________________________________________________________
34	+3.015570E-03	+3.576890E-03	+0.000000E+00	-5.613202E-04	+2.542338E-03
	+1.930237E-08	-3.254652E-08	+0.000000E+00	+5.184889E-08	-1.144767E-08
_________________________________________________________________________________________
	+4.546831E-06	+6.397071E-06	+0.000000E+00	+1.575402E-07	+3.231740E-06
_________________________________________________________________________________________
35	+3.015570E-03	+2.542338E-03	+0.000000E+00	-4.732324E-04	+2.143369E-03
	+1.930237E-08	-1.144767E-08	+0.000000E+00	-3.075004E-08	+6.789271E-09
_________________________________________________________________________________________
	+4.546831E-06	+3.231740E-06	+0.000000E+00	+1.119745E-07	+2.297016E-06
_________________________________________________________________________________________
36	+2.143369E-03	+2.542338E-03	+0.000000E+00	-3.989682E-04	+1.807011E-03
	+6.789271E-09	-1.144767E-08	+0.000000E+00	+1.823694E-08	-4.026515E-09
_________________________________________________________________________________________
	+2.297016E-06	+3.231740E-06	+0.000000E+00	+7.958781E-08	+1.632645E-06
_________________________________________________________________________________________
37	+2.143369E-03	+1.807011E-03	+0.000000E+00	-3.363582E-04	+1.523437E-03
	+6.789271E-09	-4.026515E-09	+0.000000E+00	-1.081579E-08	+2.388007E-09
_________________________________________________________________________________________
	+2.297016E-06	+1.632645E-06	+0.000000E+00	+5.656843E-08	+1.160431E-06
_________________________________________________________________________________________
38	+1.523437E-03	+1.807011E-03	+0.000000E+00	-2.835737E-04	+1.284365E-03
	+2.388007E-09	-4.026515E-09	+0.000000E+00	+6.414522E-09	-1.416256E-09
_________________________________________________________________________________________
	+1.160431E-06	+1.632645E-06	+0.000000E+00	+4.020701E-08	+8.247966E-07
_________________________________________________________________________________________
39	+1.523437E-03	+1.284365E-03	+0.000000E+00	-2.390725E-04	+1.082810E-03
	+2.388007E-09	-1.416256E-09	+0.000000E+00	-3.804263E-09	+8.399394E-10
_________________________________________________________________________________________
	+1.160431E-06	+8.247966E-07	+0.000000E+00	+2.857784E-08	+5.862387E-07
_________________________________________________________________________________________
40	+1.082810E-03	+1.284365E-03	+0.000000E+00	-2.015550E-04	+9.128849E-04
	+8.399394E-10	-1.416256E-09	+0.000000E+00	+2.256195E-09	-4.981431E-10
_________________________________________________________________________________________
	+5.862387E-07	+8.247966E-07	+0.000000E+00	+2.031220E-08	+4.166795E-07
_________________________________________________________________________________________
41	+1.082810E-03	+9.128849E-04	+0.000000E+00	-1.699250E-04	+7.696262E-04
	+8.399394E-10	-4.981431E-10	+0.000000E+00	-1.338082E-09	+2.954339E-10
_________________________________________________________________________________________
	+5.862387E-07	+4.166795E-07	+0.000000E+00	+1.443725E-08	+2.961623E-07
_________________________________________________________________________________________
42	+7.696262E-04	+9.128849E-04	+0.000000E+00	-1.432587E-04	+6.488490E-04
	+2.954339E-10	-4.981431E-10	+0.000000E+00	+7.935770E-10	-1.752131E-10
_________________________________________________________________________________________
	+2.961623E-07	+4.166795E-07	+0.000000E+00	+1.026153E-08	+2.105025E-07
_________________________________________________________________________________________
43	+7.696262E-04	+6.488490E-04	+0.000000E+00	-1.207772E-04	+5.470254E-04
	+2.954339E-10	-1.752131E-10	+0.000000E+00	-4.706470E-10	+1.039137E-10
_________________________________________________________________________________________
	+2.961623E-07	+2.105025E-07	+0.000000E+00	+7.293564E-09	+1.496184E-07
_________________________________________________________________________________________
44	+5.470254E-04	+6.488490E-04	+0.000000E+00	-1.018237E-04	+4.611809E-04
	+1.039137E-10	-1.752131E-10	+0.000000E+00	+2.791268E-10	-6.162812E-11
_________________________________________________________________________________________
	+1.496184E-07	+2.105025E-07	+0.000000E+00	+5.184029E-09	+1.063439E-07
_________________________________________________________________________________________
45	+5.470254E-04	+4.611809E-04	+0.000000E+00	-8.584451E-05	+3.888079E-04
	+1.039137E-10	-6.162812E-11	+0.000000E+00	-1.655418E-10	+3.654981E-11
_________________________________________________________________________________________
	+1.496184E-07	+1.063439E-07	+0.000000E+00	+3.684640E-09	+7.558579E-08
_________________________________________________________________________________________
46	+3.888079E-04	+4.611809E-04	+0.000000E+00	-7.237296E-05	+3.277924E-04
	+3.654981E-11	-6.162812E-11	+0.000000E+00	+9.817793E-11	-2.167661E-11
_________________________________________________________________________________________
	+7.558579E-08	+1.063439E-07	+0.000000E+00	+2.618923E-09	+5.372393E-08
_________________________________________________________________________________________
47	+3.888079E-04	+3.277924E-04	+0.000000E+00	-6.101549E-05	+2.763520E-04
	+3.654981E-11	-2.167661E-11	+0.000000E+00	-5.822642E-11	+1.285575E-11
_________________________________________________________________________________________
	+7.558579E-08	+5.372393E-08	+0.000000E+00	+1.861445E-09	+3.818523E-08
_________________________________________________________________________________________
48	+2.763520E-04	+3.277924E-04	+0.000000E+00	-5.144035E-05	+2.329842E-04
	+1.285575E-11	-2.167661E-11	+0.000000E+00	+3.453236E-11	-7.624366E-12
_________________________________________________________________________________________
	+3.818523E-08	+5.372393E-08	+0.000000E+00	+1.323055E-09	+2.714082E-08
_________________________________________________________________________________________
49	+2.763520E-04	+2.329842E-04	+0.000000E+00	-4.336784E-05	+1.964221E-04
	+1.285575E-11	-7.624366E-12	+0.000000E+00	-2.048012E-11	+4.521785E-12
_________________________________________________________________________________________
	+3.818523E-08	+2.714082E-08	+0.000000E+00	+9.403846E-10	+1.929082E-08
_________________________________________________________________________________________
50	+1.964221E-04	+2.329842E-04	+0.000000E+00	-3.656214E-05	+1.655976E-04
	+4.521785E-12	-7.624366E-12	+0.000000E+00	+1.214615E-11	-2.681737E-12
_________________________________________________________________________________________
	+1.929082E-08	+2.714082E-08	+0.000000E+00	+6.683949E-10	+1.371129E-08
_________________________________________________________________________________________
51	+1.964221E-04	+1.655976E-04	+0.000000E+00	-3.082445E-05	+1.396104E-04
	+4.521785E-12	-2.681737E-12	+0.000000E+00	-7.203522E-12	+1.590458E-12
_________________________________________________________________________________________
	+1.929082E-08	+1.371129E-08	+0.000000E+00	+4.750734E-10	+9.745538E-09
_________________________________________________________________________________________
52	+1.396104E-04	+1.655976E-04	+0.000000E+00	-2.598718E-05	+1.177014E-04
	+1.590458E-12	-2.681737E-12	+0.000000E+00	+4.272195E-12	-9.432537E-13
_________________________________________________________________________________________
	+9.745538E-09	+1.371129E-08	+0.000000E+00	+3.376668E-10	+6.926813E-09
_________________________________________________________________________________________
53	+1.396104E-04	+1.177014E-04	+0.000000E+00	-2.190902E-05	+9.923058E-05
	+1.590458E-12	-9.432537E-13	+0.000000E+00	-2.533712E-12	+5.594158E-13
_________________________________________________________________________________________
	+9.745538E-09	+6.926813E-09	+0.000000E+00	+2.400026E-10	+4.923354E-09
_________________________________________________________________________________________
54	+9.923058E-05	+1.177014E-04	+0.000000E+00	-1.847085E-05	+8.365836E-05
	+5.594158E-13	-9.432537E-13	+0.000000E+00	+1.502669E-12	-3.317729E-13
_________________________________________________________________________________________
	+4.923354E-09	+6.926813E-09	+0.000000E+00	+1.705861E-10	+3.499360E-09
_________________________________________________________________________________________
55	+9.923058E-05	+8.365836E-05	+0.000000E+00	-1.557222E-05	+7.052988E-05
	+5.594158E-13	-3.317729E-13	+0.000000E+00	-8.911887E-13	+1.967647E-13
_________________________________________________________________________________________
	+4.923354E-09	+3.499360E-09	+0.000000E+00	+1.212470E-10	+2.487232E-09
_________________________________________________________________________________________
56	+7.052988E-05	+8.365836E-05	+0.000000E+00	-1.312848E-05	+5.946165E-05
	+1.967647E-13	-3.317729E-13	+0.000000E+00	+5.285376E-13	-1.166953E-13
_________________________________________________________________________________________
	+2.487232E-09	+3.499360E-09	+0.000000E+00	+8.617847E-11	+1.767844E-09
_________________________________________________________________________________________
57	+7.052988E-05	+5.946165E-05	+0.000000E+00	-1.106823E-05	+5.013035E-05
	+1.967647E-13	-1.166953E-13	+0.000000E+00	-3.134599E-13	+6.920851E-14
_________________________________________________________________________________________
	+2.487232E-09	+1.767844E-09	+0.000000E+00	+6.125286E-11	+1.256526E-09
_________________________________________________________________________________________
58	+5.013035E-05	+5.946165E-05	+0.000000E+00	-9.331297E-06	+4.226341E-05
	+6.920851E-14	-1.166953E-13	+0.000000E+00	+1.859038E-13	-4.104551E-14
_________________________________________________________________________________________
	+1.256526E-09	+1.767844E-09	+0.000000E+00	+4.353655E-11	+8.930980E-10
_________________________________________________________________________________________
59	+5.013035E-05	+4.226341E-05	+0.000000E+00	-7.866939E-06	+3.563103E-05
	+6.920851E-14	-4.104551E-14	+0.000000E+00	-1.102540E-13	+2.434288E-14
_________________________________________________________________________________________
	+1.256526E-09	+8.930980E-10	+0.000000E+00	+3.094437E-11	+6.347851E-10
_________________________________________________________________________________________
60	+3.563103E-05	+4.226341E-05	+0.000000E+00	-6.632383E-06	+3.003946E-05
	+2.434288E-14	-4.104551E-14	+0.000000E+00	+6.538839E-14	-1.443704E-14
_________________________________________________________________________________________
	+6.347851E-10	+8.930980E-10	+0.000000E+00	+2.199425E-11	+4.511847E-10
_________________________________________________________________________________________
61	+3.563103E-05	+3.003946E-05	+0.000000E+00	-5.591565E-06	+2.532538E-05
	+2.434288E-14	-1.443704E-14	+0.000000E+00	-3.877991E-14	+8.562179E-15
_________________________________________________________________________________________
	+6.347851E-10	+4.511847E-10	+0.000000E+00	+1.563280E-11	+3.206874E-10
_________________________________________________________________________________________
62	+2.532538E-05	+3.003946E-05	+0.000000E+00	-4.714083E-06	+2.135108E-05
	+8.562179E-15	-1.443704E-14	+0.000000E+00	+2.299922E-14	-5.077974E-15
_________________________________________________________________________________________
	+3.206874E-10	+4.511847E-10	+0.000000E+00	+1.111129E-11	+2.279342E-10
_________________________________________________________________________________________
63	+2.532538E-05	+2.135108E-05	+0.000000E+00	-3.974303E-06	+1.800046E-05
	+8.562179E-15	-5.077974E-15	+0.000000E+00	-1.364015E-14	+3.011596E-15
_________________________________________________________________________________________
	+3.206874E-10	+2.279342E-10	+0.000000E+00	+7.897544E-12	+1.620083E-10
_________________________________________________________________________________________
64	+1.800046E-05	+2.135108E-05	+0.000000E+00	-3.350617E-06	+1.517565E-05
	+3.011596E-15	-5.077974E-15	+0.000000E+00	+8.089570E-15	-1.786088E-15
_________________________________________________________________________________________
	+1.620083E-10	+2.279342E-10	+0.000000E+00	+5.613318E-12	+1.151502E-10
_________________________________________________________________________________________
65	+1.800046E-05	+1.517565E-05	+0.000000E+00	-2.824806E-06	+1.279414E-05
	+3.011596E-15	-1.786088E-15	+0.000000E+00	-4.797684E-15	+1.059276E-15
_________________________________________________________________________________________
	+1.620083E-10	+1.151502E-10	+0.000000E+00	+3.989765E-12	+8.184504E-11
_________________________________________________________________________________________
66	+1.279414E-05	+1.517565E-05	+0.000000E+00	-2.381510E-06	+1.078636E-05
	+1.059276E-15	-1.786088E-15	+0.000000E+00	+2.845364E-15	-6.282252E-16
_________________________________________________________________________________________
	+8.184504E-11	+1.151502E-10	+0.000000E+00	+2.835795E-12	+5.817280E-11
_________________________________________________________________________________________

Algorithm 15.2: Torczon's multi-directional method

In [18]:
def torczon(obj,x0,eps=1.0e-5,maxiter=100):
    x = x0
    n,m = x0.shape
    x = x0
    it = 0
    if m != n+1: 
        raise OptimizationInputError("Incorrect size")
    iters=list()
    while True:  
        it = it + 1
        f = [obj(x[:,k]) for k in range(m)]
        ## Worst value
        worst = max(f)
        worstindex = np.argmax(f)
        xworst = x[:,[worstindex]]
        ## Best value
        best = min(f)
        bestindex = np.argmin(f) 
        xbest = x[:,[bestindex]]
        d = xworst - xbest 
  
        iterOutput = [x.copy(),xbest.copy(),best]
        ## Reflexion
        xr = np.empty(x.shape)
        for k in range(m):
            if k != bestindex:
                xr[:,[k]] = 2 * xbest - x[:,[k]]
            else:
                xr[:,[k]] = xbest                
        fr = [obj(xr[:,k]) for k in range(m)]
        
        ## Best value
        bestr = min(fr)
        bestrindex = np.argmin(fr) 

        if  bestr >= best:
            ## Contraction
            for k in range(m):
                if k != bestindex:
                    x[:,[k]] = 0.5 * (xbest + x[:,[k]])
            status = "C"
        else:

            ## Expansion
            xe = np.empty(x.shape)
            for k in range(m):
                if k == bestindex:
                    xe[:,[k]] = xbest
                else:
                    xe[:,[k]] = 3 * xbest - 2 * x[:,[k]]
            fe = [obj(xe[:,k]) for k in range(m)]
            ## Best value
            beste = min(fe)
            besteindex = np.argmin(fe) 
    
            if beste >= bestr:
                x = xr
                status = "R"
            else:
                x = xe
                status = "E"
        iters.append(iterOutput + [status])
        if linalg.norm(d) < eps or it >= maxiter:
            break
    return x[:,[bestindex]],iters
In [19]:
x0 = np.array([[1, (1+np.sqrt(33))/8 , 0],[ 1, (1-np.sqrt(33))/8, 0]])
print(x0)
(sol,iters) = torczon(mckinnon,x0)
sol
[[ 1.          0.84307033  0.        ]
 [ 1.         -0.59307033  0.        ]]
Out[19]:
array([[ 5.12295925e-06],
       [-5.00001308e-01]])
In [20]:
print("(x1)1\t\t(x1)2\t\tf(x1)\t\tStatus")
for k in range(len(iters)):
    print("{:+E}\t{:+E}\t{:+E}\t{}".format(iters[k][1].item(0),iters[k][1].item(1),iters[k][2],iters[k][3]))
     
(x1)1		(x1)2		f(x1)		Status
+0.000000E+00	+0.000000E+00	+0.000000E+00	C
+0.000000E+00	+0.000000E+00	+0.000000E+00	C
+0.000000E+00	+0.000000E+00	+0.000000E+00	C
+1.053838E-01	-7.413379E-02	-2.003511E-03	E
+6.615137E-02	-4.724014E-01	-2.229823E-01	C
+6.615137E-02	-4.724014E-01	-2.229823E-01	C
+6.615137E-02	-4.724014E-01	-2.229823E-01	R
+3.651374E-03	-5.349014E-01	-2.487019E-01	C
+3.651374E-03	-5.349014E-01	-2.487019E-01	C
+3.651374E-03	-5.349014E-01	-2.487019E-01	C
+3.651374E-03	-5.349014E-01	-2.487019E-01	C
+3.651374E-03	-5.349014E-01	-2.487019E-01	R
+3.581306E-04	-5.325847E-01	-2.489375E-01	E
+1.584144E-03	-5.201388E-01	-2.495794E-01	R
+2.810157E-03	-5.076930E-01	-2.498934E-01	C
+2.810157E-03	-5.076930E-01	-2.498934E-01	R
+3.423163E-03	-5.014700E-01	-2.499275E-01	C
+1.470038E-03	-5.034232E-01	-2.499753E-01	R
-1.765836E-04	-5.022648E-01	-2.499836E-01	R
+1.299197E-04	-4.991534E-01	-2.499992E-01	C
-2.333193E-05	-5.007091E-01	-2.499993E-01	C
+5.329388E-05	-4.999312E-01	-2.500000E-01	C
+5.329388E-05	-4.999312E-01	-2.500000E-01	C
+5.329388E-05	-4.999312E-01	-2.500000E-01	C
+4.371566E-05	-5.000285E-01	-2.500000E-01	C
+1.798719E-05	-5.000104E-01	-2.500000E-01	C
+1.798719E-05	-5.000104E-01	-2.500000E-01	R
+5.122959E-06	-5.000013E-01	-2.500000E-01	C
+5.122959E-06	-5.000013E-01	-2.500000E-01	C

Figure 15.7, page 357

In [21]:
%matplotlib inline
import matplotlib.pyplot as plt
def theFunctionToPlot(x,y):
    res = (x <= 0) * (360 * x * x + y + y * y) + (x > 0) * (6 * x * x + y + y * y)
    return res
xmin = -0.5
xmax = 1.2
ymin = -1.1
ymax = 1.1
xlist = np.linspace(xmin,xmax,100)
ylist = np.linspace(ymin,ymax,100)
X,Y = np.meshgrid(xlist,ylist)
Z = theFunctionToPlot(X,Y)
plt.contour(X,Y,Z,50)
for iter in range(len(iters)):
    xiter = [iters[iter][0][:,k].item(0) for k in range(3)]+[iters[iter][0][:,0].item(0)]
    yiter = [iters[iter][0][:,k].item(1) for k in range(3)]+[iters[iter][0][:,0].item(1)]
    plt.plot(xiter,yiter, linewidth=5, color='r',marker='o',mfc='blue')
plt.xlim([xmin,xmax])
plt.ylim([ymin,ymax])
plt.show()