Optimization (Part 4, Brent's search)

In [2]:
import pandas, numpy
import brent

import matplotlib.pyplot as plt
%matplotlib inline

plt.style.use('seaborn-whitegrid')

x (x - 2)

In [3]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

df1_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df2_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df3_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn1  = lambda x: x * (x - 2.0)
fn2  = lambda x: numpy.fabs(x * (x - 2.0))
fn3  = lambda x: (lambda x: 0.0 if x < 0.0 else x)(x * (x - 2.0))

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn1, -1.5, 20.1, e, 10000)
    df1 = df1.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn2, -20.1, 0.9, e, 10000)
    df2 = df2.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn3, -1.5, 20.1, e, 10000)
    df3 = df3.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)    
    
    st, xm, n, pn, gn = brent.optim(fn1, -1.5, 20.1, e, 10000)
    df1_ = df1_.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn2, -20.1, 0.9, e, 10000)
    df2_ = df2_.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn3, -1.5, 20.1, e, 10000)
    df3_ = df3_.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
In [4]:
df1
Out[4]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 6.750466 6.750465843002271e+00
1 0 1 5 3 2 1.000000 9.999999999999996e-01
2 0 0.1 5 3 2 1.000000 9.999999999999996e-01
3 0 1e-05 5 3 2 1.000000 9.999999999999996e-01
4 0 1e-08 5 3 2 1.000000 9.999999999999996e-01
5 0 1e-10 5 3 2 1.000000 9.999999999999996e-01
6 0 1e-12 5 3 2 1.000000 9.999999999999996e-01
7 0 1e-14 5 3 2 1.000000 9.999999999999996e-01
8 0 1e-15 5 3 2 1.000000 9.999999999999996e-01
9 0 5e-16 5 3 2 1.000000 9.999999999999996e-01
10 -1 1e-16 10000 3 9997 0.000000 0.000000000000000e+00
In [5]:
df1_
Out[5]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 6.750466 6.750465843002271e+00
1 0 1 5 3 2 1.000000 9.999999999999996e-01
2 0 0.1 5 3 2 1.000000 9.999999999999996e-01
3 0 1e-05 5 3 2 1.000000 9.999999999999996e-01
4 0 1e-08 5 3 2 1.000000 9.999999999999996e-01
5 0 1e-10 5 3 2 1.000000 9.999999999999996e-01
6 0 1e-12 5 3 2 1.000000 9.999999999999996e-01
7 0 1e-14 5 3 2 1.000000 9.999999999999996e-01
8 0 1e-15 5 3 2 1.000000 9.999999999999996e-01
9 0 5e-16 5 3 2 1.000000 9.999999999999996e-01
10 -1 1e-16 10000 3 9997 0.000000 0.000000000000000e+00
In [6]:
df2
Out[6]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 -7.121286e+00 -7.121286236252210e+00
1 0 1 6 0 6 1.767211e-01 1.767210712787059e-01
2 0 0.1 11 3 8 2.231541e-03 2.231540800105902e-03
3 0 1e-05 23 13 10 -5.189632e-07 -5.189632461187967e-07
4 0 1e-08 33 19 14 2.412586e-09 2.412585935687975e-09
5 0 1e-10 40 25 15 1.920852e-11 1.920851635654664e-11
6 0 1e-12 47 30 17 -4.199133e-14 -4.199132753806180e-14
7 0 1e-14 53 35 18 1.978002e-15 1.978001960335236e-15
8 0 1e-15 57 38 19 -6.555190e-17 -6.555190055990715e-17
9 0 5e-16 57 38 19 -6.555190e-17 -6.555190055990715e-17
10 0 1e-16 59 39 20 3.779855e-18 3.779855031060694e-18
In [7]:
df2_
Out[7]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 -7.121286e+00 -7.121286236252210e+00
1 0 1 6 0 6 1.767211e-01 1.767210712787059e-01
2 0 0.1 11 3 8 2.231541e-03 2.231540800105902e-03
3 0 1e-05 23 13 10 -5.189632e-07 -5.189632461187967e-07
4 0 1e-08 33 19 14 2.412586e-09 2.412585935687975e-09
5 0 1e-10 40 25 15 1.920852e-11 1.920851635654664e-11
6 0 1e-12 47 30 17 -4.199133e-14 -4.199132753806180e-14
7 0 1e-14 53 35 18 1.978002e-15 1.978001960335236e-15
8 0 1e-15 57 38 19 -6.555190e-17 -6.555190055990715e-17
9 0 5e-16 57 38 19 -6.555190e-17 -6.555190055990715e-17
10 0 1e-16 59 39 20 3.779855e-18 3.779855031060694e-18
In [8]:
df3
Out[8]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 6.750466 6.750465843002271e+00
1 0 1 5 3 2 1.130904 1.130904471872161e+00
2 0 0.1 6 3 3 1.080903 1.080903412896350e+00
3 0 1e-05 25 3 22 1.000009 1.000008653696862e+00
4 0 1e-08 40 3 37 1.000000 1.000000006344348e+00
5 0 1e-10 49 3 46 1.000000 1.000000000083463e+00
6 0 1e-12 59 3 56 1.000000 1.000000000000678e+00
7 0 1e-14 68 3 65 1.000000 1.000000000000008e+00
8 0 1e-15 73 3 70 1.000000 9.999999999999999e-01
9 0 5e-16 74 3 71 1.000000 9.999999999999996e-01
10 -1 1e-16 10000 3 9997 0.000000 0.000000000000000e+00
In [9]:
df3_
Out[9]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 6.750466 6.750465843002271e+00
1 0 1 5 3 2 1.130904 1.130904471872161e+00
2 0 0.1 6 3 3 1.080903 1.080903412896350e+00
3 0 1e-05 25 3 22 1.000009 1.000008653696862e+00
4 0 1e-08 40 3 37 1.000000 1.000000006344348e+00
5 0 1e-10 49 3 46 1.000000 1.000000000083463e+00
6 0 1e-12 59 3 56 1.000000 1.000000000000678e+00
7 0 1e-14 68 3 65 1.000000 1.000000000000008e+00
8 0 1e-15 73 3 70 1.000000 9.999999999999999e-01
9 0 5e-16 74 3 71 1.000000 9.999999999999996e-01
10 -1 1e-16 10000 3 9997 0.000000 0.000000000000000e+00
In [10]:
fig, ax = plt.subplots(3, 2, figsize=(40, 50), sharex='col', sharey='row')

x1 = numpy.linspace(-2.0, 7.0, 5000)
x2 = numpy.linspace(-2.0, 7.0, 5000)
x3 = numpy.linspace(-2.0, 7.0, 5000)

ax[0, 0].plot(x1, fn1(x1), color='black', linestyle='solid')
ax[0, 0].set(xlim=(-2.0, 7.0))
ax[0, 0].set_title('optim')
m00 = df1.loc[df1['status'] == 0]['xmin'].values
ax[0, 0].scatter(m00, fn1(m00), s= 40, color='red')

ax[0, 1].plot(x1, fn1(x1), color='black', linestyle='solid')
ax[0, 1].set(xlim=(-2.0, 7.0))
ax[0, 1].set_title('optim_')
m01 = df1_.loc[df1_['status'] == 0]['xmin'].values
ax[0, 1].scatter(m01, fn1(m01), s= 40, color='red')

