VTK
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Attributes | List of all members
vtkPolynomialSolversUnivariate Class Reference

polynomial solvers More...

#include <vtkPolynomialSolversUnivariate.h>

Inheritance diagram for vtkPolynomialSolversUnivariate:
[legend]
Collaboration diagram for vtkPolynomialSolversUnivariate:
[legend]

Public Types

typedef vtkObject Superclass
 

Public Member Functions

virtual vtkTypeBool IsA (const char *type)
 Return 1 if this class is the same type of (or a subclass of) the named class. More...
 
vtkPolynomialSolversUnivariateNewInstance () const
 
void PrintSelf (ostream &os, vtkIndent indent) override
 Methods invoked by print to print information about the object including superclasses. More...
 
- Public Member Functions inherited from vtkObject
 vtkBaseTypeMacro (vtkObject, vtkObjectBase)
 
virtual void DebugOn ()
 Turn debugging output on. More...
 
virtual void DebugOff ()
 Turn debugging output off. More...
 
bool GetDebug ()
 Get the value of the debug flag. More...
 
void SetDebug (bool debugFlag)
 Set the value of the debug flag. More...
 
virtual void Modified ()
 Update the modification time for this object. More...
 
virtual vtkMTimeType GetMTime ()
 Return this object's modified time. More...
 
unsigned long AddObserver (unsigned long event, vtkCommand *, float priority=0.0f)
 Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...
 
unsigned long AddObserver (const char *event, vtkCommand *, float priority=0.0f)
 
vtkCommandGetCommand (unsigned long tag)
 
void RemoveObserver (vtkCommand *)
 
void RemoveObservers (unsigned long event, vtkCommand *)
 
void RemoveObservers (const char *event, vtkCommand *)
 
vtkTypeBool HasObserver (unsigned long event, vtkCommand *)
 
vtkTypeBool HasObserver (const char *event, vtkCommand *)
 
void RemoveObserver (unsigned long tag)
 
void RemoveObservers (unsigned long event)
 
void RemoveObservers (const char *event)
 
void RemoveAllObservers ()
 
vtkTypeBool HasObserver (unsigned long event)
 
vtkTypeBool HasObserver (const char *event)
 
template<class U , class T >
unsigned long AddObserver (unsigned long event, U observer, void(T::*callback)(), float priority=0.0f)
 Overloads to AddObserver that allow developers to add class member functions as callbacks for events. More...
 
template<class U , class T >
unsigned long AddObserver (unsigned long event, U observer, void(T::*callback)(vtkObject *, unsigned long, void *), float priority=0.0f)
 
template<class U , class T >
unsigned long AddObserver (unsigned long event, U observer, bool(T::*callback)(vtkObject *, unsigned long, void *), float priority=0.0f)
 Allow user to set the AbortFlagOn() with the return value of the callback method. More...
 
int InvokeEvent (unsigned long event, void *callData)
 This method invokes an event and return whether the event was aborted or not. More...
 
int InvokeEvent (const char *event, void *callData)
 
int InvokeEvent (unsigned long event)
 
int InvokeEvent (const char *event)
 
- Public Member Functions inherited from vtkObjectBase
const char * GetClassName () const
 Return the class name as a string. More...
 
virtual void Delete ()
 Delete a VTK object. More...
 
virtual void FastDelete ()
 Delete a reference to this object. More...
 
void InitializeObjectBase ()
 
void Print (ostream &os)
 Print an object to an ostream. More...
 
virtual void PrintHeader (ostream &os, vtkIndent indent)
 
virtual void PrintTrailer (ostream &os, vtkIndent indent)
 
virtual void Register (vtkObjectBase *o)
 Increase the reference count (mark as used by another object). More...
 
virtual void UnRegister (vtkObjectBase *o)
 Decrease the reference count (release by another object). More...
 
int GetReferenceCount ()
 Return the current reference count of this object. More...
 
void SetReferenceCount (int)
 Sets the reference count. More...
 
void PrintRevisions (ostream &)
 Legacy. More...
 

Static Public Member Functions

