Example #1
0
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
Example #2
0
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)
Example #3
0
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))
Example #4
0
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
Example #5
0
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
Example #6
0
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)