ax[1, 0].plot(x2, fn2(x2), color='black', linestyle='solid')
ax[1, 0].set(xlim=(-2.0, 7.0))
ax[1, 0].set_title('optim')
m10 = df2.loc[df2['status'] == 0]['xmin'].values
ax[1, 0].scatter(m10, fn2(m10), s= 40, color='red')

ax[1, 1].plot(x2, fn2(x2), color='black', linestyle='solid')
ax[1, 1].set(xlim=(-2.0, 7.0))
ax[1, 1].set_title('optim_')
m11 = df2_.loc[df2_['status'] == 0]['xmin'].values
ax[1, 1].scatter(m11, fn2(m11), s= 40, color='red')

ax[2, 0].plot(x3, numpy.vectorize(fn3)(x3), color='black', linestyle='solid')
ax[2, 0].set(xlim=(-2.0, 7.0))
ax[2, 0].set_title('optim')
m20 = df3.loc[df3['status'] == 0]['xmin'].values
ax[2, 0].scatter(m20, numpy.vectorize(fn3)(m20), s= 40, color='red')

ax[2, 1].plot(x3, numpy.vectorize(fn3)(x3), color='black', linestyle='solid')
ax[2, 1].set(xlim=(-2.0, 7.0))
ax[2, 1].set_title('optim_')
m21 = df3_.loc[df3_['status'] == 0]['xmin'].values
ax[2, 1].scatter(m21, numpy.vectorize(fn3)(m21), s= 40, color='red')
Out[10]:
<matplotlib.collections.PathCollection at 0x7fe07af51ac8>

|x ^ 3|

In [11]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn = lambda x: numpy.fabs(x ** 3)

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn, -1.5, 20.1, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    st, xm, n, pn, gn = brent.optim_(fn, -1.5, 20.1, e, 10000)
    df_ = df_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
In [12]:
df
Out[12]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 6.750466e+00 6.750465843002271e+00
1 0 1 9 5 4 7.161482e-02 7.161482254445145e-02
2 0 0.1 11 7 4 9.611939e-03 9.611939465130538e-03
3 0 1e-05 21 17 4 9.518415e-07 9.518414567175423e-07
4 0 1e-08 28 24 4 -1.412201e-09 -1.412201053102113e-09
5 0 1e-10 33 29 4 1.406338e-11 1.406338406466596e-11
6 0 1e-12 38 34 4 -1.336898e-13 -1.336897864356291e-13
7 0 1e-14 43 39 4 1.263484e-15 1.263484214711275e-15
8 0 1e-15 46 42 4 -7.773172e-17 -7.773172212787402e-17
9 0 5e-16 46 42 4 -7.773172e-17 -7.773172212787402e-17
10 0 1e-16 48 44 4 -1.222641e-17 -1.222640857447610e-17
In [13]:
df_
Out[13]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 6.750466e+00 6.750465843002271e+00
1 0 1 438 435 3 2.354253e-65 2.354252604023816e-65
2 0 0.1 444 439 5 2.354253e-65 2.354252604023816e-65
3 0 1e-05 474 459 15 2.354253e-65 2.354252604023816e-65
4 0 1e-08 495 473 22 2.354253e-65 2.354252604023816e-65
5 0 1e-10 510 483 27 2.354253e-65 2.354252604023816e-65
6 0 1e-12 525 493 32 2.354253e-65 2.354252604023816e-65
7 0 1e-14 537 501 36 2.354253e-65 2.354252604023816e-65
8 0 1e-15 546 507 39 2.354253e-65 2.354252604023816e-65
9 0 5e-16 549 509 40 2.354253e-65 2.354252604023816e-65
10 0 1e-16 552 511 41 2.354253e-65 2.354252604023816e-65
In [14]:
fig, ax = plt.subplots(1, 2, figsize=(30, 10), sharex='col', sharey='row')

x = numpy.linspace(-1.5, 20.1, 5000)

ax[0].plot(x, fn(x), color='black', linestyle='solid')
ax[0].set(xlim=(-1.5, 20.1))

m0 = df.loc[df['status'] == 0]['xmin'].values

ax[0].scatter(m0, fn(m0), s= 40, color='red')
ax[0].set_title('optim')

ax[1].plot(x, fn(x), color='black', linestyle='solid')
ax[1].set(xlim=(-1.5, 20.1))

m1 = df_.loc[df_['status'] == 0]['xmin'].values

ax[1].scatter(m1, fn(m1), s= 40, color='red')
ax[1].set_title('optim_')
Out[14]:
Text(0.5, 1.0, 'optim_')

x (x - 2) (x - 3)

In [15]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', 'delta'])
df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

df1_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', 'delta'])
df2_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df3_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn1 = lambda x: x * (x - 2.0) * (x - 3.0)
fn2 = lambda x: numpy.fabs(x * (x - 2.0) * (x - 3.0))
fn3 = lambda x: (lambda x: 0.0 if x < 0.0 else x)(x * (x - 2.0) * (x - 3.0))

xmin = (5.0 + numpy.sqrt(7.0)) / 3.0

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn1, 1.1, 20.1, e, 10000)
    df1 = df1.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,),
                      'delta'           : numpy.fabs(xm - xmin)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn2, 1.1, 2.5, e, 10000)
    df2 = df2.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn3, 1.1, 20.1, e, 10000)
    df3 = df3.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)    

    st, xm, n, pn, gn = brent.optim(fn1, 1.1, 20.1, e, 10000)
    df1_ = df1_.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,),
                      'delta'           : numpy.fabs(xm - xmin)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn2, 1.1, 2.5, e, 10000)
    df2_ = df2_.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, pn, gn = brent.optim(fn3, 1.1, 20.1, e, 10000)
    df3_ = df3_.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'pn'              : pn,
                      'gn'              : gn,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)    
