CoolProp

A class for polynomials starting at an arbitrary degree.
It is implemented for the incompressibles and is a little messy, but seems to work fine for now. Besides handling arbitrary starting exponents for the polynomials, it can also calculate polynomials with a base value. This means that the independent variable no longer is x, but (xx_base). For fitted functions, we often see such a design to enhance the fit quality/stability.
#include <PolyMath.h>
Public Member Functions  
Polynomial2DFrac ()  
Constructors.  
virtual  ~Polynomial2DFrac () 
Destructor. No implementation.  
Eigen::MatrixXd  deriveCoeffs (const Eigen::MatrixXd &coefficients, const int &axis, const int ×, const int &firstExponent) 
Integrating coefficients for polynomials is done by dividing the original coefficients by (i+1) and elevating the order by 1 through adding a zero as first coefficient. More...  
double  evaluate (const Eigen::MatrixXd &coefficients, const double &x_in, const int &firstExponent=0, const double &x_base=0.0) 
The core functions to evaluate the polynomial. More...  
double  evaluate (const Eigen::MatrixXd &coefficients, const double &x_in, const double &y_in, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0) 
double  derivative (const Eigen::MatrixXd &coefficients, const double &x_in, const double &y_in, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0) 
double  integral (const Eigen::MatrixXd &coefficients, const double &x_in, const double &y_in, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0, const double &ax_val=0.0) 
Eigen::VectorXd  solve (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0) 
Returns a vector with ALL the real roots of p(x_in,y_in)z_in. More...  
double  solve_limits (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &min, const double &max, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0) 
Uses the Brent solver to find the roots of p(x_in,y_in)z_in. More...  
double  solve_guess (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &guess, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0) 
Uses the Newton solver to find the roots of p(x_in,y_in)z_in. More...  
double  solve_limitsInt (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &min, const double &max, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0, const int &int_axis=0) 
Uses the Brent solver to find the roots of Int(p(x_in,y_in))z_in. More...  
double  solve_guessInt (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &guess, const int &axis, const int &x_exp, const int &y_exp, const double &x_base=0.0, const double &y_base=0.0, const int &int_axis=0) 
Uses the Newton solver to find the roots of Int(p(x_in,y_in))z_in. More...  
Public Member Functions inherited from CoolProp::Polynomial2D  
Polynomial2D ()  
Constructors.  
virtual  ~Polynomial2D () 
Destructor. No implementation.  
Eigen::MatrixXd  convertCoefficients (const std::vector< double > &coefficients) 
Convert the coefficient vector. More...  
Eigen::MatrixXd  convertCoefficients (const std::vector< std::vector< double > > &coefficients) 
Convert the coefficient matrix. More...  
bool  checkCoefficients (const Eigen::MatrixXd &coefficients, const unsigned int rows, const unsigned int columns) 
Basic checks for coefficient vectors. More...  
Eigen::MatrixXd  integrateCoeffs (const Eigen::MatrixXd &coefficients, const int &axis, const int ×) 
Integration functions. More...  
Eigen::MatrixXd  deriveCoeffs (const Eigen::MatrixXd &coefficients, const int &axis=1, const int ×=1) 
Derivative coefficients calculation. More...  
double  evaluate (const Eigen::MatrixXd &coefficients, const double &x_in) 
The core functions to evaluate the polynomial. More...  
double  evaluate (const Eigen::MatrixXd &coefficients, const double &x_in, const double &y_in) 
double  derivative (const Eigen::MatrixXd &coefficients, const double &x_in, const double &y_in, const int &axis) 
double  integral (const Eigen::MatrixXd &coefficients, const double &x_in, const double &y_in, const int &axis) 
Eigen::VectorXd  solve (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const int &axis) 
Returns a vector with ALL the real roots of p(x_in,y_in)z_in. More...  
double  solve_limits (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &min, const double &max, const int &axis) 
Uses the Brent solver to find the roots of p(x_in,y_in)z_in. More...  
double  solve_guess (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &guess, const int &axis) 
Uses the Newton solver to find the roots of p(x_in,y_in)z_in. More...  
Protected Member Functions  
double  factorial (const int &nValue) 
Simple integrated centred(!) polynomial function generator divided by independent variable. More...  
double  binom (const int &nValue, const int &nValue2) 
Eigen::MatrixXd  fracIntCentralDvector (const int &m, const double &x_in, const double &x_base) 
Helper function to calculate the D vector: More...  
double  fracIntCentral (const Eigen::MatrixXd &coefficients, const double &x_in, const double &x_base) 
Indefinite integral of a centred polynomial divided by its independent variable. More...  
Protected Member Functions inherited from CoolProp::Polynomial2D  
double  solve_limits (Poly2DResidual *res, const double &min, const double &max) 
Uses the Brent solver to find the roots of p(x_in,y_in)z_in. More...  
double  solve_guess (Poly2DResidual *res, const double &guess) 
Uses the Newton solver to find the roots of p(x_in,y_in)z_in. More...  
double  simplePolynomial (const std::vector< double > &coefficients, double x) 
Simple polynomial function generator. < Deprecated due to poor performance, use Hornerscheme instead. More...  
DEPRECATED (double simplePolynomial(const std::vector< std::vector< double > > &coefficients, double x, double y))  
double  baseHorner (const std::vector< double > &coefficients, double x) 
Horner function generator implementations. More...  
DEPRECATED (double baseHorner(const std::vector< std::vector< double > > &coefficients, double x, double y))  
bool  do_debug (void) 

