Drake
Polynomial< _CoefficientType > Class Template Reference

A scalar multi-variate polynomial, modeled after the msspoly in spotless. More...

#include <drake/common/polynomial.h>

Classes

class  Monomial
 An additive atom of a Polynomial: The product of any number of Terms and a coefficient. More...
 
struct  Product
 
class  Term
 An individual variable raised to an integer power; e.g. x**2. More...
 

Public Types

typedef _CoefficientType CoefficientType
 
typedef unsigned int VarType
 
typedef int PowerType
 This should be 'unsigned int' but MSVC considers a call to std::pow(..., unsigned int) ambiguous because it won't cast unsigned int to int. More...
 
typedef Eigen::NumTraits< CoefficientType >::Real RealScalar
 
typedef std::complex< RealScalarRootType
 
typedef Eigen::Matrix< RootType, Eigen::Dynamic, 1 > RootsType
 

Public Member Functions

 Polynomial (void)
 Construct the vacuous polynomial, "0". More...
 
 Polynomial (const CoefficientType &scalar)
 Construct a Polynomial of a single constant. e.g. "5". More...
 
 Polynomial (const CoefficientType coeff, const std::vector< Term > &terms)
 Construct a Polynomial consisting of a single Monomial, e.g. "5xy**3". More...
 
 Polynomial (typename std::vector< Monomial >::const_iterator start, typename std::vector< Monomial >::const_iterator finish)
 Construct a Polynomial from a sequence of Monomials. More...
 
 Polynomial (const std::string varname, const unsigned int num=1)
 Construct a polynomial consisting of a single Monomial of the variable named varname + num. More...
 
 Polynomial (const CoefficientType &coeff, const VarType &v)
 Construct a single Monomial of the given coefficient and variable. More...
 
template<typename Derived >
 Polynomial (Eigen::MatrixBase< Derived > const &coefficients)
 A legacy constructor for univariate polynomials: Takes a vector of coefficients for the constant, x, x**2, x**3... More...
 
int GetNumberOfCoefficients () const
 Returns the number of unique Monomials (and thus the number of coefficients) in this Polynomial. More...
 
int GetDegree () const
 Returns the highest degree of any Monomial in this Polynomial. More...
 
bool IsAffine () const
 Returns true iff this is a sum of terms of degree 1, plus a constant. More...
 
VarType GetSimpleVariable () const
 If the polynomial is "simple" – e.g. More...
 
const std::vector< Monomial > & GetMonomials () const
 
Eigen::Matrix< CoefficientType, Eigen::Dynamic, 1 > GetCoefficients () const
 
std::set< VarTypeGetVariables () const
 Returns a set of all of the variables present in this Polynomial. More...
 
template<typename T >
Product< CoefficientType, T >::type EvaluateUnivariate (const T &x) const
 Evaluate a univariate Polynomial at a specific point. More...
 
template<typename T >
Product< CoefficientType, T >::type EvaluateMultivariate (const std::map< VarType, T > &var_values) const
 Evaluate a multivariate Polynomial at a specific point. More...
 
drake::AutoDiffXd EvaluateMultivariate (const std::map< VarType, drake::AutoDiffXd > &var_values) const
 Specialization of EvaluateMultivariate on AutoDiffXd. More...
 
Polynomial EvaluatePartial (const std::map< VarType, CoefficientType > &var_values) const
 Substitute values for some but not necessarily all variables of a Polynomial. More...
 
void Subs (const VarType &orig, const VarType &replacement)
 Replaces all instances of variable orig with replacement. More...
 
Polynomial Derivative (int derivative_order=1) const
 Takes the derivative of this (univariate) Polynomial. More...
 
Polynomial Integral (const CoefficientType &integration_constant=0.0) const
 Takes the integral of this (univariate, non-constant) Polynomial. More...
 
bool operator== (const Polynomial &other) const
 
Polynomialoperator+= (const Polynomial &other)
 
Polynomialoperator-= (const Polynomial &other)
 
Polynomialoperator*= (const Polynomial &other)
 
Polynomialoperator+= (const CoefficientType &scalar)
 
Polynomialoperator-= (const CoefficientType &scalar)
 