In [16]:
df1
Out[16]:
status eps n pn gn xmin str(xmin) delta
0 0 10 1 0 1 8.357354 8.357354213751996e+00 5.808770e+00
1 0 1 8 4 4 2.661377 2.661377134449123e+00 1.127934e-01
2 0 0.1 17 13 4 2.548584 2.548583768799707e+00 1.555156e-09
3 0 1e-05 17 13 4 2.548584 2.548583768799707e+00 1.555156e-09
4 0 1e-08 17 13 4 2.548584 2.548583768799707e+00 1.555156e-09
5 0 1e-10 24 13 11 2.548584 2.548583768940176e+00 1.414688e-09
6 0 1e-12 34 13 21 2.548584 2.548583768999374e+00 1.355490e-09
7 0 1e-14 43 13 30 2.548584 2.548583768998716e+00 1.356148e-09
8 0 1e-15 48 13 35 2.548584 2.548583768998720e+00 1.356144e-09
9 0 5e-16 48 13 35 2.548584 2.548583768998720e+00 1.356144e-09
10 -1 1e-16 10000 13 9987 0.000000 0.000000000000000e+00 2.548584e+00
In [17]:
df2
Out[17]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 1.634752 1.634752415750147e+00
1 0 1 0 0 0 1.634752 1.634752415750147e+00
2 0 0.1 4 2 2 1.977052 1.977052181955907e+00
3 0 1e-05 15 10 5 2.000003 2.000002776977096e+00
4 0 1e-08 23 18 5 2.000000 1.999999997142151e+00
5 0 1e-10 29 22 7 2.000000 1.999999999992864e+00
6 0 1e-12 35 26 9 2.000000 1.999999999999841e+00
7 0 1e-14 42 31 11 2.000000 2.000000000000001e+00
8 0 1e-15 45 34 11 2.000000 2.000000000000000e+00
9 0 5e-16 47 35 12 2.000000 2.000000000000000e+00
10 -1 1e-16 10000 35 9965 0.000000 0.000000000000000e+00
In [18]:
df3
Out[18]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 8.357354 8.357354213751996e+00
1 0 1 7 4 3 2.900627 2.900626613441252e+00
2 0 0.1 7 4 3 2.900627 2.900626613441252e+00
3 0 1e-05 24 4 20 2.872587 2.872587430041186e+00
4 0 1e-08 38 4 34 2.872580 2.872579585245678e+00
5 0 1e-10 48 4 44 2.872580 2.872579576004557e+00
6 0 1e-12 57 4 53 2.872580 2.872579575929802e+00
7 0 1e-14 67 4 63 2.872580 2.872579575928814e+00
8 0 1e-15 71 4 67 2.872580 2.872579575928806e+00
9 0 5e-16 72 4 68 2.872580 2.872579575928806e+00
10 -1 1e-16 10000 4 9996 0.000000 0.000000000000000e+00
In [19]:
df1_
Out[19]:
status eps n pn gn xmin str(xmin) delta
0 0 10 1 0 1 8.357354 8.357354213751996e+00 5.808770e+00
1 0 1 8 4 4 2.661377 2.661377134449123e+00 1.127934e-01
2 0 0.1 17 13 4 2.548584 2.548583768799707e+00 1.555156e-09
3 0 1e-05 17 13 4 2.548584 2.548583768799707e+00 1.555156e-09
4 0 1e-08 17 13 4 2.548584 2.548583768799707e+00 1.555156e-09
5 0 1e-10 24 13 11 2.548584 2.548583768940176e+00 1.414688e-09
6 0 1e-12 34 13 21 2.548584 2.548583768999374e+00 1.355490e-09
7 0 1e-14 43 13 30 2.548584 2.548583768998716e+00 1.356148e-09
8 0 1e-15 48 13 35 2.548584 2.548583768998720e+00 1.356144e-09
9 0 5e-16 48 13 35 2.548584 2.548583768998720e+00 1.356144e-09
10 -1 1e-16 10000 13 9987 0.000000 0.000000000000000e+00 2.548584e+00
In [20]:
df2_
Out[20]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 1.634752 1.634752415750147e+00
1 0 1 0 0 0 1.634752 1.634752415750147e+00
2 0 0.1 4 2 2 1.977052 1.977052181955907e+00
3 0 1e-05 15 10 5 2.000003 2.000002776977096e+00
4 0 1e-08 23 18 5 2.000000 1.999999997142151e+00
5 0 1e-10 29 22 7 2.000000 1.999999999992864e+00
6 0 1e-12 35 26 9 2.000000 1.999999999999841e+00
7 0 1e-14 42 31 11 2.000000 2.000000000000001e+00
8 0 1e-15 45 34 11 2.000000 2.000000000000000e+00
9 0 5e-16 47 35 12 2.000000 2.000000000000000e+00
10 -1 1e-16 10000 35 9965 0.000000 0.000000000000000e+00
In [21]:
df3_
Out[21]:
status eps n pn gn xmin str(xmin)
0 0 10 1 0 1 8.357354 8.357354213751996e+00
1 0 1 7 4 3 2.900627 2.900626613441252e+00
2 0 0.1 7 4 3 2.900627 2.900626613441252e+00
3 0 1e-05 24 4 20 2.872587 2.872587430041186e+00
4 0 1e-08 38 4 34 2.872580 2.872579585245678e+00
5 0 1e-10 48 4 44 2.872580 2.872579576004557e+00
6 0 1e-12 57 4 53 2.872580 2.872579575929802e+00
7 0 1e-14 67 4 63 2.872580 2.872579575928814e+00
8 0 1e-15 71 4 67 2.872580 2.872579575928806e+00
9 0 5e-16 72 4 68 2.872580 2.872579575928806e+00
10 -1 1e-16 10000 4 9996 0.000000 0.000000000000000e+00
In [22]:
fig, ax = plt.subplots(3, 2, figsize=(40, 40), sharex='col', sharey='row')

x1 = numpy.linspace(1.0, 3.5, 5000)
x2 = numpy.linspace(1.0, 3.5, 5000)
x3 = numpy.linspace(1.0, 3.5, 5000)

ax[0, 0].plot(x1, fn1(x1), color='black', linestyle='solid')
ax[0, 0].set(xlim=(1.0, 3.5), ylim=(-1.0, 0.0))
ax[0, 0].set_title('optim')
m00 = df1.loc[df1['status'] == 0]['xmin'].values
ax[0, 0].scatter(m00, fn1(m00), s= 40, color='red')

ax[0, 1].plot(x1, fn1(x1), color='black', linestyle='solid')
ax[0, 1].set(xlim=(1.0, 3.5))
ax[0, 1].set_title('optim_')
m01 = df1_.loc[df1_['status'] == 0]['xmin'].values
ax[0, 1].scatter(m01, fn1(m01), s= 40, color='red')

ax[1, 0].plot(x2, fn2(x2), color='black', linestyle='solid')
ax[1, 0].set(xlim=(1.0, 3.5))
ax[1, 0].set_title('optim')
m10 = df2.loc[df2['status'] == 0]['xmin'].values
ax[1, 0].scatter(m10, fn2(m10), s= 40, color='red')

ax[1, 1].plot(x2, fn2(x2), color='black', linestyle='solid')
ax[1, 1].set(xlim=(1.0, 3.5))
ax[1, 1].set_title('optim_')
m11 = df2_.loc[df2_['status'] == 0]['xmin'].values
ax[1, 1].scatter(m11, fn2(m11), s= 40, color='red')

ax[2, 0].plot(x3, numpy.vectorize(fn3)(x3), color='black', linestyle='solid')
ax[2, 0].set(xlim=(1.0, 3.5), ylim=(-0.1, 1.0))
ax[2, 0].set_title('optim')
m20 = df3.loc[df3['status'] == 0]['xmin'].values
ax[2, 0].scatter(m20, numpy.vectorize(fn3)(m20), s= 40, color='red')

ax[2, 1].plot(x3, numpy.vectorize(fn3)(x3), color='black', linestyle='solid')
ax[2, 1].set(xlim=(1.0, 3.5))
ax[2, 1].set_title('optim_')
m21 = df3_.loc[df3_['status'] == 0]['xmin'].values
ax[2, 1].scatter(m21, numpy.vectorize(fn3)(m21), s= 40, color='red')
Out[22]:
<matplotlib.collections.PathCollection at 0x7fe0795fb208>

|sin x ^ 2|

In [23]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - pi^0.5|'])
df1_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - pi^0.5|'])

df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - (2pi)^0.5|'])
df2_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - (2pi)^0.5|'])

