# Approximation libraryApproximation.h

The need for function approximations arises in many branches of applied mathematics, and computer science in particular. In general, a function approximation problem asks us to select a function among a well-defined class that closely matches a target function in a task-specific way. In mathematics, the idea of least squares can be applied to approximating a given function by a weighted sum of other functions. The best approximation can be defined as that which minimises the difference between the original function and the approximation; for a least-squares approach the quality of the approximation is measured in terms of the squared differences between the two.

This library implements different function cores to approximate existing empirical data or time series by well known analytic functions, such as polynomial, exponential, hyperbolic, power and much complex composite functions (see the full list below).

## Contents

- Approximation by power function
- Approximation by elementary functions
- Linear approximation
- Square law approximation
- Cube law approximation
- Hyperbolic approximation
- Inverse square law approximation
- Inverse cube law approximation
- Square root approximation
- Exponential approximation
- Logarithmic approximation
- Hyperbolic sine approximation
- Hyperbolic cosine approximation
- Inverse hyperbolic sine approximation
- Inverse hyperbolic cosine approximation
- Approximation by polynomial functions
- Polynomial approximation
- Square root approximation
- Exponential approximation
- Logarithmic approximation
- Hyperbolic sine approximation
- Hyperbolic cosine approximation
- Inverse hyperbolic sine approximation
- Inverse hyperbolic cosine approximation
- Approximation by rational functions
- Rational function approximation
- Subrational function approximation

## Function list

C function name | Functions | C++ function name | Functions |
---|---|---|---|

ArcCosH | 2 functions | ArcCosH | 2 functions |

ArcSinH | 2 functions | ArcSinH | 2 functions |

CosH | 2 functions | CosH | 2 functions |

Cube | 2 functions | Cube | 2 functions |

Exp | 2 functions | Exp | 2 functions |

Hyperbolic | 2 functions | Hyperbolic | 2 functions |

InverseCube | 2 functions | InverseCube | 2 functions |

InverseSquare | 2 functions | InverseSquare | 2 functions |

Linear | 2 functions | Linear | 2 functions |

Log | 2 functions | Log | 2 functions |

PolyArcCosH | 2 functions | PolyArcCosH | 2 functions |

PolyArcSinH | 2 functions | PolyArcSinH | 2 functions |

PolyCosH | 2 functions | PolyCosH | 2 functions |

PolyExp | 2 functions | PolyExp | 2 functions |

PolyLog | 2 functions | PolyLog | 2 functions |

PolySinH | 2 functions | PolySinH | 2 functions |

PolySqrt | 2 functions | PolySqrt | 2 functions |

Polynomial | 2 functions | Polynomial | 2 functions |

Power | 2 functions | Power | 2 functions |

Rational | 2 functions | Rational | 2 functions |

SinH | 2 functions | SinH | 2 functions |

Sqrt | 2 functions | Sqrt | 2 functions |

Square | 2 functions | Square | 2 functions |

Subrational | 2 functions | Subrational | 2 functions |

C function name | Functions | C++ function name | Functions |

# Approximation by power function

