Source code for numdifftools.tests.test_extrapolation
import numpy as np
from numpy.testing import assert_array_almost_equal, assert_allclose # @UnresolvedImport
from numdifftools.extrapolation import Dea, dea3, Richardson, EpsAlg
[docs]class TestRichardson(object):
[docs] def setup_method(self):
self.true_vals = {
(1, 1, 1): [-0.9999999999999998, 1.9999999999999998],
(1, 1, 2): [-0.33333333333333304, 1.333333333333333],
(1, 1, 3): [-0.14285714285714307, 1.142857142857143],
(1, 1, 4): [-0.06666666666666654, 1.0666666666666664],
(1, 1, 5): [-0.03225806451612906, 1.0322580645161292],
(1, 1, 6): [-0.015873015873015872, 1.0158730158730154],
(1, 2, 1): [-0.9999999999999998, 1.9999999999999998],
(1, 2, 2): [-0.33333333333333304, 1.333333333333333],
(1, 2, 3): [-0.14285714285714307, 1.142857142857143],
(1, 2, 4): [-0.06666666666666654, 1.0666666666666664],
(1, 2, 5): [-0.03225806451612906, 1.0322580645161292],
(1, 2, 6): [-0.015873015873015872, 1.0158730158730154],
(2, 1, 1): [0.33333333333333337, -2.0, 2.666666666666667],
(2, 1, 2): [0.04761904761904753, -0.5714285714285693,
1.523809523809522],
(2, 1, 3): [0.009523809523810024, -0.2285714285714322,
1.2190476190476225],
(2, 1, 4): [0.002150537634408055, -0.10322580645160284,
1.1010752688171945],
(2, 1, 5): [0.0005120327700975248, -0.04915514592935677,
1.0486431131592595],
(2, 1, 6): [0.0001249843769525012, -0.02399700037493191,
1.0238720159979793],
(2, 2, 1): [0.1428571428571428, -1.428571428571427,
2.2857142857142843],
(2, 2, 2): [0.022222222222222185, -0.444444444444444,
1.4222222222222216],
(2, 2, 3): [0.004608294930875861, -0.1843317972350207,
1.179723502304145],
(2, 2, 4): [0.0010582010582006751, -0.08465608465608221,
1.0835978835978812],
(2, 2, 5): [0.0002540005080009476, -0.040640081280166496,
1.0403860807721657],
(2, 2, 6): [6.224712107032182e-05, -0.01991907874258203,
1.0198568316215115],
(3, 1, 1): [-0.04761904761904734, 0.6666666666666641,
-2.6666666666666594, 3.047619047619042],
(3, 1, 2): [-0.003174603174603108, 0.08888888888889318,
-0.7111111111111337, 1.6253968253968432],
(3, 1, 3): [-0.0003072196620577672, 0.01720430107525861,
-0.27526881720422713, 1.258371735791026],
(3, 1, 4): [-3.4135518007183396e-05, 0.003823178016754525,
-0.12234169653539884, 1.1185526540366513],
(3, 1, 5): [-4.031754094968587e-06, 0.0009031129172963892,
-0.0577992267083981, 1.056900145545197],
(3, 1, 6): [-4.901348115149418e-07, 0.00021958039560535103,
-0.02810629063481751, 1.0278872003740238],
(3, 2, 1): [-0.004608294930874168, 0.1935483870967698,
-1.5483870967741966, 2.359447004608302],
(3, 2, 2): [-0.00035273368606647537, 0.02962962962962734,
-0.47407407407406155, 1.444797178130501],
(3, 2, 3): [-3.628578685754835e-05, 0.006096012192020994,
-0.19507239014474764, 1.1890126637395837],
(3, 2, 4): [-4.149808071229888e-06, 0.0013943355119737377,
-0.08923747276669802, 1.0878472870627958],
(3, 2, 5): [-4.970655732572382e-07, 0.0003340280653114369,
-0.042755592360228634, 1.0424220613604906],
(3, 2, 6): [-6.08476257157875e-08, 8.177920896951241e-05,
-0.02093547748207586, 1.0208537591207332]}
[docs] def test_order_step_combinations(self):
for num_terms in [1, 2, 3]:
for step in [1, 2]:
for order in range(1, 7):
r_extrap = Richardson(step_ratio=2.0, step=step,
num_terms=num_terms, order=order)
rule = r_extrap.rule()
# print((num_terms, step, order), rule.tolist())
assert_array_almost_equal(rule,
self.true_vals[(num_terms, step,
order)])
# self.assert_(False)
[docs]class TestExtrapolation(object):
[docs] def setup_method(self):
n = 7
e_i = np.zeros(n)
h = np.zeros(n)
for k in np.arange(n):
x = np.linspace(0, np.pi / 2., 2 ** (k + 5) + 1)
e_i[k] = np.trapz(np.sin(x), x)
h[k] = x[1]
self.e_i = e_i
self.h = h
[docs] def test_dea3_on_trapz_sin(self):
e_i = self.e_i
e_n, err = dea3(e_i[0], e_i[1], e_i[2])
true_err = e_i[:3] - 1.
assert_allclose(true_err,
[-2.00805680e-04, -5.01999079e-05, -1.25498825e-05])
assert_allclose(e_n, 1.)
assert err <= 0.00021
[docs] def test_dea_on_trapz_sin(self):
e_i = self.e_i
dea_3 = Dea(3)
for val in e_i:
e_n, err = dea_3(val)
true_err = np.abs(e_i - 1.)
err_bound = 10 * np.array([2.00805680e-04, 5.01999079e-05,
1.25498825e-05, 3.13746471e-06,
7.84365809e-07, 1.96091429e-07,
4.90228558e-08])
assert np.all(true_err < err_bound)
assert_allclose(e_n, 1.)
assert err <= 1e-10
[docs] def test_richardson(self):
e_i, h = self.e_i[:, np.newaxis], self.h[:, np.newaxis]
e_n, err, _step = Richardson(step=1, order=1)(e_i, h)
assert_allclose(e_n, 1.)
assert np.all(err < 0.0022)
[docs] def test_epsal(self):
true_vals = [0.78539816, 0.94805945, 0.99945672]
dea = EpsAlg()
vals = [dea(val) for val in [0.78539816, 0.94805945, 0.98711580]]
assert_array_almost_equal(true_vals, vals)
dea2 = EpsAlg()
vals2 = [dea2(val) for val in self.e_i[:-1]]
assert_array_almost_equal(vals2,
[0.99979919432001874, 0.99994980009210122,
0.99999999949599017, 0.99999999996850009,
1.0, 1.0])