Chris@87: """Test inter-conversion of different polynomial classes. Chris@87: Chris@87: This tests the convert and cast methods of all the polynomial classes. Chris@87: Chris@87: """ Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: import operator as op Chris@87: from numbers import Number Chris@87: Chris@87: import numpy as np Chris@87: from numpy.polynomial import ( Chris@87: Polynomial, Legendre, Chebyshev, Laguerre, Hermite, HermiteE) Chris@87: from numpy.testing import ( Chris@87: assert_almost_equal, assert_raises, assert_equal, assert_, Chris@87: run_module_suite) Chris@87: from numpy.compat import long Chris@87: Chris@87: Chris@87: classes = ( Chris@87: Polynomial, Legendre, Chebyshev, Laguerre, Chris@87: Hermite, HermiteE) Chris@87: Chris@87: Chris@87: def test_class_methods(): Chris@87: for Poly1 in classes: Chris@87: for Poly2 in classes: Chris@87: yield check_conversion, Poly1, Poly2 Chris@87: yield check_cast, Poly1, Poly2 Chris@87: for Poly in classes: Chris@87: yield check_call, Poly Chris@87: yield check_identity, Poly Chris@87: yield check_basis, Poly Chris@87: yield check_fromroots, Poly Chris@87: yield check_fit, Poly Chris@87: yield check_equal, Poly Chris@87: yield check_not_equal, Poly Chris@87: yield check_add, Poly Chris@87: yield check_sub, Poly Chris@87: yield check_mul, Poly Chris@87: yield check_floordiv, Poly Chris@87: yield check_truediv, Poly Chris@87: yield check_mod, Poly Chris@87: yield check_divmod, Poly Chris@87: yield check_pow, Poly Chris@87: yield check_integ, Poly Chris@87: yield check_deriv, Poly Chris@87: yield check_roots, Poly Chris@87: yield check_linspace, Poly Chris@87: yield check_mapparms, Poly Chris@87: yield check_degree, Poly Chris@87: yield check_copy, Poly Chris@87: yield check_cutdeg, Poly Chris@87: yield check_truncate, Poly Chris@87: yield check_trim, Poly Chris@87: Chris@87: Chris@87: # Chris@87: # helper functions Chris@87: # Chris@87: random = np.random.random Chris@87: Chris@87: Chris@87: def assert_poly_almost_equal(p1, p2, msg=""): Chris@87: try: Chris@87: assert_(np.all(p1.domain == p2.domain)) Chris@87: assert_(np.all(p1.window == p2.window)) Chris@87: assert_almost_equal(p1.coef, p2.coef) Chris@87: except AssertionError: Chris@87: msg = "Result: %s\nTarget: %s", (p1, p2) Chris@87: raise AssertionError(msg) Chris@87: Chris@87: Chris@87: # Chris@87: # conversion methods that depend on two classes Chris@87: # Chris@87: Chris@87: Chris@87: def check_conversion(Poly1, Poly2): Chris@87: x = np.linspace(0, 1, 10) Chris@87: coef = random((3,)) Chris@87: Chris@87: d1 = Poly1.domain + random((2,))*.25 Chris@87: w1 = Poly1.window + random((2,))*.25 Chris@87: p1 = Poly1(coef, domain=d1, window=w1) Chris@87: Chris@87: d2 = Poly2.domain + random((2,))*.25 Chris@87: w2 = Poly2.window + random((2,))*.25 Chris@87: p2 = p1.convert(kind=Poly2, domain=d2, window=w2) Chris@87: Chris@87: assert_almost_equal(p2.domain, d2) Chris@87: assert_almost_equal(p2.window, w2) Chris@87: assert_almost_equal(p2(x), p1(x)) Chris@87: Chris@87: Chris@87: def check_cast(Poly1, Poly2): Chris@87: x = np.linspace(0, 1, 10) Chris@87: coef = random((3,)) Chris@87: Chris@87: d1 = Poly1.domain + random((2,))*.25 Chris@87: w1 = Poly1.window + random((2,))*.25 Chris@87: p1 = Poly1(coef, domain=d1, window=w1) Chris@87: Chris@87: d2 = Poly2.domain + random((2,))*.25 Chris@87: w2 = Poly2.window + random((2,))*.25 Chris@87: p2 = Poly2.cast(p1, domain=d2, window=w2) Chris@87: Chris@87: assert_almost_equal(p2.domain, d2) Chris@87: assert_almost_equal(p2.window, w2) Chris@87: assert_almost_equal(p2(x), p1(x)) Chris@87: Chris@87: Chris@87: # Chris@87: # methods that depend on one class Chris@87: # Chris@87: Chris@87: Chris@87: def check_identity(Poly): Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: x = np.linspace(d[0], d[1], 11) Chris@87: p = Poly.identity(domain=d, window=w) Chris@87: assert_equal(p.domain, d) Chris@87: assert_equal(p.window, w) Chris@87: assert_almost_equal(p(x), x) Chris@87: Chris@87: Chris@87: def check_basis(Poly): Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: p = Poly.basis(5, domain=d, window=w) Chris@87: assert_equal(p.domain, d) Chris@87: assert_equal(p.window, w) Chris@87: assert_equal(p.coef, [0]*5 + [1]) Chris@87: Chris@87: Chris@87: def check_fromroots(Poly): Chris@87: # check that requested roots are zeros of a polynomial Chris@87: # of correct degree, domain, and window. Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: r = random((5,)) Chris@87: p1 = Poly.fromroots(r, domain=d, window=w) Chris@87: assert_equal(p1.degree(), len(r)) Chris@87: assert_equal(p1.domain, d) Chris@87: assert_equal(p1.window, w) Chris@87: assert_almost_equal(p1(r), 0) Chris@87: Chris@87: # check that polynomial is monic Chris@87: pdom = Polynomial.domain Chris@87: pwin = Polynomial.window Chris@87: p2 = Polynomial.cast(p1, domain=pdom, window=pwin) Chris@87: assert_almost_equal(p2.coef[-1], 1) Chris@87: Chris@87: Chris@87: def check_fit(Poly): Chris@87: Chris@87: def f(x): Chris@87: return x*(x - 1)*(x - 2) Chris@87: x = np.linspace(0, 3) Chris@87: y = f(x) Chris@87: Chris@87: # check default value of domain and window Chris@87: p = Poly.fit(x, y, 3) Chris@87: assert_almost_equal(p.domain, [0, 3]) Chris@87: assert_almost_equal(p(x), y) Chris@87: assert_equal(p.degree(), 3) Chris@87: Chris@87: # check with given domains and window Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: p = Poly.fit(x, y, 3, domain=d, window=w) Chris@87: assert_almost_equal(p(x), y) Chris@87: assert_almost_equal(p.domain, d) Chris@87: assert_almost_equal(p.window, w) Chris@87: Chris@87: # check with class domain default Chris@87: p = Poly.fit(x, y, 3, []) Chris@87: assert_equal(p.domain, Poly.domain) Chris@87: assert_equal(p.window, Poly.window) Chris@87: Chris@87: # check that fit accepts weights. Chris@87: w = np.zeros_like(x) Chris@87: z = y + random(y.shape)*.25 Chris@87: w[::2] = 1 Chris@87: p1 = Poly.fit(x[::2], z[::2], 3) Chris@87: p2 = Poly.fit(x, z, 3, w=w) Chris@87: assert_almost_equal(p1(x), p2(x)) Chris@87: Chris@87: Chris@87: def check_equal(Poly): Chris@87: p1 = Poly([1, 2, 3], domain=[0, 1], window=[2, 3]) Chris@87: p2 = Poly([1, 1, 1], domain=[0, 1], window=[2, 3]) Chris@87: p3 = Poly([1, 2, 3], domain=[1, 2], window=[2, 3]) Chris@87: p4 = Poly([1, 2, 3], domain=[0, 1], window=[1, 2]) Chris@87: assert_(p1 == p1) Chris@87: assert_(not p1 == p2) Chris@87: assert_(not p1 == p3) Chris@87: assert_(not p1 == p4) Chris@87: Chris@87: Chris@87: def check_not_equal(Poly): Chris@87: p1 = Poly([1, 2, 3], domain=[0, 1], window=[2, 3]) Chris@87: p2 = Poly([1, 1, 1], domain=[0, 1], window=[2, 3]) Chris@87: p3 = Poly([1, 2, 3], domain=[1, 2], window=[2, 3]) Chris@87: p4 = Poly([1, 2, 3], domain=[0, 1], window=[1, 2]) Chris@87: assert_(not p1 != p1) Chris@87: assert_(p1 != p2) Chris@87: assert_(p1 != p3) Chris@87: assert_(p1 != p4) Chris@87: Chris@87: Chris@87: def check_add(Poly): Chris@87: # This checks commutation, not numerical correctness Chris@87: c1 = list(random((4,)) + .5) Chris@87: c2 = list(random((3,)) + .5) Chris@87: p1 = Poly(c1) Chris@87: p2 = Poly(c2) Chris@87: p3 = p1 + p2 Chris@87: assert_poly_almost_equal(p2 + p1, p3) Chris@87: assert_poly_almost_equal(p1 + c2, p3) Chris@87: assert_poly_almost_equal(c2 + p1, p3) Chris@87: assert_poly_almost_equal(p1 + tuple(c2), p3) Chris@87: assert_poly_almost_equal(tuple(c2) + p1, p3) Chris@87: assert_poly_almost_equal(p1 + np.array(c2), p3) Chris@87: assert_poly_almost_equal(np.array(c2) + p1, p3) Chris@87: assert_raises(TypeError, op.add, p1, Poly([0], domain=Poly.domain + 1)) Chris@87: assert_raises(TypeError, op.add, p1, Poly([0], window=Poly.window + 1)) Chris@87: if Poly is Polynomial: Chris@87: assert_raises(TypeError, op.add, p1, Chebyshev([0])) Chris@87: else: Chris@87: assert_raises(TypeError, op.add, p1, Polynomial([0])) Chris@87: Chris@87: Chris@87: def check_sub(Poly): Chris@87: # This checks commutation, not numerical correctness Chris@87: c1 = list(random((4,)) + .5) Chris@87: c2 = list(random((3,)) + .5) Chris@87: p1 = Poly(c1) Chris@87: p2 = Poly(c2) Chris@87: p3 = p1 - p2 Chris@87: assert_poly_almost_equal(p2 - p1, -p3) Chris@87: assert_poly_almost_equal(p1 - c2, p3) Chris@87: assert_poly_almost_equal(c2 - p1, -p3) Chris@87: assert_poly_almost_equal(p1 - tuple(c2), p3) Chris@87: assert_poly_almost_equal(tuple(c2) - p1, -p3) Chris@87: assert_poly_almost_equal(p1 - np.array(c2), p3) Chris@87: assert_poly_almost_equal(np.array(c2) - p1, -p3) Chris@87: assert_raises(TypeError, op.sub, p1, Poly([0], domain=Poly.domain + 1)) Chris@87: assert_raises(TypeError, op.sub, p1, Poly([0], window=Poly.window + 1)) Chris@87: if Poly is Polynomial: Chris@87: assert_raises(TypeError, op.sub, p1, Chebyshev([0])) Chris@87: else: Chris@87: assert_raises(TypeError, op.sub, p1, Polynomial([0])) Chris@87: Chris@87: Chris@87: def check_mul(Poly): Chris@87: c1 = list(random((4,)) + .5) Chris@87: c2 = list(random((3,)) + .5) Chris@87: p1 = Poly(c1) Chris@87: p2 = Poly(c2) Chris@87: p3 = p1 * p2 Chris@87: assert_poly_almost_equal(p2 * p1, p3) Chris@87: assert_poly_almost_equal(p1 * c2, p3) Chris@87: assert_poly_almost_equal(c2 * p1, p3) Chris@87: assert_poly_almost_equal(p1 * tuple(c2), p3) Chris@87: assert_poly_almost_equal(tuple(c2) * p1, p3) Chris@87: assert_poly_almost_equal(p1 * np.array(c2), p3) Chris@87: assert_poly_almost_equal(np.array(c2) * p1, p3) Chris@87: assert_poly_almost_equal(p1 * 2, p1 * Poly([2])) Chris@87: assert_poly_almost_equal(2 * p1, p1 * Poly([2])) Chris@87: assert_raises(TypeError, op.mul, p1, Poly([0], domain=Poly.domain + 1)) Chris@87: assert_raises(TypeError, op.mul, p1, Poly([0], window=Poly.window + 1)) Chris@87: if Poly is Polynomial: Chris@87: assert_raises(TypeError, op.mul, p1, Chebyshev([0])) Chris@87: else: Chris@87: assert_raises(TypeError, op.mul, p1, Polynomial([0])) Chris@87: Chris@87: Chris@87: def check_floordiv(Poly): Chris@87: c1 = list(random((4,)) + .5) Chris@87: c2 = list(random((3,)) + .5) Chris@87: c3 = list(random((2,)) + .5) Chris@87: p1 = Poly(c1) Chris@87: p2 = Poly(c2) Chris@87: p3 = Poly(c3) Chris@87: p4 = p1 * p2 + p3 Chris@87: c4 = list(p4.coef) Chris@87: assert_poly_almost_equal(p4 // p2, p1) Chris@87: assert_poly_almost_equal(p4 // c2, p1) Chris@87: assert_poly_almost_equal(c4 // p2, p1) Chris@87: assert_poly_almost_equal(p4 // tuple(c2), p1) Chris@87: assert_poly_almost_equal(tuple(c4) // p2, p1) Chris@87: assert_poly_almost_equal(p4 // np.array(c2), p1) Chris@87: assert_poly_almost_equal(np.array(c4) // p2, p1) Chris@87: assert_poly_almost_equal(2 // p2, Poly([0])) Chris@87: assert_poly_almost_equal(p2 // 2, 0.5*p2) Chris@87: assert_raises( Chris@87: TypeError, op.floordiv, p1, Poly([0], domain=Poly.domain + 1)) Chris@87: assert_raises( Chris@87: TypeError, op.floordiv, p1, Poly([0], window=Poly.window + 1)) Chris@87: if Poly is Polynomial: Chris@87: assert_raises(TypeError, op.floordiv, p1, Chebyshev([0])) Chris@87: else: Chris@87: assert_raises(TypeError, op.floordiv, p1, Polynomial([0])) Chris@87: Chris@87: Chris@87: def check_truediv(Poly): Chris@87: # true division is valid only if the denominator is a Number and Chris@87: # not a python bool. Chris@87: p1 = Poly([1,2,3]) Chris@87: p2 = p1 * 5 Chris@87: Chris@87: for stype in np.ScalarType: Chris@87: if not issubclass(stype, Number) or issubclass(stype, bool): Chris@87: continue Chris@87: s = stype(5) Chris@87: assert_poly_almost_equal(op.truediv(p2, s), p1) Chris@87: assert_raises(TypeError, op.truediv, s, p2) Chris@87: for stype in (int, long, float): Chris@87: s = stype(5) Chris@87: assert_poly_almost_equal(op.truediv(p2, s), p1) Chris@87: assert_raises(TypeError, op.truediv, s, p2) Chris@87: for stype in [complex]: Chris@87: s = stype(5, 0) Chris@87: assert_poly_almost_equal(op.truediv(p2, s), p1) Chris@87: assert_raises(TypeError, op.truediv, s, p2) Chris@87: for s in [tuple(), list(), dict(), bool(), np.array([1])]: Chris@87: assert_raises(TypeError, op.truediv, p2, s) Chris@87: assert_raises(TypeError, op.truediv, s, p2) Chris@87: for ptype in classes: Chris@87: assert_raises(TypeError, op.truediv, p2, ptype(1)) Chris@87: Chris@87: Chris@87: def check_mod(Poly): Chris@87: # This checks commutation, not numerical correctness Chris@87: c1 = list(random((4,)) + .5) Chris@87: c2 = list(random((3,)) + .5) Chris@87: c3 = list(random((2,)) + .5) Chris@87: p1 = Poly(c1) Chris@87: p2 = Poly(c2) Chris@87: p3 = Poly(c3) Chris@87: p4 = p1 * p2 + p3 Chris@87: c4 = list(p4.coef) Chris@87: assert_poly_almost_equal(p4 % p2, p3) Chris@87: assert_poly_almost_equal(p4 % c2, p3) Chris@87: assert_poly_almost_equal(c4 % p2, p3) Chris@87: assert_poly_almost_equal(p4 % tuple(c2), p3) Chris@87: assert_poly_almost_equal(tuple(c4) % p2, p3) Chris@87: assert_poly_almost_equal(p4 % np.array(c2), p3) Chris@87: assert_poly_almost_equal(np.array(c4) % p2, p3) Chris@87: assert_poly_almost_equal(2 % p2, Poly([2])) Chris@87: assert_poly_almost_equal(p2 % 2, Poly([0])) Chris@87: assert_raises(TypeError, op.mod, p1, Poly([0], domain=Poly.domain + 1)) Chris@87: assert_raises(TypeError, op.mod, p1, Poly([0], window=Poly.window + 1)) Chris@87: if Poly is Polynomial: Chris@87: assert_raises(TypeError, op.mod, p1, Chebyshev([0])) Chris@87: else: Chris@87: assert_raises(TypeError, op.mod, p1, Polynomial([0])) Chris@87: Chris@87: Chris@87: def check_divmod(Poly): Chris@87: # This checks commutation, not numerical correctness Chris@87: c1 = list(random((4,)) + .5) Chris@87: c2 = list(random((3,)) + .5) Chris@87: c3 = list(random((2,)) + .5) Chris@87: p1 = Poly(c1) Chris@87: p2 = Poly(c2) Chris@87: p3 = Poly(c3) Chris@87: p4 = p1 * p2 + p3 Chris@87: c4 = list(p4.coef) Chris@87: quo, rem = divmod(p4, p2) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(p4, c2) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(c4, p2) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(p4, tuple(c2)) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(tuple(c4), p2) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(p4, np.array(c2)) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(np.array(c4), p2) Chris@87: assert_poly_almost_equal(quo, p1) Chris@87: assert_poly_almost_equal(rem, p3) Chris@87: quo, rem = divmod(p2, 2) Chris@87: assert_poly_almost_equal(quo, 0.5*p2) Chris@87: assert_poly_almost_equal(rem, Poly([0])) Chris@87: quo, rem = divmod(2, p2) Chris@87: assert_poly_almost_equal(quo, Poly([0])) Chris@87: assert_poly_almost_equal(rem, Poly([2])) Chris@87: assert_raises(TypeError, divmod, p1, Poly([0], domain=Poly.domain + 1)) Chris@87: assert_raises(TypeError, divmod, p1, Poly([0], window=Poly.window + 1)) Chris@87: if Poly is Polynomial: Chris@87: assert_raises(TypeError, divmod, p1, Chebyshev([0])) Chris@87: else: Chris@87: assert_raises(TypeError, divmod, p1, Polynomial([0])) Chris@87: Chris@87: Chris@87: def check_roots(Poly): Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: tgt = np.sort(random((5,))) Chris@87: res = np.sort(Poly.fromroots(tgt, domain=d, window=w).roots()) Chris@87: assert_almost_equal(res, tgt) Chris@87: # default domain and window Chris@87: res = np.sort(Poly.fromroots(tgt).roots()) Chris@87: assert_almost_equal(res, tgt) Chris@87: Chris@87: Chris@87: def check_degree(Poly): Chris@87: p = Poly.basis(5) Chris@87: assert_equal(p.degree(), 5) Chris@87: Chris@87: Chris@87: def check_copy(Poly): Chris@87: p1 = Poly.basis(5) Chris@87: p2 = p1.copy() Chris@87: assert_(p1 == p2) Chris@87: assert_(p1 is not p2) Chris@87: assert_(p1.coef is not p2.coef) Chris@87: assert_(p1.domain is not p2.domain) Chris@87: assert_(p1.window is not p2.window) Chris@87: Chris@87: Chris@87: def check_integ(Poly): Chris@87: P = Polynomial Chris@87: # Check defaults Chris@87: p0 = Poly.cast(P([1*2, 2*3, 3*4])) Chris@87: p1 = P.cast(p0.integ()) Chris@87: p2 = P.cast(p0.integ(2)) Chris@87: assert_poly_almost_equal(p1, P([0, 2, 3, 4])) Chris@87: assert_poly_almost_equal(p2, P([0, 0, 1, 1, 1])) Chris@87: # Check with k Chris@87: p0 = Poly.cast(P([1*2, 2*3, 3*4])) Chris@87: p1 = P.cast(p0.integ(k=1)) Chris@87: p2 = P.cast(p0.integ(2, k=[1, 1])) Chris@87: assert_poly_almost_equal(p1, P([1, 2, 3, 4])) Chris@87: assert_poly_almost_equal(p2, P([1, 1, 1, 1, 1])) Chris@87: # Check with lbnd Chris@87: p0 = Poly.cast(P([1*2, 2*3, 3*4])) Chris@87: p1 = P.cast(p0.integ(lbnd=1)) Chris@87: p2 = P.cast(p0.integ(2, lbnd=1)) Chris@87: assert_poly_almost_equal(p1, P([-9, 2, 3, 4])) Chris@87: assert_poly_almost_equal(p2, P([6, -9, 1, 1, 1])) Chris@87: # Check scaling Chris@87: d = 2*Poly.domain Chris@87: p0 = Poly.cast(P([1*2, 2*3, 3*4]), domain=d) Chris@87: p1 = P.cast(p0.integ()) Chris@87: p2 = P.cast(p0.integ(2)) Chris@87: assert_poly_almost_equal(p1, P([0, 2, 3, 4])) Chris@87: assert_poly_almost_equal(p2, P([0, 0, 1, 1, 1])) Chris@87: Chris@87: Chris@87: def check_deriv(Poly): Chris@87: # Check that the derivative is the inverse of integration. It is Chris@87: # assumes that the integration has been checked elsewhere. Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: p1 = Poly([1, 2, 3], domain=d, window=w) Chris@87: p2 = p1.integ(2, k=[1, 2]) Chris@87: p3 = p1.integ(1, k=[1]) Chris@87: assert_almost_equal(p2.deriv(1).coef, p3.coef) Chris@87: assert_almost_equal(p2.deriv(2).coef, p1.coef) Chris@87: # default domain and window Chris@87: p1 = Poly([1, 2, 3]) Chris@87: p2 = p1.integ(2, k=[1, 2]) Chris@87: p3 = p1.integ(1, k=[1]) Chris@87: assert_almost_equal(p2.deriv(1).coef, p3.coef) Chris@87: assert_almost_equal(p2.deriv(2).coef, p1.coef) Chris@87: Chris@87: Chris@87: def check_linspace(Poly): Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: p = Poly([1, 2, 3], domain=d, window=w) Chris@87: # check default domain Chris@87: xtgt = np.linspace(d[0], d[1], 20) Chris@87: ytgt = p(xtgt) Chris@87: xres, yres = p.linspace(20) Chris@87: assert_almost_equal(xres, xtgt) Chris@87: assert_almost_equal(yres, ytgt) Chris@87: # check specified domain Chris@87: xtgt = np.linspace(0, 2, 20) Chris@87: ytgt = p(xtgt) Chris@87: xres, yres = p.linspace(20, domain=[0, 2]) Chris@87: assert_almost_equal(xres, xtgt) Chris@87: assert_almost_equal(yres, ytgt) Chris@87: Chris@87: Chris@87: def check_pow(Poly): Chris@87: d = Poly.domain + random((2,))*.25 Chris@87: w = Poly.window + random((2,))*.25 Chris@87: tgt = Poly([1], domain=d, window=w) Chris@87: tst = Poly([1, 2, 3], domain=d, window=w) Chris@87: for i in range(5): Chris@87: assert_poly_almost_equal(tst**i, tgt) Chris@87: tgt = tgt * tst Chris@87: # default domain and window Chris@87: tgt = Poly([1]) Chris@87: tst = Poly([1, 2, 3]) Chris@87: for i in range(5): Chris@87: assert_poly_almost_equal(tst**i, tgt) Chris@87: tgt = tgt * tst Chris@87: # check error for invalid powers Chris@87: assert_raises(ValueError, op.pow, tgt, 1.5) Chris@87: assert_raises(ValueError, op.pow, tgt, -1) Chris@87: Chris@87: Chris@87: def check_call(Poly): Chris@87: P = Polynomial Chris@87: d = Poly.domain Chris@87: x = np.linspace(d[0], d[1], 11) Chris@87: Chris@87: # Check defaults Chris@87: p = Poly.cast(P([1, 2, 3])) Chris@87: tgt = 1 + x*(2 + 3*x) Chris@87: res = p(x) Chris@87: assert_almost_equal(res, tgt) Chris@87: Chris@87: Chris@87: def check_cutdeg(Poly): Chris@87: p = Poly([1, 2, 3]) Chris@87: assert_raises(ValueError, p.cutdeg, .5) Chris@87: assert_raises(ValueError, p.cutdeg, -1) Chris@87: assert_equal(len(p.cutdeg(3)), 3) Chris@87: assert_equal(len(p.cutdeg(2)), 3) Chris@87: assert_equal(len(p.cutdeg(1)), 2) Chris@87: assert_equal(len(p.cutdeg(0)), 1) Chris@87: Chris@87: Chris@87: def check_truncate(Poly): Chris@87: p = Poly([1, 2, 3]) Chris@87: assert_raises(ValueError, p.truncate, .5) Chris@87: assert_raises(ValueError, p.truncate, 0) Chris@87: assert_equal(len(p.truncate(4)), 3) Chris@87: assert_equal(len(p.truncate(3)), 3) Chris@87: assert_equal(len(p.truncate(2)), 2) Chris@87: assert_equal(len(p.truncate(1)), 1) Chris@87: Chris@87: Chris@87: def check_trim(Poly): Chris@87: c = [1, 1e-6, 1e-12, 0] Chris@87: p = Poly(c) Chris@87: assert_equal(p.trim().coef, c[:3]) Chris@87: assert_equal(p.trim(1e-10).coef, c[:2]) Chris@87: assert_equal(p.trim(1e-5).coef, c[:1]) Chris@87: Chris@87: Chris@87: def check_mapparms(Poly): Chris@87: # check with defaults. Should be identity. Chris@87: d = Poly.domain Chris@87: w = Poly.window Chris@87: p = Poly([1], domain=d, window=w) Chris@87: assert_almost_equal([0, 1], p.mapparms()) Chris@87: # Chris@87: w = 2*d + 1 Chris@87: p = Poly([1], domain=d, window=w) Chris@87: assert_almost_equal([1, 2], p.mapparms()) Chris@87: Chris@87: Chris@87: if __name__ == "__main__": Chris@87: run_module_suite()