Visual Servoing Platform  version 3.0.0
vpLevenbergMarquartd.cpp
1 /****************************************************************************
2  *
3  * This file is part of the ViSP software.
4  * Copyright (C) 2005 - 2015 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * ("GPL") version 2 as published by the Free Software Foundation.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See http://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * Levenberg Marquartd.
32  *
33  * Authors:
34  * Eric Marchand
35  * Francois Chaumette
36  *
37  *****************************************************************************/
38 
39 #include <cmath> // std::fabs
40 #include <limits> // numeric_limits
41 #include <iostream>
42 #include <algorithm> // std::min
43 
44 #include <visp3/vision/vpLevenbergMarquartd.h>
45 #include <visp3/core/vpMath.h>
46 
47 #define SIGN(x) ((x) < 0 ? -1 : 1)
48 #define SWAP(a,b,c) {(c) = (a); (a) = (b); (b) = (c);}
49 #define MIJ(m,i,j,s) ((m) + ((long) (i) * (long) (s)) + (long) (j))
50 #define TRUE 1
51 #define FALSE 0
52 
53 /*
54  * PROCEDURE : enorm
55  *
56  * ENTREE :
57  *
58  * x Vecteur de taille "n"
59  * n Taille du vecteur "x"
60  *
61  * DESCRIPTION :
62  * La procedure calcule la norme euclidienne d'un vecteur "x" de taille "n"
63  * La norme euclidienne est calculee par accumulation de la somme des carres
64  * dans les trois directions. Les sommes des carres pour les petits et grands
65  * elements sont mis a echelle afin d'eviter les overflows. Des underflows non
66  * destructifs sont autorisee. Les underflows et overflows sont evites dans le
67  * calcul des sommes des carres non encore mis a echelle par les elements
68  * intermediaires. La definition des elements petit, intermediaire et grand
69  * depend de deux constantes : rdwarf et rdiant. Les restrictions principales
70  * sur ces constantes sont rdwarf^2 n'est pas en underflow et rdgiant^2 n'est
71  * pas en overflow. Les constantes donnees ici conviennent pour la plupart des
72  * pc connus.
73  *
74  * RETOUR :
75  * En cas de succes, la valeur retournee est la norme euclidienne du vecteur
76  * Sinon, la valeur -1 est retournee et la variable globale "errno" est
77  * initialisee pour indiquee le type de l'erreur.
78  *
79  */
80 double enorm (const double *x, int n)
81 {
82  const double rdwarf = 3.834e-20;
83  const double rgiant = 1.304e19;
84 
85  int i;
86  double agiant, floatn;
87  double norm_eucl = 0.0;
88  double s1 = 0.0, s2 = 0.0, s3 = 0.0;
89  double xabs;
90  double x1max = 0.0 , x3max = 0.0;
91 
92  floatn = (double) n;
93  agiant = rgiant / floatn;
94 
95  for (i = 0; i < n; i++)
96  {
97  xabs = std::fabs(x[i]);
98  if ((xabs > rdwarf) && (xabs < agiant))
99  {
100  /*
101  * somme pour elements intemediaires.
102  */
103  s2 += xabs * xabs;
104  }
105 
106  else if (xabs <= rdwarf)
107  {
108  /*
109  * somme pour elements petits.
110  */
111  if (xabs <= x3max)
112  {
113  //if (xabs != 0.0)
114  if (xabs > std::numeric_limits<double>::epsilon())
115  s3 += (xabs / x3max) * (xabs / x3max);
116  }
117  else
118  {
119  s3 = 1.0 + s3 * (x3max / xabs) * (x3max / xabs);
120  x3max = xabs;
121  }
122  }
123 
124  else
125  {
126  /*
127  * somme pour elements grand.
128  */
129  if (xabs <= x1max)
130  {
131  s1 += (xabs / x1max) * (xabs / x1max);
132  }
133  else
134  {
135  s1 = 1.0 + s1 * (x1max / xabs) * (x1max / xabs);
136  x1max = xabs;
137  }
138  }
139  }
140 
141  /*
142  * calcul de la norme.
143  */
144  //if (s1 == 0.0)
145  if (std::fabs(s1) <= std::numeric_limits<double>::epsilon())
146  {
147  //if (s2 == 0.0)
148  if (std::fabs(s2) <= std::numeric_limits<double>::epsilon())
149  norm_eucl = x3max * sqrt(s3);
150  else if (s2 >= x3max)
151  norm_eucl = sqrt (s2 * (1.0 + ( x3max / s2) * (x3max * s3)));
152  else if (s2 < x3max)
153  norm_eucl = sqrt (x3max * ((s2 / x3max) + (x3max * s3)));
154  }
155  else
156  norm_eucl = x1max * sqrt (s1 + (s2 / x1max) / x1max);
157 
158  return (norm_eucl);
159 }
160 
161 /* PROCEDURE : lmpar
162  *
163  * ENTREE :
164  * n Ordre de la matrice "r".
165  * r Matrice de taille "n" x "n". En entree, la toute la partie
166  * triangulaire superieure doit contenir toute la partie triangulaire
167  * superieure de "r".
168  *
169  * ldr Taille maximum de la matrice "r". "ldr" >= "n".
170  *
171  * ipvt Vecteur de taille "n" qui definit la matrice de permutation "p"
172  * tel que :
173  * a * p = q * r.
174  * La jeme colonne de p la colonne ipvt[j] de la matrice d'identite.
175  *
176  * diag Vecteur de taille "n" contenant les elements diagonaux de la
177  * matrice "d".
178  *
179  * qtb Vecteur de taille "n" contenant les "n" premiers elements du
180  * vecteur (q transpose)*b.
181  *
182  * delta Limite superieure de la norme euclidienne de d * x.
183  *
184  * par Estimee initiale du parametre de Levenberg-Marquardt.
185  * wa1, wa2 Vecteurs de taille "n" de travail.
186  *
187  * DESCRIPTION :
188  * La procedure determine le parametre de Levenberg-Marquardt. Soit une matrice
189  * "a" de taille "m" x "n", une matrice diagonale "d" non singuliere de taille
190  * "n" x "n", un vecteur "b" de taille "m" et un nombre positf delta, le probleme
191  * est le calcul du parametre "par" de telle facon que si "x" resoud le systeme
192  *
193  * a * x = b , sqrt(par) * d * x = 0 ,
194  *
195  * au sens des moindre carre, et dxnorm est la norme euclidienne de d * x
196  * alors "par" vaut 0.0 et (dxnorm - delta) <= 0.1 * delta ,
197  * ou "par" est positif et abs(dxnorm-delta) <= 0.1 * delta.
198  * Cette procedure complete la solution du probleme si on lui fourni les infos
199  * nessaires de la factorisation qr, avec pivotage de colonnes de a.
200  * Donc, si a * p = q * r, ou "p" est une matrice de permutation, les colonnes
201  * de "q" sont orthogonales, et "r" est une matrice triangulaire superieure
202  * avec les elements diagonaux classes par ordre decroissant de leur valeur, lmpar
203  * attend une matrice triangulaire superieure complete, la matrice de permutation
204  * "p" et les "n" premiers elements de (q transpose) * b. En sortie, la procedure
205  * lmpar fournit aussi une matrice triangulaire superieure "s" telle que
206  *
207  * t t t
208  * p * (a * a + par * d * d )* p = s * s .
209  *
210  * "s" est utilise a l'interieure de lmpar et peut etre d'un interet separe.
211  *
212  * Seulement quelques iterations sont necessaire pour la convergence de
213  * l'algorithme. Si neanmoins la limite de 10 iterations est atteinte, la
214  * valeur de sortie "par" aura la derniere meilleure valeur.
215  *
216  * SORTIE :
217  * r En sortie, tout le triangle superieur est inchange, et le
218  * le triangle inferieur contient les elements de la partie
219  * triangulaire superieure (transpose) de la matrice triangulaire
220  * superieure de "s".
221  * par Estimee finale du parametre de Levenberg-Marquardt.
222  * x Vecteur de taille "n" contenant la solution au sens des moindres
223  * carres du systeme a * x = b, sqrt(par) * d * x = 0, pour le
224  * parametre en sortie "par"
225  * sdiag Vecteur de taille "n" contenant les elements diagonaux de la
226  * matrice triangulaire "s".
227  *
228  * RETOUR :
229  * En cas de succes, la valeur 0.0 est retournee.
230  *
231  */
232 int lmpar(int n, double *r, int ldr, int *ipvt, double *diag, double *qtb,
233  double *delta, double *par, double *x, double *sdiag, double *wa1, double *wa2)
234 {
235  const double tol1 = 0.1, tol001 = 0.001; /* tolerance a 0.1 et a 0.001 */
236 
237  int l, jm1;
238  unsigned int jp1;
239  unsigned int iter; /* compteur d'iteration */
240  int nsing; /* nombre de singularite de la matrice */
241  double dxnorm, fp, gnorm, parc;
242  double parl, paru; /* borne inf et sup de par */
243  double sum, temp;
244  double dwarf = DBL_MIN; /* plus petite amplitude positive */
245 
246  /*
247  * calcul et stockage dans "x" de la direction de Gauss-Newton. Si
248  * le jacobien a une rangee de moins, on a une solution au moindre
249  * carres.
250  */
251  nsing = n;
252 
253  for (int i = 0; i < n; i++)
254  {
255  wa1[i] = qtb[i];
256  double *pt = MIJ(r, i, i, ldr);
257  //if (*MIJ(r, i, i, ldr) == 0.0 && nsing == n)
258  if (std::fabs(*pt) <= std::numeric_limits<double>::epsilon() && nsing == n)
259  nsing = i - 1;
260 
261  if (nsing < n)
262  wa1[i] = 0.0;
263  }
264 
265  if (nsing >= 0)
266  {
267  for (int k = 0; k < nsing; k++)
268  {
269  int i = nsing - 1 - k;
270  wa1[i] /= *MIJ(r, i, i, ldr);
271  temp = wa1[i];
272  jm1 = i - 1;
273 
274  if (jm1 >= 0)
275  {
276  for (unsigned int j = 0; j <= (unsigned int)jm1; j++)
277  wa1[j] -= *MIJ(r, i, j, ldr) * temp;
278  }
279  }
280  }
281 
282  for (int j = 0; j < n; j++)
283  {
284  l = ipvt[j];
285  x[l] = wa1[j];
286  }
287 
288  /*
289  * initialisation du compteur d'iteration.
290  * evaluation de la fonction a l'origine, et test
291  * d'acceptation de la direction de Gauss-Newton.
292  */
293  iter = 0;
294 
295  for (int i = 0; i < n; i++)
296  wa2[i] = diag[i] * x[i];
297 
298  dxnorm = enorm(wa2, n);
299 
300  fp = dxnorm - *delta;
301 
302  if (fp > tol1 * (*delta))
303  {
304  /*
305  * Si le jacobien n'a pas de rangee deficiente,l'etape de
306  * Newton fournit une limite inferieure, parl pour le
307  * zero de la fonction. Sinon cette limite vaut 0.0.
308  */
309  parl = 0.0;
310 
311  if (nsing >= n)
312  {
313  for (int i = 0; i < n; i++)
314  {
315  l = ipvt[i];
316  wa1[i] = diag[l] * (wa2[l] / dxnorm);
317  }
318 
319  for (int i = 0; i < n; i++)
320  {
321  long im1;
322  sum = 0.0;
323  im1 = (i - 1L);
324 
325  if (im1 >= 0)
326  {
327  for (unsigned int j = 0; j <= (unsigned int)im1; j++)
328  sum += (*MIJ(r, i, j, ldr) * wa1[j]);
329  }
330  wa1[i] = (wa1[i] - sum) / *MIJ(r, i, i, ldr);
331  }
332 
333  temp = enorm(wa1, n);
334  parl = ((fp / *delta) / temp) / temp;
335  }
336 
337  /*
338  * calcul d'une limite superieure, paru, pour le zero de la
339  * fonction.
340  */
341  for (int i = 0; i < n; i++)
342  {
343  sum = 0.0;
344 
345  for (int j = 0; j <= i; j++)
346  sum += *MIJ(r, i, j, ldr) * qtb[j];
347 
348  l = ipvt[i];
349  wa1[i] = sum / diag[l];
350  }
351 
352  gnorm = enorm(wa1, n);
353  paru = gnorm / *delta;
354 
355  //if (paru == 0.0)
356  if (std::fabs(paru) <= std::numeric_limits<double>::epsilon())
357  paru = dwarf / vpMath::minimum(*delta, tol1);
358 
359  /*
360  * Si "par" en entree tombe hors de l'intervalle (parl,paru),
361  * on le prend proche du point final.
362  */
363 
364  *par = vpMath::maximum(*par, parl);
365  *par = vpMath::maximum(*par, paru);
366 
367  //if (*par == 0.0)
368  if (std::fabs(*par) <= std::numeric_limits<double>::epsilon() )
369  *par = gnorm / dxnorm;
370 
371  /*
372  * debut d'une iteration.
373  */
374  for(;;) //iter >= 0)
375  {
376  iter++;
377 
378  /*
379  * evaluation de la fonction a la valeur courant
380  * de "par".
381  */
382  //if (*par == 0.0)
383  if (std::fabs(*par) <= std::numeric_limits<double>::epsilon() )
384  *par = vpMath::maximum(dwarf, (tol001 * paru));
385 
386  temp = sqrt(*par);
387 
388  for (int i = 0; i < n; i++)
389  wa1[i] = temp * diag[i];
390 
391  qrsolv(n, r, ldr, ipvt, wa1, qtb, x, sdiag, wa2);
392 
393  for (int i = 0; i < n; i++)
394  wa2[i] = diag[i] * x[i];
395 
396  dxnorm = enorm(wa2, n);
397  temp = fp;
398  fp = dxnorm - *delta;
399 
400  /*
401  * si la fonction est assez petite, acceptation de
402  * la valeur courant de "par". de plus, test des cas
403  * ou parl est nul et ou le nombre d'iteration a
404  * atteint 10.
405  */
406  //if ((std::fabs(fp) <= tol1 * (*delta)) || ((parl == 0.0) && (fp <= temp)
407  // && (temp < 0.0)) || (iter == 10))
408  if ((std::fabs(fp) <= tol1 * (*delta)) || ((std::fabs(parl) <= std::numeric_limits<double>::epsilon()) && (fp <= temp)
409  && (temp < 0.0)) || (iter == 10))
410  {
411  // terminaison.
412 
413  // Remove the two next lines since this is a dead code
414  /* if (iter == 0)
415  *par = 0.0; */
416 
417  return (0);
418  }
419 
420  /*
421  * calcul de la correction de Newton.
422  */
423 
424  for (int i = 0; i < n; i++)
425  {
426  l = ipvt[i];
427  wa1[i] = diag[l] * (wa2[l] / dxnorm);
428  }
429 
430  for (unsigned int i = 0; i < (unsigned int)n; i++)
431  {
432  wa1[i] = wa1[i] / sdiag[i];
433  temp = wa1[i];
434  jp1 = i + 1;
435  if ( (unsigned int) n >= jp1)
436  {
437  for (unsigned int j = jp1; j < (unsigned int)n; j++)
438  wa1[j] -= (*MIJ(r, i, j, ldr) * temp);
439  }
440  }
441 
442  temp = enorm(wa1, n);
443  parc = ((fp / *delta) / temp) / temp;
444 
445  /*
446  * selon le signe de la fonction, mise a jour
447  * de parl ou paru.
448  */
449  if (fp > 0.0)
450  parl = vpMath::maximum(parl, *par);
451 
452  if (fp < 0.0)
453  paru = vpMath::minimum(paru, *par);
454 
455  /*
456  * calcul d'une estimee ameliree de "par".
457  */
458  *par = vpMath::maximum(parl, (*par + parc));
459  }/* fin boucle sur iter */
460  }/* fin fp > tol1 * delta */
461 
462  /*
463  * terminaison.
464  */
465  if (iter == 0)
466  *par = 0.0;
467 
468  return (0);
469 }
470 
471 /*
472  * PROCEDURE : pythag
473  *
474  * ENTREES :
475  * a, b Variables dont on veut la racine carre de leur somme de carre
476  *
477  * DESCRIPTION :
478  * La procedure calcule la racine carre de la somme des carres de deux nombres
479  * en evitant l'overflow ou l'underflow destructif.
480  *
481  * RETOUR :
482  * La procedure retourne la racine carre de a^2 + b^2.
483  *
484  */
485 double pythag (double a, double b)
486 {
487  double pyth, p, r, s, t, u;
488 
489  p = vpMath::maximum(std::fabs(a), std::fabs(b));
490 
491  //if (p == 0.0)
492  if (std::fabs(p) <= std::numeric_limits<double>::epsilon() )
493  {
494  pyth = p;
495  return (pyth);
496  }
497 
498  r = (std::min(std::fabs(a), std::fabs(b)) / p) * (std::min(std::fabs(a), std::fabs(b)) / p);
499  t = 4.0 + r;
500 
501  //while (t != 4.0)
502  while (std::fabs(t - 4.0) < std::fabs(vpMath::maximum(t,4.0)) * std::numeric_limits<double>::epsilon() )
503  {
504  s = r / t;
505  u = 1.0 + 2.0 * s;
506  p *= u;
507  r *= (s / u) * (s / u);
508  t = 4.0 + r;
509  }
510 
511  pyth = p;
512  return (pyth);
513 }
514 
515 /*
516  * PROCEDURE : qrfac
517  *
518  * ENTREE :
519  * m Nombre de lignes de la matrice "a".
520  * n Nombre de colonne de la matrice "a".
521  * a Matrice de taille "m" x "n". elle contient, en entree la matrice
522  * dont on veut sa factorisation qr.
523  * lda Taille maximale de "a". lda >= m.
524  * pivot Booleen. Si pivot est TRUE, le pivotage de colonnes est realise
525  * Si pivot = FALSE, pas de pivotage.
526  * lipvt Taille du vecteur "ipvt". Si pivot est FALSE, lipvt est de
527  * l'ordre de 1. Sinon lipvt est de l'ordre de "n".
528  * wa Vecteur de travail de taille "n". Si pivot = FALSE "wa"
529  * coincide avec rdiag.
530  *
531  * DESCRIPTION :
532  * La procedure effectue une decomposition de la matrice "a"par la methode qr.
533  * Elle utilise les transformations de householders avec pivotage sur les colonnes
534  * (option) pour calculer la factorisation qr de la matrice "a" de taille "m" x "n".
535  * La procedure determine une matrice orthogonale "q", une matrice de permutation
536  * "p" et une matrice trapesoidale superieure "r" dont les elements diagonaux
537  * sont ordonnes dans l'ordre decroissant de leurs valeurs,tel que a * p = q * r.
538  * La transformation de householder pour la colonne k, k = 1,2,...,min(m,n),
539  * est de la forme
540  * t
541  * i - (1 / u(k)) * u * u
542  *
543  * Ou u a des zeros dans les k-1 premieres positions.
544  *
545  * SORTIE :
546  * a Matrice de taille "m" x "n" dont le trapeze superieur de "a"
547  * contient la partie trapezoidale superieure de "r" et la partie
548  * trapezoidale inferieure de "a" contient une forme factorisee
549  * de "q" (les elements non triviaux du vecteurs "u" sont decrits
550  * ci-dessus).
551  * ipvt Vecteur de taille "n". Il definit la matrice de permutation "p"
552  * tel que a * p = q * r. La jeme colonne de p est la colonne
553  * ipvt[j] de la matrice d'identite. Si pivot = FALSE, ipvt n'est
554  * pas referencee.
555  * rdiag Vecteur de taille "n" contenant les elements diagonaux de la
556  * matrice "r".
557  * acnorm Vecteur de taille "n" contenant les normes des lignes
558  * correspondantes de la matrice "a". Si cette information n'est
559  * pas requise, acnorm coincide avec rdiag.
560  *
561  */
562 int qrfac(int m, int n, double *a, int lda, int *pivot, int *ipvt,
563  int /* lipvt */, double *rdiag, double *acnorm, double *wa)
564 {
565  const double tolerance = 0.05;
566 
567  int i, j, ip1, k, kmax, minmn;
568  double ajnorm, epsmch;
569  double sum, temp, tmp;
570 
571  /*
572  * epsmch est la precision machine.
573  */
574  epsmch = std::numeric_limits<double>::epsilon();
575 
576  /*
577  * calcul des normes initiales des lignes et initialisation
578  * de plusieurs tableaux.
579  */
580  for (i = 0; i < m; i++)
581  {
582  acnorm[i] = enorm(MIJ(a, i, 0, lda), n);
583  rdiag[i] = acnorm[i];
584  wa[i] = rdiag[i];
585 
586  if (pivot)
587  ipvt[i] = i;
588  }
589  /*
590  * reduction de "a" en "r" avec les tranformations de Householder.
591  */
592  minmn = vpMath::minimum(m, n);
593  for (i = 0; i < minmn; i++)
594  {
595  if (pivot)
596  {
597  /*
598  * met la ligne de plus grande norme en position
599  * de pivot.
600  */
601  kmax = i;
602  for (k = i; k < m; k++)
603  {
604  if (rdiag[k] > rdiag[kmax])
605  kmax = k;
606  }
607 
608  if (kmax != i)
609  {
610  for (j = 0; j < n; j++)
611  SWAP(*MIJ(a, i, j, lda),
612  *MIJ(a, kmax, j, lda), tmp);
613 
614  rdiag[kmax] = rdiag[i];
615  wa[kmax] = wa[i];
616 
617  SWAP( ipvt[i], ipvt[kmax], k);
618  }
619  }
620 
621  /*
622  * calcul de al transformationde Householder afin de reduire
623  * la jeme ligne de "a" a un multiple du jeme vecteur unite.
624  */
625  ajnorm = enorm(MIJ(a, i, i, lda), n - i);
626 
627  //if (ajnorm != 0.0)
628  if (std::fabs(ajnorm) > std::numeric_limits<double>::epsilon() )
629  {
630  if (*MIJ(a, i, i, lda) < 0.0)
631  ajnorm = -ajnorm;
632 
633  for (j = i; j < n; j++)
634  *MIJ(a, i, j, lda) /= ajnorm;
635  *MIJ(a, i, i, lda) += 1.0;
636 
637  /*
638  * application de la tranformation aux lignes
639  * restantes et mise a jour des normes.
640  */
641  ip1 = i + 1;
642 
643  if (m >= ip1)
644  {
645  for (k = ip1; k < m; k++)
646  {
647  sum = 0.0;
648  for (j = i; j < n; j++)
649  sum += *MIJ(a, i, j, lda) * *MIJ(a, k, j, lda);
650 
651  temp = sum / *MIJ(a, i, i, lda);
652 
653  for (j = i; j < n; j++)
654  *MIJ(a, k, j, lda) -= temp * *MIJ(a, i, j, lda);
655 
656  //if (pivot && rdiag[k] != 0.0)
657  if (pivot && (std::fabs(rdiag[k]) > std::numeric_limits<double>::epsilon()) )
658  {
659  temp = *MIJ (a, k, i, lda) / rdiag[k];
660  rdiag[k] *= sqrt(vpMath::maximum(0.0, (1.0 - temp * temp)));
661 
662  if (tolerance * (rdiag[k] / wa[k]) * (rdiag[k] / wa[k]) <= epsmch)
663  {
664  rdiag[k] = enorm(MIJ(a, k, ip1, lda), (n -1 - (int) i));
665  wa[k] = rdiag[k];
666  }
667  }
668  }/* fin boucle for k */
669 
670  }
671 
672  } /* fin if (ajnorm) */
673 
674  rdiag[i] = -ajnorm;
675  } /* fin for (i = 0; i < minmn; i++) */
676  return (0);
677 }
678 
679 /* PROCEDURE : qrsolv
680  *
681  * ENTREE :
682  * n Ordre de la matrice "r".
683  * r Matrice de taille "n" x "n". En entree, la partie triangulaire
684  * complete de "r" doit contenir la partie triangulaire superieure
685  * complete de "r".
686  * ldr Taille maximale de la matrice "r". "ldr" >= n.
687  * ipvt Vecteur de taille "n" definissant la matrice de permutation "p"
688  * La jeme colonne de de "p" est la colonne ipvt[j] de la matrice
689  * identite.
690  * diag Vecteur de taille "n" contenant les elements diagonaux de la
691  * matrice "d".
692  * qtb Vecteur de taille "n" contenant les "n" premiers elements du
693  * vecteur (q transpose) * b.
694  * wa Vecteur de travail de taille "n".
695  *
696  * DESCRIPTION :
697  * La procedure complete la solution du probleme, si on fournit les information
698  * necessaires de la factorisation qr, avec pivotage des colonnes.
699  * Soit une matrice "a" de taille "m" x "n" donnee, une matrice diagonale "d" de
700  * taille "n" x "n" et un vecteur "b" de taille "m", le probleme est la determination
701  * un vecteur "x" qui est solution du systeme
702  *
703  * a*x = b , d*x = 0 ,
704  *
705  * Au sens des moindres carres.
706  *
707  * Soit a * p = q * r, ou p est une matrice de permutation, les colonnes de "q"
708  * sont orthogonales et "r" est une matrice traingulaire superieure dont les
709  * elements diagonaux sont classes de l'ordre decroissant de leur valeur. Cette
710  * procedure attend donc la matrice triangulaire superieure remplie "r", la
711  * matrice de permutaion "p" et les "n" premiers elements de (q transpose) * b.
712  * Le systeme
713  *
714  * a * x = b, d * x = 0, est alors equivalent a
715  *
716  * t t
717  * r * z = q * b , p * d * p * z = 0 ,
718  *
719  * Ou x = p * z. Si ce systeme ne possede pas de rangee pleine, alors une
720  * solution au moindre carre est obtenue. En sortie, la procedure fournit aussi
721  * une matrice triangulaire superieure "s" tel que
722  *
723  * t t t
724  * p * (a * a + d * d) * p = s * s .
725  *
726  * "s" est calculee a l'interieure de qrsolv et peut etre hors interet.
727  *
728  * SORTIE :
729  * r En sortie, le triangle superieur n'est pas altere, et la partie
730  * triangulaire inferieure contient la partie triangulaire superieure
731  * (transpose) de la matrice triangulaire "s".
732  * x Vecteur de taille "n" contenant les solutions au moindres carres du
733  * systeme a * x = b, d * x = 0.
734  * sdiag Vecteur de taille "n" contenant les elements diagonaux de la
735  * matrice triangulaire superieure "s".
736  *
737  */
738 int qrsolv (int n, double *r, int ldr, int *ipvt, double *diag, double *qtb,
739  double *x, double *sdiag, double *wa)
740 {
741  int i, j, jp1, k, kp1, l; /* compteur de boucle */
742  int nsing;
743  double cosi, cotg, qtbpj, sinu, sum, tg, temp;
744 
745  /*
746  * copie de r et (q transpose) * b afin de preserver l'entree
747  * et initialisation de "s". En particulier, sauvegarde des elements
748  * diagonaux de "r" dans "x".
749  */
750  for (i = 0; i < n; i++)
751  {
752  for (j = i; j < n; j++)
753  *MIJ(r, i, j, ldr) = *MIJ(r, j, i, ldr);
754 
755  x[i] = *MIJ(r, i, i, ldr);
756  wa[i] = qtb[i];
757  }
758 
759  /*
760  * Elimination de la matrice diagonale "d" en utlisant une rotation
761  * connue.
762  */
763 
764  for (i = 0; i < n; i++)
765  {
766  /*
767  * preparation de la colonne de d a eliminer, reperage de
768  * l'element diagonal par utilisation de p de la
769  * factorisation qr.
770  */
771  l = ipvt[i];
772 
773  //if (diag[l] != 0.0)
774  if (std::fabs(diag[l]) > std::numeric_limits<double>::epsilon())
775  {
776  for (k = i; k < n; k++)
777  sdiag[k] = 0.0;
778 
779  sdiag[i] = diag[l];
780 
781  /*
782  * Les transformations qui eliminent la colonne de d
783  * modifient seulement qu'un seul element de
784  * (q transpose)*b avant les n premiers elements
785  * lesquels sont inialement nuls.
786  */
787 
788  qtbpj = 0.0;
789 
790  for (k = i; k < n; k++)
791  {
792  /*
793  * determination d'une rotation qui elimine
794  * les elements appropriees dans la colonne
795  * courante de d.
796  */
797 
798  //if (sdiag[k] != 0.0)
799  if (std::fabs(sdiag[k]) > std::numeric_limits<double>::epsilon())
800  {
801  if (std::fabs(*MIJ(r, k, k, ldr)) >= std::fabs(sdiag[k]))
802  {
803  tg = sdiag[k] / *MIJ(r, k, k, ldr);
804  cosi = 0.5 / sqrt(0.25 + 0.25 * (tg * tg));
805  sinu = cosi * tg;
806  }
807  else
808  {
809  cotg = *MIJ(r, k, k, ldr) / sdiag[k];
810  sinu = 0.5 / sqrt(0.25 + 0.25 * (cotg * cotg));
811  cosi = sinu * cotg;
812  }
813 
814  /*
815  * calcul des elements de la diagonale modifiee
816  * de r et des elements modifies de
817  * ((q transpose)*b,0).
818  */
819  *MIJ(r, k, k, ldr) = cosi * *MIJ(r, k, k, ldr) + sinu * sdiag[k];
820  temp = cosi * wa[k] + sinu * qtbpj;
821  qtbpj = -sinu * wa[k] + cosi * qtbpj;
822  wa[k] = temp;
823 
824  /*
825  * accumulation des tranformations dans
826  * les lignes de s.
827  */
828 
829  kp1 = k + 1;
830 
831  if ( n >= kp1)
832  {
833  for (j = kp1; j < n; j++)
834  {
835  temp = cosi * *MIJ(r, k, j, ldr) +
836  sinu * sdiag[j];
837  sdiag[j] = - sinu * *MIJ(r, k, j, ldr) +
838  cosi * sdiag[j];
839  *MIJ(r, k, j, ldr) = temp;
840  }
841  }
842  }/* fin if diag[] !=0 */
843  } /* fin boucle for k -> n */
844  }/* fin if diag =0 */
845 
846  /*
847  * stokage de l'element diagonal de s et restauration de
848  * l'element diagonal correspondant de r.
849  */
850  sdiag[i] = *MIJ(r, i, i, ldr);
851  *MIJ(r, i, i, ldr) = x[i];
852  } /* fin boucle for j -> n */
853 
854  /*
855  * resolution du systeme triangulaire pour z. Si le systeme est
856  * singulier, on obtient une solution au moindres carres.
857  */
858  nsing = n;
859 
860  for (i = 0; i < n; i++)
861  {
862  //if (sdiag[i] == 0.0 && nsing == n)
863  if ( (std::fabs(sdiag[i]) <= std::numeric_limits<double>::epsilon()) && nsing == n)
864  nsing = i - 1;
865 
866  if (nsing < n)
867  wa[i] = 0.0;
868  }
869 
870  if (nsing >= 0)
871  {
872  for (k = 0; k < nsing; k++)
873  {
874  i = nsing - 1 - k;
875  sum = 0.0;
876  jp1 = i + 1;
877 
878  if (nsing >= jp1)
879  {
880  for (j = jp1; j < nsing; j++)
881  sum += *MIJ(r, i, j, ldr) * wa[j];
882  }
883  wa[i] = (wa[i] - sum) / sdiag[i];
884  }
885  }
886  /*
887  * permutation arriere des composants de z et des componants de x.
888  */
889 
890  for (j = 0; j < n; j++)
891  {
892  l = ipvt[j];
893  x[l] = wa[j];
894 
895  }
896  return (0);
897 }
898 
899 /*
900  * PROCEDURE : lmder
901  *
902  *
903  * ENTREE :
904  * fcn Fonction qui calcule la fonction et le jacobien de la fonction.
905  * m Nombre de fonctions.
906  * n Nombre de variables. n <= m
907  * x Vecteur de taille "n" contenant en entree une estimation
908  * initiale de la solution.
909  * ldfjac Taille dominante de la matrice "fjac". ldfjac >= "m".
910  * ftol Erreur relative desiree dans la somme des carre. La terminaison
911  * survient quand les preductions estimee et vraie de la somme des
912  * carres sont toutes deux au moins egal a ftol.
913  * xtol Erreur relative desiree dans la solution approximee. La
914  * terminaison survient quand l'erreur relative entre deux
915  * iterations consecutives est au moins egal a xtol.
916  * gtol Mesure de l'orthogonalite entre le vecteur des fonctions et les
917  * colonnes du jacobien. La terminaison survient quand le cosinus
918  * de l'angle entre fvec et n'importe quelle colonne du jacobien
919  * est au moins egal a gtol, en valeur absolue.
920  * maxfev Nombre d'appel maximum. La terminaison se produit lorsque le
921  * nombre d'appel a fcn avec iflag = 1 a atteint "maxfev".
922  * diag Vecteur de taille "n". Si mode = 1 (voir ci-apres), diag est
923  * initialisee en interne. Si mode = 2, diag doit contenir les
924  * entree positives qui servent de facteurs d'echelle aux variables.
925  * mode Si mode = 1, les variables seront mis a l'echelle en interne.
926  * Si mode = 2, la mise a l'echelle est specifie par l'entree diag.
927  * Les autres valeurs de mode sont equivalents a mode = 1.
928  * factor Definit la limite de l'etape initial. Cette limite est initialise
929  * au produit de "factor" et de la norme euclidienne de "diag" * "x"
930  * sinon nul. ou a "factor" lui meme. Dans la plupart des cas,
931  * "factor" doit se trouve dans l'intervalle (1, 100); ou 100 est
932  * la valeur recommandee.
933  * nprint Controle de l'impression des iterees (si valeur positive).
934  * Dans ce cas, fcn est appelle avec iflag = 0 au debut de la
935  * premiere iteration et apres chaque nprint iteration, x, fvec,
936  * et fjac sont disponible pour impression, cela avant de quitter
937  * la procedure. Si "nprint" est negatif, aucun appel special de
938  * fcn est faite.
939  * wa1, wa2, wa3 Vecteur de travail de taille "n".
940  * wa4 Vecteur de travail de taille "m".
941  *
942  *
943  * SORTIE :
944  * x Vecteur de taille "n" contenant en sortie l'estimee finale
945  * de la solution.
946  * fvec Vecteur de taille "m" contenant les fonctions evaluee en "x".
947  * fjac Matrice de taille "m" x "n". La sous matrice superieure de
948  * taille "n" x "n" de fjac contient une matrice triangulaire
949  * superieure r dont les elements diagonaux, classe dans le sens
950  * decroissant de leur valeur, sont de la forme :
951  *
952  * T T T
953  * p * (jac * jac) * p = r * r
954  *
955  * Ou p est une matrice de permutation et jac est le jacobien
956  * final calcule.
957  * La colonne j de p est la colonne ipvt (j) (voir ci apres) de
958  * la matrice identite. La partie trapesoidale inferieure de fjac
959  * contient les information genere durant le calcul de r.
960  * info Information de l'execution de la procedure. Lorsque la procedure
961  * a termine son execution, "info" est inialisee a la valeur
962  * (negative) de iflag. sinon elle prend les valeurs suivantes :
963  * info = 0 : parametres en entree non valides.
964  * info = 1 : les reductions relatives reelle et estimee de la
965  * somme des carres sont au moins egales a ftol.
966  * info = 2 : erreur relative entre deux iteres consecutives sont
967  * egaux a xtol.
968  * info = 3 : conditions info = 1 et info = 2 tous deux requis.
969  * info = 4 : le cosinus de l'angle entre fvec et n'importe quelle
970  * colonne du jacobien est au moins egal a gtol, en
971  * valeur absolue.
972  * info = 5 : nombre d'appels a fcn avec iflag = 1 a atteint
973  * maxfev.
974  * info = 6 : ftol est trop petit. Plus moyen de reduire de la
975  * somme des carres.
976  * info = 7 : xtol est trop petit. Plus d'amelioration possible
977  * pour approximer la solution x.
978  * info = 8 : gtol est trop petit. "fvec" est orthogonal aux
979  * colonnes du jacobien a la precision machine pres.
980  * nfev Nombre d'appel a "fcn" avec iflag = 1.
981  * njev Nombre d'appel a "fcn" avec iflag = 2.
982  * ipvt Vecteur de taille "n". Il definit une matrice de permutation p
983  * tel que jac * p = q * p, ou jac est le jacbien final calcule,
984  * q est orthogonal (non socke) et r est triangulaire superieur,
985  * avec les elements diagonaux classes en ordre decroissant de
986  * leur valeur. La colonne j de p est ipvt[j] de la matrice identite.
987  * qtf Vecteur de taille n contenant les n premiers elements du
988  * vecteur qT * fvec.
989  *
990  * DESCRIPTION :
991  * La procedure minimize la somme de carre de m equation non lineaire a n
992  * variables par une modification de l'algorithme de Levenberg - Marquardt.
993  *
994  * REMARQUE :
995  * L'utilisateur doit fournir une procedure "fcn" qui calcule la fonction et
996  * le jacobien.
997  * "fcn" doit etre declare dans une instruction externe a la procedure et doit
998  * etre appele comme suit :
999  * fcn (int m, int n, int ldfjac, double *x, double *fvec, double *fjac, int *iflag)
1000  *
1001  * si iflag = 1 calcul de la fonction en x et retour de ce vecteur dans fvec.
1002  * fjac n'est pas modifie.
1003  * si iflag = 2 calcul du jacobien en x et retour de cette matrice dans fjac.
1004  * fvec n'est pas modifie.
1005  *
1006  * RETOUR :
1007  * En cas de succes, la valeur zero est retournee.
1008  * Sinon la valeur -1 est retournee.
1009  */
1010 int lmder (void (*ptr_fcn)(int m, int n, double *xc, double *fvecc,
1011  double *jac, int ldfjac, int iflag), int m, int n, double *x,
1012  double *fvec, double *fjac, int ldfjac, double ftol, double xtol,
1013  double gtol, unsigned int maxfev, double *diag, int mode,
1014  const double factor, int nprint, int *info, unsigned int *nfev,
1015  int *njev, int *ipvt, double *qtf, double *wa1, double *wa2,
1016  double *wa3, double *wa4)
1017 {
1018  const double tol1 = 0.1, tol5 = 0.5, tol25 = 0.25, tol75 = 0.75, tol0001 = 0.0001;
1019  int oncol = TRUE;
1020  int iflag, iter;
1021  int count = 0;
1022  int i, j, l;
1023  double actred, delta, dirder, epsmch, fnorm, fnorm1, gnorm;
1024  double ratio = std::numeric_limits<double>::epsilon();
1025  double par, pnorm, prered;
1026  double sum, temp, temp1, temp2, xnorm = 0.0;
1027 
1028  /* epsmch est la precision machine. */
1029  epsmch = std::numeric_limits<double>::epsilon();
1030 
1031  *info = 0;
1032  iflag = 0;
1033  *nfev = 0;
1034  *njev = 0;
1035 
1036  /* verification des parametres d'entree. */
1037 
1038  /*if (n <= 0)
1039  return 0;*/
1040  if (m < n)
1041  return 0;
1042  if (ldfjac < m)
1043  return 0;
1044  if (ftol < 0.0)
1045  return 0;
1046  if (xtol < 0.0)
1047  return 0;
1048  if (gtol < 0.0)
1049  return 0;
1050  if (maxfev == 0)
1051  return 0;
1052  if (factor <= 0.0)
1053  return 0;
1054  if ((n <= 0) || (m < n) || (ldfjac < m) || (ftol < 0.0) || (xtol < 0.0)
1055  || (gtol < 0.0) || (maxfev == 0) || (factor <= 0.0))
1056  {
1057  /*
1058  * termination, normal ou imposee par l'utilisateur.
1059  */
1060  if (iflag < 0)
1061  *info = iflag;
1062 
1063  iflag = 0;
1064 
1065  if (nprint > 0)
1066  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1067 
1068  return (count);
1069  }
1070 
1071  if (mode == 2)
1072  {
1073  for (j = 0; j < n; j++)
1074  {
1075  if (diag[j] <= 0.0)
1076  {
1077  /*
1078  * termination, normal ou imposee par l'utilisateur.
1079  */
1080  if (iflag < 0)
1081  *info = iflag;
1082 
1083  iflag = 0;
1084 
1085  if (nprint > 0)
1086  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1087 
1088  return (count);
1089  }
1090  }
1091  }
1092 
1093  /*
1094  * evaluation de la fonction au point de depart
1095  * et calcul de sa norme.
1096  */
1097  iflag = 1;
1098 
1099  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1100 
1101 
1102  *nfev = 1;
1103 
1104  if (iflag < 0)
1105  {
1106  /*
1107  * termination, normal ou imposee par l'utilisateur.
1108  */
1109  if (iflag < 0)
1110  *info = iflag;
1111 
1112  iflag = 0;
1113 
1114  if (nprint > 0)
1115  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1116 
1117  return (count);
1118  }
1119 
1120  fnorm = enorm(fvec, m);
1121 
1122  /*
1123  * initialisation du parametre de Levenberg-Marquardt
1124  * et du conteur d'iteration.
1125  */
1126 
1127  par = 0.0;
1128  iter = 1;
1129 
1130  /*
1131  * debut de la boucle la plus externe.
1132  */
1133  while (count < (int)maxfev)
1134  {
1135  count++;
1136  /*
1137  * calcul de la matrice jacobienne.
1138  */
1139 
1140  iflag = 2;
1141 
1142  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1143 
1144  (*njev) ++;
1145 
1146  if (iflag < 0)
1147  {
1148  /*
1149  * termination, normal ou imposee par l'utilisateur.
1150  */
1151  if (iflag < 0)
1152  *info = iflag;
1153 
1154  iflag = 0;
1155 
1156  if (nprint > 0)
1157  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1158 
1159  return (count);
1160  }
1161 
1162  /*
1163  * si demandee, appel de fcn pour impression des iterees.
1164  */
1165  if (nprint > 0)
1166  {
1167  iflag = 0;
1168  if ((iter-1) % nprint == 0)
1169  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1170 
1171  if (iflag < 0)
1172  {
1173  /*
1174  * termination, normal ou imposee par l'utilisateur.
1175  */
1176  if (iflag < 0)
1177  *info = iflag;
1178 
1179  iflag = 0;
1180 
1181  if (nprint > 0)
1182  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1183 
1184  return (count);
1185  }
1186  }
1187 
1188  /*
1189  * calcul de la factorisation qr du jacobien.
1190  */
1191  qrfac(n, m, fjac, ldfjac, &oncol, ipvt, n, wa1, wa2, wa3);
1192 
1193  /*
1194  * a la premiere iteration et si mode est 1, mise a l'echelle
1195  * en accord avec les normes des colonnes du jacobien initial.
1196  */
1197 
1198  if (iter == 1)
1199  {
1200  if (mode != 2)
1201  {
1202  for (j = 0; j < n; j++)
1203  {
1204  diag[j] = wa2[j];
1205  //if (wa2[j] == 0.0)
1206  if (std::fabs(wa2[j]) <= std::numeric_limits<double>::epsilon())
1207  diag[j] = 1.0;
1208  }
1209  }
1210 
1211  /*
1212  * a la premiere iteration, calcul de la norme de x mis
1213  * a l'echelle et initialisation de la limite delta de
1214  * l'etape.
1215  */
1216 
1217  for (j = 0; j < n; j++)
1218  wa3[j] = diag[j] * x[j];
1219 
1220  xnorm = enorm (wa3, n);
1221  delta = factor * xnorm;
1222 
1223  //if (delta == 0.0)
1224  if (std::fabs(delta) <= std::numeric_limits<double>::epsilon())
1225  delta = factor;
1226  }
1227 
1228  /*
1229  * formation de (q transpose) * fvec et stockage des n premiers
1230  * composants dans qtf.
1231  */
1232  for (i = 0; i < m; i++)
1233  wa4[i] = fvec[i];
1234 
1235  for (i = 0; i < n; i++)
1236  {
1237  double *pt = MIJ(fjac, i, i, ldfjac);
1238  //if (*MIJ(fjac, i, i, ldfjac) != 0.0)
1239  if (std::fabs(*pt) > std::numeric_limits<double>::epsilon() )
1240  {
1241  sum = 0.0;
1242 
1243  for (j = i; j < m; j++)
1244  sum += *MIJ(fjac, i, j, ldfjac) * wa4[j];
1245 
1246  temp = - sum / *MIJ(fjac, i, i, ldfjac);
1247 
1248  for (j = i; j < m; j++)
1249  wa4[j] += *MIJ(fjac, i, j, ldfjac) * temp;
1250 
1251  }
1252 
1253  *MIJ(fjac, i, i, ldfjac) = wa1[i];
1254  qtf[i] = wa4[i];
1255  }
1256 
1257  /*
1258  * calcul de la norme du gradient mis a l'echelle.
1259  */
1260 
1261  gnorm = 0.0;
1262 
1263  //if (fnorm != 0.0)
1264  if (std::fabs(fnorm) > std::numeric_limits<double>::epsilon())
1265  {
1266  for (i = 0; i < n; i++)
1267  {
1268  l = ipvt[i];
1269  //if (wa2[l] != 0.0)
1270  if (std::fabs(wa2[l]) > std::numeric_limits<double>::epsilon())
1271  {
1272  sum = 0.0;
1273  for (j = 0; j <= i; j++)
1274  sum += *MIJ(fjac, i, j, ldfjac) * (qtf[j] / fnorm);
1275 
1276  gnorm = vpMath::maximum(gnorm, std::fabs(sum / wa2[l]));
1277  }
1278  }
1279  }
1280 
1281  /*
1282  * test pour la convergence de la norme du gradient .
1283  */
1284 
1285  if (gnorm <= gtol)
1286  *info = 4;
1287 
1288  if (*info != 0)
1289  {
1290  /*
1291  * termination, normal ou imposee par l'utilisateur.
1292  */
1293  if (iflag < 0)
1294  *info = iflag;
1295 
1296  iflag = 0;
1297 
1298  if (nprint > 0)
1299  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1300 
1301  return (count);
1302  }
1303 
1304  /*
1305  * remise a l'echelle si necessaire.
1306  */
1307 
1308  if (mode != 2)
1309  {
1310  for (j = 0; j < n; j++)
1311  diag[j] = vpMath::maximum(diag[j], wa2[j]);
1312  }
1313 
1314  /*
1315  * debut de la boucle la plus interne.
1316  */
1317  ratio = 0.0;
1318  while (ratio < tol0001)
1319  {
1320 
1321  /*
1322  * determination du parametre de Levenberg-Marquardt.
1323  */
1324  lmpar(n, fjac, ldfjac, ipvt, diag, qtf, &delta, &par, wa1,
1325  wa2, wa3, wa4);
1326 
1327  /*
1328  * stockage de la direction p et x + p. calcul de la norme de p.
1329  */
1330 
1331  for (j = 0; j < n; j++)
1332  {
1333  wa1[j] = - wa1[j];
1334  wa2[j] = x[j] + wa1[j];
1335  wa3[j] = diag[j] * wa1[j];
1336  }
1337 
1338  pnorm = enorm(wa3, n);
1339 
1340  /*
1341  * a la premiere iteration, ajustement de la premiere limite de
1342  * l'etape.
1343  */
1344 
1345  if (iter == 1)
1346  delta = vpMath::minimum(delta, pnorm);
1347 
1348  /*
1349  * evaluation de la fonction en x + p et calcul de leur norme.
1350  */
1351 
1352  iflag = 1;
1353  (*ptr_fcn)(m, n, wa2, wa4, fjac, ldfjac, iflag);
1354 
1355  (*nfev)++;
1356 
1357  if (iflag < 0)
1358  {
1359  /*
1360  * termination, normal ou imposee par l'utilisateur.
1361  */
1362  if (iflag < 0)
1363  *info = iflag;
1364 
1365  iflag = 0;
1366 
1367  if (nprint > 0)
1368  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1369 
1370  return (count);
1371  }
1372 
1373  fnorm1 = enorm(wa4, m);
1374 
1375  /*
1376  * calcul de la reduction reelle mise a l'echelle.
1377  */
1378 
1379  actred = - 1.0;
1380 
1381  if ((tol1 * fnorm1) < fnorm)
1382  actred = 1.0 - ((fnorm1 / fnorm) * (fnorm1 / fnorm));
1383 
1384  /*
1385  * calcul de la reduction predite mise a l'echelle et
1386  * de la derivee directionnelle mise a l'echelle.
1387  */
1388 
1389  for (i = 0; i < n; i++)
1390  {
1391  wa3[i] = 0.0;
1392  l = ipvt[i];
1393  temp = wa1[l];
1394  for (j = 0; j <= i; j++)
1395  wa3[j] += *MIJ(fjac, i, j, ldfjac) * temp;
1396  }
1397 
1398  temp1 = enorm(wa3, n) / fnorm;
1399  temp2 = (sqrt(par) * pnorm) / fnorm;
1400  prered = (temp1 * temp1) + (temp2 * temp2) / tol5;
1401  dirder = - ((temp1 * temp1) + (temp2 * temp2));
1402 
1403  /*
1404  * calcul du rapport entre la reduction reel et predit.
1405  */
1406 
1407  ratio = 0.0;
1408 
1409  //if (prered != 0.0)
1410  if (std::fabs(prered) > std::numeric_limits<double>::epsilon())
1411  ratio = actred / prered;
1412 
1413  /*
1414  * mise a jour de la limite de l'etape.
1415  */
1416 
1417  if (ratio > tol25)
1418  {
1419  //if ((par == 0.0) || (ratio <= tol75))
1420  if ((std::fabs(par) <= std::numeric_limits<double>::epsilon()) || (ratio <= tol75))
1421  {
1422  delta = pnorm / tol5;
1423  par *= tol5;
1424  }
1425  }
1426  else
1427  {
1428  if (actred >= 0.0)
1429  temp = tol5;
1430 
1431  else
1432  temp = tol5 * dirder / (dirder + tol5 * actred);
1433 
1434  if ((tol1 * fnorm1 >= fnorm) || (temp < tol1))
1435  temp = tol1;
1436 
1437  delta = temp * vpMath::minimum(delta, (pnorm / tol1));
1438  par /= temp;
1439  }
1440 
1441  /*
1442  * test pour une iteration reussie.
1443  */
1444  if (ratio >= tol0001)
1445  {
1446  /*
1447  * iteration reussie. mise a jour de x, de fvec, et de
1448  * leurs normes.
1449  */
1450 
1451  for (j = 0; j < n; j++)
1452  {
1453  x[j] = wa2[j];
1454  wa2[j] = diag[j] * x[j];
1455  }
1456 
1457  for (i = 0; i < m; i++)
1458  fvec[i] = wa4[i];
1459 
1460  xnorm = enorm(wa2, n);
1461  fnorm = fnorm1;
1462  iter++;
1463  }
1464 
1465  /*
1466  * tests pour convergence.
1467  */
1468 
1469  if ((std::fabs(actred) <= ftol) && (prered <= ftol) && (tol5 * ratio <= 1.0))
1470  *info = 1;
1471 
1472  if (delta <= xtol * xnorm)
1473  *info = 2;
1474 
1475  if ((std::fabs(actred) <= ftol) && (prered <= ftol) && (tol5 * ratio <= 1.0)
1476  && *info == 2)
1477  *info = 3;
1478 
1479  if (*info != 0)
1480  {
1481  /*
1482  * termination, normal ou imposee par l'utilisateur.
1483  */
1484  if (iflag < 0)
1485  *info = iflag;
1486 
1487  iflag = 0;
1488 
1489  if (nprint > 0)
1490  (*ptr_fcn)(m,n,x,fvec,fjac,ldfjac, iflag);
1491 
1492  return (count);
1493  }
1494  /*
1495  * tests pour termination et
1496  * verification des tolerances.
1497  */
1498 
1499  if (*nfev >= maxfev)
1500  *info = 5;
1501 
1502  if ((std::fabs(actred) <= epsmch) && (prered <= epsmch)
1503  && (tol5 * ratio <= 1.0))
1504  *info = 6;
1505 
1506  if (delta <= epsmch * xnorm)
1507  *info = 7;
1508 
1509  if (gnorm <= epsmch)
1510  *info = 8;
1511 
1512  if (*info != 0)
1513  {
1514  /*
1515  * termination, normal ou imposee par l'utilisateur.
1516  */
1517  if (iflag < 0)
1518  *info = iflag;
1519 
1520  iflag = 0;
1521 
1522  if (nprint > 0)
1523  (*ptr_fcn)(m, n, x, fvec, fjac, ldfjac, iflag);
1524 
1525  return (count);
1526  }
1527  }/* fin while ratio >=tol0001 */
1528  }/*fin while 1*/
1529 
1530  return 0 ;
1531 }
1532 
1533 
1534 
1535 /*
1536  * PROCEDURE : lmder1
1537  *
1538  * ENTREE :
1539  * fcn Fonction qui calcule la fonction et le jacobien de la fonction.
1540  * m Nombre de fonctions.
1541  * n Nombre de variables (parametres). n <= m
1542  * x Vecteur de taille "n" contenant en entree une estimation
1543  * initiale de la solution.
1544  * ldfjac Taille maximale de la matrice "fjac". ldfjac >= "m".
1545  * tol Tolerance. La terminaison de la procedure survient quand
1546  * l'algorithme estime que l'erreur relative dans la somme des
1547  * carres est au moins egal a tol ou bien que l'erreur relative
1548  * entre x et la solution est au moins egal atol.
1549  * wa Vecteur de travail de taille "lwa".
1550  * lwa Taille du vecteur "wa". wa >= 5 * n + m.
1551  *
1552  *
1553  * SORTIE :
1554  * x Vecteur de taille "n" contenant en sortie l'estimee finale
1555  * de la solution.
1556  * fvec Vecteur de taille "m" contenant les fonctions evaluee en "x".
1557  * fjac Matrice de taille "m" x "n". La sous matrice superieure de
1558  * taille "n" x "n" de fjac contient une matrice triangulaire
1559  * superieure r dont les elements diagonaux, classe dans le sens
1560  * decroissant de leur valeur, sont de la forme :
1561  *
1562  * T T T
1563  * p * (jac * jac) * p = r * r
1564  *
1565  * Ou p est une matrice de permutation et jac est le jacobien
1566  * final calcule.
1567  * La colonne j de p est la colonne ipvt (j) (voir ci apres) de
1568  * la matrice identite. La partie trapesoidale inferieure de fjac
1569  * contient les information genere durant le calcul de r.
1570  * info Information de l'executionde la procedure. Lorsque la procedure
1571  * a termine son execution, "info" est inialisee a la valeur
1572  * (negative) de iflag. sinon elle prend les valeurs suivantes :
1573  * info = 0 : parametres en entre non valides.
1574  * info = 1 : estimation par l'algorithme que l'erreur relative
1575  * de la somme des carre est egal a tol.
1576  * info = 2 : estimation par l'algorithme que l'erreur relative
1577  * entre x et la solution est egal a tol.
1578  * info = 3 : conditions info = 1 et info = 2 tous deux requis.
1579  * info = 4 : fvec est orthogonal aux colonnes du jacobien.
1580  * info = 5 : nombre d'appels a fcn avec iflag = 1 a atteint
1581  * 100 * (n + 1).
1582  * info = 6 : tol est trop petit. Plus moyen de reduire de la
1583  * somme des carres.
1584  * info = 7 : tol est trop petit. Plus d'amelioration possible
1585  * d' approximer la solution x.
1586  * ipvt Vecteur de taille "n". Il definit une matrice de permutation p
1587  * tel que jac * p = q * p, ou jac est le jacbien final calcule,
1588  * q est orthogonal (non socke) et r est triangulaire superieur,
1589  * avec les elements diagonaux classes en ordre decroissant de
1590  * leur valeur. La colonne j de p est ipvt[j] de la matrice identite.
1591  *
1592  * DESCRIPTION :
1593  * La procedure minimize la somme de carre de m equation non lineaire a n
1594  * variables par une modification de l'algorithme de Levenberg - Marquardt.
1595  * Cette procedure appele la procedure generale au moindre carre lmder.
1596  *
1597  * REMARQUE :
1598  * L'utilisateur doit fournir une procedure "fcn" qui calcule la fonction et
1599  * le jacobien.
1600  * "fcn" doit etre declare dans une instruction externe a la procedure et doit
1601  * etre appele comme suit :
1602  * fcn (int m, int n, int ldfjac, double *x, double *fvec, double *fjac, int *iflag)
1603  *
1604  * si iflag = 1 calcul de la fonction en x et retour de ce vecteur dans fvec.
1605  * fjac n'est pas modifie.
1606  * si iflag = 2 calcul du jacobien en x et retour de cette matrice dans fjac.
1607  * fvec n'est pas modifie.
1608  *
1609  * RETOUR :
1610  * En cas de succes, la valeur zero est retournee.
1611  * Sinon, la valeur -1.
1612  *
1613  */
1614 int lmder1 (void (*ptr_fcn)(int m, int n, double *xc, double *fvecc,
1615  double *jac, int ldfjac, int iflag),
1616  int m, int n, double *x, double *fvec, double *fjac,
1617  int ldfjac, double tol, int *info, int *ipvt, int lwa, double *wa)
1618 {
1619  const double factor = 100.0;
1620  unsigned int maxfev, nfev;
1621  int mode, njev, nprint;
1622  double ftol, gtol, xtol;
1623 
1624  *info = 0;
1625 
1626  /* verification des parametres en entree qui causent des erreurs */
1627 
1628 
1629  if (/*(n <= 0) ||*/ (m < n) || (ldfjac < m) || (tol < 0.0) ||
1630  (lwa < (5 * n + m)) )
1631  {
1632  printf("%d %d %d %d \n", (m < n), (ldfjac < m), (tol < 0.0) , (lwa < (5 * n + m))) ;
1633  return (-1);
1634  }
1635 
1636  /* appel a lmder */
1637 
1638  maxfev = (unsigned int)(100 * (n + 1));
1639  ftol = tol;
1640  xtol = tol;
1641  gtol = 0.0;
1642  mode = 1;
1643  nprint = 0;
1644 
1645  lmder (ptr_fcn , m, n, x, fvec, fjac, ldfjac, ftol, xtol, gtol, maxfev, wa,
1646  mode, factor, nprint, info, &nfev, &njev, ipvt, &wa[n], &wa[2 * n],
1647  &wa[3 * n], &wa[4 * n], &wa[5 * n]);
1648 
1649  if (*info == 8)
1650  *info = 4;
1651 
1652  return (0);
1653 }
1654 
1655 #undef TRUE
1656 #undef FALSE
1657 
1658 
1659 /*
1660  * Local variables:
1661  * c-basic-offset: 2
1662  * End:
1663  */
static Type maximum(const Type &a, const Type &b)
Definition: vpMath.h:141
static Type minimum(const Type &a, const Type &b)
Definition: vpMath.h:152