summaryrefslogtreecommitdiff
path: root/numpy/polynomial/tests/test_classes.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/polynomial/tests/test_classes.py')
-rw-r--r--numpy/polynomial/tests/test_classes.py193
1 files changed, 193 insertions, 0 deletions
diff --git a/numpy/polynomial/tests/test_classes.py b/numpy/polynomial/tests/test_classes.py
new file mode 100644
index 000000000..e0fc28f33
--- /dev/null
+++ b/numpy/polynomial/tests/test_classes.py
@@ -0,0 +1,193 @@
+"""Test inter-conversion of different polynomial classes.
+
+This tests the convert and cast methods of all the polynomial classes.
+
+"""
+from __future__ import division
+
+import numpy as np
+from numpy.polynomial import (
+ Polynomial, Legendre, Chebyshev, Laguerre,
+ Hermite, HermiteE)
+from numpy.testing import (
+ TestCase, assert_almost_equal, assert_raises,
+ assert_equal, assert_, run_module_suite)
+
+classes = (
+ Polynomial, Legendre, Chebyshev, Laguerre,
+ Hermite, HermiteE)
+
+class TestClassConversions(TestCase):
+
+ def test_conversion(self):
+ x = np.linspace(0, 1, 10)
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly1 in classes:
+ d1 = domain + np.random.random((2,))*.25
+ w1 = window + np.random.random((2,))*.25
+ c1 = np.random.random((3,))
+ p1 = Poly1(c1, domain=d1, window=w1)
+ for Poly2 in classes:
+ msg = "-- %s -> %s" % (Poly1.__name__, Poly2.__name__)
+ d2 = domain + np.random.random((2,))*.25
+ w2 = window + np.random.random((2,))*.25
+ p2 = p1.convert(kind=Poly2, domain=d2, window=w2)
+ assert_almost_equal(p2.domain, d2, err_msg=msg)
+ assert_almost_equal(p2.window, w2, err_msg=msg)
+ assert_almost_equal(p2(x), p1(x), err_msg=msg)
+
+ def test_cast(self):
+ x = np.linspace(0, 1, 10)
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly1 in classes:
+ d1 = domain + np.random.random((2,))*.25
+ w1 = window + np.random.random((2,))*.25
+ c1 = np.random.random((3,))
+ p1 = Poly1(c1, domain=d1, window=w1)
+ for Poly2 in classes:
+ msg = "-- %s -> %s" % (Poly1.__name__, Poly2.__name__)
+ d2 = domain + np.random.random((2,))*.25
+ w2 = window + np.random.random((2,))*.25
+ p2 = Poly2.cast(p1, domain=d2, window=w2)
+ assert_almost_equal(p2.domain, d2, err_msg=msg)
+ assert_almost_equal(p2.window, w2, err_msg=msg)
+ assert_almost_equal(p2(x), p1(x), err_msg=msg)
+
+
+class TestClasses(TestCase):
+
+ def test_basis(self):
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ d = domain + np.random.random((2,))*.25
+ w = window + np.random.random((2,))*.25
+ p = Poly.basis(5, domain=d, window=w)
+ assert_equal(p.domain, d, err_msg=msg)
+ assert_equal(p.window, w, err_msg=msg)
+ assert_equal(p.coef, [0]*5 + [1])
+
+ def test_fromroots(self):
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ d = domain + np.random.random((2,))*.25
+ w = window + np.random.random((2,))*.25
+ r = np.random.random((5,))
+ p1 = Poly.fromroots(r, domain=d, window=w)
+ assert_equal(p1.domain, d, err_msg=msg)
+ assert_equal(p1.window, w, err_msg=msg)
+ assert_almost_equal(p1(r), 0, err_msg=msg)
+ # test monic with same domain and window
+ p2 = Polynomial.cast(p1, domain=d, window=w)
+ assert_almost_equal(p2.coef[-1], 1, err_msg=msg)
+
+ def test_roots(self):
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ d = domain + np.random.random((2,))*.25
+ w = window + np.random.random((2,))*.25
+ tgt = np.sort(np.random.random((5,)))
+ res = np.sort(Poly.fromroots(tgt).roots())
+ assert_almost_equal(res, tgt, err_msg=msg)
+
+ def test_degree(self):
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ p = Poly.basis(5)
+ assert_equal(p.degree(), 5, err_msg=msg)
+
+ def test_copy(self):
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ p1 = Poly.basis(5)
+ p2 = p1.copy()
+ assert_(p1 == p2, msg)
+ assert_(p1 is not p2, msg)
+ assert_(p1.coef is not p2.coef, msg)
+ assert_(p1.domain is not p2.domain, msg)
+ assert_(p1.window is not p2.window, msg)
+
+ def test_deriv(self):
+ # Check that the derivative is the inverse of integration. It is
+ # assumes that the integration has been tested elsewhere.
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ d = domain + np.random.random((2,))*.25
+ w = window + np.random.random((2,))*.25
+ p1 = Poly([1, 2, 3], domain=d, window=w)
+ p2 = p1.integ(2, k=[1, 2])
+ p3 = p1.integ(1, k=[1])
+ assert_almost_equal(p2.deriv(1).coef, p3.coef, err_msg=msg)
+ assert_almost_equal(p2.deriv(2).coef, p1.coef, err_msg=msg)
+
+ def test_linspace(self):
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ d = domain + np.random.random((2,))*.25
+ w = window + np.random.random((2,))*.25
+ p = Poly([1,2,3], domain=d, window=w)
+ # test default domain
+ xtgt = np.linspace(d[0], d[1], 20)
+ ytgt = p(xtgt)
+ xres, yres = p.linspace(20)
+ assert_almost_equal(xres, xtgt, err_msg=msg)
+ assert_almost_equal(yres, ytgt, err_msg=msg)
+ # test specified domain
+ xtgt = np.linspace(0, 2, 20)
+ ytgt = p(xtgt)
+ xres, yres = p.linspace(20, domain=[0, 2])
+ assert_almost_equal(xres, xtgt, err_msg=msg)
+ assert_almost_equal(yres, ytgt, err_msg=msg)
+
+ def test_fit(self) :
+
+ def f(x) :
+ return x*(x - 1)*(x - 2)
+ x = np.linspace(0,3)
+ y = f(x)
+
+ window = np.array([0, 1])
+ domain = np.array([0, 1])
+ for Poly in classes:
+ msg = "-- %s" % (Poly.__name__,)
+ # test default value of domain
+ p = Poly.fit(x, y, 3)
+ assert_almost_equal(p.domain, [0,3], err_msg=msg)
+ assert_almost_equal(p(x), y, err_msg=msg)
+ assert_equal(p.degree(), 3, err_msg=msg)
+
+ # test with given windows and domains
+ d = domain + np.random.random((2,))*.25
+ w = window + np.random.random((2,))*.25
+ p = Poly.fit(x, y, 3, domain=d, window=w)
+ assert_almost_equal(p(x), y, err_msg=msg)
+ assert_almost_equal(p.domain, d, err_msg=msg)
+ assert_almost_equal(p.window, w, err_msg=msg)
+
+ # test with class domain default
+ p = Poly.fit(x, y, 3, [])
+ assert_equal(p.domain, Poly.domain, err_msg=msg)
+ assert_equal(p.window, Poly.window, err_msg=msg)
+
+ # test that fit accepts weights.
+ w = np.zeros_like(x)
+ z = y + np.random.random(y.shape)*.25
+ w[::2] = 1
+ p1 = Poly.fit(x[::2], z[::2], 3)
+ p2 = Poly.fit(x, z, 3, w=w)
+ assert_almost_equal(p1(x), p2(x), err_msg=msg)
+
+
+if __name__ == "__main__":
+ run_module_suite()