static vtkPolynomialSolversUnivariateNew ()
 
static vtkTypeBool IsTypeOf (const char *type)
 
static vtkPolynomialSolversUnivariateSafeDownCast (vtkObjectBase *o)
 
static ostream & PrintPolynomial (ostream &os, double *P, int degP)
 
static int HabichtBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol)
 Finds all REAL roots (within tolerance tol) of the d -th degree polynomial. More...
 
static int HabichtBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol, int intervalType)
 
static int HabichtBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol, int intervalType, bool divideGCD)
 
static int SturmBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol)
 Finds all REAL roots (within tolerance tol) of the d -th degree polynomial P[0] X^d + ... More...
 
static int SturmBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol, int intervalType)
 
static int SturmBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol, int intervalType, bool divideGCD)
 
static int FilterRoots (double *P, int d, double *upperBnds, int rootcount, double diameter)
 This uses the derivative sequence to filter possible roots of a polynomial. More...
 
static int LinBairstowSolve (double *c, int d, double *r, double &tolerance)
 Seeks all REAL roots of the d -th degree polynomial c[0] X^d + ... More...
 
static int FerrariSolve (double *c, double *r, int *m, double tol)
 Algebraically extracts REAL roots of the quartic polynomial with REAL coefficients X^4 + c[0] X^3 + c[1] X^2 + c[2] X + c[3] and stores them (when they exist) and their respective multiplicities in the r and m arrays, based on Ferrari's method. More...
 
static int TartagliaCardanSolve (double *c, double *r, int *m, double tol)
 Algebraically extracts REAL roots of the cubic polynomial with REAL coefficients X^3 + c[0] X^2 + c[1] X + c[2] and stores them (when they exist) and their respective multiplicities in the r and m arrays. More...
 
static double * SolveCubic (double c0, double c1, double c2, double c3)
 Solves a cubic equation c0*t^3 + c1*t^2 + c2*t + c3 = 0 when c0, c1, c2, and c3 are REAL. More...
 
static double * SolveQuadratic (double c0, double c1, double c2)
 Solves a quadratic equation c0*t^2 + c1*t + c2 = 0 when c0, c1, and c2 are REAL. More...
 
static double * SolveLinear (double c0, double c1)
 Solves a linear equation c0*t + c1 = 0 when c0 and c1 are REAL. More...
 
static int SolveCubic (double c0, double c1, double c2, double c3, double *r1, double *r2, double *r3, int *num_roots)
 Solves a cubic equation when c0, c1, c2, And c3 Are REAL. More...
 
static int SolveQuadratic (double c0, double c1, double c2, double *r1, double *r2, int *num_roots)
 Solves a quadratic equation c0*t^2 + c1*t + c2 = 0 when c0, c1, and c2 are REAL. More...
 
static int SolveQuadratic (double *c, double *r, int *m)
 Algebraically extracts REAL roots of the quadratic polynomial with REAL coefficients c[0] X^2 + c[1] X + c[2] and stores them (when they exist) and their respective multiplicities in the r and m arrays. More...
 
static int SolveLinear (double c0, double c1, double *r1, int *num_roots)
 Solves a linear equation c0*t + c1 = 0 when c0 and c1 are REAL. More...
 
static void SetDivisionTolerance (double tol)
 Set/get the tolerance used when performing polynomial Euclidean division to find polynomial roots. More...
 
static double GetDivisionTolerance ()
 
- Static Public Member Functions inherited from vtkObject
static vtkObjectNew ()
 Create an object with Debug turned off, modified time initialized to zero, and reference counting on. More...
 
static void BreakOnError ()
 This method is called when vtkErrorMacro executes. More...
 
static void SetGlobalWarningDisplay (int val)
 This is a global flag that controls whether any debug, warning or error messages are displayed. More...
 
static void GlobalWarningDisplayOn ()
 
static void GlobalWarningDisplayOff ()
 
static int GetGlobalWarningDisplay ()
 
- Static Public Member Functions inherited from vtkObjectBase
static vtkTypeBool IsTypeOf (const char *name)
 Return 1 if this class type is the same type of (or a subclass of) the named class. More...
 