protected 
nValue  integer value that represents the upper part of the factorial 
nValue2  integer value that represents the lower part of the factorial 
double CoolProp::Polynomial2DFrac::derivative  (  const Eigen::MatrixXd &  coefficients, 
const double &  x_in,  
const double &  y_in,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 

) 
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
y_in  double value that represents the current input in the 2nd dimension 
axis  unsigned integer value that represents the axis to derive for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
y_in  double value that represents the current input in the 2nd dimension 
axis  integer value that represents the axis to derive for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
Eigen::MatrixXd CoolProp::Polynomial2DFrac::deriveCoeffs  (  const Eigen::MatrixXd &  coefficients, 
const int &  axis,  
const int &  times,  
const int &  firstExponent  
) 
Integrating coefficients for polynomials is done by dividing the original coefficients by (i+1) and elevating the order by 1 through adding a zero as first coefficient.
Some reslicing needs to be applied to integrate along the xaxis. In the brine/solution equations, reordering of the parameters avoids this expensive operation. However, it is included for the sake of completeness.Derivative coefficients calculation Deriving coefficients for polynomials is done by multiplying the original coefficients with i and lowering the order by 1.
Remember that the first exponent might need to be adjusted after derivation. It has to be lowered by times: derCoeffs = deriveCoeffs(coefficients, axis, times, firstExponent); firstExponent = times;
coefficients  matrix containing the ordered coefficients 
axis  unsigned integer value that represents the desired direction of derivation 
times  integer value that represents the desired order of derivation 
firstExponent  integer value that represents the lowest exponent of the polynomial in axis direction 
double CoolProp::Polynomial2DFrac::evaluate  (  const Eigen::MatrixXd &  coefficients, 
const double &  x_in,  
const int &  firstExponent = 0 , 

const double &  x_base = 0.0 

) 
The core functions to evaluate the polynomial.
It is here we implement the different special functions that allow us to specify certain types of polynomials.
Try to avoid many calls to the derivative and integral functions. Both of them have to calculate the new coefficients internally, which slows things down. Instead, you should use the deriveCoeffs and integrateCoeffs functions and store the coefficient matrix you need for future calls to evaluate derivative and integral.
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
firstExponent  integer value that represents the lowest exponent of the polynomial 
x_base  double value that represents the base value for a centered fit in the 1st dimension 
It is here we implement the different special functions that allow us to specify certain types of polynomials.
Try to avoid many calls to the derivative and integral functions. Both of them have to calculate the new coefficients internally, which slows things down. Instead, you should use the deriveCoeffs and integrateCoeffs functions and store the coefficient matrix you need for future calls to evaluate derivative and integral.
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
firstExponent  integer value that represents the lowest exponent of the polynomial 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
double CoolProp::Polynomial2DFrac::evaluate  (  const Eigen::MatrixXd &  coefficients, 
const double &  x_in,  
const double &  y_in,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 

) 
coefficients  matrix containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
y_in  double value that represents the current input in the 2nd dimension 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centered fit in the 1st dimension 
y_base  double value that represents the base value for a centered fit in the 2nd dimension 
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
y_in  double value that represents the current input in the 2nd dimension 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 

