def test_interpolate_rat_mp(): mp.dps = 100 X = mp_linspace(0, 1, 100) ## def f(x): return (x + 3) / ((x + 1) * (x + 2)) Z = mp_linspace(0, 1, 5) r = baryrat.interpolate_rat(Z, f(Z)) assert np.linalg.norm(f(X) - r(X)) < 1e-90 assert r.order == 2 ## def f(x): return (x * (x + 1) * (x + 2)) / (x + 3) Z = mp_linspace(0, 1, 7) r = baryrat.interpolate_rat(Z, f(Z)) assert np.linalg.norm(f(X) - r(X)) < 1e-90 assert r.order == 3 ## test complex case n = 9 Z = np.array([np.exp(2j * k / n * np.pi) for k in range(0, n)]) r = baryrat.interpolate_rat(Z, np.exp(Z), use_mp=True) X = 1j * mp_linspace(-1, 1, 100) assert abs(np.vectorize(mp.exp)(X) - r(X)).max() < 1e-7 ## same thing with Z already in mpc form Z = np.array([mp.exp(2j * k / n * np.pi) for k in range(0, n)]) r = baryrat.interpolate_rat(Z, np.vectorize(mp.exp)(Z)) X = 1j * mp_linspace(-1, 1, 100) assert abs(np.vectorize(mp.exp)(X) - r(X)).max() < 1e-7
def test_jacobians(): Z = np.linspace(1, 5, 7) r = baryrat.interpolate_rat(Z, np.sin(Z)) x = np.linspace(2, 4, 3) Dz, Df, Dw = r.jacobians(x) delta = 1e-6 # compare to finite differences for k in range(len(r.nodes)): z_delta = r.nodes.copy() z_delta[k] += delta r_delta = baryrat.BarycentricRational(z_delta, r.values, r.weights) deriv = (r_delta(x) - r(x)) / delta assert np.allclose(Dz[:, k], deriv) f_delta = r.values.copy() f_delta[k] += delta r_delta = baryrat.BarycentricRational(r.nodes, f_delta, r.weights) deriv = (r_delta(x) - r(x)) / delta assert np.allclose(Df[:, k], deriv) w_delta = r.weights.copy() w_delta[k] += delta r_delta = baryrat.BarycentricRational(r.nodes, r.values, w_delta) deriv = (r_delta(x) - r(x)) / delta assert np.allclose(Dw[:, k], deriv)
def test_reduce_order(): nodes = np.linspace(0, 1, 11) r = baryrat.interpolate_rat(nodes, np.ones_like(nodes)) assert r.order == 5 r2 = r.reduce_order() assert r2.order == 0 X = np.linspace(0, 1, 25) assert np.allclose(r2(X), 1.0) # # another test with full order (no reduction) r = baryrat.interpolate_rat(nodes, np.sin(nodes)) assert r.order == 5 r2 = r.reduce_order() assert r2.order == 5 X = np.linspace(0, 1, 25) assert np.allclose(r2(X), r(X))
def test_interpolate_rat(): Z = np.linspace(1, 5, 7) F = np.sin(Z) p = baryrat.interpolate_rat(Z, F) assert np.allclose(p(Z), F) X = np.linspace(1, 5, 100) err = np.linalg.norm(p(X) - np.sin(X), np.inf) assert err < 2e-3
def test_interpolate_rat_complex(): Z = np.linspace(0.0, 1.0, 9) def f(z): return np.exp(2j * np.pi * z) F = f(Z) r = baryrat.interpolate_rat(Z, F) assert np.allclose(r(Z), F) # check interpolation property X = np.linspace(0.0, 1.0, 100) err = np.linalg.norm(r(X) - f(X), np.inf) assert err < 1e-4 # check interpolation error
def test_interpolate_rat(): Z = np.linspace(1, 5, 7) F = np.sin(Z) r = baryrat.interpolate_rat(Z, F) assert np.allclose(r(Z), F) X = np.linspace(1, 5, 100) err = np.linalg.norm(r(X) - np.sin(X), np.inf) assert err < 2e-3 # p, q = r.numerator(), r.denominator() assert np.allclose(p(X) / q(X), r(X)) assert r.degree() == (3, 3)