summaryrefslogtreecommitdiff
path: root/gsl-1.9/multifit/lmset.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/multifit/lmset.c')
-rw-r--r--gsl-1.9/multifit/lmset.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/gsl-1.9/multifit/lmset.c b/gsl-1.9/multifit/lmset.c
new file mode 100644
index 0000000..f6a97cc
--- /dev/null
+++ b/gsl-1.9/multifit/lmset.c
@@ -0,0 +1,44 @@
+static int
+set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale)
+{
+ lmder_state_t *state = (lmder_state_t *) vstate;
+
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+ gsl_vector *work1 = state->work1;
+ gsl_permutation *perm = state->perm;
+
+ int signum;
+
+ GSL_MULTIFIT_FN_EVAL_F_DF (fdf, x, f, J);
+
+ state->par = 0;
+ state->iter = 1;
+ state->fnorm = enorm (f);
+
+ gsl_vector_set_all (dx, 0.0);
+
+ /* store column norms in diag */
+
+ if (scale)
+ {
+ compute_diag (J, diag);
+ }
+ else
+ {
+ gsl_vector_set_all (diag, 1.0);
+ }
+
+ /* set delta to 100 |D x| or to 100 if |D x| is zero */
+
+ state->xnorm = scaled_enorm (diag, x);
+ state->delta = compute_delta (diag, x);
+
+ /* Factorize J into QR decomposition */
+
+ gsl_matrix_memcpy (r, J);
+ gsl_linalg_QRPT_decomp (r, tau, perm, &signum, work1);
+
+ return GSL_SUCCESS;
+}