VTK

polynomial solvers More...
#include <vtkPolynomialSolversUnivariate.h>
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...  
vtkPolynomialSolversUnivariate *  NewInstance () 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...  
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) 
int  InvokeEvent (unsigned long event) 
int  InvokeEvent (const char *event) 
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) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
vtkCommand *  GetCommand (unsigned long tag) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
void  RemoveObserver (vtkCommand *) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
void  RemoveObservers (unsigned long event, vtkCommand *) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
void  RemoveObservers (const char *event, vtkCommand *) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
vtkTypeBool  HasObserver (unsigned long event, vtkCommand *) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
vtkTypeBool  HasObserver (const char *event, vtkCommand *) 
Allow people to add/remove/invoke observers (callbacks) to any VTK object. More...  
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) 
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, 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) 
This method invokes an event and return whether the event was aborted or not. More...  
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  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...  
virtual void  PrintHeader (ostream &os, vtkIndent indent) 
Methods invoked by print to print information about the object including superclasses. More...  
virtual void  PrintTrailer (ostream &os, vtkIndent indent) 
Methods invoked by print to print information about the object including superclasses. More...  
Static Public Member Functions  
static vtkPolynomialSolversUnivariate *  New () 
static vtkTypeBool  IsTypeOf (const char *type) 
static vtkPolynomialSolversUnivariate *  SafeDownCast (vtkObjectBase *o) 
static ostream &  PrintPolynomial (ostream &os, double *P, int degP) 
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 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
in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr. More...  
static int  HabichtBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol, int intervalType) 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial
in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr. More...  
static int  HabichtBisectionSolve (double *P, int d, double *a, double *upperBnds, double tol, int intervalType, bool divideGCD) 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial
in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr. More...  
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) 
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, bool divideGCD) 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial P[0] X^d + ... More...  
static void  SetDivisionTolerance (double tol) 
Set/get the tolerance used when performing polynomial Euclidean division to find polynomial roots. More...  
static double  GetDivisionTolerance () 
Set/get the tolerance used when performing polynomial Euclidean division to find polynomial roots. More...  
Static Public Member Functions inherited from vtkObject  
static vtkObject *  New () 
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 () 
This is a global flag that controls whether any debug, warning or error messages are displayed. More...  
static void  GlobalWarningDisplayOff () 
This is a global flag that controls whether any debug, warning or error messages are displayed. More...  
static int  GetGlobalWarningDisplay () 
This is a global flag that controls whether any debug, warning or error messages are displayed. More...  
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 vtkObjectBase *  New () 
Create an object with Debug turned off, modified time initialized to zero, and reference counting on. More...  
Protected Member Functions  
virtual vtkObjectBase *  NewInstanceInternal () 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 () 
These methods allow a command to exclusively grab all events. More...  
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  
vtkAtomicInt32  ReferenceCount 
vtkWeakPointerBase **  WeakPointers 
polynomial solvers
vtkPolynomialSolversUnivariate provides solvers for univariate polynomial equations with real coefficients. The TartagliaCardan and Ferrari solvers work on polynomials of fixed degree 3 and 4, respectively. The LinBairstow 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 LinBairstow 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.
Definition at line 58 of file vtkPolynomialSolversUnivariate.h.
Definition at line 62 of file vtkPolynomialSolversUnivariate.h.

inlineprotected 
Definition at line 291 of file vtkPolynomialSolversUnivariate.h.

inlineoverrideprotected 
Definition at line 292 of file vtkPolynomialSolversUnivariate.h.

static 

static 

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.

static 

protectedvirtual 
vtkPolynomialSolversUnivariate* vtkPolynomialSolversUnivariate::NewInstance  (  )  const 

overridevirtual 

static 

static 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial
in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr.
All roots are bracketed in the 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 nonzero 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 are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

static 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial
in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr.
All roots are bracketed in the 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 nonzero 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 are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

static 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial
in ]a[0] ; a[1]] using the Habicht sequence (polynomial coefficients are REAL) and returns the count nr.
All roots are bracketed in the 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 nonzero 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 are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

static 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial P[0] X^d + ...
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 nonzero 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 are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

static 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial P[0] X^d + ...
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 nonzero 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 are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

static 
Finds all REAL roots (within tolerance tol) of the d th degree polynomial P[0] X^d + ...
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 nonzero 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 are lumped in the same bracket. array is large enough to contain the maximal number of expected upper bounds.

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.

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

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 nonnegative 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) nonsimple 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.

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() ).

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.
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.

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).

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

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.

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.

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.

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.

staticprotected 
Definition at line 294 of file vtkPolynomialSolversUnivariate.h.