Optimization (Part 6, Golden search)

In [40]:
import pandas, numpy
import golden

import matplotlib.pyplot as plt
%matplotlib inline

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

x (x - 2)

In [41]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)'])
df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)'])
df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn1, -1.5, 20.1, e, 10000)
    df1 = df1.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'en'              : en,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, en = golden.optim(fn2, -20.1, 0.9, e, 10000)
    df2 = df2.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'en'              : en,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, en = golden.optim(fn3, -1.5, 20.1, e, 10000)
    df3 = df3.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'en'              : en,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)  
In [42]:
df1
Out[42]:
status eps n en xmin str(xmin)
0 0 10 1 1.0 5.174767 5.174767078498865e+00
1 0 1 5 5.0 0.677562 6.775621365124915e-01
2 0 0.1 10 10.0 0.995264 9.952641705988002e-01
3 0 1e-05 29 29.0 1.000001 1.000000760058491e+00
4 0 1e-08 44 44.0 1.000000 1.000000004899969e+00
5 0 1e-10 53 53.0 1.000000 1.000000007383613e+00
6 0 1e-12 63 63.0 1.000000 1.000000007449978e+00
7 0 1e-14 72 72.0 1.000000 1.000000007450573e+00
8 0 1e-15 77 77.0 1.000000 1.000000007450580e+00
9 0 5e-16 79 79.0 1.000000 1.000000007450581e+00
10 -2 1e-16 80 82.0 0.000000 0.000000000000000e+00
In [43]:
df2
Out[43]:
status eps n en xmin str(xmin)
0 0 10 1 1.0 -5.589357e+00 -5.589356881873897e+00
1 0 1 5 5.0 -4.678441e-02 -4.678440936947947e-02
2 0 0.1 10 10.0 -1.417540e-02 -1.417539921048971e-02
3 0 1e-05 29 29.0 -4.110432e-07 -4.110432173378970e-07
4 0 1e-08 44 44.0 -6.230600e-10 -6.230599660567082e-10
5 0 1e-10 53 53.0 1.424456e-11 1.424456061173656e-11
6 0 1e-12 63 63.0 2.361773e-13 2.361773134154066e-13
7 0 1e-14 72 72.0 -3.260849e-15 -3.260849262957531e-15
8 0 1e-15 77 77.0 -1.874575e-16 -1.874575353243656e-16
9 0 5e-16 79 79.0 -6.352477e-17 -6.352477476990648e-17
10 0 1e-16 82 82.0 3.115143e-17 3.115142965449587e-17
In [44]:
df3
Out[44]:
status eps n en xmin str(xmin)
0 0 10 1 1.0 5.174767 5.174767078498865e+00
1 0 1 5 5.0 1.421506 1.421506177482965e+00
2 0 0.1 10 10.0 1.914830 1.914829576694194e+00
3 0 1e-05 29 29.0 2.000002 2.000002160362198e+00
4 0 1e-08 44 44.0 2.000000 1.999999994541888e+00
5 0 1e-10 53 53.0 2.000000 1.999999999914306e+00
6 0 1e-12 63 63.0 2.000000 1.999999999999392e+00
7 0 1e-14 72 72.0 2.000000 1.999999999999993e+00
8 0 1e-15 77 77.0 2.000000 2.000000000000000e+00
9 0 5e-16 79 79.0 2.000000 2.000000000000000e+00
10 -2 1e-16 79 82.0 0.000000 0.000000000000000e+00
In [45]:
fig, ax = plt.subplots(3, 1, figsize=(30, 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].plot(x1, fn1(x1), color='black', linestyle='solid')
ax[0].set(xlim=(-2.0, 7.0))
m0 = df1.loc[df1['status'] == 0]['xmin'].values
ax[0].scatter(m0, fn1(m0), s= 40, color='red')

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

ax[2].plot(x3, numpy.vectorize(fn3)(x3), color='black', linestyle='solid')
ax[2].set(xlim=(-2.0, 7.0))
m2 = df3.loc[df3['status'] == 0]['xmin'].values
ax[2].scatter(m2, numpy.vectorize(fn3)(m2), s= 40, color='red')
Out[45]:
<matplotlib.collections.PathCollection at 0x7f1c15eac7f0>

|x ^ 3|

In [46]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn, -1.5, 20.1, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [47]:
df
Out[47]:
status eps n en xmin str(xmin)
0 0 10 1 1.0 5.174767e+00 5.174767078498865e+00
1 0 1 5 5.0 -5.261646e-01 -5.261646075056784e-01
2 0 0.1 10 10.0 -3.284121e-02 -3.284120829444966e-02
3 0 1e-05 29 29.0 -5.074792e-06 -5.074792226156675e-06
4 0 1e-08 44 44.0 -1.765102e-09 -1.765102024210050e-09
5 0 1e-10 53 53.0 -4.894611e-11 -4.894611031293296e-11
6 0 1e-12 63 63.0 -3.905151e-13 -3.905150758409104e-13
7 0 1e-14 72 72.0 -4.004574e-15 -4.004574196126575e-15
8 0 1e-15 77 77.0 2.366905e-16 2.366905305438668e-16
9 0 5e-16 79 79.0 1.092308e-16 1.092308214356956e-16
10 0 1e-16 82 82.0 1.186027e-17 1.186026806940185e-17
In [48]:
fig, ax = plt.subplots(1, 1, figsize=(10, 5), sharex='col', sharey='row')

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

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

m = df['xmin'].values

ax.scatter(m, fn(m), s= 40, color='red')
Out[48]:
<matplotlib.collections.PathCollection at 0x7f1c15f7d518>

x (x - 2) (x - 3)

In [49]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)', 'delta'])
df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)'])
df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn1, 1.1, 20.1, e, 10000)
    df1 = df1.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'en'              : en,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,),
                      'delta'           : numpy.fabs(xm - xmin)},
                     ignore_index=True)
    st, xm, n, en = golden.optim(fn2, 1.1, 2.5, e, 10000)
    df2 = df2.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'en'              : en,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)
    st, xm, n, en = golden.optim(fn3, 1.1, 20.1, e, 10000)
    df3 = df3.append({'status'          : st,
                      'eps'             : e,
                      'n'               : n,
                      'en'              : en,
                      'xmin'            : xm,
                      'str(xmin)'       : '%.15e' % (xm,)},
                     ignore_index=True)   
