1D-Polynomial roots


Defines

#define IRPLIB_SWAP(a, b)   { const double t=(a);(a)=(b);(b)=t; }
#define irplib_trace()

Functions

static double irplib_polynomial_eval_2_max (double p2, double p1, double p0, cpl_boolean is_c, double x1, double x2)
 Find the max residual on a 2nd degree 1D-polynomial on the roots.
static double irplib_polynomial_eval_3_max (double p3, double p2, double p1, double p0, cpl_boolean is_c, double x1, double x2, double x3)
 Find the max residual on a 3rd degree 1D-polynomial on the roots.
static cpl_boolean irplib_polynomial_solve_1d_2 (double, double, double, double *, double *)
static cpl_boolean irplib_polynomial_solve_1d_3 (double, double, double, double, double *, double *, double *, cpl_boolean *, cpl_boolean *)
static void irplib_polynomial_solve_1d_31 (double, double, double *, double *, double *, cpl_boolean *)
static void irplib_polynomial_solve_1d_32 (double, double, double, double *, double *, double *, cpl_boolean *)
static void irplib_polynomial_solve_1d_3r (double, double, double, double, double *, double *, double *)
static void irplib_polynomial_solve_1d_3c (double, double, double, double, double, double, double *, double *, double *, cpl_boolean *, cpl_boolean *)
static cpl_error_code irplib_polynomial_solve_1d_4 (double, double, double, double, double, cpl_size *, double *, double *, double *, double *)
static cpl_error_code irplib_polynomial_solve_1d_nonzero (cpl_polynomial *, cpl_vector *, cpl_size *)
static cpl_error_code irplib_polynomial_divide_1d_root (cpl_polynomial *, double, double *)
cpl_error_code irplib_polynomial_add (cpl_polynomial *self, const cpl_polynomial *first, const cpl_polynomial *second)
 Add two polynomials of the same dimension.
cpl_error_code irplib_polynomial_subtract (cpl_polynomial *self, const cpl_polynomial *first, const cpl_polynomial *second)
 Subtract two polynomials of the same dimension.
cpl_error_code irplib_polynomial_multiply_scalar (cpl_polynomial *self, const cpl_polynomial *other, double factor)
 Multiply a polynomial with a scalar.
cpl_error_code irplib_polynomial_solve_1d_all (const cpl_polynomial *self, cpl_vector *roots, cpl_size *preal)
 Compute all n roots of p(x) = 0, where p(x) is of degree n, n > 0.

Function Documentation

static double irplib_polynomial_eval_2_max ( double  p2,
double  p1,
double  p0,
cpl_boolean  is_c,
double  x1,
double  x2 
) [static]

Find the max residual on a 2nd degree 1D-polynomial on the roots.

Parameters:
p2 p2
p1 p1
p0 p0
is_c CPL_TRUE iff the two roots are complex
x1 The 1st point of evaluation (or real part on complex)
x2 The 2nd point of evaluation (or imaginary part on complex)
Returns:
The result

Definition at line 613 of file irplib_polynomial.c.

static double irplib_polynomial_eval_3_max ( double  p3,
double  p2,
double  p1,
double  p0,
cpl_boolean  is_c,
double  x1,
double  x2,
double  x3 
) [static]

Find the max residual on a 3rd degree 1D-polynomial on the roots.

Parameters:
p3 p3
p2 p2
p1 p1
p0 p0
is_c CPL_TRUE iff two roots are complex
x1 The 1st point of evaluation (real)
x2 The 2nd point of evaluation (or real part on complex)
x3 The 3rd point of evaluation (or imaginary part on complex)
Returns:
The result

Definition at line 650 of file irplib_polynomial.c.

cpl_error_code irplib_polynomial_add ( cpl_polynomial *  self,
const cpl_polynomial *  first,
const cpl_polynomial *  second 
)

Add two polynomials of the same dimension.

Parameters:
self The polynomial to hold the result
first The 1st polynomial to add
second The 2nd polynomial to add
Returns:
CPL_ERROR_NONE or the relevant CPL error code
Note:
self may be passed also as first and/or second
Possible CPL error code set in this function:
  • CPL_ERROR_NULL_INPUT if an input pointer is NULL
  • CPL_ERROR_INCOMPATIBLE_INPUT if the polynomials do not have identical dimensions
  • CPL_ERROR_UNSUPPORTED_MODE if the dimension is not 1 (FIXME)

Definition at line 134 of file irplib_polynomial.c.

cpl_error_code irplib_polynomial_subtract ( cpl_polynomial *  self,
const cpl_polynomial *  first,
const cpl_polynomial *  second 
)

Subtract two polynomials of the same dimension.

Parameters:
self The polynomial to hold the result
first The polynomial to subtract from
second The polynomial to subtract
Returns:
CPL_ERROR_NONE or the relevant CPL error code
Note:
self may be passed also as first and/or second
Possible CPL error code set in this function:
  • CPL_ERROR_NULL_INPUT if an input pointer is NULL
  • CPL_ERROR_INCOMPATIBLE_INPUT if the polynomials do not have identical dimensions
  • CPL_ERROR_UNSUPPORTED_MODE if the dimension is not 1 (FIXME)

Definition at line 195 of file irplib_polynomial.c.

cpl_error_code irplib_polynomial_multiply_scalar ( cpl_polynomial *  self,
const cpl_polynomial *  other,
double  factor 
)

Multiply a polynomial with a scalar.

Parameters:
self The polynomial to hold the result
other The polynomial to scale, may equal self
factor The factor to multiply with
Returns:
CPL_ERROR_NONE or the relevant CPL error code
Possible CPL error code set in this function:
  • CPL_ERROR_NULL_INPUT if an input pointer is NULL
  • CPL_ERROR_UNSUPPORTED_MODE if the dimension is not 1 (FIXME)

Definition at line 253 of file irplib_polynomial.c.

cpl_error_code irplib_polynomial_solve_1d_all ( const cpl_polynomial *  self,
cpl_vector *  roots,
cpl_size *  preal 
)

Compute all n roots of p(x) = 0, where p(x) is of degree n, n > 0.

Parameters:
self The 1D-polynomial
roots A pre-allocated vector of length n to hold the roots
preal The number of real roots found, or undefined on error
Returns:
CPL_ERROR_NONE or the relevant CPL error code
The *preal real roots are stored first in ascending order, then follows for each pair of complex conjugate roots, the real and imaginary parts of the root in the positive imaginary half-plane, for example for a 3rd degree polynomial with 1 real root, the roots are represented as: x0 = v0 x1 = v1 + i v2 x2 = v1 - i v2, where v0, v1, v2 are the elements of the roots vector.

Possible CPL error code set in this function:

  • CPL_ERROR_NULL_INPUT if an input pointer is NULL
  • CPL_ERROR_INVALID_TYPE if the polynomial has the wrong dimension
  • CPL_ERROR_DATA_NOT_FOUND if the polynomial does not have a degree of at least 1.
  • CPL_ERROR_INCOMPATIBLE_INPUT if the roots vector does not have length n
  • CPL_ERROR_DIVISION_BY_ZERO if a division by zero occurs (n > 4)
  • CPL_ERROR_CONTINUE if the algorithm does not converge (n > 4)

Definition at line 310 of file irplib_polynomial.c.


Generated on Mon Feb 6 14:42:07 2012 for NACO Pipeline Reference Manual by  doxygen 1.5.8