static vtkObjectBaseNew ()
 Create an object with Debug turned off, modified time initialized to zero, and reference counting on. More...
 

Protected Member Functions

virtual vtkObjectBaseNewInstanceInternal () const
 
 vtkPolynomialSolversUnivariate ()
 
 ~vtkPolynomialSolversUnivariate () override
 
- Protected Member Functions inherited from vtkObject
 vtkObject ()
 
 ~vtkObject () override
 
void RegisterInternal (vtkObjectBase *, vtkTypeBool check) override
 
void UnRegisterInternal (vtkObjectBase *, vtkTypeBool check) override
 
void InternalGrabFocus (vtkCommand *mouseEvents, vtkCommand *keypressEvents=nullptr)
 These methods allow a command to exclusively grab all events. More...
 
void InternalReleaseFocus ()
 
- Protected Member Functions inherited from vtkObjectBase
 vtkObjectBase ()
 
virtual ~vtkObjectBase ()
 
virtual void CollectRevisions (ostream &)
 
virtual void ReportReferences (vtkGarbageCollector *)
 
 vtkObjectBase (const vtkObjectBase &)
 
void operator= (const vtkObjectBase &)
 

Static Protected Attributes

static double DivisionTolerance
 

Additional Inherited Members

- Protected Attributes inherited from vtkObject
bool Debug
 
vtkTimeStamp MTime
 
vtkSubjectHelper * SubjectHelper
 
- Protected Attributes inherited from vtkObjectBase
std::atomic< int32_t > ReferenceCount
 
vtkWeakPointerBase ** WeakPointers
 

Detailed Description

polynomial solvers

vtkPolynomialSolversUnivariate provides solvers for univariate polynomial equations with real coefficients. The Tartaglia-Cardan and Ferrari solvers work on polynomials of fixed degree 3 and 4, respectively. The Lin-Bairstow and Sturm solvers work on polynomials of arbitrary degree. The Sturm solver is the most robust solver but only reports roots within an interval and does not report multiplicities. The Lin-Bairstow solver reports multiplicities.

For difficult polynomials, you may wish to use FilterRoots to eliminate some of the roots reported by the Sturm solver. FilterRoots evaluates the derivatives near each root to eliminate cases where a local minimum or maximum is close to zero.

Thanks:
Thanks to Philippe Pebay, Korben Rusek, David Thompson, and Maurice Rojas for implementing these solvers.

Definition at line 55 of file vtkPolynomialSolversUnivariate.h.

Member Typedef Documentation

◆ Superclass

Definition at line 59 of file vtkPolynomialSolversUnivariate.h.

Constructor & Destructor Documentation

◆ vtkPolynomialSolversUnivariate()

vtkPolynomialSolversUnivariate::vtkPolynomialSolversUnivariate ( )
inlineprotected

Definition at line 281 of file vtkPolynomialSolversUnivariate.h.

◆ ~vtkPolynomialSolversUnivariate()

vtkPolynomialSolversUnivariate::~vtkPolynomialSolversUnivariate ( )
inlineoverrideprotected

Definition at line 282 of file vtkPolynomialSolversUnivariate.h.

Member Function Documentation

◆ New()

static vtkPolynomialSolversUnivariate* vtkPolynomialSolversUnivariate::New ( )
static

◆ IsTypeOf()

static vtkTypeBool vtkPolynomialSolversUnivariate::IsTypeOf ( const char *  type)
static

◆ IsA()

virtual vtkTypeBool vtkPolynomialSolversUnivariate::IsA ( const char *  name)
virtual

Return 1 if this class is the same type of (or a subclass of) the named class.

Returns 0 otherwise. This method works in combination with vtkTypeMacro found in vtkSetGet.h.

Reimplemented from vtkObjectBase.

◆ SafeDownCast()

static vtkPolynomialSolversUnivariate* vtkPolynomialSolversUnivariate::SafeDownCast ( vtkObjectBase o)
static

◆ NewInstanceInternal()

