CoolProp
6.6.0
An open-source fluid property and humid air property database
|
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.
Definition at line 215 of file PolyMath.h.
#include <PolyMath.h>
Public Member Functions | |
Polynomial2DFrac () | |
Constructors. More... | |
virtual | ~Polynomial2DFrac () |
Destructor. No implementation. More... | |
Eigen::MatrixXd | deriveCoeffs (const Eigen::MatrixXd &coefficients, const int &axis, const int ×, const int &firstExponent) |
Derivative coefficients calculation. 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) |
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) |
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) |
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) |
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) |
Public Member Functions inherited from CoolProp::Polynomial2D | |
Polynomial2D () | |
Constructors. More... | |
virtual | ~Polynomial2D () |
Destructor. No implementation. More... | |
Eigen::MatrixXd | convertCoefficients (const std::vector< double > &coefficients) |
Eigen::MatrixXd | convertCoefficients (const std::vector< std::vector< double >> &coefficients) |
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) |
double | solve_limits (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &min, const double &max, const int &axis) |
double | solve_guess (const Eigen::MatrixXd &coefficients, const double &in, const double &z_in, const double &guess, const int &axis) |
Protected Member Functions | |
double | factorial (const int &nValue) |
double | binom (const int &nValue, const int &nValue2) |
Eigen::MatrixXd | fracIntCentralDvector (const int &m, const double &x_in, const double &x_base) |
double | fracIntCentral (const Eigen::MatrixXd &coefficients, const double &x_in, const double &x_base) |
Protected Member Functions inherited from CoolProp::Polynomial2D | |
double | solve_limits (Poly2DResidual *res, const double &min, const double &max) |
double | solve_guess (Poly2DResidual *res, const double &guess) |
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) |
|
inline |
Constructors.
Definition at line 220 of file PolyMath.h.
|
inlinevirtual |
Destructor. No implementation.
Definition at line 223 of file PolyMath.h.
|
protected |
nValue | integer value that represents the upper part of the factorial |
nValue2 | integer value that represents the lower part of the factorial |
Definition at line 861 of file PolyMath.cpp.
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 |
Definition at line 581 of file PolyMath.cpp.
Eigen::MatrixXd CoolProp::Polynomial2DFrac::deriveCoeffs | ( | const Eigen::MatrixXd & | coefficients, |
const int & | axis, | ||
const int & | times, | ||
const int & | firstExponent | ||
) |
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 |
Definition at line 397 of file PolyMath.cpp.
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 |
Definition at line 514 of file PolyMath.cpp.
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 |
Definition at line 460 of file PolyMath.cpp.
|
protected |
nValue | integer value that represents the order of the factorial |
Simple integrated centred(!) polynomial function generator divided by independent variable. 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 |
Definition at line 853 of file PolyMath.cpp.
|
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 |
Definition at line 888 of file PolyMath.cpp.
|
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 |
Definition at line 869 of file PolyMath.cpp.
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. |
Definition at line 629 of file PolyMath.cpp.
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 |
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 | 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 |
Definition at line 710 of file PolyMath.cpp.
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 |
Definition at line 796 of file PolyMath.cpp.
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) |
Definition at line 835 of file PolyMath.cpp.
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 |
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 | 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 |
Definition at line 777 of file PolyMath.cpp.
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) |
Definition at line 817 of file PolyMath.cpp.