Functions to operate on polynomials.
Class | poly1d |
A one-dimensional polynomial class. |
Exception |
|
Issued by polyfit when the Vandermonde matrix is rank deficient. |
Function | poly |
Find the coefficients of a polynomial with the given sequence of roots. |
Function | polyadd |
Find the sum of two polynomials. |
Function | polyder |
Return the derivative of the specified order of a polynomial. |
Function | polydiv |
Returns the quotient and remainder of polynomial division. |
Function | polyfit |
Least squares polynomial fit. |
Function | polyint |
Return an antiderivative (indefinite integral) of a polynomial. |
Function | polymul |
Find the product of two polynomials. |
Function | polysub |
Difference (subtraction) of two polynomials. |
Function | polyval |
Evaluate a polynomial at specific values. |
Function | roots |
Return the roots of a polynomial with coefficients given in p. |
Variable | array |
Undocumented |
Function | _binary |
Undocumented |
Function | _poly |
Undocumented |
Function | _polyder |
Undocumented |
Function | _polydiv |
Undocumented |
Function | _polyfit |
Undocumented |
Function | _polyint |
Undocumented |
Function | _polyval |
Undocumented |
Function | _raise |
Undocumented |
Function | _roots |
Undocumented |
Variable | _poly |
Undocumented |
Find the coefficients of a polynomial with the given sequence of roots.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
Returns the coefficients of the polynomial whose leading coefficient is one for the given sequence of zeros (multiple roots must be included in the sequence as many times as their multiplicity; see Examples). A square matrix (or array, which will be treated as a matrix) can also be given, in which case the coefficients of the characteristic polynomial of the matrix are returned.
See Also
Notes
Specifying the roots of a polynomial still leaves one degree of freedom, typically represented by an undetermined leading coefficient. [1] In the case of this function, that coefficient - the first one in the returned array - is always taken as one. (If for some reason you have one other point, the only automatic way presently to leverage that information is to use polyfit.)
The characteristic polynomial, pa(t), of an n
-by-n
matrix A is given by
pa(t) = det(t I − A),
where I is the n
-by-n
identity matrix. [2]
References
[1] | M. Sullivan and M. Sullivan, III, "Algebra and Trignometry, Enhanced With Graphing Utilities," Prentice-Hall, pg. 318, 1996. |
[2] | G. Strang, "Linear Algebra and Its Applications, 2nd Edition," Academic Press, pg. 182, 1980. |
Examples
Given a sequence of a polynomial's zeros:
>>> np.poly((0, 0, 0)) # Multiple root example array([1., 0., 0., 0.])
The line above represents z**3 + 0*z**2 + 0*z + 0.
>>> np.poly((-1./2, 0, 1./2)) array([ 1. , 0. , -0.25, 0. ])
The line above represents z**3 - z/4
>>> np.poly((np.random.random(1)[0], 0, np.random.random(1)[0])) array([ 1. , -0.77086955, 0.08618131, 0. ]) # random
Given a square array object:
>>> P = np.array([[0, 1./3], [-1./2, 0]]) >>> np.poly(P) array([1. , 0. , 0.16666667])
Note how in all cases the leading coefficient is always 1.
Parameters | |
seqarray_like , shape(N , ) or (N , N) | A sequence of polynomial roots, or a square array or matrix object. |
Returns | |
ndarray | c - 1D array of polynomial coefficients from highest to lowest degree: c[0] * x**(N) + c[1] * x**(N-1) + ... + c[N-1] * x + c[N] where c[0] always equals 1. |
Raises | |
ValueError | If input is the wrong shape (the input must be a 1-D or square 2-D array). |
Find the sum of two polynomials.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
Returns the polynomial resulting from the sum of two input polynomials. Each input must be either a poly1d object or a 1D sequence of polynomial coefficients, from highest to lowest degree.
See Also
poly1d
- A one-dimensional polynomial class.
poly
, polyadd
, polyder
, polydiv
, polyfit
, polyint
, polysub
, polyval
Examples
>>> np.polyadd([1, 2], [9, 5, 4]) array([9, 6, 6])
Using poly1d objects:
>>> p1 = np.poly1d([1, 2]) >>> p2 = np.poly1d([9, 5, 4]) >>> print(p1) 1 x + 2 >>> print(p2) 2 9 x + 5 x + 4 >>> print(np.polyadd(p1, p2)) 2 9 x + 6 x + 6
Parameters | |
a1:array_like or poly1d object | Input polynomials. |
a2:array_like or poly1d object | Input polynomials. |
Returns | |
ndarray or poly1d object | out - The sum of the inputs. If either input is a poly1d object, then the output is also a poly1d object. Otherwise, it is a 1D array of polynomial coefficients from highest to lowest degree. |
Return the derivative of the specified order of a polynomial.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
Examples
The derivative of the polynomial x3 + x2 + x1 + 1 is:
>>> p = np.poly1d([1,1,1,1]) >>> p2 = np.polyder(p) >>> p2 poly1d([3, 2, 1])
which evaluates to:
>>> p2(2.) 17.0
We can verify this, approximating the derivative with (f(x + h) - f(x))/h:
>>> (p(2. + 0.001) - p(2.)) / 0.001 17.007000999997857
The fourth-order derivative of a 3rd-order polynomial is zero:
>>> np.polyder(p, 2) poly1d([6, 2]) >>> np.polyder(p, 3) poly1d([6]) >>> np.polyder(p, 4) poly1d([0])
Parameters | |
p:poly1d or sequence | Polynomial to differentiate.
A sequence is interpreted as polynomial coefficients, see poly1d . |
m:int , optional | Order of differentiation (default: 1) |
Returns | |
poly1d | der - A new polynomial representing the derivative. |
Returns the quotient and remainder of polynomial division.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
The input arrays are the coefficients (including any coefficients equal to zero) of the "numerator" (dividend) and "denominator" (divisor) polynomials, respectively.
Notes
Both u
and v
must be 0-d or 1-d (ndim = 0 or 1), but u.ndim
need
not equal v.ndim
. In other words, all four possible combinations -
u.ndim = v.ndim = 0, u.ndim = v.ndim = 1,
u.ndim = 1, v.ndim = 0, and u.ndim = 0, v.ndim = 1 - work.
Examples
>>> x = np.array([3.0, 5.0, 2.0]) >>> y = np.array([2.0, 1.0]) >>> np.polydiv(x, y) (array([1.5 , 1.75]), array([0.25]))
Parameters | |
u:array_like or poly1d | Dividend polynomial's coefficients. |
v:array_like or poly1d | Divisor polynomial's coefficients. |
Returns | |
|
def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False): (source) ¶
Least squares polynomial fit.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
Fit a polynomial p(x) = p[0] * x**deg + ... + p[deg] of degree deg
to points (x, y)
. Returns a vector of coefficients p
that minimises
the squared error in the order deg
, deg-1
, ... 0
.
The Polynomial.fit
class
method is recommended for new code as it is more stable numerically. See
the documentation of the method for more information.
See Also
polyval
- Compute polynomial values.
linalg.lstsq
- Computes a least-squares fit.
scipy.interpolate.UnivariateSpline
- Computes spline fits.
Notes
The solution minimizes the squared error
in the equations:
x[0]**n * p[0] + ... + x[0] * p[n-1] + p[n] = y[0] x[1]**n * p[0] + ... + x[1] * p[n-1] + p[n] = y[1] ... x[k]**n * p[0] + ... + x[k] * p[n-1] + p[n] = y[k]
The coefficient matrix of the coefficients p
is a Vandermonde matrix.
polyfit
issues a RankWarning
when the least-squares fit is badly
conditioned. This implies that the best fit is not well-defined due
to numerical error. The results may be improved by lowering the polynomial
degree or by replacing x
by x
- x
.mean(). The rcond
parameter
can also be set to a value smaller than its default, but the resulting
fit may be spurious: including contributions from the small singular
values can add numerical noise to the result.
Note that fitting polynomial coefficients is inherently badly conditioned when the degree of the polynomial is large or the interval of sample points is badly centered. The quality of the fit should always be checked in these cases. When polynomial fits are not satisfactory, splines may be a good alternative.
References
[1] | Wikipedia, "Curve fitting", https://en.wikipedia.org/wiki/Curve_fitting |
[2] | Wikipedia, "Polynomial interpolation", https://en.wikipedia.org/wiki/Polynomial_interpolation |
Examples
>>> import warnings >>> x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) >>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0]) >>> z = np.polyfit(x, y, 3) >>> z array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254]) # may vary
It is convenient to use poly1d
objects for dealing with polynomials:
>>> p = np.poly1d(z) >>> p(0.5) 0.6143849206349179 # may vary >>> p(3.5) -0.34732142857143039 # may vary >>> p(10) 22.579365079365115 # may vary
High-order polynomials may oscillate wildly:
>>> with warnings.catch_warnings(): ... warnings.simplefilter('ignore', np.RankWarning) ... p30 = np.poly1d(np.polyfit(x, y, 30)) ... >>> p30(4) -0.80000000000000204 # may vary >>> p30(5) -0.99999999999999445 # may vary >>> p30(4.5) -0.10547061179440398 # may vary
Illustration:
>>> import matplotlib.pyplot as plt >>> xp = np.linspace(-2, 6, 100) >>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--') >>> plt.ylim(-2,2) (-2, 2) >>> plt.show()
Parameters | |
x:array_like , shape(M , ) | x-coordinates of the M sample points (x[i], y[i]). |
y:array_like , shape(M , ) or (M , K) | y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column. |
deg:int | Degree of the fitting polynomial |
rcond:float , optional | Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases. |
full:bool , optional | Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned. |
w:array_like , shape(M , ), optional | Weights. If not None, the weight w[i] applies to the unsquared residual y[i] - y_hat[i] at x[i]. Ideally the weights are chosen so that the errors of the products w[i]*y[i] all have the same variance. When using inverse-variance weighting, use w[i] = 1/sigma(y[i]). The default value is None. |
cov:bool or str , optional | If given and not False , return not just the estimate but also its
covariance matrix. By default, the covariance are scaled by
chi2/dof, where dof = M - (deg + 1), i.e., the weights are presumed
to be unreliable except in a relative sense and everything is scaled
such that the reduced chi2 is unity. This scaling is omitted if
cov='unscaled', as is relevant for the case that the weights are
w = 1/sigma, with sigma known to be a reliable estimate of the
uncertainty. |
Returns | |
| |
Warns | |
RankWarning | The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if full == False. The warnings can be turned off by >>> import warnings >>> warnings.simplefilter('ignore', np.RankWarning) |
Return an antiderivative (indefinite integral) of a polynomial.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
The returned order m
antiderivative P
of polynomial p
satisfies
(dm)/(dxm)P(x) = p(x) and is defined up to m - 1
integration constants k
. The constants determine the low-order
polynomial part
of P
so that P(j)(0) = km − j − 1.
See Also
polyder
- derivative of a polynomial
poly1d.integ
- equivalent method
Examples
The defining property of the antiderivative:
>>> p = np.poly1d([1,1,1]) >>> P = np.polyint(p) >>> P poly1d([ 0.33333333, 0.5 , 1. , 0. ]) # may vary >>> np.polyder(P) == p True
The integration constants default to zero, but can be specified:
>>> P = np.polyint(p, 3) >>> P(0) 0.0 >>> np.polyder(P)(0) 0.0 >>> np.polyder(P, 2)(0) 0.0 >>> P = np.polyint(p, 3, k=[6,5,3]) >>> P poly1d([ 0.01666667, 0.04166667, 0.16666667, 3. , 5. , 3. ]) # may vary
Note that 3 = 6 / 2!, and that the constants are given in the order of integrations. Constant of the highest-order polynomial term comes first:
>>> np.polyder(P, 2)(0) 6.0 >>> np.polyder(P, 1)(0) 5.0 >>> P(0) 3.0
Parameters | |
p:array_like or poly1d | Polynomial to integrate.
A sequence is interpreted as polynomial coefficients, see poly1d . |
m:int , optional | Order of the antiderivative. (Default: 1) |
k:list of m scalarsor scalar , optional | Integration constants. They are given in the order of integration: those corresponding to highest-order terms come first. If None (default), all constants are assumed to be zero.
If |
Find the product of two polynomials.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
Finds the polynomial resulting from the multiplication of the two input polynomials. Each input must be either a poly1d object or a 1D sequence of polynomial coefficients, from highest to lowest degree.
See Also
poly1d
- A one-dimensional polynomial class.
poly
, polyadd
, polyder
, polydiv
, polyfit
, polyint
, polysub
, polyval
convolve
- Array convolution. Same output as polymul, but has parameter for overlap mode.
Examples
>>> np.polymul([1, 2, 3], [9, 5, 1]) array([ 9, 23, 38, 17, 3])
Using poly1d objects:
>>> p1 = np.poly1d([1, 2, 3]) >>> p2 = np.poly1d([9, 5, 1]) >>> print(p1) 2 1 x + 2 x + 3 >>> print(p2) 2 9 x + 5 x + 1 >>> print(np.polymul(p1, p2)) 4 3 2 9 x + 23 x + 38 x + 17 x + 3
Parameters | |
a1:array_like or poly1d object | Input polynomials. |
a2:array_like or poly1d object | Input polynomials. |
Returns | |
ndarray or poly1d object | out - The polynomial resulting from the multiplication of the inputs. If either inputs is a poly1d object, then the output is also a poly1d object. Otherwise, it is a 1D array of polynomial coefficients from highest to lowest degree. |
Difference (subtraction) of two polynomials.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
Given two polynomials a1
and a2
, returns a1 - a2.
a1
and a2
can be either array_like sequences of the polynomials'
coefficients (including coefficients equal to zero), or poly1d
objects.
Examples
>>> np.polysub([2, 10, -2], [3, 10, -4]) array([-1, 0, 2])
Parameters | |
a1:array_like or poly1d | Minuend and subtrahend polynomials, respectively. |
a2:array_like or poly1d | Minuend and subtrahend polynomials, respectively. |
Returns | |
ndarray or poly1d | out - Array or poly1d object of the difference polynomial's coefficients. |
Evaluate a polynomial at specific values.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
If p
is of length N, this function returns the value:
p[0]*x**(N-1) + p[1]*x**(N-2) + ... + p[N-2]*x + p[N-1]
If x
is a sequence, then p(x) is returned for each element of x.
If x
is another polynomial then the composite polynomial p(x(t))
is returned.
See Also
poly1d
- A polynomial class.
Notes
Horner's scheme [1] is used to evaluate the polynomial. Even so, for polynomials of high degree the values may be inaccurate due to rounding errors. Use carefully.
If x
is a subtype of ndarray
the return value will be of the same type.
References
[1] | I. N. Bronshtein, K. A. Semendyayev, and K. A. Hirsch (Eng. trans. Ed.), Handbook of Mathematics, New York, Van Nostrand Reinhold Co., 1985, pg. 720. |
Examples
>>> np.polyval([3,0,1], 5) # 3 * 5**2 + 0 * 5**1 + 1 76 >>> np.polyval([3,0,1], np.poly1d(5)) poly1d([76]) >>> np.polyval(np.poly1d([3,0,1]), 5) 76 >>> np.polyval(np.poly1d([3,0,1]), np.poly1d(5)) poly1d([76])
Parameters | |
p:array_like or poly1d object | 1D array of polynomial coefficients (including coefficients equal to zero) from highest degree to the constant term, or an instance of poly1d. |
x:array_like or poly1d object | A number, an array of numbers, or an instance of poly1d, at
which to evaluate p . |
Returns | |
ndarray or poly1d | values - If x is a poly1d instance, the result is the composition of the two
polynomials, i.e., x is "substituted" in p and the simplified
result is returned. In addition, the type of x - array_like or
poly1d - governs the type of the output: x array_like => values
array_like, x a poly1d object => values is also. |
Return the roots of a polynomial with coefficients given in p.
Note
This forms part of the old polynomial API. Since version 1.4, the
new polynomial API defined in numpy.polynomial
is preferred.
A summary of the differences can be found in the
:doc:`transition guide </reference/routines.polynomials>`.
The values in the rank-1 array p
are coefficients of a polynomial.
If the length of p
is n+1 then the polynomial is described by:
p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n]
See Also
Notes
The algorithm relies on computing the eigenvalues of the companion matrix [1].
References
[1] | R. A. Horn & C. R. Johnson, Matrix Analysis. Cambridge, UK: Cambridge University Press, 1999, pp. 146-7. |
Examples
>>> coeff = [3.2, 2, 1] >>> np.roots(coeff) array([-0.3125+0.46351241j, -0.3125-0.46351241j])
Parameters | |
p:array_like | Rank-1 array of polynomial coefficients. |
Returns | |
ndarray | out - An array containing the roots of the polynomial. |
Raises | |
ValueError | When p cannot be converted to a rank-1 array. |