Chris@87
|
1 from __future__ import division, absolute_import, print_function
|
Chris@87
|
2
|
Chris@87
|
3 '''
|
Chris@87
|
4 >>> p = np.poly1d([1.,2,3])
|
Chris@87
|
5 >>> p
|
Chris@87
|
6 poly1d([ 1., 2., 3.])
|
Chris@87
|
7 >>> print(p)
|
Chris@87
|
8 2
|
Chris@87
|
9 1 x + 2 x + 3
|
Chris@87
|
10 >>> q = np.poly1d([3.,2,1])
|
Chris@87
|
11 >>> q
|
Chris@87
|
12 poly1d([ 3., 2., 1.])
|
Chris@87
|
13 >>> print(q)
|
Chris@87
|
14 2
|
Chris@87
|
15 3 x + 2 x + 1
|
Chris@87
|
16 >>> print(np.poly1d([1.89999+2j, -3j, -5.12345678, 2+1j]))
|
Chris@87
|
17 3 2
|
Chris@87
|
18 (1.9 + 2j) x - 3j x - 5.123 x + (2 + 1j)
|
Chris@87
|
19 >>> print(np.poly1d([-3, -2, -1]))
|
Chris@87
|
20 2
|
Chris@87
|
21 -3 x - 2 x - 1
|
Chris@87
|
22
|
Chris@87
|
23 >>> p(0)
|
Chris@87
|
24 3.0
|
Chris@87
|
25 >>> p(5)
|
Chris@87
|
26 38.0
|
Chris@87
|
27 >>> q(0)
|
Chris@87
|
28 1.0
|
Chris@87
|
29 >>> q(5)
|
Chris@87
|
30 86.0
|
Chris@87
|
31
|
Chris@87
|
32 >>> p * q
|
Chris@87
|
33 poly1d([ 3., 8., 14., 8., 3.])
|
Chris@87
|
34 >>> p / q
|
Chris@87
|
35 (poly1d([ 0.33333333]), poly1d([ 1.33333333, 2.66666667]))
|
Chris@87
|
36 >>> p + q
|
Chris@87
|
37 poly1d([ 4., 4., 4.])
|
Chris@87
|
38 >>> p - q
|
Chris@87
|
39 poly1d([-2., 0., 2.])
|
Chris@87
|
40 >>> p ** 4
|
Chris@87
|
41 poly1d([ 1., 8., 36., 104., 214., 312., 324., 216., 81.])
|
Chris@87
|
42
|
Chris@87
|
43 >>> p(q)
|
Chris@87
|
44 poly1d([ 9., 12., 16., 8., 6.])
|
Chris@87
|
45 >>> q(p)
|
Chris@87
|
46 poly1d([ 3., 12., 32., 40., 34.])
|
Chris@87
|
47
|
Chris@87
|
48 >>> np.asarray(p)
|
Chris@87
|
49 array([ 1., 2., 3.])
|
Chris@87
|
50 >>> len(p)
|
Chris@87
|
51 2
|
Chris@87
|
52
|
Chris@87
|
53 >>> p[0], p[1], p[2], p[3]
|
Chris@87
|
54 (3.0, 2.0, 1.0, 0)
|
Chris@87
|
55
|
Chris@87
|
56 >>> p.integ()
|
Chris@87
|
57 poly1d([ 0.33333333, 1. , 3. , 0. ])
|
Chris@87
|
58 >>> p.integ(1)
|
Chris@87
|
59 poly1d([ 0.33333333, 1. , 3. , 0. ])
|
Chris@87
|
60 >>> p.integ(5)
|
Chris@87
|
61 poly1d([ 0.00039683, 0.00277778, 0.025 , 0. , 0. ,
|
Chris@87
|
62 0. , 0. , 0. ])
|
Chris@87
|
63 >>> p.deriv()
|
Chris@87
|
64 poly1d([ 2., 2.])
|
Chris@87
|
65 >>> p.deriv(2)
|
Chris@87
|
66 poly1d([ 2.])
|
Chris@87
|
67
|
Chris@87
|
68 >>> q = np.poly1d([1.,2,3], variable='y')
|
Chris@87
|
69 >>> print(q)
|
Chris@87
|
70 2
|
Chris@87
|
71 1 y + 2 y + 3
|
Chris@87
|
72 >>> q = np.poly1d([1.,2,3], variable='lambda')
|
Chris@87
|
73 >>> print(q)
|
Chris@87
|
74 2
|
Chris@87
|
75 1 lambda + 2 lambda + 3
|
Chris@87
|
76
|
Chris@87
|
77 >>> np.polydiv(np.poly1d([1,0,-1]), np.poly1d([1,1]))
|
Chris@87
|
78 (poly1d([ 1., -1.]), poly1d([ 0.]))
|
Chris@87
|
79
|
Chris@87
|
80 '''
|
Chris@87
|
81 import numpy as np
|
Chris@87
|
82 from numpy.testing import (
|
Chris@87
|
83 run_module_suite, TestCase, assert_, assert_equal, assert_array_equal,
|
Chris@87
|
84 assert_almost_equal, rundocs
|
Chris@87
|
85 )
|
Chris@87
|
86
|
Chris@87
|
87
|
Chris@87
|
88 class TestDocs(TestCase):
|
Chris@87
|
89 def test_doctests(self):
|
Chris@87
|
90 return rundocs()
|
Chris@87
|
91
|
Chris@87
|
92 def test_roots(self):
|
Chris@87
|
93 assert_array_equal(np.roots([1, 0, 0]), [0, 0])
|
Chris@87
|
94
|
Chris@87
|
95 def test_str_leading_zeros(self):
|
Chris@87
|
96 p = np.poly1d([4, 3, 2, 1])
|
Chris@87
|
97 p[3] = 0
|
Chris@87
|
98 assert_equal(str(p),
|
Chris@87
|
99 " 2\n"
|
Chris@87
|
100 "3 x + 2 x + 1")
|
Chris@87
|
101
|
Chris@87
|
102 p = np.poly1d([1, 2])
|
Chris@87
|
103 p[0] = 0
|
Chris@87
|
104 p[1] = 0
|
Chris@87
|
105 assert_equal(str(p), " \n0")
|
Chris@87
|
106
|
Chris@87
|
107 def test_polyfit(self):
|
Chris@87
|
108 c = np.array([3., 2., 1.])
|
Chris@87
|
109 x = np.linspace(0, 2, 7)
|
Chris@87
|
110 y = np.polyval(c, x)
|
Chris@87
|
111 err = [1, -1, 1, -1, 1, -1, 1]
|
Chris@87
|
112 weights = np.arange(8, 1, -1)**2/7.0
|
Chris@87
|
113
|
Chris@87
|
114 # check 1D case
|
Chris@87
|
115 m, cov = np.polyfit(x, y+err, 2, cov=True)
|
Chris@87
|
116 est = [3.8571, 0.2857, 1.619]
|
Chris@87
|
117 assert_almost_equal(est, m, decimal=4)
|
Chris@87
|
118 val0 = [[2.9388, -5.8776, 1.6327],
|
Chris@87
|
119 [-5.8776, 12.7347, -4.2449],
|
Chris@87
|
120 [1.6327, -4.2449, 2.3220]]
|
Chris@87
|
121 assert_almost_equal(val0, cov, decimal=4)
|
Chris@87
|
122
|
Chris@87
|
123 m2, cov2 = np.polyfit(x, y+err, 2, w=weights, cov=True)
|
Chris@87
|
124 assert_almost_equal([4.8927, -1.0177, 1.7768], m2, decimal=4)
|
Chris@87
|
125 val = [[8.7929, -10.0103, 0.9756],
|
Chris@87
|
126 [-10.0103, 13.6134, -1.8178],
|
Chris@87
|
127 [0.9756, -1.8178, 0.6674]]
|
Chris@87
|
128 assert_almost_equal(val, cov2, decimal=4)
|
Chris@87
|
129
|
Chris@87
|
130 # check 2D (n,1) case
|
Chris@87
|
131 y = y[:, np.newaxis]
|
Chris@87
|
132 c = c[:, np.newaxis]
|
Chris@87
|
133 assert_almost_equal(c, np.polyfit(x, y, 2))
|
Chris@87
|
134 # check 2D (n,2) case
|
Chris@87
|
135 yy = np.concatenate((y, y), axis=1)
|
Chris@87
|
136 cc = np.concatenate((c, c), axis=1)
|
Chris@87
|
137 assert_almost_equal(cc, np.polyfit(x, yy, 2))
|
Chris@87
|
138
|
Chris@87
|
139 m, cov = np.polyfit(x, yy + np.array(err)[:, np.newaxis], 2, cov=True)
|
Chris@87
|
140 assert_almost_equal(est, m[:, 0], decimal=4)
|
Chris@87
|
141 assert_almost_equal(est, m[:, 1], decimal=4)
|
Chris@87
|
142 assert_almost_equal(val0, cov[:, :, 0], decimal=4)
|
Chris@87
|
143 assert_almost_equal(val0, cov[:, :, 1], decimal=4)
|
Chris@87
|
144
|
Chris@87
|
145 def test_objects(self):
|
Chris@87
|
146 from decimal import Decimal
|
Chris@87
|
147 p = np.poly1d([Decimal('4.0'), Decimal('3.0'), Decimal('2.0')])
|
Chris@87
|
148 p2 = p * Decimal('1.333333333333333')
|
Chris@87
|
149 assert_(p2[1] == Decimal("3.9999999999999990"))
|
Chris@87
|
150 p2 = p.deriv()
|
Chris@87
|
151 assert_(p2[1] == Decimal('8.0'))
|
Chris@87
|
152 p2 = p.integ()
|
Chris@87
|
153 assert_(p2[3] == Decimal("1.333333333333333333333333333"))
|
Chris@87
|
154 assert_(p2[2] == Decimal('1.5'))
|
Chris@87
|
155 assert_(np.issubdtype(p2.coeffs.dtype, np.object_))
|
Chris@87
|
156
|
Chris@87
|
157 def test_complex(self):
|
Chris@87
|
158 p = np.poly1d([3j, 2j, 1j])
|
Chris@87
|
159 p2 = p.integ()
|
Chris@87
|
160 assert_((p2.coeffs == [1j, 1j, 1j, 0]).all())
|
Chris@87
|
161 p2 = p.deriv()
|
Chris@87
|
162 assert_((p2.coeffs == [6j, 2j]).all())
|
Chris@87
|
163
|
Chris@87
|
164 def test_integ_coeffs(self):
|
Chris@87
|
165 p = np.poly1d([3, 2, 1])
|
Chris@87
|
166 p2 = p.integ(3, k=[9, 7, 6])
|
Chris@87
|
167 assert_(
|
Chris@87
|
168 (p2.coeffs == [1/4./5., 1/3./4., 1/2./3., 9/1./2., 7, 6]).all())
|
Chris@87
|
169
|
Chris@87
|
170 def test_zero_dims(self):
|
Chris@87
|
171 try:
|
Chris@87
|
172 np.poly(np.zeros((0, 0)))
|
Chris@87
|
173 except ValueError:
|
Chris@87
|
174 pass
|
Chris@87
|
175
|
Chris@87
|
176 if __name__ == "__main__":
|
Chris@87
|
177 run_module_suite()
|