In [50]:
df1
Out[50]:
status eps n en xmin str(xmin) delta
0 0 10 0 -0.0 10.600000 1.060000000000000e+01 8.051416e+00
1 0 1 5 5.0 3.015448 3.015448175635988e+00 4.668644e-01
2 0 0.1 10 10.0 2.581506 2.581506296700184e+00 3.292253e-02
3 0 1e-05 29 29.0 2.548585 2.548584791155009e+00 1.020800e-06
4 0 1e-08 43 43.0 2.548584 2.548583771420466e+00 1.065602e-09
5 0 1e-10 53 53.0 2.548584 2.548583772144820e+00 1.789956e-09
6 0 1e-12 63 63.0 2.548584 2.548583772132946e+00 1.778083e-09
7 0 1e-14 72 72.0 2.548584 2.548583772133135e+00 1.778272e-09
8 0 1e-15 77 77.0 2.548584 2.548583772133134e+00 1.778270e-09
9 -2 5e-16 77 78.0 0.000000 0.000000000000000e+00 2.548584e+00
10 -2 1e-16 77 82.0 0.000000 0.000000000000000e+00 2.548584e+00
In [51]:
df2
Out[51]:
status eps n en xmin str(xmin)
0 0 10 0 -5.0 1.800000 1.800000000000000e+00
1 0 1 0 -0.0 1.800000 1.800000000000000e+00
2 0 0.1 5 5.0 1.980148 1.980147949626399e+00
3 0 1e-05 24 24.0 2.000002 2.000001928975136e+00
4 0 1e-08 38 38.0 2.000000 1.999999997814935e+00
5 0 1e-10 48 48.0 2.000000 1.999999999981395e+00
6 0 1e-12 57 57.0 2.000000 2.000000000000396e+00
7 0 1e-14 67 67.0 2.000000 2.000000000000001e+00
8 0 1e-15 71 72.0 2.000000 2.000000000000000e+00
9 0 5e-16 73 73.0 2.000000 2.000000000000000e+00
10 -2 1e-16 73 76.0 0.000000 0.000000000000000e+00
In [52]:
df3
Out[52]:
status eps n en xmin str(xmin)
0 0 10 0 -0.0 10.600000 1.060000000000000e+01
1 0 1 5 5.0 3.015448 3.015448175635988e+00
2 0 0.1 10 10.0 2.985945 2.985944785492141e+00
3 0 1e-05 29 29.0 2.999993 2.999992759291924e+00
4 0 1e-08 43 43.0 3.000000 2.999999995440269e+00
5 0 1e-10 53 53.0 3.000000 2.999999999957388e+00
6 0 1e-12 63 63.0 3.000000 2.999999999999603e+00
7 0 1e-14 72 72.0 3.000000 2.999999999999992e+00
8 0 1e-15 77 77.0 3.000000 3.000000000000000e+00
9 0 5e-16 78 78.0 3.000000 3.000000000000000e+00
10 -2 1e-16 78 82.0 0.000000 0.000000000000000e+00
In [53]:
fig, ax = plt.subplots(3, 1, 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].plot(x1, fn1(x1), color='black', linestyle='solid')
ax[0].set(xlim=(1.0, 3.5), ylim=(-1.0, 0.0))
m0 = df1.loc[df1['status'] == 0]['xmin'].values
ax[0].scatter(m0, fn1(m0), s= 40, color='red')

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