df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df3_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn1 = lambda x: numpy.fabs(numpy.sin(x ** 2))
fn2 = lambda x: numpy.fabs(numpy.sin(x ** 2))
fn3 = lambda x: (lambda x: 0.0 if x < 0.0 else x)(numpy.sin(x ** 2))

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn1, 1.5, 2.0, e, 10000)
    df1 = df1.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,),
                     '|xmin - pi^0.5|' : '%.15e' % (numpy.fabs(xm - numpy.sqrt(numpy.pi)),)},
                   ignore_index=True)
    
    st, xm, n, pn, gn = brent.optim_(fn1, 1.5, 2.0, e, 10000)
    df1_ = df1_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,),
                       '|xmin - pi^0.5|' : '%.15e' % (numpy.fabs(xm - numpy.sqrt(numpy.pi)),)},
                     ignore_index=True)  
    
    st, xm, n, pn, gn = brent.optim(fn2, 2.3, 2.7, e, 10000)
    df2 = df2.append({'status'             : st,
                     'eps'                : e,
                     'n'                  : n,
                     'pn'                 : pn,
                     'gn'                 : gn,
                     'xmin'               : xm,
                     'str(xmin)'          : '%.15e' % (xm,),
                     '|xmin - (2pi)^0.5|' : '%.15e' % (numpy.fabs(xm - numpy.sqrt(2.0 * numpy.pi)),)},
                   ignore_index=True)
    
    st, xm, n, pn, gn = brent.optim_(fn2, 2.3, 2.7, e, 10000)
    df2_ = df2_.append({'status'             : st,
                       'eps'                : e,
                       'n'                  : n,
                       'pn'                 : pn,
                       'gn'                 : gn,
                       'xmin'               : xm,
                       'str(xmin)'          : '%.15e' % (xm,),
                       '|xmin - (2pi)^0.5|' : '%.15e' % (numpy.fabs(xm - numpy.sqrt(2.0 * numpy.pi)),)},
                     ignore_index=True)  
    
    st, xm, n, pn, gn = brent.optim(fn3, 1.5, 2.0, e, 10000)
    df3 = df3.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    
    st, xm, n, pn, gn = brent.optim_(fn3, 1.5, 2.0, e, 10000)
    df3_ = df3_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True) 
In [24]:
df1
Out[24]:
status eps n pn gn xmin str(xmin) |xmin - pi^0.5|
0 0 10 0 0 0 1.690983 1.690983005625053e+00 8.147084528046333e-02
1 0 1 0 0 0 1.690983 1.690983005625053e+00 8.147084528046333e-02
2 0 0.1 3 1 2 1.774903 1.774903282261449e+00 2.449431355932896e-03
3 0 1e-05 16 12 4 1.772453 1.772452782905502e+00 1.068000013537684e-06
4 0 1e-08 27 20 7 1.772454 1.772453850346569e+00 5.589473328626582e-10
5 0 1e-10 35 26 9 1.772454 1.772453850915308e+00 9.791945032588956e-12
6 0 1e-12 42 31 11 1.772454 1.772453850905432e+00 8.415490526658687e-14
7 0 1e-14 48 36 12 1.772454 1.772453850905516e+00 2.220446049250313e-16
8 0 5e-16 52 38 14 1.772454 1.772453850905516e+00 2.220446049250313e-16
9 -1 1e-16 10000 38 9962 0.000000 0.000000000000000e+00 1.772453850905516e+00
In [25]:
df2
Out[25]:
status eps n pn gn xmin str(xmin) |xmin - (2pi)^0.5|
0 0 10 0 0 0 2.452786 2.452786404500042e+00 5.384187013095820e-02
1 0 1 0 0 0 2.452786 2.452786404500042e+00 5.384187013095820e-02
2 0 0.1 2 0 2 2.547214 2.547213595499958e+00 4.058532086895772e-02
3 0 1e-05 13 10 3 2.506628 2.506627987195875e+00 2.874351254789076e-07
4 0 1e-08 23 19 4 2.506628 2.506628274302736e+00 3.282645266722284e-10
5 0 1e-10 29 24 5 2.506628 2.506628274650793e+00 1.979305608301729e-11
6 0 1e-12 34 28 6 2.506628 2.506628274631204e+00 2.033928581113287e-13
7 0 1e-14 40 32 8 2.506628 2.506628274630999e+00 8.881784197001252e-16
8 0 5e-16 45 35 10 2.506628 2.506628274631001e+00 4.440892098500626e-16
9 -1 1e-16 10000 35 9965 0.000000 0.000000000000000e+00 2.506628274631000e+00
In [26]:
df3
Out[26]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 1.690983 1.690983005625053e+00
1 0 1 0 0 0 1.690983 1.690983005625053e+00
2 0 0.1 3 1 2 1.845492 1.845491502812526e+00
3 0 1e-05 21 1 20 1.809023 1.809023307028033e+00
4 0 1e-08 35 1 34 1.809017 1.809017001863277e+00
5 0 1e-10 44 1 43 1.809017 1.809016994473461e+00
6 0 1e-12 54 1 53 1.809017 1.809016994375748e+00
7 0 1e-14 64 1 63 1.809017 1.809016994374954e+00
8 0 5e-16 69 1 68 1.809017 1.809016994374948e+00
9 -1 1e-16 10000 1 9999 0.000000 0.000000000000000e+00
In [27]:
df1_
Out[27]:
status eps n pn gn xmin str(xmin) |xmin - pi^0.5|
0 0 10 0 0 0 1.690983 1.690983005625053e+00 8.147084528046333e-02
1 0 1 0 0 0 1.690983 1.690983005625053e+00 8.147084528046333e-02
2 0 0.1 3 1 2 1.774903 1.774903282261449e+00 2.449431355932896e-03
3 0 1e-05 17 15 2 1.772453 1.772453436911577e+00 4.139939384639746e-07
4 0 1e-08 25 22 3 1.772454 1.772453850156010e+00 7.495062348539250e-10
5 0 1e-10 31 28 3 1.772454 1.772453850917076e+00 1.155986417700205e-11
6 0 1e-12 36 32 4 1.772454 1.772453850905460e+00 5.595524044110789e-14
7 0 1e-14 42 37 5 1.772454 1.772453850905517e+00 1.110223024625157e-15
8 0 5e-16 48 42 6 1.772454 1.772453850905516e+00 2.220446049250313e-16
9 -1 1e-16 10000 42 9958 0.000000 0.000000000000000e+00 1.772453850905516e+00
In [28]:
df2_
Out[28]:
status eps n pn gn xmin str(xmin) |xmin - (2pi)^0.5|
0 0 10 0 0 0 2.452786 2.452786404500042e+00 5.384187013095820e-02
1 0 1 0 0 0 2.452786 2.452786404500042e+00 5.384187013095820e-02
2 0 0.1 2 0 2 2.547214 2.547213595499958e+00 4.058532086895772e-02
3 0 1e-05 13 10 3 2.506628 2.506627987195875e+00 2.874351254789076e-07
4 0 1e-08 22 19 3 2.506628 2.506628275662220e+00 1.031219998282040e-09
5 0 1e-10 27 24 3 2.506628 2.506628274656137e+00 2.513633745593324e-11
6 0 1e-12 33 30 3 2.506628 2.506628274630935e+00 6.528111384795920e-14
7 0 1e-14 37 33 4 2.506628 2.506628274631001e+00 4.440892098500626e-16
8 0 5e-16 41 36 5 2.506628 2.506628274631001e+00 4.440892098500626e-16
9 -1 1e-16 10000 36 9964 0.000000 0.000000000000000e+00 2.506628274631000e+00
In [29]:
df3_
Out[29]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 1.690983 1.690983005625053e+00
1 0 1 0 0 0 1.690983 1.690983005625053e+00
2 0 0.1 3 1 2 1.845492 1.845491502812526e+00
3 0 1e-05 21 1 20 1.809023 1.809023307028033e+00
4 0 1e-08 35 1 34 1.809017 1.809017001863277e+00
5 0 1e-10 44 1 43 1.809017 1.809016994473461e+00
6 0 1e-12 54 1 53 1.809017 1.809016994375748e+00
7 0 1e-14 64 1 63 1.809017 1.809016994374954e+00
8 0 5e-16 69 1 68 1.809017 1.809016994374948e+00
9 -1 1e-16 10000 1 9999 0.000000 0.000000000000000e+00
In [30]:
fig, ax = plt.subplots(2, 2, figsize=(30, 10), sharex='col', sharey='row')