virtual vtkObjectBase* vtkPolynomialSolversUnivariate::NewInstanceInternal ( ) const
protectedvirtual

◆ NewInstance()

vtkPolynomialSolversUnivariate* vtkPolynomialSolversUnivariate::NewInstance ( ) const

◆ PrintSelf()

void vtkPolynomialSolversUnivariate::PrintSelf ( ostream &  os,
vtkIndent  indent 
)
overridevirtual

Methods invoked by print to print information about the object including superclasses.

Typically not called by the user (use Print() instead) but used in the hierarchical print process to combine the output of several classes.

Reimplemented from vtkObject.

◆ PrintPolynomial()

static ostream& vtkPolynomialSolversUnivariate::PrintPolynomial ( ostream &  os,
double *  P,
int  degP 
)
static

◆ HabichtBisectionSolve() [1/3]

static int vtkPolynomialSolversUnivariate::HabichtBisectionSolve ( double *  P,
int  d,
double *  a,
double *  upperBnds,
double  tol 
)
static

Finds all REAL roots (within tolerance tol) of the d -th degree polynomial.

\[ P[0] X^d + ... + P[d-1] X + P[d] \]

in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr. All roots are bracketed in the \nr first ]upperBnds[i] - tol ; upperBnds[i]] intervals. Returns -1 if anything went wrong (such as: polynomial does not have degree d, the interval provided by the other is absurd, etc.).

intervalType specifies the search interval as follows: 0 = 00 = ]a,b[ 1 = 10 = [a,b[ 2 = 01 = ]a,b] 3 = 11 = [a,b] This defaults to 0.

The last non-zero item in the Habicht sequence is the gcd of P and P'. The parameter divideGCD specifies whether the program should attempt to divide by the gcd and run again. It works better with polynomials known to have high multiplicities. When divideGCD != 0 then it attempts to divide by the GCD, if applicable. This defaults to 0.

Compared to the Sturm solver the Habicht solver is slower, although both are O(d^2). The Habicht solver has the added benefit that it has a built in mechanism to keep the leading coefficients of the result from polynomial division bounded above and below in absolute value. This will tend to keep the coefficients of the polynomials in the sequence from zeroing out prematurely or becoming infinite.

Constructing the Habicht sequence is O(d^2) in both time and space.

Warning: it is the user's responsibility to make sure the upperBnds array is large enough to contain the maximal number of expected roots. Note that nr is smaller or equal to the actual number of roots in ]a[0] ; a[1]] since roots within \tol are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

◆ HabichtBisectionSolve() [2/3]

static int vtkPolynomialSolversUnivariate::HabichtBisectionSolve ( double *  P,
int  d,
double *  a,
double *  upperBnds,
double  tol,
int  intervalType 
)
static

◆ HabichtBisectionSolve() [3/3]

static int vtkPolynomialSolversUnivariate::HabichtBisectionSolve ( double *  P,
int  d,
double *  a,
double *  upperBnds,
double  tol,
int  intervalType,
bool  divideGCD 
)
static

◆ SturmBisectionSolve() [1/3]

static int vtkPolynomialSolversUnivariate::SturmBisectionSolve ( double *  P,
int  d,
double *  a,
double *  upperBnds,
double  tol 
)
static

Finds all REAL roots (within tolerance tol) of the d -th degree polynomial P[0] X^d + ...

  • P[d-1] X + P[d] in ]a[0] ; a[1]] using Sturm's theorem ( polynomial coefficients are REAL ) and returns the count nr. All roots are bracketed in the \nr first ]upperBnds[i] - tol ; upperBnds[i]] intervals. Returns -1 if anything went wrong (such as: polynomial does not have degree d, the interval provided by the other is absurd, etc.).