Polynomialoperator*= (const CoefficientType &scalar)
 
Polynomialoperator/= (const CoefficientType &scalar)
 
const Polynomial operator+ (const Polynomial &other) const
 
const Polynomial operator- (const Polynomial &other) const
 
const Polynomial operator- () const
 
const Polynomial operator* (const Polynomial &other) const
 
const Polynomial operator/ (const CoefficientType &scalar) const
 
bool operator< (const Polynomial &other) const
 A comparison to allow std::lexicographical_compare on this class; does not reflect any sort of mathematical total order. More...
 
RootsType Roots () const
 Returns the roots of this (univariate) Polynomial. More...
 
bool IsApprox (const Polynomial &other, const RealScalar &tol) const
 Checks if a (univariate) Polynomial is approximately equal to this one. More...
 

Static Public Member Functions

static bool IsValidVariableName (const std::string name)
 Variable name/ID conversion facility. More...
 
static VarType VariableNameToId (const std::string name, const unsigned int m=1)
 
static std::string IdToVariableName (const VarType id)
 

Friends

const Polynomial operator+ (const Polynomial &p, const CoefficientType &scalar)
 
const Polynomial operator+ (const CoefficientType &scalar, const Polynomial &p)
 
const Polynomial operator- (const Polynomial &p, const CoefficientType &scalar)
 
const Polynomial operator- (const CoefficientType &scalar, const Polynomial &p)
 
const Polynomial operator* (const Polynomial &p, const CoefficientType &scalar)
 
const Polynomial operator* (const CoefficientType &scalar, const Polynomial &p)
 
std::ostream & operator<< (std::ostream &os, const Monomial &m)
 
std::ostream & operator<< (std::ostream &os, const Polynomial &poly)
 
template<typename CoefficientType >
Polynomial< CoefficientTypepow (const Polynomial< CoefficientType > &p, typename Polynomial< CoefficientType >::PowerType n)
 

Detailed Description

template<typename _CoefficientType = double>
class Polynomial< _CoefficientType >

A scalar multi-variate polynomial, modeled after the msspoly in spotless.

Polynomial represents a list of additive Monomials, each one of which is a product of a constant coefficient (of _CoefficientType, which by default is double) and any number of distinct Terms (variables raised to positive integer powers).

Variables are identified by integer indices rather than symbolic names, but an automatic facility is provided to covert variable names up to four characters into unique integers, provided those variables are named using only lowercase letters and the "@#_." characters followed by a number. For example, valid names include "dx4" and "m_x".

Monomials which have the same variables and powers may be constructed but will be automatically combined: (3 * a * b * a) + (1.5 * b * a**2) will be reduced to (4.5 * b * a**2) internally after construction.

Polynomials can be added, subtracted, and multiplied. They may only be divided by scalars (of _CoefficientType) because Polynomials are not closed under division.

Member Typedef Documentation

◆ CoefficientType

typedef _CoefficientType CoefficientType

◆ PowerType

typedef int PowerType

This should be 'unsigned int' but MSVC considers a call to std::pow(..., unsigned int) ambiguous because it won't cast unsigned int to int.

◆ RealScalar

typedef Eigen::NumTraits<CoefficientType>::Real RealScalar

◆ RootsType

typedef Eigen::Matrix<RootType, Eigen::Dynamic, 1> RootsType

◆ RootType

typedef std::complex<RealScalar> RootType

◆ VarType

typedef unsigned int VarType

Constructor & Destructor Documentation

◆ Polynomial() [1/7]

Polynomial ( void  )
inline

Construct the vacuous polynomial, "0".

◆ Polynomial() [2/7]

Polynomial ( const CoefficientType scalar)

Construct a Polynomial of a single constant. e.g. "5".

◆ Polynomial() [3/7]

Polynomial ( const CoefficientType  coeff,
const std::vector< Term > &  terms 
)

Construct a Polynomial consisting of a single Monomial, e.g. "5xy**3".

◆ Polynomial() [4/7]

Polynomial ( typename std::vector< Monomial >::const_iterator  start,
typename std::vector< Monomial >::const_iterator  finish 
)

Construct a Polynomial from a sequence of Monomials.

◆ Polynomial() [5/7]