x  = numpy.linspace(0.5, 3.0, 6000)

ax[0, 0].plot(x, fn1(x), color='black', linestyle='solid')
ax[0, 0].set(xlim=(0.5, 3.0), ylim=(-0.1, 1.1), xlabel='x', ylabel='|sin x^2|')
ax[0, 0].set_title('optim')
m1 = df1.loc[df1['status'] == 0]['xmin'].values
ax[0, 0].scatter(m1, fn1(m1), s= 40, color='red')
m2 = df2.loc[df2['status'] == 0]['xmin'].values
ax[0, 0].scatter(m2, fn2(m2), s= 40, color='red')

ax[0, 1].plot(x, fn1(x), color='black', linestyle='solid')
ax[0, 1].set(xlim=(0.5, 3.0), ylim=(-0.1, 1.1), xlabel='x', ylabel='|sin x^2|')
ax[0, 1].set_title('optim_')
m1_ = df1_.loc[df1_['status'] == 0]['xmin'].values
ax[0, 1].scatter(m1_, fn1(m1_), s= 40, color='red')
m2_ = df2_.loc[df2_['status'] == 0]['xmin'].values
ax[0, 1].scatter(m2_, fn2(m2_), s= 40, color='red')

ax[1, 0].plot(x, numpy.vectorize(fn3)(x), color='black', linestyle='solid')
ax[1, 0].set(xlim=(0.5, 3.0), ylim=(-0.1, 1.1))
ax[1, 0].set_title('optim')
m3 = df3.loc[df3['status'] == 0]['xmin'].values
ax[1, 0].scatter(m3, numpy.vectorize(fn3)(m3), s= 40, color='red')

ax[1, 1].plot(x, numpy.vectorize(fn3)(x), color='black', linestyle='solid')
ax[1, 1].set(xlim=(0.5, 3.0), ylim=(-0.1, 1.1))
ax[1, 1].set_title('optim_')
m3_ = df3_.loc[df3_['status'] == 0]['xmin'].values
ax[1, 1].scatter(m3_, numpy.vectorize(fn3)(m3_), s= 40, color='red')
Out[30]:
<matplotlib.collections.PathCollection at 0x7fe0794dff98>

|e^{0.1 x} sin(x)|

In [31]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - pi|'])
df1_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - pi|'])

df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - 2pi|'])
df2_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)', '|xmin - 2pi|'])

df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df3_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn1 = lambda x: numpy.fabs(numpy.exp(0.1 * x) * numpy.sin(x))
fn2 = lambda x: numpy.fabs(numpy.exp(0.1 * x) * numpy.sin(x))
fn3 = lambda x: (lambda x: 0.0 if x < 0.0 else x)(numpy.exp(0.1 * x) * numpy.sin(x))

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn1, 2.0, 4.5, e, 10000)
    df1 = df1.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,),
                     '|xmin - pi|' : '%.15e' % (numpy.fabs(xm - numpy.pi),)},
                   ignore_index=True)
    
    st, xm, n, pn, gn = brent.optim_(fn1, 2.0, 4.5, e, 10000)
    df1_ = df1_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,),
                       '|xmin - pi|' : '%.15e' % (numpy.fabs(xm - numpy.pi),)},
                     ignore_index=True)  

    st, xm, n, pn, gn = brent.optim(fn2, 4.9, 7.5, e, 10000)
    df2 = df2.append({'status'             : st,
                     'eps'                : e,
                     'n'                  : n,
                     'pn'                 : pn,
                     'gn'                 : gn,
                     'xmin'               : xm,
                     'str(xmin)'          : '%.15e' % (xm,),
                     '|xmin - 2pi|' : '%.15e' % (numpy.fabs(xm - 2.0 * numpy.pi),)},
                   ignore_index=True)
    
    st, xm, n, pn, gn = brent.optim_(fn2, 4.9, 7.5, e, 10000)
    df2_ = df2_.append({'status'             : st,
                       'eps'                : e,
                       'n'                  : n,
                       'pn'                 : pn,
                       'gn'                 : gn,
                       'xmin'               : xm,
                       'str(xmin)'          : '%.15e' % (xm,),
                       '|xmin - 2pi|' : '%.15e' % (numpy.fabs(xm - 2.0 * numpy.pi),)},
                     ignore_index=True)  

    st, xm, n, pn, gn = brent.optim(fn3, 2.5, 7.5, e, 10000)
    df3 = df3.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    
    st, xm, n, pn, gn = brent.optim_(fn3, 2.5, 7.5, e, 10000)
    df3_ = df3_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)     