intervalType specifies the search interval as follows: 0 = 00 = ]a,b[ 1 = 10 = [a,b[ 2 = 01 = ]a,b] 3 = 11 = [a,b] This defaults to 0.

The last non-zero item in the Sturm sequence is the gcd of P and P'. The parameter divideGCD specifies whether the program should attempt to divide by the gcd and run again. It works better with polynomials known to have high multiplicities. When divideGCD != 0 then it attempts to divide by the GCD, if applicable. This defaults to 0.

Constructing the Sturm sequence is O(d^2) in both time and space.

Warning: it is the user's responsibility to make sure the upperBnds array is large enough to contain the maximal number of expected roots. Note that nr is smaller or equal to the actual number of roots in ]a[0] ; a[1]] since roots within \tol are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

◆ SturmBisectionSolve() [2/3]

static int vtkPolynomialSolversUnivariate::SturmBisectionSolve ( double *  P,
int  d,
double *  a,
double *  upperBnds,
double  tol,
int  intervalType 
)
static

◆ SturmBisectionSolve() [3/3]

static int vtkPolynomialSolversUnivariate::SturmBisectionSolve ( double *  P,
int  d,
double *  a,
double *  upperBnds,
double  tol,
int  intervalType,
bool  divideGCD 
)
static

◆ FilterRoots()

static int vtkPolynomialSolversUnivariate::FilterRoots ( double *  P,
int  d,
double *  upperBnds,
int  rootcount,
double  diameter 
)
static

This uses the derivative sequence to filter possible roots of a polynomial.

First it sorts the roots and removes any duplicates. If the number of sign changes of the derivative sequence at a root at upperBnds[i] == that at upperBnds[i] - diameter then the i^th value is removed from upperBnds. It returns the new number of roots.

◆ LinBairstowSolve()

static int vtkPolynomialSolversUnivariate::LinBairstowSolve ( double *  c,
int  d,
double *  r,
double &  tolerance 
)
static

Seeks all REAL roots of the d -th degree polynomial c[0] X^d + ...

  • c[d-1] X + c[d] = 0 equation Lin-Bairstow's method ( polynomial coefficients are REAL ) and stores the nr roots found ( multiple roots are multiply stored ) in r. tolerance is the user-defined solver tolerance; this variable may be relaxed by the iterative solver if needed. Returns nr. Warning: it is the user's responsibility to make sure the r array is large enough to contain the maximal number of expected roots.

◆ FerrariSolve()

static int vtkPolynomialSolversUnivariate::FerrariSolve ( double *  c,
double *  r,
int *  m,
double  tol 
)
static

Algebraically extracts REAL roots of the quartic polynomial with REAL coefficients X^4 + c[0] X^3 + c[1] X^2 + c[2] X + c[3] and stores them (when they exist) and their respective multiplicities in the r and m arrays, based on Ferrari's method.

Some numerical noise can be filtered by the use of a tolerance tol instead of equality with 0 (one can use, e.g., VTK_DBL_EPSILON). Returns the number of roots. Warning: it is the user's responsibility to pass a non-negative tol.

◆ TartagliaCardanSolve()

static int vtkPolynomialSolversUnivariate::TartagliaCardanSolve ( double *  c,
double *  r,
int *  m,
double  tol 
)
static

Algebraically extracts REAL roots of the cubic polynomial with REAL coefficients X^3 + c[0] X^2 + c[1] X + c[2] and stores them (when they exist) and their respective multiplicities in the r and m arrays.

Some numerical noise can be filtered by the use of a tolerance tol instead of equality with 0 (one can use, e.g., VTK_DBL_EPSILON). The main differences with SolveCubic are that (1) the polynomial must have unit leading coefficient, (2) complex roots are discarded upfront, (3) non-simple roots are stored only once, along with their respective multiplicities, and (4) some numerical noise is filtered by the use of relative tolerance instead of equality with 0. Returns the number of roots. In memoriam Niccolo Tartaglia (1500 - 1559), unfairly forgotten.

◆ SolveCubic() [1/2]

static double* vtkPolynomialSolversUnivariate::SolveCubic ( double  c0,
double  c1,
double  c2,
double  c3 
)
static

Solves a cubic equation c0*t^3 + c1*t^2 + c2*t + c3 = 0 when c0, c1, c2, and c3 are REAL.

Solution is motivated by Numerical Recipes In C 2nd Ed. Return array contains number of (real) roots (counting multiple roots as one) followed by roots themselves. The value in roots[4] is a integer giving further information about the roots (see return codes for int SolveCubic() ).

◆ SolveQuadratic() [1/3]

static double* vtkPolynomialSolversUnivariate::SolveQuadratic ( double  c0,
double  c1,
double  c2 
)
static

Solves a quadratic equation c0*t^2 + c1*t + c2 = 0 when c0, c1, and c2 are REAL.

Solution is motivated by Numerical Recipes In C 2nd Ed. Return array contains number of (real) roots (counting multiple roots as one) followed by roots themselves. Note that roots[3] contains a return code further describing solution - see documentation for SolveCubic() for meaning of return codes.

◆ SolveLinear() [1/2]

static double* vtkPolynomialSolversUnivariate::SolveLinear ( double  c0,
double  c1 
)
static

Solves a linear equation c0*t + c1 = 0 when c0 and c1 are REAL.

Solution is motivated by Numerical Recipes In C 2nd Ed. Return array contains number of roots followed by roots themselves.

◆ SolveCubic() [2/2]

static int vtkPolynomialSolversUnivariate::SolveCubic ( double  c0,
double  c1,
double  c2,
double  c3,
double *  r1,
double *  r2,
double *  r3,
int *  num_roots 
)
static

Solves a cubic equation when c0, c1, c2, And c3 Are REAL.

Solution is motivated by Numerical Recipes In C 2nd Ed. Roots and number of real roots are stored in user provided variables r1, r2, r3, and num_roots. Note that the function can return the following integer values describing the roots: (0)-no solution; (-1)-infinite number of solutions; (1)-one distinct real root of multiplicity 3 (stored in r1); (2)-two distinct real roots, one of multiplicity 2 (stored in r1 & r2); (3)-three distinct real roots; (-2)-quadratic equation with complex conjugate solution (real part of root returned in r1, imaginary in r2); (-3)-one real root and a complex conjugate pair (real root in r1 and real part of pair in r2 and imaginary in r3).

◆ SolveQuadratic() [2/3]

static int vtkPolynomialSolversUnivariate::SolveQuadratic ( double  c0,
double  c1,
double  c2,
double *  r1,
double *  r2,
int *  num_roots 
)
static

Solves a quadratic equation c0*t^2 + c1*t + c2 = 0 when c0, c1, and c2 are REAL.

Solution is motivated by Numerical Recipes In C 2nd Ed. Roots and number of roots are stored in user provided variables r1, r2, num_roots

◆ SolveQuadratic() [3/3]

static int vtkPolynomialSolversUnivariate::SolveQuadratic ( double *  c,
double *  r,
int *  m 
)
static

Algebraically extracts REAL roots of the quadratic polynomial with REAL coefficients c[0] X^2 + c[1] X + c[2] and stores them (when they exist) and their respective multiplicities in the r and m arrays.

Returns either the number of roots, or -1 if ininite number of roots.

◆ SolveLinear() [2/2]

static int vtkPolynomialSolversUnivariate::SolveLinear ( double  c0,
double  c1,
double *  r1,
int *  num_roots 
)
static

Solves a linear equation c0*t + c1 = 0 when c0 and c1 are REAL.

Solution is motivated by Numerical Recipes In C 2nd Ed. Root and number of (real) roots are stored in user provided variables r1 and num_roots.

◆ SetDivisionTolerance()

static void vtkPolynomialSolversUnivariate::SetDivisionTolerance ( double  tol)
static

Set/get the tolerance used when performing polynomial Euclidean division to find polynomial roots.

This tolerance is used to decide whether the coefficient(s) of a polynomial remainder are close enough to zero to be neglected.

◆ GetDivisionTolerance()

static double vtkPolynomialSolversUnivariate::GetDivisionTolerance ( )
static

Member Data Documentation

◆ DivisionTolerance

double vtkPolynomialSolversUnivariate::DivisionTolerance
staticprotected

Definition at line 284 of file vtkPolynomialSolversUnivariate.h.


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