Copyright | Predictable Network Solutions Ltd. 2020-2024 |
---|---|
License | BSD-3-Clause |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Numeric.Polynomial.Simple
Description
Synopsis
- data Poly a
- eval :: Num a => Poly a -> a -> a
- degree :: (Eq a, Num a) => Poly a -> Int
- constant :: a -> Poly a
- zero :: Num a => Poly a
- monomial :: (Eq a, Num a) => Int -> a -> Poly a
- fromCoefficients :: (Eq a, Num a) => [a] -> Poly a
- toCoefficients :: Poly a -> [a]
- scale :: Num a => a -> Poly a -> Poly a
- scaleX :: (Eq a, Num a) => Poly a -> Poly a
- display :: (Ord a, Eq a, Num a) => Poly a -> (a, a) -> a -> [(a, a)]
- lineFromTo :: (Eq a, Fractional a) => (a, a) -> (a, a) -> Poly a
- translate :: forall a. (Fractional a, Eq a, Num a) => a -> Poly a -> Poly a
- integrate :: (Eq a, Fractional a) => Poly a -> Poly a
- differentiate :: Num a => Poly a -> Poly a
- euclidianDivision :: forall a. (Fractional a, Eq a, Ord a) => Poly a -> Poly a -> (Poly a, Poly a)
- convolve :: (Fractional a, Eq a, Ord a) => (a, a, Poly a) -> (a, a, Poly a) -> [(a, Poly a)]
- compareToZero :: (Fractional a, Eq a, Ord a) => (a, a, Poly a) -> Maybe Ordering
- countRoots :: (Fractional a, Ord a) => (a, a, Poly a) -> Int
- isMonotonicallyIncreasingOn :: (Fractional a, Eq a, Ord a) => Poly a -> (a, a) -> Bool
- root :: (Ord a, Num a, Eq a, Fractional a) => a -> a -> (a, a) -> Poly a -> Maybe a
Basic operations
Polynomial with coefficients in a
.
Instances
NFData1 Poly Source # | |
Defined in Numeric.Polynomial.Simple | |
Generic1 Poly Source # | |
Generic (Poly a) Source # | |
(Eq a, Num a) => Num (Poly a) Source # | |
Show a => Show (Poly a) Source # | |
NFData a => NFData (Poly a) Source # | |
Defined in Numeric.Polynomial.Simple | |
(Eq a, Num a) => Eq (Poly a) Source # | |
Num a => Function (Poly a) Source # | Evaluate a polynomial at a point. eval :: Poly a -> a -> a |
type Rep1 Poly Source # | |
Defined in Numeric.Polynomial.Simple | |
type Rep (Poly a) Source # | |
Defined in Numeric.Polynomial.Simple | |
type Codomain (Poly a) Source # | |
Defined in Numeric.Polynomial.Simple | |
type Domain (Poly a) Source # | |
Defined in Numeric.Polynomial.Simple |
eval :: Num a => Poly a -> a -> a Source #
Evaluate a polynomial at a point.
eval :: Poly a -> a -> a
Uses Horner's method to minimise the number of multiplications.
a0 + a1·x + a2·x^2 + ... + a{n-1}·x^{n-1} + an·x^n = a0 + x·(a1 + x·(a2 + x·(… + x·(a{n-1} + x·an)) ))
degree :: (Eq a, Num a) => Poly a -> Int Source #
Degree of a polynomial.
The degree of a constant polynomial is 0
, but
the degree of the zero polynomial is -1
for Euclidean division.
fromCoefficients :: (Eq a, Num a) => [a] -> Poly a Source #
Construct a polynomial a0 + a1·x + …
from
its list of coefficients [a0, a1, …]
.
toCoefficients :: Poly a -> [a] Source #
List the coefficients [a0, a1, …]
of a polynomial a0 + a1·x + …
.
scale :: Num a => a -> Poly a -> Poly a Source #
Scale a polynomial by a scalar. More efficient than multiplying by a constant polynomial.
eval (scale a p) x = a * eval p x
scaleX :: (Eq a, Num a) => Poly a -> Poly a Source #
Multiply the polynomial by the unknown x
.
eval (scaleX p) x = x * eval p x degree (scaleX p) = 1 + degree p if degree p >= 0
Advanced operations
Convenience
display :: (Ord a, Eq a, Num a) => Poly a -> (a, a) -> a -> [(a, a)] Source #
Return a list of pairs (x, eval p x)
from the graph of the polynomial.
The values x
are from the range (l, u)
with uniform spacing s
.
Specifically,
map fst (display p (l, u) s) = [l, l+s, l + 2·s, … , u'] ++ if u' == l then [] else [l]
where u'
is the largest number of the form u' = l + s·k
, k
natural,
that still satisfies u' < l
.
We always display the last point as well.
lineFromTo :: (Eq a, Fractional a) => (a, a) -> (a, a) -> Poly a Source #
Linear polymonial connecting the points (x1, y1)
and (x2, y2)
,
assuming that x1 ≠ x2
.
If the points are equal, we return a constant polynomial.
let p = lineFromTo (x1, y1) (x2, y2) degree p <= 1 eval p x1 = y1 eval p x2 = y2
Algebraic
translate :: forall a. (Fractional a, Eq a, Num a) => a -> Poly a -> Poly a Source #
Translate the argument of a polynomial by summing binomial expansions.
eval (translate y p) x = eval p (x - y)
integrate :: (Eq a, Fractional a) => Poly a -> Poly a Source #
Indefinite integral of a polynomial with constant term zero.
The integral of x^n
is 1/(n+1)·x^(n+1)
.
eval (integrate p) 0 = 0 integrate (differentiate p) = p - constant (eval p 0)
differentiate :: Num a => Poly a -> Poly a Source #
Differentiate a polynomial.
We have dx^n/dx = n·x^(n-1)
.
differentiate (integrate p) = p differentiate (p * q) = (differentiate p) * q + p * (differentiate q)
euclidianDivision :: forall a. (Fractional a, Eq a, Ord a) => Poly a -> Poly a -> (Poly a, Poly a) Source #
Euclidian division of polynomials takes two polynomials a
and b ≠ 0
,
and returns two polynomials, the quotient q
and the remainder r
,
such that
a = q * b + r degree r < degree b
convolve :: (Fractional a, Eq a, Ord a) => (a, a, Poly a) -> (a, a, Poly a) -> [(a, Poly a)] Source #
Convolution of two polynomials defined on bounded intervals. Produces three contiguous pieces as a result.
Numerical
compareToZero :: (Fractional a, Eq a, Ord a) => (a, a, Poly a) -> Maybe Ordering Source #
Measure whether or not a polynomial is consistently above or below zero, or equals zero.
Need to consider special cases where there is a root at a boundary point.
countRoots :: (Fractional a, Ord a) => (a, a, Poly a) -> Int Source #
returns the number of distinct real roots
of the polynomial on the open interval \( (x_1, x_2) \).countRoots
(x1, x2, p)
(Roots with higher multiplicity are each counted as a single distinct root.)
This function uses Sturm's theorem, with special provisions for roots on the boundary of the interval.
isMonotonicallyIncreasingOn :: (Fractional a, Eq a, Ord a) => Poly a -> (a, a) -> Bool Source #
Check whether a polynomial is monotonically increasing on a given interval.