In [32]:
df1
Out[32]:
status eps n pn gn xmin str(xmin) |xmin - pi|
0 0 10 0 0 0 2.954915 2.954915028125263e+00 1.866776254645304e-01
1 0 1 1 0 1 2.954915 2.954915028125263e+00 1.866776254645304e-01
2 0 0.1 5 3 2 3.135767 3.135766957211675e+00 5.825696378118028e-03
3 0 1e-05 19 15 4 3.141592 3.141592382824757e+00 2.707650357258728e-07
4 0 1e-08 27 21 6 3.141593 3.141592654977387e+00 1.387594039670148e-09
5 0 1e-10 34 25 9 3.141593 3.141592653597307e+00 7.513545341453209e-12
6 0 1e-12 42 31 11 3.141593 3.141592653589748e+00 4.529709940470639e-14
7 0 1e-14 49 37 12 3.141593 3.141592653589792e+00 8.881784197001252e-16
8 0 5e-16 52 40 12 3.141593 3.141592653589793e+00 0.000000000000000e+00
9 -1 1e-16 10000 40 9960 0.000000 0.000000000000000e+00 3.141592653589793e+00
In [33]:
df2
Out[33]:
status eps n pn gn xmin str(xmin) |xmin - 2pi|
0 0 10 0 0 0 5.893112 5.893111629250273e+00 3.900736779293128e-01
1 0 1 1 0 1 6.506888 6.506888370749727e+00 2.237030635701407e-01
2 0 0.1 5 3 2 6.292361 6.292361052927991e+00 9.175745748404296e-03
3 0 1e-05 17 12 5 6.283184 6.283183754630675e+00 1.552548911654128e-06
4 0 1e-08 28 20 8 6.283185 6.283185306046819e+00 1.132766769273985e-09
5 0 1e-10 34 25 9 6.283185 6.283185307194098e+00 1.451194719948035e-11
6 0 1e-12 40 30 10 6.283185 6.283185307179771e+00 1.847411112976260e-13
7 0 1e-14 47 35 12 6.283185 6.283185307179587e+00 8.881784197001252e-16
8 -1 5e-16 10000 36 9964 0.000000 0.000000000000000e+00 6.283185307179586e+00
9 -1 1e-16 10000 36 9964 0.000000 0.000000000000000e+00 6.283185307179586e+00
In [34]:
df3
Out[34]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 4.409830 4.409830056250525e+00
1 0 1 3 1 2 5.000000 5.000000000000000e+00
2 0 0.1 7 1 6 4.495935 4.495934690622109e+00
3 0 1e-05 26 1 25 4.409839 4.409839266287255e+00
4 0 1e-08 41 1 40 4.409830 4.409830063002748e+00
5 0 1e-10 50 1 49 4.409830 4.409830056339355e+00
6 0 1e-12 60 1 59 4.409830 4.409830056251248e+00
7 0 1e-14 69 1 68 4.409830 4.409830056250535e+00
8 -1 5e-16 10000 1 9999 0.000000 0.000000000000000e+00
9 -1 1e-16 10000 1 9999 0.000000 0.000000000000000e+00
In [35]:
df1_
Out[35]:
status eps n pn gn xmin str(xmin) |xmin - pi|
0 0 10 0 0 0 2.954915 2.954915028125263e+00 1.866776254645304e-01
1 0 1 1 0 1 2.954915 2.954915028125263e+00 1.866776254645304e-01
2 0 0.1 5 3 2 3.135767 3.135766957211675e+00 5.825696378118028e-03
3 0 1e-05 18 14 4 3.141591 3.141591456264603e+00 1.197325190105403e-06
4 -1 1e-08 10000 9996 4 0.000000 0.000000000000000e+00 3.141592653589793e+00
5 -1 1e-10 10000 9996 4 0.000000 0.000000000000000e+00 3.141592653589793e+00
6 -1 1e-12 10000 9996 4 0.000000 0.000000000000000e+00 3.141592653589793e+00
7 -1 1e-14 10000 9996 4 0.000000 0.000000000000000e+00 3.141592653589793e+00
8 -1 5e-16 10000 9996 4 0.000000 0.000000000000000e+00 3.141592653589793e+00
9 -1 1e-16 10000 9996 4 0.000000 0.000000000000000e+00 3.141592653589793e+00
In [36]:
df2_
Out[36]:
status eps n pn gn xmin str(xmin) |xmin - 2pi|
0 0 10 0 0 0 5.893112 5.893111629250273e+00 3.900736779293128e-01
1 0 1 1 0 1 6.506888 6.506888370749727e+00 2.237030635701407e-01
2 0 0.1 5 3 2 6.292361 6.292361052927991e+00 9.175745748404296e-03
3 -1 1e-05 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
4 -1 1e-08 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
5 -1 1e-10 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
6 -1 1e-12 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
7 -1 1e-14 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
8 -1 5e-16 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
9 -1 1e-16 10000 9998 2 0.000000 0.000000000000000e+00 6.283185307179586e+00
In [37]:
df3_
Out[37]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 4.409830 4.409830056250525e+00
1 0 1 3 1 2 5.000000 5.000000000000000e+00
2 0 0.1 7 1 6 4.495935 4.495934690622109e+00
3 0 1e-05 26 1 25 4.409839 4.409839266287255e+00
4 0 1e-08 41 1 40 4.409830 4.409830063002748e+00
5 0 1e-10 50 1 49 4.409830 4.409830056339355e+00
6 0 1e-12 60 1 59 4.409830 4.409830056251248e+00
7 0 1e-14 69 1 68 4.409830 4.409830056250535e+00
8 -1 5e-16 10000 1 9999 0.000000 0.000000000000000e+00
9 -1 1e-16 10000 1 9999 0.000000 0.000000000000000e+00
In [38]:
fig, ax = plt.subplots(2, 2, figsize=(30, 10), sharex='col', sharey='row')

x  = numpy.linspace(2.5, 7.5, 6000)

ax[0, 0].plot(x, fn1(x), color='black', linestyle='solid')
ax[0, 0].set(xlim=(2.5, 7.5), ylim=(-0.1, 1.7), xlabel='x', ylabel='|sin x^2|')
ax[0, 0].set_title('optim')
m1 = df1.loc[df1['status'] == 0]['xmin'].values
ax[0, 0].scatter(m1, fn1(m1), s= 40, color='red')
m2 = df2.loc[df2['status'] == 0]['xmin'].values
ax[0, 0].scatter(m2, fn2(m2), s= 40, color='red')

ax[0, 1].plot(x, fn1(x), color='black', linestyle='solid')
ax[0, 1].set(xlim=(2.5, 7.5), ylim=(-0.1, 1.7), xlabel='x', ylabel='|sin x^2|')
ax[0, 1].set_title('optim_')
m1_ = df1_.loc[df1_['status'] == 0]['xmin'].values
ax[0, 1].scatter(m1_, fn1(m1_), s= 40, color='red')
m2_ = df2_.loc[df2_['status'] == 0]['xmin'].values
ax[0, 1].scatter(m2_, fn2(m2_), s= 40, color='red')

ax[1, 0].plot(x, numpy.vectorize(fn3)(x), color='black', linestyle='solid')
ax[1, 0].set(xlim=(2.5, 7.5), ylim=(-0.1, 1.7))
ax[1, 0].set_title('optim')
m3 = df3.loc[df3['status'] == 0]['xmin'].values
ax[1, 0].scatter(m3, numpy.vectorize(fn3)(m3), s= 40, color='red')

ax[1, 1].plot(x, numpy.vectorize(fn3)(x), color='black', linestyle='solid')
ax[1, 1].set(xlim=(2.5, 7.5), ylim=(-0.1, 1.7))
ax[1, 1].set_title('optim_')
m3_ = df3_.loc[df3_['status'] == 0]['xmin'].values
ax[1, 1].scatter(m3_, numpy.vectorize(fn3)(m3_), s= 40, color='red')
Out[38]:
<matplotlib.collections.PathCollection at 0x7fe0794297b8>

-5 x^5 + 4 x^4 -12 x^3 + 11 x^2 -2 x + 1 [-0.5, 0.5]

In [39]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn = lambda x: -5.0 * x**5 + 4.0 * x**4 - 12.0 * x**3 + 11.0 * x**2 - 2.0 * x + 1.0

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn, -0.5, 0.5, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    st, xm, n, pn, gn = brent.optim_(fn, -0.5, 0.5, e, 10000)
    df_ = df_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)    