Polynomial ( const std::string  varname,
const unsigned int  num = 1 
)
explicit

Construct a polynomial consisting of a single Monomial of the variable named varname + num.

◆ Polynomial() [6/7]

Polynomial ( const CoefficientType coeff,
const VarType v 
)

Construct a single Monomial of the given coefficient and variable.

◆ Polynomial() [7/7]

Polynomial ( Eigen::MatrixBase< Derived > const &  coefficients)
inlineexplicit

A legacy constructor for univariate polynomials: Takes a vector of coefficients for the constant, x, x**2, x**3...

Monomials.

Member Function Documentation

◆ Derivative()

Polynomial Derivative ( int  derivative_order = 1) const

Takes the derivative of this (univariate) Polynomial.

Returns a new Polynomial that is the derivative of this one in its sole variable.

Exceptions
std::exceptionif this Polynomial is not univariate.

If derivative_order is given, takes the nth derivative of this Polynomial.

◆ EvaluateMultivariate() [1/2]

Product<CoefficientType, T>::type EvaluateMultivariate ( const std::map< VarType, T > &  var_values) const
inline

Evaluate a multivariate Polynomial at a specific point.

Evaluates a Polynomial with the given values for each variable.

Exceptions
std::out_of_rangeif the Polynomial contains variables for which values were not provided.

The provided values may be of any type which is std::is_arithmetic (supporting the std::pow, *, and + operations) and need not be CoefficientsType or RealScalar)

◆ EvaluateMultivariate() [2/2]

drake::AutoDiffXd EvaluateMultivariate ( const std::map< VarType, drake::AutoDiffXd > &  var_values) const
inline

Specialization of EvaluateMultivariate on AutoDiffXd.

Specialize EvaluateMultivariate on AutoDiffXd because Eigen autodiffs implement a confusing subset of operators and conversions that makes a strictly generic approach too confusing and unreadable.

Note that it is up to the caller to ensure that all of the AutoDiffXds in var_values correctly correspond to one another, because Polynomial has no knowledge of what partial derivative terms the indices of a given AutoDiffXd correspond to.

◆ EvaluatePartial()

Polynomial EvaluatePartial ( const std::map< VarType, CoefficientType > &  var_values) const

Substitute values for some but not necessarily all variables of a Polynomial.

Analogous to EvaluateMultivariate, but: (1) Restricted to CoefficientType, and (2) Need not map every variable in var_values.

Returns a Polynomial in which each variable in var_values has been replaced with its value and constants appropriately combined.

◆ EvaluateUnivariate()

Product<CoefficientType, T>::type EvaluateUnivariate ( const T &  x) const
inline

Evaluate a univariate Polynomial at a specific point.

Evaluates a univariate Polynomial at the given x.

Exceptions
std::runtime_errorif this Polynomial is not univariate.

x may be of any type supporting the ** and + operations (which can be different from both CoefficientsType and RealScalar)

◆ GetCoefficients()

Eigen::Matrix<CoefficientType, Eigen::Dynamic, 1> GetCoefficients ( ) const

◆ GetDegree()

int GetDegree ( ) const

Returns the highest degree of any Monomial in this Polynomial.

The degree of a multivariate Monomial is the product of the degrees of each of its terms.

◆ GetMonomials()

const std::vector<Monomial>& GetMonomials ( ) const

◆ GetNumberOfCoefficients()

int GetNumberOfCoefficients ( ) const

Returns the number of unique Monomials (and thus the number of coefficients) in this Polynomial.

◆ GetSimpleVariable()

VarType GetSimpleVariable ( ) const

If the polynomial is "simple" – e.g.

just a single term with coefficient 1 – then returns that variable; otherwise returns 0.

◆ GetVariables()

std::set<VarType> GetVariables ( ) const

Returns a set of all of the variables present in this Polynomial.

◆ IdToVariableName()

static std::string IdToVariableName ( const VarType  id)
static

◆ Integral()

Polynomial Integral ( const CoefficientType integration_constant = 0.0) const

Takes the integral of this (univariate, non-constant) Polynomial.

Returns a new Polynomial that is the indefinite integral of this one in its sole variable.

Exceptions
std::exceptionif this Polynomial is not univariate, or if it has no variables.

