levmar-0.3: An implementation of the Levenberg-Marquardt algorithm

Stability Experimental Roel van Dijk Bas van Dijk

Numeric.LevMar.Fitting

Description

This module provides the Levenberg-Marquardt algorithm specialised for curve-fitting.

For additional documentation see the documentation of the levmar C library which this library is based on: http://www.ics.forth.gr/~lourakis/levmar/

Synopsis

# Model & Jacobian.

type Model r a = [r] -> a -> rSource

A functional relation describing measurements represented as a function from a list of parameters and an x-value to an expected measurement.

• Ensure that the length of the parameters list equals the lenght of the initial parameters list in `levmar`.

For example, the quadratic function `f(x) = a*x^2 + b*x + c` can be written as:

```quad :: `Num` r => `Model` r r
quad [a, b, c] x = a*x^2 + b*x + c
```

type SimpleModel r = Model r rSource

This type synonym expresses that usually the `a` in `Model r a` equals the type of the parameters.

type Jacobian r a = [r] -> a -> [r]Source

The jacobian of the `Model` function. Expressed as a function from a list of parameters and an x-value to the partial derivatives of the parameters.

• Ensure that the length of the parameters list equals the lenght of the initial parameters list in `levmar`.
• Ensure that the length of the output parameter derivatives list equals the length of the input parameters list.

For example, the jacobian of the above `quad` model can be written as:

```quadJacob :: `Num` r => `Jacobian` N3 r r
quadJacob [_, _, _] x = [ x^2   -- with respect to a
, x     -- with respect to b
, 1     -- with respect to c
]
```

(Notice you don't have to differentiate for `x`.)

type SimpleJacobian r = Jacobian r rSource

This type synonym expresses that usually the `a` in `Jacobian r a` equals the type of the parameters.

# Levenberg-Marquardt algorithm.

class LevMarable r Source

The Levenberg-Marquardt algorithm is overloaded to work on `Double` and `Float`.

Instances

 LevMarable Double LevMarable Float

Arguments

 :: LevMarable r => Model r a Model -> Maybe (Jacobian r a) Optional jacobian -> [r] Initial parameters -> [(a, r)] Samples -> Integer Maximum iterations -> Options r Minimization options -> Constraints r Constraints -> Either LevMarError ([r], Info r, CovarMatrix r)

The Levenberg-Marquardt algorithm specialised for curve-fitting.

type LinearConstraints r = ([[r]], [r])Source

Linear constraints consisting of a constraints matrix, kxm and a right hand constraints vector, kx1 where m is the number of parameters and k is the number of constraints.

# Minimization options.

data Options r Source

Minimization options

Constructors

 Opts FieldsoptScaleInitMu :: rScale factor for initial mu. optStopNormInfJacTe :: rStopping thresholds for `||J^T e||_inf`. optStopNorm2Dp :: rStopping thresholds for `||Dp||_2`. optStopNorm2E :: rStopping thresholds for `||e||_2`. optDelta :: rStep used in the difference approximation to the Jacobian. If `optDelta<0`, the Jacobian is approximated with central differences which are more accurate (but slower!) compared to the forward differences employed by default.

Instances

 Read r => Read (Options r) Show r => Show (Options r)

Default minimization options

# Output

data Info r Source

Information regarding the minimization.

Constructors

 Info FieldsinfNorm2initE :: r`||e||_2` at initial parameters. infNorm2E :: r`||e||_2` at estimated parameters. infNormInfJacTe :: r`||J^T e||_inf` at estimated parameters. infNorm2Dp :: r`||Dp||_2` at estimated parameters. infMuDivMax :: r`mu/max[J^T J]_ii ]` at estimated parameters. infNumIter :: IntegerNumber of iterations. infStopReason :: StopReasonReason for terminating. infNumFuncEvals :: IntegerNumber of function evaluations. infNumJacobEvals :: IntegerNumber of jacobian evaluations. infNumLinSysSolved :: IntegerNumber of linear systems solved, i.e. attempts for reducing error.

Instances

 Read r => Read (Info r) Show r => Show (Info r)

data StopReason Source

Reason for terminating.

Constructors

 SmallGradient Stopped because of small gradient `J^T e`. SmallDp Stopped because of small Dp. MaxIterations Stopped because maximum iterations was reached. SingularMatrix Stopped because of singular matrix. Restart from current estimated parameters with increased `optScaleInitMu`. SmallestError Stopped because no further error reduction is possible. Restart with increased `optScaleInitMu`. SmallNorm2E Stopped because of small `||e||_2`. InvalidValues Stopped because model function returned invalid values (i.e. NaN or Inf). This is a user error.

Instances

 Enum StopReason Read StopReason Show StopReason

type CovarMatrix r = [[r]]Source

Covariance matrix corresponding to LS solution.

Constructors

 LevMarError Generic error (not one of the others) LapackError A call to a lapack subroutine failed in the underlying C levmar library. FailedBoxCheck At least one lower bound exceeds the upper one. MemoryAllocationFailure A call to `malloc` failed in the underlying C levmar library. ConstraintMatrixRowsGtCols The matrix of constraints cannot have more rows than columns. ConstraintMatrixNotFullRowRank Constraints matrix is not of full row rank. TooFewMeasurements Cannot solve a problem with fewer measurements than unknowns. In case linear constraints are provided, this error is also returned when the number of measurements is smaller than the number of unknowns minus the number of equality constraints.

Instances

 Show LevMarError Typeable LevMarError Exception LevMarError