In [40]:
df
Out[40]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 -0.118034 -1.180339887498949e-01
1 0 1 0 0 0 -0.118034 -1.180339887498949e-01
2 0 0.1 5 3 2 0.109841 1.098408947635083e-01
3 0 1e-05 10 8 2 0.109860 1.098599153130670e-01
4 0 1e-08 10 8 2 0.109860 1.098599153130670e-01
5 0 1e-10 12 8 4 0.109860 1.098599151605560e-01
6 0 1e-12 22 8 14 0.109860 1.098599150670654e-01
7 0 1e-14 32 8 24 0.109860 1.098599150663052e-01
8 0 1e-15 36 8 28 0.109860 1.098599150662999e-01
9 0 5e-16 38 8 30 0.109860 1.098599150662993e-01
10 0 1e-16 41 8 33 0.109860 1.098599150662991e-01
In [41]:
df_
Out[41]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 -0.118034 -1.180339887498949e-01
1 0 1 0 0 0 -0.118034 -1.180339887498949e-01
2 0 0.1 5 3 2 0.109841 1.098408947635083e-01
3 0 1e-05 10 8 2 0.109860 1.098599153130670e-01
4 0 1e-08 10 8 2 0.109860 1.098599153130670e-01
5 0 1e-10 12 8 4 0.109860 1.098599151605560e-01
6 0 1e-12 22 8 14 0.109860 1.098599150670654e-01
7 0 1e-14 32 8 24 0.109860 1.098599150663052e-01
8 0 1e-15 36 8 28 0.109860 1.098599150662999e-01
9 0 5e-16 38 8 30 0.109860 1.098599150662993e-01
10 0 1e-16 41 8 33 0.109860 1.098599150662991e-01
In [42]:
fig, ax = plt.subplots(1, 2, figsize=(30, 10), sharex='col', sharey='row')

x = numpy.linspace(-0.5, 0.5, 5000)

ax[0].plot(x, fn(x), color='black', linestyle='solid')
ax[0].set(xlim=(-0.7, 0.7))

m0 = df.loc[df['status'] == 0]['xmin'].values

ax[0].scatter(m0, fn(m0), s= 40, color='red')
ax[0].set_title('optim')

ax[1].plot(x, fn(x), color='black', linestyle='solid')
ax[1].set(xlim=(-0.7, 0.7))

m1 = df_.loc[df_['status'] == 0]['xmin'].values

ax[1].scatter(m1, fn(m1), s= 40, color='red')
ax[1].set_title('optim_')
Out[42]:
Text(0.5, 1.0, 'optim_')

- ln^2 (x - 2) + ln^2 (10 - x) - x ^ 0.2 [6, 9.9]

In [43]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn = lambda x: - numpy.log(x - 2.0) ** 2 + numpy.log(10.0 - x) ** 2 - numpy.power(x, 0.2)

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn, 6.0, 9.9, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    st, xm, n, pn, gn = brent.optim_(fn, 6.0, 9.9, e, 10000)
    df_ = df_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
In [44]:
df
Out[44]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 7.489667 7.489667443875410e+00
1 0 1 2 0 2 8.979335 8.979334887750820e+00
2 0 0.1 6 3 3 9.206058 9.206058166802496e+00
3 0 1e-05 10 7 3 9.206243 9.206243224575539e+00
4 0 1e-08 13 9 4 9.206243 9.206243224575539e+00
5 0 1e-10 20 11 9 9.206243 9.206243224716843e+00
6 0 1e-12 30 11 19 9.206243 9.206243224723568e+00
7 0 1e-14 39 11 28 9.206243 9.206243224723552e+00
8 -1 1e-15 10000 11 9989 0.000000 0.000000000000000e+00
9 -1 5e-16 10000 11 9989 0.000000 0.000000000000000e+00
10 -1 1e-16 10000 11 9989 0.000000 0.000000000000000e+00
In [45]:
df_
Out[45]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 7.489667 7.489667443875410e+00
1 0 1 2 0 2 8.979335 8.979334887750820e+00
2 0 0.1 6 3 3 9.206058 9.206058166802496e+00
3 0 1e-05 10 7 3 9.206243 9.206243224575539e+00
4 0 1e-08 13 9 4 9.206243 9.206243224575539e+00
5 0 1e-10 20 11 9 9.206243 9.206243224716843e+00
6 0 1e-12 30 11 19 9.206243 9.206243224723568e+00
7 0 1e-14 39 11 28 9.206243 9.206243224723552e+00
8 -1 1e-15 10000 11 9989 0.000000 0.000000000000000e+00
9 -1 5e-16 10000 11 9989 0.000000 0.000000000000000e+00
10 -1 1e-16 10000 11 9989 0.000000 0.000000000000000e+00
In [46]:
fig, ax = plt.subplots(1, 2, figsize=(30, 10), sharex='col', sharey='row')

x = numpy.linspace(6.0, 9.9, 5000)

ax[0].plot(x, fn(x), color='black', linestyle='solid')
ax[0].set(xlim=(6.0, 10.0))

m0 = df.loc[df['status'] == 0]['xmin'].values

ax[0].scatter(m0, fn(m0), s= 40, color='red')
ax[0].set_title('optim')

ax[1].plot(x, fn(x), color='black', linestyle='solid')
ax[1].set(xlim=(6.0, 10.0))

m1 = df_.loc[df_['status'] == 0]['xmin'].values

ax[1].scatter(m1, fn(m1), s= 40, color='red')
ax[1].set_title('optim_')
Out[46]:
Text(0.5, 1.0, 'optim_')

-3 x sin(0.75 x) + e^{-2 x} [0, 2pi]

In [47]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn = lambda x: - 3.0 * x * numpy.sin(0.75 * x) + numpy.exp(-2.0 * x)

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn, 0.0, 2.0 * numpy.pi, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    st, xm, n, pn, gn = brent.optim_(fn, 0.0, 2.0 * numpy.pi, e, 10000)
    df_ = df_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
In [48]:
df
Out[48]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 2.399963 2.399963229728653e+00
1 0 1 5 2 3 2.813048 2.813048141335586e+00
2 0 0.1 10 7 3 2.706476 2.706475582063684e+00
3 0 1e-05 11 8 3 2.706476 2.706475582063684e+00
4 0 1e-08 13 9 4 2.706476 2.706475582063684e+00
5 0 1e-10 23 13 10 2.706476 2.706475583373197e+00
6 0 1e-12 33 13 20 2.706476 2.706475583361293e+00
7 0 1e-14 43 13 30 2.706476 2.706475583360997e+00
8 0 1e-15 47 13 34 2.706476 2.706475583360997e+00
9 0 5e-16 48 13 35 2.706476 2.706475583360997e+00
10 -1 1e-16 10000 13 9987 0.000000 0.000000000000000e+00
In [49]:
df_
Out[49]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 2.399963 2.399963229728653e+00
1 0 1 5 3 2 2.705883 2.705883209283115e+00
2 0 0.1 9 7 2 2.706476 2.706475582063684e+00
3 0 1e-05 10 8 2 2.706476 2.706475582063684e+00
4 0 1e-08 12 10 2 2.706476 2.706475582063684e+00
5 -1 1e-10 10000 9998 2 0.000000 0.000000000000000e+00
6 -1 1e-12 10000 9998 2 0.000000 0.000000000000000e+00
7 -1 1e-14 10000 9998 2 0.000000 0.000000000000000e+00
8 -1 1e-15 10000 9998 2 0.000000 0.000000000000000e+00
9 -1 5e-16 10000 9998 2 0.000000 0.000000000000000e+00
10 -1 1e-16 10000 9998 2 0.000000 0.000000000000000e+00
In [50]:
fig, ax = plt.subplots(1, 2, figsize=(30, 10), sharex='col', sharey='row')

