### 39.7 Iteration

The following functions drive the iteration of each algorithm. Each function performs one iteration of the trust region method and updates the state of the solver.

Function: int gsl_multifit_nlinear_iterate (gsl_multifit_nlinear_workspace * w)
Function: int gsl_multilarge_nlinear_iterate (gsl_multilarge_nlinear_workspace * w)

  These functions perform a single iteration of the solver w. If the iteration encounters an unexpected problem then an error code will be returned. The solver workspace maintains a current estimate of the best-fit parameters at all times.

The solver workspace w contains the following entries, which can be used to track the progress of the solution:

`gsl_vector * x`

  The current position, length p.

`gsl_vector * f`

  The function residual vector at the current position f(x), length n.

`gsl_matrix * J`

  The Jacobian matrix at the current position J(x), size n-by-p (only for `gsl_multifit_nlinear` interface).

`gsl_vector * dx`

  The difference between the current position and the previous position, i.e. the last step \delta, taken as a vector, length p.

These quantities can be accessed with the following functions,

Function: gsl_vector * gsl_multifit_nlinear_position (const gsl_multifit_nlinear_workspace * w)
Function: gsl_vector * gsl_multilarge_nlinear_position (const gsl_multilarge_nlinear_workspace * w)

  These functions return the current position x (i.e. best-fit parameters) of the solver w.

Function: gsl_vector * gsl_multifit_nlinear_residual (const gsl_multifit_nlinear_workspace * w)
Function: gsl_vector * gsl_multilarge_nlinear_residual (const gsl_multilarge_nlinear_workspace * w)

  These functions return the current residual vector f(x) of the solver w. For weighted systems, the residual vector includes the weighting factor \sqrt{W}.

Function: gsl_matrix * gsl_multifit_nlinear_jac (const gsl_multifit_nlinear_workspace * w)

  This function returns a pointer to the n-by-p Jacobian matrix for the current iteration of the solver w. This function is available only for the `gsl_multifit_nlinear` interface.

Function: size_t gsl_multifit_nlinear_niter (const gsl_multifit_nlinear_workspace * w)
Function: size_t gsl_multilarge_nlinear_niter (const gsl_multilarge_nlinear_workspace * w)

  These functions return the number of iterations performed so far. The iteration counter is updated on each call to the `_iterate` functions above, and reset to 0 in the `_init` functions.

Function: int gsl_multifit_nlinear_rcond (double * rcond, const gsl_multifit_nlinear_workspace * w)
Function: int gsl_multilarge_nlinear_rcond (double * rcond, const gsl_multilarge_nlinear_workspace * w)

  This function estimates the reciprocal condition number of the Jacobian matrix at the current position x and stores it in rcond. The computed value is only an estimate to give the user a guideline as to the conditioning of their particular problem. Its calculation is based on which factorization method is used (Cholesky, QR, or SVD).

  - For the Cholesky solver, the matrix J^T J is factored at each iteration. Therefore this function will estimate the 1-norm condition number rcond^2 = 1/(||J^T J||_1 \cdot ||(J^T J)^{-1}||_1)
  - For the QR solver, J is factored as J = Q R at each iteration. For simplicity, this function calculates the 1-norm conditioning of only the R factor, rcond = 1 / (||R||_1 \cdot ||R^{-1}||_1). This can be computed efficiently since R is upper triangular.
  - For the SVD solver, in order to efficiently solve the trust region subproblem, the matrix which is factored is J D^{-1}, instead of J itself. The resulting singular values are used to provide the 2-norm reciprocal condition number, as rcond = \sigma_{min} / \sigma_{max}. Note that when using Moré scaling, D \ne I and the resulting rcond estimate may be significantly different from the true rcond of J itself.