protected 
Simple integrated centred(!) polynomial function generator divided by independent variable.
nValue  integer value that represents the order of the factorial 
We need to rewrite some of the functions in order to use central fit. Having a central temperature xbase allows for a better fit, but requires a different formulation of the fracInt function group. Other functions are not affected. Starts with only the first coefficient at x^0
nValue  integer value that represents the order of the factorial 

protected 
Indefinite integral of a centred polynomial divided by its independent variable.
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input 
x_base  double value that represents the basis for the fit 

protected 
Helper function to calculate the D vector:
m  integer value that represents order 
x_in  double value that represents the current input 
x_base  double value that represents the basis for the fit 
double CoolProp::Polynomial2DFrac::integral  (  const Eigen::MatrixXd &  coefficients, 
const double &  x_in,  
const double &  y_in,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 , 

const double &  ax_val = 0.0 

) 
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
y_in  double value that represents the current input in the 2nd dimension 
axis  unsigned integer value that represents the axis to integrate for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
ax_val  double value that represents the base value for the definite integral on the chosen axis. 
coefficients  vector containing the ordered coefficients 
x_in  double value that represents the current input in the 1st dimension 
y_in  double value that represents the current input in the 2nd dimension 
axis  integer value that represents the axis to integrate for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
ax_val  double value that represents the base value for the definite integral on the chosen axis. 
Eigen::VectorXd CoolProp::Polynomial2DFrac::solve  (  const Eigen::MatrixXd &  coefficients, 
const double &  in,  
const double &  z_in,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 

) 
Returns a vector with ALL the real roots of p(x_in,y_in)z_in.
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
axis  unsigned integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
axis  integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
double CoolProp::Polynomial2DFrac::solve_guess  (  const Eigen::MatrixXd &  coefficients, 
const double &  in,  
const double &  z_in,  
const double &  guess,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 

) 
Uses the Newton solver to find the roots of p(x_in,y_in)z_in.
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
guess  double value that represents the start value 
axis  unsigned integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
double CoolProp::Polynomial2DFrac::solve_guessInt  (  const Eigen::MatrixXd &  coefficients, 
const double &  in,  
const double &  z_in,  
const double &  guess,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 , 

const int &  int_axis = 0 

) 
Uses the Newton solver to find the roots of Int(p(x_in,y_in))z_in.
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
guess  double value that represents the start value 
axis  unsigned integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
int_axis  axis for the integration (0=x, 1=y) 
double CoolProp::Polynomial2DFrac::solve_limits  (  const Eigen::MatrixXd &  coefficients, 
const double &  in,  
const double &  z_in,  
const double &  min,  
const double &  max,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 

) 
Uses the Brent solver to find the roots of p(x_in,y_in)z_in.
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
min  double value that represents the minimum value 
max  double value that represents the maximum value 
axis  unsigned integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
min  double value that represents the minimum value 
max  double value that represents the maximum value 
axis  integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
double CoolProp::Polynomial2DFrac::solve_limitsInt  (  const Eigen::MatrixXd &  coefficients, 
const double &  in,  
const double &  z_in,  
const double &  min,  
const double &  max,  
const int &  axis,  
const int &  x_exp,  
const int &  y_exp,  
const double &  x_base = 0.0 , 

const double &  y_base = 0.0 , 

const int &  int_axis = 0 

) 
Uses the Brent solver to find the roots of Int(p(x_in,y_in))z_in.
coefficients  vector containing the ordered coefficients 
in  double value that represents the current input in x (1st dimension) or y (2nd dimension) 
z_in  double value that represents the current output in the 3rd dimension 
min  double value that represents the minimum value 
max  double value that represents the maximum value 
axis  unsigned integer value that represents the axis to solve for (0=x, 1=y) 
x_exp  integer value that represents the lowest exponent of the polynomial in the 1st dimension 
y_exp  integer value that represents the lowest exponent of the polynomial in the 2nd dimension 
x_base  double value that represents the base value for a centred fit in the 1st dimension 
y_base  double value that represents the base value for a centred fit in the 2nd dimension 
int_axis  axis for the integration (0=x, 1=y) 