CoolProp
Public Member Functions | Protected Member Functions | List of all members
CoolProp::Polynomial2DFrac Class Reference

Detailed Description

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 (x-x_base). For fitted functions, we often see such a design to enhance the fit quality/stability.

#include <PolyMath.h>

Inheritance diagram for CoolProp::Polynomial2DFrac:
CoolProp::Polynomial2D

Public Member Functions

 Polynomial2DFrac ()
 Constructors.
 
virtual ~Polynomial2DFrac ()
 Destructor. No implementation.
 
Eigen::MatrixXd 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. 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 &times)
 Integration functions. More...
 
Eigen::MatrixXd deriveCoeffs (const Eigen::MatrixXd &coefficients, const int &axis=-1, const int &times=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 Horner-scheme 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)
 

Member Function Documentation

§ binom()

double CoolProp::Polynomial2DFrac::binom ( const int &  nValue,
const int &  nValue2 
)
protected
Parameters
nValueinteger value that represents the upper part of the factorial
nValue2integer value that represents the lower part of the factorial

§ derivative()

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 
)
Parameters
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
y_indouble value that represents the current input in the 2nd dimension
axisunsigned integer value that represents the axis to derive for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
y_indouble value that represents the current input in the 2nd dimension
axisinteger value that represents the axis to derive for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension

§ deriveCoeffs()

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 x-axis. 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;

Parameters
coefficientsmatrix containing the ordered coefficients
axisunsigned integer value that represents the desired direction of derivation
timesinteger value that represents the desired order of derivation
firstExponentinteger value that represents the lowest exponent of the polynomial in axis direction

§ evaluate() [1/2]

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.

Parameters
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
firstExponentinteger value that represents the lowest exponent of the polynomial
x_basedouble 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.

Parameters
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
firstExponentinteger value that represents the lowest exponent of the polynomial
x_basedouble value that represents the base value for a centred fit in the 1st dimension

§ evaluate() [2/2]

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 
)
Parameters
coefficientsmatrix containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
y_indouble value that represents the current input in the 2nd dimension
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centered fit in the 1st dimension
y_basedouble value that represents the base value for a centered fit in the 2nd dimension
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
y_indouble value that represents the current input in the 2nd dimension
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension

§ factorial()

double CoolProp::Polynomial2DFrac::factorial ( const int &  nValue)
protected

Simple integrated centred(!) polynomial function generator divided by independent variable.

Parameters
nValueinteger 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

Parameters
nValueinteger value that represents the order of the factorial

§ fracIntCentral()

double CoolProp::Polynomial2DFrac::fracIntCentral ( const Eigen::MatrixXd &  coefficients,
const double &  x_in,
const double &  x_base 
)
protected

Indefinite integral of a centred polynomial divided by its independent variable.

Parameters
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input
x_basedouble value that represents the basis for the fit

§ fracIntCentralDvector()

Eigen::MatrixXd CoolProp::Polynomial2DFrac::fracIntCentralDvector ( const int &  m,
const double &  x_in,
const double &  x_base 
)
protected

Helper function to calculate the D vector:

Parameters
minteger value that represents order
x_indouble value that represents the current input
x_basedouble value that represents the basis for the fit

§ integral()

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 
)
Parameters
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
y_indouble value that represents the current input in the 2nd dimension
axisunsigned integer value that represents the axis to integrate for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
ax_valdouble value that represents the base value for the definite integral on the chosen axis.
coefficientsvector containing the ordered coefficients
x_indouble value that represents the current input in the 1st dimension
y_indouble value that represents the current input in the 2nd dimension
axisinteger value that represents the axis to integrate for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
ax_valdouble value that represents the base value for the definite integral on the chosen axis.

§ solve()

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.

Parameters
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
axisunsigned integer value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
axisinteger value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension

§ solve_guess()

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.

Parameters
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
guessdouble value that represents the start value
axisunsigned integer value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension

§ solve_guessInt()

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.

Parameters
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
guessdouble value that represents the start value
axisunsigned integer value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
int_axisaxis for the integration (0=x, 1=y)

§ solve_limits()

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.

Parameters
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
mindouble value that represents the minimum value
maxdouble value that represents the maximum value
axisunsigned integer value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
mindouble value that represents the minimum value
maxdouble value that represents the maximum value
axisinteger value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension

§ solve_limitsInt()

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.

Parameters
coefficientsvector containing the ordered coefficients
indouble value that represents the current input in x (1st dimension) or y (2nd dimension)
z_indouble value that represents the current output in the 3rd dimension
mindouble value that represents the minimum value
maxdouble value that represents the maximum value
axisunsigned integer value that represents the axis to solve for (0=x, 1=y)
x_expinteger value that represents the lowest exponent of the polynomial in the 1st dimension
y_expinteger value that represents the lowest exponent of the polynomial in the 2nd dimension
x_basedouble value that represents the base value for a centred fit in the 1st dimension
y_basedouble value that represents the base value for a centred fit in the 2nd dimension
int_axisaxis for the integration (0=x, 1=y)

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