If integration_constant is given, adds that constant as the constant term (zeroth-order coefficient) of the resulting Polynomial.

◆ IsAffine()

bool IsAffine ( ) const

Returns true iff this is a sum of terms of degree 1, plus a constant.

◆ IsApprox()

bool IsApprox ( const Polynomial< _CoefficientType > &  other,
const RealScalar tol 
) const

Checks if a (univariate) Polynomial is approximately equal to this one.

Checks that every coefficient of other is within tol of the corresponding coefficient of this Polynomial.

Exceptions
std::exceptionif either Polynomial is not univariate.

◆ IsValidVariableName()

static bool IsValidVariableName ( const std::string  name)
static

Variable name/ID conversion facility.

◆ operator*()

const Polynomial operator* ( const Polynomial< _CoefficientType > &  other) const

◆ operator*=() [1/2]

Polynomial& operator*= ( const Polynomial< _CoefficientType > &  other)

◆ operator*=() [2/2]

Polynomial& operator*= ( const CoefficientType scalar)

◆ operator+()

const Polynomial operator+ ( const Polynomial< _CoefficientType > &  other) const

◆ operator+=() [1/2]

Polynomial& operator+= ( const Polynomial< _CoefficientType > &  other)

◆ operator+=() [2/2]

Polynomial& operator+= ( const CoefficientType scalar)

◆ operator-() [1/2]

const Polynomial operator- ( const Polynomial< _CoefficientType > &  other) const

◆ operator-() [2/2]

const Polynomial operator- ( ) const

◆ operator-=() [1/2]

Polynomial& operator-= ( const Polynomial< _CoefficientType > &  other)

◆ operator-=() [2/2]

Polynomial& operator-= ( const CoefficientType scalar)

◆ operator/()

const Polynomial operator/ ( const CoefficientType scalar) const

◆ operator/=()

Polynomial& operator/= ( const CoefficientType scalar)

◆ operator<()

bool operator< ( const Polynomial< _CoefficientType > &  other) const
inline

A comparison to allow std::lexicographical_compare on this class; does not reflect any sort of mathematical total order.

◆ operator==()

bool operator== ( const Polynomial< _CoefficientType > &  other) const

◆ Roots()

RootsType Roots ( ) const

Returns the roots of this (univariate) Polynomial.

Returns the roots of a univariate Polynomial as an Eigen column vector of complex numbers whose components are of the RealScalar type.

Exceptions
std::exceptionof this Polynomial is not univariate.

◆ Subs()

void Subs ( const VarType orig,
const VarType replacement 
)

Replaces all instances of variable orig with replacement.

◆ VariableNameToId()

static VarType VariableNameToId ( const std::string  name,
const unsigned int  m = 1 
)
static

Friends And Related Function Documentation

◆ operator* [1/2]

const Polynomial operator* ( const Polynomial< _CoefficientType > &  p,
const CoefficientType scalar 
)
friend

◆ operator* [2/2]

const Polynomial operator* ( const CoefficientType scalar,
const Polynomial< _CoefficientType > &  p 
)
friend

◆ operator+ [1/2]

const Polynomial operator+ ( const Polynomial< _CoefficientType > &  p,
const CoefficientType scalar 
)
friend

◆ operator+ [2/2]

const Polynomial operator+ ( const CoefficientType scalar,
const Polynomial< _CoefficientType > &  p 
)
friend

◆ operator- [1/2]

const Polynomial operator- ( const Polynomial< _CoefficientType > &  p,
const CoefficientType scalar 
)
friend

◆ operator- [2/2]

const Polynomial operator- ( const CoefficientType scalar,
const Polynomial< _CoefficientType > &  p 
)
friend

◆ operator<< [1/2]

std::ostream& operator<< ( std::ostream &  os,
const Monomial m 
)
friend

◆ operator<< [2/2]

std::ostream& operator<< ( std::ostream &  os,
const Polynomial< _CoefficientType > &  poly 
)
friend

◆ pow

Polynomial<CoefficientType> pow ( const Polynomial< CoefficientType > &  p,
typename Polynomial< CoefficientType >::PowerType  n 
)
friend

The documentation for this class was generated from the following file: