コード例 #1
0
def test_eval_approx_relative():
    CRootOf.clear_cache()
    t = [CRootOf(x**3 + 10 * x + 1, i) for i in range(3)]
    assert [i.eval_rational(1e-1) for i in t] == [
        -S(21) / 220,
        S(15) / 256 - 805 * I / 256,
        S(15) / 256 + 805 * I / 256
    ]
    t[0]._reset()
    assert [i.eval_rational(1e-1, 1e-4) for i in t] == [
        -S(21) / 220,
        S(3275) / 65536 - 414645 * I / 131072,
        S(3275) / 65536 + 414645 * I / 131072
    ]
    assert S(t[0]._get_interval().dx) < 1e-1
    assert S(t[1]._get_interval().dx) < 1e-1
    assert S(t[1]._get_interval().dy) < 1e-4
    assert S(t[2]._get_interval().dx) < 1e-1
    assert S(t[2]._get_interval().dy) < 1e-4
    t[0]._reset()
    assert [i.eval_rational(1e-4, 1e-4) for i in t] == [
        -S(2001) / 20020,
        S(6545) / 131072 - 414645 * I / 131072,
        S(6545) / 131072 + 414645 * I / 131072
    ]
    assert S(t[0]._get_interval().dx) < 1e-4
    assert S(t[1]._get_interval().dx) < 1e-4
    assert S(t[1]._get_interval().dy) < 1e-4
    assert S(t[2]._get_interval().dx) < 1e-4
    assert S(t[2]._get_interval().dy) < 1e-4
    # in the following, the actual relative precision is
    # less than tested, but it should never be greater
    t[0]._reset()
    assert [i.eval_rational(n=2) for i in t] == [
        -S(202201) / 2024022,
        S(104755) / 2097152 - 6634255 * I / 2097152,
        S(104755) / 2097152 + 6634255 * I / 2097152
    ]
    assert abs(S(t[0]._get_interval().dx) / t[0]) < 1e-2
    assert abs(S(t[1]._get_interval().dx) / t[1]).n() < 1e-2
    assert abs(S(t[1]._get_interval().dy) / t[1]).n() < 1e-2
    assert abs(S(t[2]._get_interval().dx) / t[2]).n() < 1e-2
    assert abs(S(t[2]._get_interval().dy) / t[2]).n() < 1e-2
    t[0]._reset()
    assert [i.eval_rational(n=3) for i in t] == [
        -S(202201) / 2024022,
        S(1676045) / 33554432 - 106148135 * I / 33554432,
        S(1676045) / 33554432 + 106148135 * I / 33554432
    ]
    assert abs(S(t[0]._get_interval().dx) / t[0]) < 1e-3
    assert abs(S(t[1]._get_interval().dx) / t[1]).n() < 1e-3
    assert abs(S(t[1]._get_interval().dy) / t[1]).n() < 1e-3
    assert abs(S(t[2]._get_interval().dx) / t[2]).n() < 1e-3
    assert abs(S(t[2]._get_interval().dy) / t[2]).n() < 1e-3

    t[0]._reset()
    a = [i.eval_approx(2) for i in t]
    assert [str(i) for i in a] == ['-0.10', '0.05 - 3.2*I', '0.05 + 3.2*I']
    assert all(abs(((a[i] - t[i]) / t[i]).n()) < 1e-2 for i in range(len(a)))
コード例 #2
0
def test_eval_approx_relative():
    CRootOf.clear_cache()
    t = [CRootOf(x**3 + 10 * x + 1, i) for i in range(3)]
    assert [i.eval_rational(1e-1) for i in t] == [
        Rational(-21, 220),
        Rational(15, 256) - I * Rational(805, 256),
        Rational(15, 256) + I * Rational(805, 256)
    ]
    t[0]._reset()
    assert [i.eval_rational(1e-1, 1e-4) for i in t] == [
        Rational(-21, 220),
        Rational(3275, 65536) - I * Rational(414645, 131072),
        Rational(3275, 65536) + I * Rational(414645, 131072)
    ]
    assert S(t[0]._get_interval().dx) < 1e-1
    assert S(t[1]._get_interval().dx) < 1e-1
    assert S(t[1]._get_interval().dy) < 1e-4
    assert S(t[2]._get_interval().dx) < 1e-1
    assert S(t[2]._get_interval().dy) < 1e-4
    t[0]._reset()
    assert [i.eval_rational(1e-4, 1e-4) for i in t] == [
        Rational(-2001, 20020),
        Rational(6545, 131072) - I * Rational(414645, 131072),
        Rational(6545, 131072) + I * Rational(414645, 131072)
    ]
    assert S(t[0]._get_interval().dx) < 1e-4
    assert S(t[1]._get_interval().dx) < 1e-4
    assert S(t[1]._get_interval().dy) < 1e-4
    assert S(t[2]._get_interval().dx) < 1e-4
    assert S(t[2]._get_interval().dy) < 1e-4
    # in the following, the actual relative precision is
    # less than tested, but it should never be greater
    t[0]._reset()
    assert [i.eval_rational(n=2) for i in t] == [
        Rational(-202201, 2024022),
        Rational(104755, 2097152) - I * Rational(6634255, 2097152),
        Rational(104755, 2097152) + I * Rational(6634255, 2097152)
    ]
    assert abs(S(t[0]._get_interval().dx) / t[0]) < 1e-2
    assert abs(S(t[1]._get_interval().dx) / t[1]).n() < 1e-2
    assert abs(S(t[1]._get_interval().dy) / t[1]).n() < 1e-2
    assert abs(S(t[2]._get_interval().dx) / t[2]).n() < 1e-2
    assert abs(S(t[2]._get_interval().dy) / t[2]).n() < 1e-2
    t[0]._reset()
    assert [i.eval_rational(n=3) for i in t] == [
        Rational(-202201, 2024022),
        Rational(1676045, 33554432) - I * Rational(106148135, 33554432),
        Rational(1676045, 33554432) + I * Rational(106148135, 33554432)
    ]
    assert abs(S(t[0]._get_interval().dx) / t[0]) < 1e-3
    assert abs(S(t[1]._get_interval().dx) / t[1]).n() < 1e-3
    assert abs(S(t[1]._get_interval().dy) / t[1]).n() < 1e-3
    assert abs(S(t[2]._get_interval().dx) / t[2]).n() < 1e-3
    assert abs(S(t[2]._get_interval().dy) / t[2]).n() < 1e-3

    t[0]._reset()
    a = [i.eval_approx(2) for i in t]
    assert [str(i) for i in a] == ['-0.10', '0.05 - 3.2*I', '0.05 + 3.2*I']
    assert all(abs(((a[i] - t[i]) / t[i]).n()) < 1e-2 for i in range(len(a)))