ax[2].plot(x3, numpy.vectorize(fn3)(x3), color='black', linestyle='solid')
ax[2].set(xlim=(1.0, 3.5), ylim=(-0.1, 1.0))
m2 = df3.loc[df3['status'] == 0]['xmin'].values
ax[2].scatter(m2, numpy.vectorize(fn3)(m2), s= 40, color='red')
Out[53]:
<matplotlib.collections.PathCollection at 0x7f1c15afb748>

|sin x ^ 2|

In [54]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)', '|xmin - pi^0.5|'])
df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)', '|xmin - (2pi)^0.5|'])
df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, 1e-15, 5e-16, 1e-16]:
    st, xm, n, en = golden.optim(fn1, 1.5, 2.0, e, 10000)
    df1 = df1.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,),
                     '|xmin - pi^0.5|' : '%.15e' % (numpy.fabs(xm - numpy.sqrt(numpy.pi)),)},
                   ignore_index=True)

    st, xm, n, en = golden.optim(fn2, 2.3, 2.7, e, 10000)
    df2 = df2.append({'status'             : st,
                     'eps'                : e,
                     'n'                  : n,
                     'en'              : en,
                     '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, en = golden.optim(fn3, 1.5, 2.0, e, 10000)
    df3 = df3.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [55]:
df1
Out[55]:
status eps n en xmin str(xmin) |xmin - pi^0.5|
0 0 10 0 -7.0 1.750000 1.750000000000000e+00 2.245385090551588e-02
1 0 1 0 -2.0 1.750000 1.750000000000000e+00 2.245385090551588e-02
2 0 0.1 2 2.0 1.786475 1.786474508437579e+00 1.402065753206294e-02
3 0 1e-05 22 22.0 1.772456 1.772455950801513e+00 2.099895996643397e-06
4 0 1e-08 36 36.0 1.772454 1.772453852165289e+00 1.259772730577424e-09
5 0 1e-10 45 45.0 1.772454 1.772453850936614e+00 3.109779100896048e-11
6 0 1e-12 55 55.0 1.772454 1.772453850905771e+00 2.549072064539359e-13
7 0 1e-14 65 65.0 1.772454 1.772453850905520e+00 3.996802888650564e-15
8 0 1e-15 69 69.0 1.772454 1.772453850905516e+00 4.440892098500626e-16
9 0 5e-16 71 71.0 1.772454 1.772453850905516e+00 0.000000000000000e+00
10 -2 1e-16 72 74.0 0.000000 0.000000000000000e+00 1.772453850905516e+00
In [56]:
df2
Out[56]:
status eps n en xmin str(xmin) |xmin - (2pi)^0.5|
0 0 10 0 -8.0 2.500000 2.500000000000000e+00 6.628274631000242e-03
1 0 1 0 -3.0 2.500000 2.500000000000000e+00 6.628274631000242e-03
2 0 0.1 2 2.0 2.529180 2.529179606750063e+00 2.255133211906291e-02
3 0 1e-05 21 21.0 2.506627 2.506626608682393e+00 1.665948607509904e-06
4 0 1e-08 35 35.0 2.506628 2.506628269619381e+00 5.011619119699162e-09
5 0 1e-10 45 45.0 2.506628 2.506628274657208e+00 2.620792471930145e-11
6 0 1e-12 55 55.0 2.506628 2.506628274631252e+00 2.517985819849855e-13
7 0 1e-14 64 64.0 2.506628 2.506628274631004e+00 3.552713678800501e-15
8 0 1e-15 69 69.0 2.506628 2.506628274631000e+00 0.000000000000000e+00
9 0 5e-16 70 70.0 2.506628 2.506628274631001e+00 4.440892098500626e-16
10 -2 1e-16 70 74.0 0.000000 0.000000000000000e+00 2.506628274631000e+00
In [57]:
df3
Out[57]:
status eps n en xmin str(xmin)
0 0 10 0 -7.0 1.750000 1.750000000000000e+00
1 0 1 0 -2.0 1.750000 1.750000000000000e+00
2 0 0.1 2 2.0 1.904508 1.904508497187474e+00
3 0 1e-05 22 22.0 1.999994 1.999993687346914e+00
4 0 1e-08 36 36.0 2.000000 1.999999992511670e+00
5 0 1e-10 45 45.0 2.000000 1.999999999901486e+00
6 0 1e-12 55 55.0 2.000000 1.999999999999199e+00
7 0 1e-14 65 65.0 2.000000 1.999999999999993e+00
8 0 1e-15 69 69.0 2.000000 1.999999999999999e+00
9 0 5e-16 71 71.0 2.000000 2.000000000000000e+00
10 -2 1e-16 72 74.0 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, 3.0, 6000)

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

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

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

In [59]:
df1  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)', '|xmin - pi|'])
df2  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', 'xmin', 'str(xmin)', '|xmin - 2pi|'])
df3  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, 1e-15, 5e-16, 1e-16]:
    st, xm, n, en = golden.optim(fn1, 2.0, 4.5, e, 10000)
    df1 = df1.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,),
                     '|xmin - pi|' : '%.15e' % (numpy.fabs(xm - numpy.pi),)},
                   ignore_index=True)
    
    st, xm, n, en = golden.optim(fn2, 4.9, 7.5, e, 10000)
    df2 = df2.append({'status'             : st,
                     'eps'                : e,
                     'n'                  : n,
                     'en'              : en,
                     'xmin'               : xm,
                     'str(xmin)'          : '%.15e' % (xm,),
                     '|xmin - 2pi|' : '%.15e' % (numpy.fabs(xm - 2.0 * numpy.pi),)},
                   ignore_index=True)

    st, xm, n, en = golden.optim(fn3, 2.5, 7.5, e, 10000)
    df3 = df3.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [60]:
df1
Out[60]:
status eps n en xmin str(xmin) |xmin - pi|
0 0 10 0 -4.0 3.250000 3.250000000000000e+00 1.084073464102069e-01
1 0 1 1 1.0 2.772542 2.772542485937369e+00 3.690501676524245e-01
2 0 0.1 6 6.0 3.163895 3.163895365628417e+00 2.230271203862433e-02
3 0 1e-05 25 25.0 3.141590 3.141590214916767e+00 2.438673026183835e-06
4 0 1e-08 39 39.0 3.141593 3.141592656665714e+00 3.075920851358660e-09
5 0 1e-10 49 49.0 3.141593 3.141592653577062e+00 1.273159355719145e-11
6 0 1e-12 58 58.0 3.141593 3.141592653590021e+00 2.282618538629322e-13
7 0 1e-14 68 68.0 3.141593 3.141592653589790e+00 2.664535259100376e-15
8 0 1e-15 73 73.0 3.141593 3.141592653589793e+00 0.000000000000000e+00
9 0 5e-16 75 74.0 3.141593 3.141592653589793e+00 0.000000000000000e+00
10 -2 1e-16 75 78.0 0.000000 0.000000000000000e+00 3.141592653589793e+00
In [61]:
df2
Out[61]:
status eps n en xmin str(xmin) |xmin - 2pi|
0 0 10 0 -4.0 6.200000 6.200000000000000e+00 8.318530717958605e-02
1 0 1 1 1.0 6.696556 6.696555814625137e+00 4.133705074455509e-01
2 0 0.1 6 6.0 6.289549 6.289548819746446e+00 6.363512566859519e-03
3 0 1e-05 25 25.0 6.283188 6.283188199483126e+00 2.892303539780983e-06
4 0 1e-08 39 39.0 6.283185 6.283185304758092e+00 2.421494116333633e-09
5 0 1e-10 49 49.0 6.283185 6.283185307152323e+00 2.726352477111504e-11
6 0 1e-12 58 58.0 6.283185 6.283185307179281e+00 3.055333763768431e-13
7 0 1e-14 68 68.0 6.283185 6.283185307179588e+00 1.776356839400250e-15
8 0 1e-15 72 73.0 6.283185 6.283185307179586e+00 0.000000000000000e+00
9 -2 5e-16 72 74.0 0.000000 0.000000000000000e+00 6.283185307179586e+00
10 -2 1e-16 72 78.0 0.000000 0.000000000000000e+00 6.283185307179586e+00
In [62]:
df3
Out[62]:
status eps n en xmin str(xmin)
0 0 10 0 -2.0 5.000000 5.000000000000000e+00
1 0 1 2 2.0 5.364745 5.364745084375789e+00
2 0 0.1 7 7.0 6.233555 6.233555478129469e+00
3 0 1e-05 26 26.0 6.283180 6.283179892343034e+00
4 0 1e-08 41 41.0 6.283185 6.283185302603129e+00
5 0 1e-10 50 50.0 6.283185 6.283185307118590e+00
6 0 1e-12 60 60.0 6.283185 6.283185307179332e+00
7 0 1e-14 69 69.0 6.283185 6.283185307179582e+00
8 -2 1e-15 73 74.0 0.000000 0.000000000000000e+00
9 -2 5e-16 73 76.0 0.000000 0.000000000000000e+00
10 -2 1e-16 73 79.0 0.000000 0.000000000000000e+00
In [63]:
fig, ax = plt.subplots(1, 2, figsize=(30, 5), sharex='col', sharey='row')

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

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

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

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

