Copyright | (c) Matthew Peddie 2015 |
---|---|

License | GPL |

Maintainer | Alberto Ruiz |

Stability | provisional |

Safe Haskell | None |

Language | Haskell98 |

Interpolation routines.

https://www.gnu.org/software/gsl/manual/html_node/Interpolation.html#Interpolation

The GSL routines `gsl_spline_eval`

and friends are used, but in spite
of the names, they are not restricted to spline interpolation. The
functions in this module will work for any `InterpolationMethod`

.

- data InterpolationMethod
- evaluate :: InterpolationMethod -> [(Double, Double)] -> Double -> Double
- evaluateV :: InterpolationMethod -> Vector Double -> Vector Double -> Double -> Double
- evaluateDerivative :: InterpolationMethod -> [(Double, Double)] -> Double -> Double
- evaluateDerivative2 :: InterpolationMethod -> [(Double, Double)] -> Double -> Double
- evaluateDerivativeV :: InterpolationMethod -> Vector Double -> Vector Double -> Double -> Double
- evaluateDerivative2V :: InterpolationMethod -> Vector Double -> Vector Double -> Double -> Double
- evaluateIntegral :: InterpolationMethod -> [(Double, Double)] -> (Double, Double) -> Double
- evaluateIntegralV :: InterpolationMethod -> Vector Double -> Vector Double -> Double -> Double -> Double

# Interpolation methods

data InterpolationMethod Source #

# Evaluation of interpolated functions

:: InterpolationMethod | What method to use to interpolate |

-> [(Double, Double)] | (domain, range) values sampling the function |

-> Double | Point at which to evaluate the function |

-> Double | Interpolated result |

Evaluate a function by interpolating within the given dataset. For example:

`>>>`

`let xs = [1..10]`

`>>>`

`let ys map (**2) [1..10]`

`>>>`

4.840000000000001`evaluate Akima (zip xs ys) 2.2`

To successfully `evaluate points x`

, the domain (`x`

) values in
`points`

must be monotonically increasing. The evaluation point `x`

must lie between the smallest and largest values in the sampled
domain.

:: InterpolationMethod | What method to use to interpolate |

-> Vector Double | Data points sampling the domain of the function |

-> Vector Double | Data points sampling the range of the function |

-> Double | Point at which to evaluate the function |

-> Double | Interpolated result |

Evaluate a function by interpolating within the given dataset. For example:

`>>>`

`let xs = vector [1..10]`

`>>>`

`let ys = vector $ map (**2) [1..10]`

`>>>`

4.818867924528303`evaluateV CSpline xs ys 2.2`

To successfully `evaluateV xs ys x`

, the vectors of corresponding
domain-range values `xs`

and `ys`

must have identical lengths, and
`xs`

must be monotonically increasing. The evaluation point `x`

must
lie between the smallest and largest values in `xs`

.

# Evaluation of derivatives of interpolated functions

:: InterpolationMethod | What method to use to interpolate |

-> [(Double, Double)] | (domain, range) points sampling the function |

-> Double | Point |

-> Double | Interpolated result |

Evaluate the derivative of a function by interpolating within the given dataset. For example:

`>>>`

`let xs = [1..10]`

`>>>`

`let ys map (**2) [1..10]`

`>>>`

4.4`evaluateDerivative Akima (zip xs ys) 2.2`

To successfully `evaluateDerivative points x`

, the domain (`x`

) values
in `points`

must be monotonically increasing. The evaluation point
`x`

must lie between the smallest and largest values in the sampled
domain.

:: InterpolationMethod | What method to use to interpolate |

-> [(Double, Double)] | (domain, range) points sampling the function |

-> Double | Point |

-> Double | Interpolated result |

Evaluate the second derivative of a function by interpolating within the given dataset. For example:

`>>>`

`let xs = [1..10]`

`>>>`

`let ys map (**2) [1..10]`

`>>>`

2.0`evaluateDerivative2 Akima (zip xs ys) 2.2`

To successfully `evaluateDerivative2 points x`

, the domain (`x`

)
values in `points`

must be monotonically increasing. The evaluation
point `x`

must lie between the smallest and largest values in the
sampled domain.

:: InterpolationMethod | What method to use to interpolate |

-> Vector Double | Data points |

-> Vector Double | Data points |

-> Double | Point |

-> Double | Interpolated result |

Evaluate the derivative of a function by interpolating within the given dataset. For example:

`>>>`

`let xs = vector [1..10]`

`>>>`

`let ys = vector $ map (**2) [1..10]`

`>>>`

4.338867924528302`evaluateDerivativeV CSpline xs ys 2.2`

To successfully `evaluateDerivativeV xs ys x`

, the vectors of
corresponding domain-range values `xs`

and `ys`

must have identical
lengths, and `xs`

must be monotonically increasing. The interpolation
point `x`

must lie between the smallest and largest values in `xs`

.

:: InterpolationMethod | What method to use to interpolate |

-> Vector Double | Data points |

-> Vector Double | Data points |

-> Double | Point |

-> Double | Interpolated result |

Evaluate the second derivative of a function by interpolating within the given dataset. For example:

`>>>`

`let xs = vector [1..10]`

`>>>`

`let ys = vector $ map (**2) [1..10]`

`>>>`

2.4`evaluateDerivative2V CSpline xs ys 2.2`

To successfully `evaluateDerivative2V xs ys x`

, the vectors `xs`

and
`ys`

must have identical lengths, and `xs`

must be monotonically
increasing. The evaluation point `x`

must lie between the smallest
and largest values in `xs`

.

# Evaluation of integrals of interpolated functions

:: InterpolationMethod | What method to use to interpolate |

-> [(Double, Double)] | (domain, range) points sampling the function |

-> (Double, Double) | Integration bounds ( |

-> Double | Resulting area |

Evaluate the definite integral of a function by interpolating within the given dataset. For example:

`>>>`

`let xs = [1..10]`

`>>>`

`let ys = map (**2) [1..10]`

`>>>`

51.909`evaluateIntegralV CSpline (zip xs ys) (2.2, 5.5)`

To successfully `evaluateIntegral points (a, b)`

, the domain (`x`

)
values of `points`

must be monotonically increasing. The integration
bounds `a`

and `b`

must lie between the smallest and largest values in
the sampled domain..

:: InterpolationMethod | What method to use to interpolate |

-> Vector Double | Data points |

-> Vector Double | Data points |

-> Double | Lower integration bound |

-> Double | Upper integration bound |

-> Double | Resulting area |

Evaluate the definite integral of a function by interpolating within the given dataset. For example:

`>>>`

`let xs = vector [1..10]`

`>>>`

`let ys = vector $ map (**2) [1..10]`

`>>>`

51.89853207547169`evaluateIntegralV CSpline xs ys 2.2 5.5`

To successfully `evaluateIntegralV xs ys a b`

, the vectors `xs`

and
`ys`

must have identical lengths, and `xs`

must be monotonically
increasing. The integration bounds `a`

and `b`

must lie between the
smallest and largest values in `xs`

.