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)))
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)))
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)))
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