In [64]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn, -0.5, 0.5, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [65]:
df
Out[65]:
status eps n en xmin str(xmin)
0 0 10 0 -6.0 0.000000 0.000000000000000e+00
1 0 1 0 -1.0 0.000000 0.000000000000000e+00
2 0 0.1 4 4.0 0.100813 1.008130618755783e-01
3 0 1e-05 23 23.0 0.109861 1.098606716377571e-01
4 0 1e-08 37 37.0 0.109860 1.098599138674955e-01
5 0 1e-10 47 47.0 0.109860 1.098599174030052e-01
6 0 1e-12 56 56.0 0.109860 1.098599173882094e-01
7 0 1e-14 66 66.0 0.109860 1.098599173884872e-01
8 0 1e-15 71 71.0 0.109860 1.098599173884884e-01
9 0 5e-16 72 72.0 0.109860 1.098599173884881e-01
10 0 1e-16 76 76.0 0.109860 1.098599173884885e-01
In [66]:
fig, ax = plt.subplots(1, 1, figsize=(30, 10), sharex='col', sharey='row')

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

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

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

ax.scatter(m, fn(m), s= 40, color='red')
Out[66]:
<matplotlib.collections.PathCollection at 0x7f1c15fa5fd0>

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

In [67]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn, 6.0, 9.9, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [68]:
df
Out[68]:
status eps n en xmin str(xmin)
0 0 10 0 -3.0 7.950000 7.950000000000000e+00
1 0 1 2 2.0 9.155166 9.155166278062296e+00
2 0 0.1 7 7.0 9.180820 9.180819732180325e+00
3 0 1e-05 26 26.0 9.206244 9.206244104463678e+00
4 0 1e-08 40 40.0 9.206243 9.206243211285592e+00
5 0 1e-10 50 50.0 9.206243 9.206243215938850e+00
6 0 1e-12 59 59.0 9.206243 9.206243215935203e+00
7 0 1e-14 69 69.0 9.206243 9.206243215935171e+00
8 -2 1e-15 71 74.0 0.000000 0.000000000000000e+00
9 -2 5e-16 71 75.0 0.000000 0.000000000000000e+00
10 -2 1e-16 71 78.0 0.000000 0.000000000000000e+00
In [69]:
fig, ax = plt.subplots(1, 1, figsize=(30, 10), sharex='col', sharey='row')

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

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

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