x = numpy.linspace(0.0, 2.0 * numpy.pi, 5000)

ax[0].plot(x, fn(x), color='black', linestyle='solid')
ax[0].set(xlim=(0.0, 2.0 * numpy.pi))

m0 = df.loc[df['status'] == 0]['xmin'].values

ax[0].scatter(m0, fn(m0), s= 40, color='red')
ax[0].set_title('optim')

ax[1].plot(x, fn(x), color='black', linestyle='solid')
ax[1].set(xlim=(0.0, 2.0 * numpy.pi))

m1 = df_.loc[df_['status'] == 0]['xmin'].values

ax[1].scatter(m1, fn(m1), s= 40, color='red')
ax[1].set_title('optim_')
Out[50]:
Text(0.5, 1.0, 'optim_')

e^{3 x} +5 e^{-2 x} [0, 1]

In [51]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn = lambda x: numpy.exp(3.0 * x) + 5.0 * numpy.exp(-2.0 * x)

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn, 0.0, 1.0, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    st, xm, n, pn, gn = brent.optim_(fn, 0.0, 1.0, e, 10000)
    df_ = df_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
In [52]:
df
Out[52]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 0.381966 3.819660112501051e-01
1 0 1 0 0 0 0.381966 3.819660112501051e-01
2 0 0.1 4 2 2 0.241031 2.410305779919080e-01
3 0 1e-05 9 7 2 0.240795 2.407945606574934e-01
4 0 1e-08 9 7 2 0.240795 2.407945606574934e-01
5 0 1e-10 11 7 4 0.240795 2.407945605302545e-01
6 0 1e-12 21 7 14 0.240795 2.407945604522558e-01
7 0 1e-14 30 7 23 0.240795 2.407945604516249e-01
8 0 1e-15 35 7 28 0.240795 2.407945604516172e-01
9 0 5e-16 36 7 29 0.240795 2.407945604516169e-01
10 0 1e-16 40 7 33 0.240795 2.407945604516165e-01
In [53]:
df_
Out[53]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 0.381966 3.819660112501051e-01
1 0 1 0 0 0 0.381966 3.819660112501051e-01
2 0 0.1 4 2 2 0.241031 2.410305779919080e-01
3 0 1e-05 9 7 2 0.240795 2.407945606574934e-01
4 0 1e-08 9 7 2 0.240795 2.407945606574934e-01
5 0 1e-10 11 7 4 0.240795 2.407945605302545e-01
6 0 1e-12 21 7 14 0.240795 2.407945604522558e-01
7 0 1e-14 30 7 23 0.240795 2.407945604516249e-01
8 0 1e-15 35 7 28 0.240795 2.407945604516172e-01
9 0 5e-16 36 7 29 0.240795 2.407945604516169e-01
10 0 1e-16 40 7 33 0.240795 2.407945604516165e-01
In [54]:
fig, ax = plt.subplots(1, 2, figsize=(30, 10), sharex='col', sharey='row')

x = numpy.linspace(0.0, 1.0, 5000)

ax[0].plot(x, fn(x), color='black', linestyle='solid')
ax[0].set(xlim=(0.0, 1.0))

m0 = df.loc[df['status'] == 0]['xmin'].values

ax[0].scatter(m0, fn(m0), s= 40, color='red')
ax[0].set_title('optim')

ax[1].plot(x, fn(x), color='black', linestyle='solid')
ax[1].set(xlim=(0.0, 1.0))

m1 = df_.loc[df_['status'] == 0]['xmin'].values

ax[1].scatter(m1, fn(m1), s= 40, color='red')
ax[1].set_title('optim_')
Out[54]:
Text(0.5, 1.0, 'optim_')

0.2 x ln x + (x - 2.3)^2 [0.5, 2.5]

In [55]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])
df_ = pandas.DataFrame(columns=['status', 'eps', 'n', 'pn', 'gn', 'xmin', 'str(xmin)'])

fn = lambda x: 0.2 * x * numpy.log(x) + (x - 2.3)**2

for e in [10, 1, 1e-1, 1e-5, 1e-8, 1e-10, 1e-12, 1e-14, 1e-15, 5e-16, 1e-16]:
    st, xm, n, pn, gn = brent.optim(fn, 0.5, 2.5, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'pn'              : pn,
                     'gn'              : gn,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
    st, xm, n, pn, gn = brent.optim_(fn, 0.5, 2.5, e, 10000)
    df_ = df_.append({'status'          : st,
                       'eps'             : e,
                       'n'               : n,
                       'pn'              : pn,
                       'gn'              : gn,
                       'xmin'            : xm,
                       'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
In [56]:
df
Out[56]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 1.263932 1.263932022500210e+00
1 0 1 1 0 1 1.736068 1.736067977499790e+00
2 0 0.1 8 6 2 2.124640 2.124639773065687e+00
3 0 1e-05 8 6 2 2.124640 2.124639773065687e+00
4 0 1e-08 9 6 3 2.124640 2.124639773065687e+00
5 0 1e-10 17 9 8 2.124640 2.124639773709835e+00
6 0 1e-12 26 9 17 2.124640 2.124639773692887e+00
7 0 1e-14 36 9 27 2.124640 2.124639773693136e+00
8 0 1e-15 40 9 31 2.124640 2.124639773693132e+00
9 0 5e-16 41 9 32 2.124640 2.124639773693132e+00
10 -1 1e-16 10000 9 9991 0.000000 0.000000000000000e+00
In [57]:
df_
Out[57]:
status eps n pn gn xmin str(xmin)
0 0 10 0 0 0 1.263932 1.263932022500210e+00
1 0 1 1 0 1 1.736068 1.736067977499790e+00
2 0 0.1 8 6 2 2.124640 2.124639773065687e+00
3 0 1e-05 8 6 2 2.124640 2.124639773065687e+00
4 0 1e-08 9 7 2 2.124640 2.124639773065687e+00
5 0 1e-10 17 9 8 2.124640 2.124639774207194e+00
6 0 1e-12 27 9 18 2.124640 2.124639774211909e+00
7 0 1e-14 36 9 27 2.124640 2.124639774211760e+00
8 0 1e-15 40 9 31 2.124640 2.124639774211762e+00
9 0 5e-16 42 9 33 2.124640 2.124639774211762e+00
10 -1 1e-16 10000 9 9991 0.000000 0.000000000000000e+00
In [58]:
fig, ax = plt.subplots(1, 2, figsize=(30, 10), sharex='col', sharey='row')

x = numpy.linspace(0.5, 2.5, 5000)

ax[0].plot(x, fn(x), color='black', linestyle='solid')
ax[0].set(xlim=(0.5, 2.5))

m0 = df.loc[df['status'] == 0]['xmin'].values

ax[0].scatter(m0, fn(m0), s= 40, color='red')
ax[0].set_title('optim')

ax[1].plot(x, fn(x), color='black', linestyle='solid')
ax[1].set(xlim=(0.5, 2.5))

m1 = df_.loc[df_['status'] == 0]['xmin'].values

ax[1].scatter(m1, fn(m1), s= 40, color='red')
ax[1].set_title('optim_')
Out[58]:
Text(0.5, 1.0, 'optim_')