Cbool Approximation_Power_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Power_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Power (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Power (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the power function of type `y(x) = a * x ^{b}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- coeff - pointer to array where the functions return found approximation coefficients (should be able to hold at least 2 elements)
- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least 4 elements)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- temp - pointer to temporary buffer is used for internal data transformation (should be able to hold at least "size" elements)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.
- FALSE (0) if size of empirical data arrays is equal to zero, or an error occurred during matrix solving process.

# Approximation by elementary functions

Elementary functions may clearly describe most of empirical data you get in real life or measure in different experiments. You may need simple approximation rules for these data, which may be covered by very simple mathematical expressions, are implemented below.

## Linear approximation

Cbool Approximation_Linear_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Linear_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Linear (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Linear (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the linear function of type `y(x) = a + b * x ^{1}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- coeff - pointer to array where the functions return found approximation coefficients (should be able to hold at least 2 elements)
- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least 4 elements)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- temp - pointer to temporary buffer is used for internal data transformation (should be able to hold at least "size" elements)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.
- FALSE (0) if size of empirical data arrays is equal to zero, or an error occurred during matrix solving process.

## Square law approximation

Cbool Approximation_Square_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Square_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Square (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Square (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the square law function of type `y(x) = a + b * x ^{2}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- coeff - pointer to array where the functions return found approximation coefficients (should be able to hold at least 2 elements)
- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least 4 elements)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- temp - pointer to temporary buffer is used for internal data transformation (should be able to hold at least "size" elements)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.
- FALSE (0) if size of empirical data arrays is equal to zero, or an error occurred during matrix solving process.

## Cube law approximation

Cbool Approximation_Cube_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Cube_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Cube (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Cube (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the cube law function of type `y(x) = a + b * x ^{3}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Hyperbolic approximation

Cbool Approximation_Hyperbolic_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Hyperbolic_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Hyperbolic (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Hyperbolic (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the hyperbolic function of type `y(x) = a + b / x ^{1}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Inverse square law approximation

Cbool Approximation_InverseSquare_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_InverseSquare_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::InverseSquare (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::InverseSquare (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the inverse square law function of type `y(x) = a + b / x ^{2}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Inverse cube law approximation

Cbool Approximation_InverseCube_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_InverseCube_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::InverseCube (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::InverseCube (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the inverse cube law function of type `y(x) = a + b / x ^{3}` and return best fit coefficients (

`a`,

`b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Square root approximation

Cbool Approximation_Sqrt_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Sqrt_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Sqrt (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Sqrt (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the square root function of type `y(x) = a + b * Sqrt (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Exponential approximation

Cbool Approximation_Exp_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Exp_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Exp (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Exp (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the exponential function of type `y(x) = a + b * Exp (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Logarithmic approximation

Cbool Approximation_Log_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Log_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Log (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Log (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the logarithmic function of type `y(x) = a + b * Log (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Hyperbolic sine approximation

Cbool Approximation_SinH_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_SinH_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::SinH (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::SinH (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the hyperbolic sine function of type `y(x) = a + b * SinH (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Hyperbolic cosine approximation

Cbool Approximation_CosH_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_CosH_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::CosH (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::CosH (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the hyperbolic cosine function of type `y(x) = a + b * CosH (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Inverse hyperbolic sine approximation

Cbool Approximation_ArcSinH_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_ArcSinH_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::ArcSinH (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::ArcSinH (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the inverse hyperbolic sine function of type `y(x) = a + b * ArcSinH (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Inverse hyperbolic cosine approximation

Cbool Approximation_ArcCosH_flt32 (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_ArcCosH_flt64 (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::ArcCosH (flt32_t coeff[], flt32_t matrix[], flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::ArcCosH (flt64_t coeff[], flt64_t matrix[], flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the inverse hyperbolic cosine function of type `y(x) = a + b * ArcCosH (x)` and return best fit coefficients (`a`, `b`) into coefficients array.

Parameters:

- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

# Approximation by polynomial functions

Complex data with curves require much complex approximation rules, which may be expressed by polynomial based functions. Polynomials of high degree is good idea to try to approximate empirical data with unknown relations between argument and derivative values.

## Polynomial approximation

Cbool Approximation_Polynomial_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Polynomial_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Polynomial (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Polynomial (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the polynomial function of type `y(x) = a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n}`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- coeff - pointer to array where the functions return found approximation coefficients (should be able to hold at least [degree+1] elements)
- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Square root approximation

Cbool Approximation_PolySqrt_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolySqrt_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolySqrt (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolySqrt (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the square root polynomial function of type `y(x) = Sqrt (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- coeff - pointer to array where the functions return found approximation coefficients (should be able to hold at least [degree+1] elements)
- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Exponential approximation

Cbool Approximation_PolyExp_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolyExp_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolyExp (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolyExp (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the exponential polynomial function of type `y(x) = Exp (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- coeff - pointer to array where the functions return found approximation coefficients (should be able to hold at least [degree+1] elements)
- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Logarithmic approximation

Cbool Approximation_PolyLog_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolyLog_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolyLog (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolyLog (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the logarithmic polynomial function of type `y(x) = Log (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Hyperbolic sine approximation

Cbool Approximation_PolySinH_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolySinH_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolySinH (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolySinH (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the hyperbolic sine polynomial function of type `y(x) = SinH (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Hyperbolic cosine approximation

Cbool Approximation_PolyCosH_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolyCosH_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolyCosH (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolyCosH (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the hyperbolic cosine polynomial function of type `y(x) = CosH (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Inverse hyperbolic sine approximation

Cbool Approximation_PolyArcSinH_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolyArcSinH_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolyArcSinH (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolyArcSinH (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the inverse hyperbolic sine polynomial function of type `y(x) = ArcSinH (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Inverse hyperbolic cosine approximation

Cbool Approximation_PolyArcCosH_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_PolyArcCosH_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::PolyArcCosH (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::PolyArcCosH (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the inverse hyperbolic cosine polynomial function of type `y(x) = ArcCosH (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

# Approximation by rational functions

Rational functions are generalization of polynomials. Some data may need this type of approximation instead of polynomial approximation.

## Rational function approximation

Cbool Approximation_Rational_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Rational_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Rational (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Rational (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the rational function of type `y(x) = 1 / (a _{0}*x^{0} + a_{1}*x^{1} + a_{2}*x^{2} + ... + a_{n}*x^{n})`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.

## Subrational function approximation

Cbool Approximation_Subrational_flt32 (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation_Subrational_flt64 (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

C++bool Approximation::Subrational (flt32_t coeff[], flt32_t matrix[], size_t degree, flt32_t args[], flt32_t vals[], flt32_t temp[], size_t size); bool Approximation::Subrational (flt64_t coeff[], flt64_t matrix[], size_t degree, flt64_t args[], flt64_t vals[], flt64_t temp[], size_t size);

Description: Try to approximate the empirical data by the subrational function of type `y(x) = a _{0}/x^{0} + a_{1}/x^{1} + a_{2}/x^{2} + ... + a_{n}/x^{n}`, where n is polynomial degree, and return best fit coefficients (

`a`,

_{0}`a`,

_{1}`a`, ...,

_{2}`a`) into coefficients array.

_{n}Parameters:

- matrix - pointer to temporary buffer is used for internal matrix coefficient (should be able to hold at least [degree+1]
^{2}elements) - degree - polynomial degree (can be zero)
- args - pointer to array which holds empirical data arguments (i.e. X axis)
- vals - pointer to array which holds empirical data values (i.e. Y axis)
- size - size of empirical data arrays (count of elements)

Return value:

- TRUE (1) by default.