ax.scatter(m, fn(m), s= 40, color='red')
Out[69]:
<matplotlib.collections.PathCollection at 0x7f1c1602d9b0>

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

In [70]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn, 0.0, 2.0 * numpy.pi, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [71]:
df
Out[71]:
status eps n en xmin str(xmin)
0 0 10 0 -2.0 3.141593 3.141592653589793e+00
1 0 1 3 3.0 3.141593 3.141592653589793e+00
2 0 0.1 8 8.0 2.683240 2.683240462586606e+00
3 0 1e-05 27 27.0 2.706473 2.706473182632760e+00
4 0 1e-08 41 41.0 2.706476 2.706475588074548e+00
5 0 1e-10 51 51.0 2.706476 2.706475593515526e+00
6 0 1e-12 60 60.0 2.706476 2.706475593499026e+00
7 0 1e-14 70 70.0 2.706476 2.706475593499238e+00
8 0 1e-15 74 75.0 2.706476 2.706475593499240e+00
9 -2 5e-16 74 76.0 0.000000 0.000000000000000e+00
10 -2 1e-16 74 79.0 0.000000 0.000000000000000e+00
In [72]:
fig, ax = plt.subplots(1, 1, figsize=(30, 10), sharex='col', sharey='row')

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

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

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

ax.scatter(m, fn(m), s= 40, color='red')
Out[72]:
<matplotlib.collections.PathCollection at 0x7f1c160ad630>

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

In [73]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn, 0.0, 1.0, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [74]:
df
Out[74]:
status eps n en xmin str(xmin)
0 0 10 0 -6.0 0.500000 5.000000000000000e-01
1 0 1 0 -1.0 0.500000 5.000000000000000e-01
2 0 0.1 4 4.0 0.218847 2.188470506254731e-01
3 0 1e-05 23 23.0 0.240795 2.407954949143477e-01
4 0 1e-08 37 37.0 0.240795 2.407945617943026e-01
5 0 1e-10 47 47.0 0.240795 2.407945668485382e-01
6 0 1e-12 56 56.0 0.240795 2.407945669099902e-01
7 0 1e-14 66 66.0 0.240795 2.407945669107354e-01
8 0 1e-15 71 71.0 0.240795 2.407945669107351e-01
9 0 5e-16 72 72.0 0.240795 2.407945669107354e-01
10 0 1e-16 76 76.0 0.240795 2.407945669107357e-01
In [75]:
fig, ax = plt.subplots(1, 1, figsize=(30, 10), sharex='col', sharey='row')

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

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

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

ax.scatter(m, fn(m), s= 40, color='red')
Out[75]:
<matplotlib.collections.PathCollection at 0x7f1c15e350f0>

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

In [76]:
df  = pandas.DataFrame(columns=['status', 'eps', 'n', 'en', '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, en = golden.optim(fn, 0.5, 2.5, e, 10000)
    df = df.append({'status'          : st,
                     'eps'             : e,
                     'n'               : n,
                     'en'              : en,
                     'xmin'            : xm,
                     'str(xmin)'       : '%.15e' % (xm,)},
                   ignore_index=True)
In [77]:
df
Out[77]:
status eps n en xmin str(xmin)
0 0 10 0 -4.0 1.500000 1.500000000000000e+00
1 0 1 1 -0.0 1.881966 1.881966011250105e+00
2 0 0.1 5 5.0 2.118034 2.118033988749895e+00
3 0 1e-05 24 24.0 2.124636 2.124635909687304e+00
4 0 1e-08 39 39.0 2.124640 2.124639776122798e+00
5 0 1e-10 48 48.0 2.124640 2.124639781223546e+00
6 0 1e-12 58 58.0 2.124640 2.124639781251735e+00
7 0 1e-14 67 67.0 2.124640 2.124639781251916e+00
8 0 1e-15 72 72.0 2.124640 2.124639781251913e+00
9 0 5e-16 73 74.0 2.124640 2.124639781251914e+00
10 -2 1e-16 73 77.0 0.000000 0.000000000000000e+00
In [78]:
fig, ax = plt.subplots(1, 1, figsize=(30, 10), sharex='col', sharey='row')

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

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

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

ax.scatter(m, fn(m), s= 40, color='red')
Out[78]:
<matplotlib.collections.PathCollection at 0x7f1c15de5240>