コード例 #3
0
ファイル: test_rootoftools.py プロジェクト: cmarqu/sympy
def test_eval_approx_relative():
    CRootOf.clear_cache()
    t = [CRootOf(x**3 + 10*x + 1, i) for i in range(3)]
    assert [i.eval_rational(1e-1) for i in t] == [
        -21/220, 15/256 - 805*I/256, 15/256 + 805*I/256]
    t[0]._reset()
    assert [i.eval_rational(1e-1, 1e-4) for i in t] == [
        -21/220, 3275/65536 - 414645*I/131072,
        3275/65536 + 414645*I/131072]
    assert S(t[0]._get_interval().dx) < 1e-1
    assert S(t[1]._get_interval().dx) < 1e-1
    assert S(t[1]._get_interval().dy) < 1e-4
    assert S(t[2]._get_interval().dx) < 1e-1
    assert S(t[2]._get_interval().dy) < 1e-4
    t[0]._reset()
    assert [i.eval_rational(1e-4, 1e-4) for i in t] == [
        -2001/20020, 6545/131072 - 414645*I/131072,
        6545/131072 + 414645*I/131072]
    assert S(t[0]._get_interval().dx) < 1e-4
    assert S(t[1]._get_interval().dx) < 1e-4
    assert S(t[1]._get_interval().dy) < 1e-4
    assert S(t[2]._get_interval().dx) < 1e-4
    assert S(t[2]._get_interval().dy) < 1e-4
    # in the following, the actual relative precision is
    # less than tested, but it should never be greater
    t[0]._reset()
    assert [i.eval_rational(n=2) for i in t] == [
        -202201/2024022, 104755/2097152 - 6634255*I/2097152,
        104755/2097152 + 6634255*I/2097152]
    assert abs(S(t[0]._get_interval().dx)/t[0]) < 1e-2
    assert abs(S(t[1]._get_interval().dx)/t[1]).n() < 1e-2
    assert abs(S(t[1]._get_interval().dy)/t[1]).n() < 1e-2
    assert abs(S(t[2]._get_interval().dx)/t[2]).n() < 1e-2
    assert abs(S(t[2]._get_interval().dy)/t[2]).n() < 1e-2
    t[0]._reset()
    assert [i.eval_rational(n=3) for i in t] == [
        -202201/2024022, 1676045/33554432 - 106148135*I/33554432,
        1676045/33554432 + 106148135*I/33554432]
    assert abs(S(t[0]._get_interval().dx)/t[0]) < 1e-3
    assert abs(S(t[1]._get_interval().dx)/t[1]).n() < 1e-3
    assert abs(S(t[1]._get_interval().dy)/t[1]).n() < 1e-3
    assert abs(S(t[2]._get_interval().dx)/t[2]).n() < 1e-3
    assert abs(S(t[2]._get_interval().dy)/t[2]).n() < 1e-3

    t[0]._reset()
    a = [i.eval_approx(2) for i in t]
    assert [str(i) for i in a] == [
        '-0.10', '0.05 - 3.2*I', '0.05 + 3.2*I']
    assert all(abs(((a[i] - t[i])/t[i]).n()) < 1e-2 for i in range(len(a)))
コード例 #4
0
def test_CRootOf_lazy():
    # irreducible poly with both real and complex roots:
    f = Poly(x**3 + 2 * x + 2)

    # real root:
    CRootOf.clear_cache()
    r = CRootOf(f, 0)
    # Not yet in cache, after construction:
    assert r.poly not in rootoftools._reals_cache
    assert r.poly not in rootoftools._complexes_cache
    r.evalf()
    # In cache after evaluation:
    assert r.poly in rootoftools._reals_cache
    assert r.poly not in rootoftools._complexes_cache

    # complex root:
    CRootOf.clear_cache()
    r = CRootOf(f, 1)
    # Not yet in cache, after construction:
    assert r.poly not in rootoftools._reals_cache
    assert r.poly not in rootoftools._complexes_cache
    r.evalf()
    # In cache after evaluation:
    assert r.poly in rootoftools._reals_cache
    assert r.poly in rootoftools._complexes_cache

    # composite poly with both real and complex roots:
    f = Poly((x**2 - 2) * (x**2 + 1))

    # real root:
    CRootOf.clear_cache()
    r = CRootOf(f, 0)
    # In cache immediately after construction:
    assert r.poly in rootoftools._reals_cache
    assert r.poly not in rootoftools._complexes_cache

    # complex root:
    CRootOf.clear_cache()
    r = CRootOf(f, 2)
    # In cache immediately after construction:
    assert r.poly in rootoftools._reals_cache
    assert r.poly in rootoftools._complexes_cache