Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
vpLevenbergMarquartd.h
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
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 https://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
34#ifndef VP_LEVENBERG_MARQUARTD_H
35#define VP_LEVENBERG_MARQUARTD_H
36
37#include <visp3/core/vpConfig.h>
38#include <visp3/core/vpMath.h>
39
40#include <errno.h>
41#include <float.h>
42#include <math.h>
43#include <stdio.h>
44#include <stdlib.h>
45
47
103 int qrsolv(int n, double *r, int ldr, int *ipvt, double *diag, double *qtb, double *x, double *sdiag, double *wa);
104
105 /*
106 * PROCEDURE : enorm
107 *
108 * ENTREE :
109 *
110 * x Vecteur de taille "n"
111 * n Taille du vecteur "x"
112 *
113 * DESCRIPTION :
114 * La procedure calcule la norme euclidienne d'un vecteur "x" de taille "n"
115 * La norme euclidienne est calculee par accumulation de la somme des carres
116 * dans les trois directions. Les sommes des carres pour les petits et grands
117 * elements sont mis a echelle afin d'eviter les overflows. Des underflows non
118 * destructifs sont autorisee. Les underflows et overflows sont evites dans le
119 * calcul des sommes des carres non encore mis a echelle par les elements
120 * intermediaires. La definition des elements petit, intermediaire et grand
121 * depend de deux constantes : rdwarf et rdiant. Les restrictions principales
122 * sur ces constantes sont rdwarf^2 n'est pas en underflow et rdgiant^2 n'est
123 * pas en overflow. Les constantes donnees ici conviennent pour la plupart des
124 * pc connus.
125 *
126 * RETOUR :
127 * En cas de succes, la valeur retournee est la norme euclidienne du vecteur
128 * Sinon, la valeur -1 est retournee et la variable globale "errno" est
129 * initialisee pour indiquee le type de l'erreur.
130 */
131double enorm(const double *x, int n);
132
133/* PROCEDURE : lmpar
134 *
135 * ENTREE :
136 * n Ordre de la matrice "r".
137 * r Matrice de taille "n" x "n". En entree, la toute la partie
138 * triangulaire superieure doit contenir toute la partie
139 * triangulaire superieure de "r".
140 *
141 * ldr Taille maximum de la matrice "r". "ldr" >= "n".
142 *
143 * ipvt Vecteur de taille "n" qui definit la matrice de permutation
144 * "p" tel que : a * p = q * r. La jeme colonne de p la colonne ipvt[j] de la
145 * matrice d'identite.
146 *
147 * diag Vecteur de taille "n" contenant les elements diagonaux de la
148 * matrice "d".
149 *
150 * qtb Vecteur de taille "n" contenant les "n" premiers elements du
151 * vecteur (q transpose)*b.
152 *
153 * delta Limite superieure de la norme euclidienne de d * x.
154 *
155 * par Estimee initiale du parametre de Levenberg-Marquardt.
156 * wa1, wa2 Vecteurs de taille "n" de travail.
157 *
158 * DESCRIPTION :
159 * La procedure determine le parametre de Levenberg-Marquardt. Soit une
160 * matrice "a" de taille "m" x "n", une matrice diagonale "d" non singuliere de
161 * taille "n" x "n", un vecteur "b" de taille "m" et un nombre positf delta,
162 * le probleme est le calcul du parametre "par" de telle facon que si "x"
163 * resoud le systeme
164 *
165 * a * x = b , sqrt(par) * d * x = 0 ,
166 *
167 * au sens des moindre carre, et dxnorm est la norme euclidienne de d * x
168 * alors "par" vaut 0.0 et (dxnorm - delta) <= 0.1 * delta ,
169 * ou "par" est positif et abs(dxnorm-delta) <= 0.1 * delta.
170 * Cette procedure complete la solution du probleme si on lui fourni les infos
171 * nessaires de la factorisation qr, avec pivotage de colonnes de a.
172 * Donc, si a * p = q * r, ou "p" est une matrice de permutation, les colonnes
173 * de "q" sont orthogonales, et "r" est une matrice triangulaire superieure
174 * avec les elements diagonaux classes par ordre decroissant de leur valeur,
175 * lmpar attend une matrice triangulaire superieure complete, la matrice de
176 * permutation "p" et les "n" premiers elements de (q transpose) * b. En
177 * sortie, la procedure lmpar fournit aussi une matrice triangulaire
178 * superieure "s" telle que
179 *
180 * t t t
181 * p * (a * a + par * d * d )* p = s * s .
182 *
183 * "s" est utilise a l'interieure de lmpar et peut etre d'un interet separe.
184 *
185 * Seulement quelques iterations sont necessaire pour la convergence de
186 * l'algorithme. Si neanmoins la limite de 10 iterations est atteinte, la
187 * valeur de sortie "par" aura la derniere meilleure valeur.
188 *
189 * SORTIE :
190 * r En sortie, tout le triangle superieur est inchange, et le
191 * le triangle inferieur contient les elements de la partie
192 * triangulaire superieure (transpose) de la matrice triangulaire
193 * superieure de "s".
194 * par Estimee finale du parametre de Levenberg-Marquardt.
195 * x Vecteur de taille "n" contenant la solution au sens des
196 * moindres carres du systeme a * x = b, sqrt(par) * d * x = 0, pour le
197 * parametre en sortie "par"
198 * sdiag Vecteur de taille "n" contenant les elements diagonaux de la
199 * matrice triangulaire "s".
200 *
201 * RETOUR :
202 * En cas de succes, la valeur 0.0 est retournee.
203 */
204int lmpar(int n, double *r, int ldr, int *ipvt, double *diag, double *qtb, double *delta, double *par,
205 double *x, double *sdiag, double *wa1, double *wa2);
206
207/*
208 * PROCEDURE : pythag
209 *
210 * ENTREES :
211 * a, b Variables dont on veut la racine carre de leur somme de carre
212 *
213 * DESCRIPTION :
214 * La procedure calcule la racine carre de la somme des carres de deux nombres
215 * en evitant l'overflow ou l'underflow destructif.
216 *
217 * RETOUR :
218 * La procedure retourne la racine carre de a^2 + b^2.
219 */
220double pythag(double a, double b);
221
222/*
223 * PROCEDURE : qrfac
224 *
225 * ENTREE :
226 * m Nombre de lignes de la matrice "a".
227 * n Nombre de colonne de la matrice "a".
228 * a Matrice de taille "m" x "n". elle contient, en entree la
229 *matrice dont on veut sa factorisation qr.
230 * lda Taille maximale de "a". lda >= m.
231 * pivot Booleen. Si pivot est TRUE, le pivotage de colonnes est
232 *realise Si pivot = FALSE, pas de pivotage.
233 * lipvt Taille du vecteur "ipvt". Si pivot est FALSE, lipvt est de
234 * l'ordre de 1. Sinon lipvt est de l'ordre de "n".
235 * wa Vecteur de travail de taille "n". Si pivot = FALSE "wa"
236 * coincide avec rdiag.
237 *
238 * DESCRIPTION :
239 * La procedure effectue une decomposition de la matrice "a"par la methode qr.
240 * Elle utilise les transformations de householders avec pivotage sur les
241 * colonnes (option) pour calculer la factorisation qr de la matrice "a" de
242 * taille "m" x "n". La procedure determine une matrice orthogonale "q", une
243 * matrice de permutation "p" et une matrice trapesoidale superieure "r" dont
244 * les elements diagonaux sont ordonnes dans l'ordre decroissant de leurs
245 * valeurs,tel que a * p = q * r. La transformation de householder pour la
246 * colonne k, k = 1,2,...,min(m,n), est de la forme
247 * t
248 * i - (1 / u(k)) * u * u
249 *
250 * Ou u a des zeros dans les k-1 premieres positions.
251 *
252 * SORTIE :
253 * a Matrice de taille "m" x "n" dont le trapeze superieur de "a"
254 * contient la partie trapezoidale superieure de "r" et la partie
255 * trapezoidale inferieure de "a" contient une forme factorisee
256 * de "q" (les elements non triviaux du vecteurs "u" sont decrits
257 * ci-dessus).
258 * ipvt Vecteur de taille "n". Il definit la matrice de permutation
259 * "p" tel que a * p = q * r. La jeme colonne de p est la colonne ipvt[j] de la
260 * matrice d'identite. Si pivot = FALSE, ipvt n'est pas referencee. rdiag
261 * Vecteur de taille "n" contenant les elements diagonaux de la matrice
262 * "r". acnorm Vecteur de taille "n" contenant les normes des lignes
263 * correspondantes de la matrice "a". Si cette information n'est
264 * pas requise, acnorm coincide avec rdiag.
265 */
266int qrfac(int m, int n, double *a, int lda, int *pivot, int *ipvt, int lipvt, double *rdiag, double *acnorm, double *wa);
267
271typedef void (*ComputeFunctionAndJacobian)(int m, int n, double *xc, double *fvecc, double *jac, int ldfjac, int iflag);
272
273/*
274 * PROCEDURE : lmder
275 *
276 *
277 * ENTREE :
278 * fcn Fonction qui calcule la fonction et le jacobien de la
279 * fonction. m Nombre de fonctions.
280 * n Nombre de variables. n <= m
281 * x Vecteur de taille "n" contenant en entree une estimation
282 * initiale de la solution.
283 * ldfjac Taille dominante de la matrice "fjac". ldfjac >= "m".
284 * ftol Erreur relative desiree dans la somme des carre. La
285 * terminaison survient quand les preductions estimee et vraie de la somme des
286 * carres sont toutes deux au moins egal a ftol.
287 * xtol Erreur relative desiree dans la solution approximee. La
288 * terminaison survient quand l'erreur relative entre deux
289 * iterations consecutives est au moins egal a xtol.
290 * gtol Mesure de l'orthogonalite entre le vecteur des fonctions et
291 * les colonnes du jacobien. La terminaison survient quand le cosinus de
292 * l'angle entre fvec et n'importe quelle colonne du jacobien est au moins
293 * egal a gtol, en valeur absolue. maxfev Nombre d'appel maximum. La
294 * terminaison se produit lorsque le nombre d'appel a fcn avec iflag = 1 a
295 * atteint "maxfev".
296 * diag Vecteur de taille "n". Si mode = 1 (voir ci-apres), diag est
297 * initialisee en interne. Si mode = 2, diag doit contenir les
298 * entree positives qui servent de facteurs d'echelle aux
299 * variables.
300 * mode Si mode = 1, les variables seront mis a l'echelle en interne.
301 * Si mode = 2, la mise a l'echelle est specifie par l'entree
302 * diag. Les autres valeurs de mode sont equivalents a mode = 1. factor
303 * Definit la limite de l'etape initial. Cette limite est initialise au
304 * produit de "factor" et de la norme euclidienne de "diag" * "x" sinon nul.
305 * ou a "factor" lui meme. Dans la plupart des cas, "factor" doit se trouve
306 * dans l'intervalle (1, 100); ou 100 est la valeur recommandee. nprint
307 * Controle de l'impression des iterees (si valeur positive). Dans ce
308 * cas, fcn est appelle avec iflag = 0 au debut de la premiere iteration et
309 * apres chaque nprint iteration, x, fvec, et fjac sont disponible pour
310 * impression, cela avant de quitter la procedure. Si "nprint" est negatif,
311 * aucun appel special de fcn est faite. wa1, wa2, wa3 Vecteur de travail de
312 * taille "n". wa4 Vecteur de travail de taille "m".
313 *
314 * SORTIE :
315 * x Vecteur de taille "n" contenant en sortie l'estimee finale
316 * de la solution.
317 * fvec Vecteur de taille "m" contenant les fonctions evaluee en "x".
318 * fjac Matrice de taille "m" x "n". La sous matrice superieure de
319 * taille "n" x "n" de fjac contient une matrice triangulaire
320 * superieure r dont les elements diagonaux, classe dans le sens
321 * decroissant de leur valeur, sont de la forme :
322 *
323 * T T T
324 * p * (jac * jac) * p = r * r
325 *
326 * Ou p est une matrice de permutation et jac est le jacobien
327 * final calcule.
328 * La colonne j de p est la colonne ipvt (j) (voir ci apres) de
329 * la matrice identite. La partie trapesoidale inferieure de fjac
330 * contient les information genere durant le calcul de r.
331 * info Information de l'execution de la procedure. Lorsque la
332 * procedure a termine son execution, "info" est inialisee a la valeur
333 * (negative) de iflag. sinon elle prend les valeurs suivantes :
334 * info = 0 : parametres en entree non valides.
335 * info = 1 : les reductions relatives reelle et estimee de la
336 * somme des carres sont au moins egales a ftol.
337 * info = 2 : erreur relative entre deux iteres consecutives sont
338 * egaux a xtol.
339 * info = 3 : conditions info = 1 et info = 2 tous deux requis.
340 * info = 4 : le cosinus de l'angle entre fvec et n'importe
341 * quelle colonne du jacobien est au moins egal a gtol, en valeur absolue. info
342 * = 5 : nombre d'appels a fcn avec iflag = 1 a atteint maxfev. info = 6 :
343 * ftol est trop petit. Plus moyen de reduire de la somme des carres. info =
344 * 7 : xtol est trop petit. Plus d'amelioration possible pour approximer la
345 * solution x. info = 8 : gtol est trop petit. "fvec" est orthogonal aux
346 * colonnes du jacobien a la precision machine pres.
347 * nfev Nombre d'appel a "fcn" avec iflag = 1.
348 * njev Nombre d'appel a "fcn" avec iflag = 2.
349 * ipvt Vecteur de taille "n". Il definit une matrice de permutation p
350 * tel que jac * p = q * p, ou jac est le jacbien final calcule,
351 * q est orthogonal (non socke) et r est triangulaire superieur,
352 * avec les elements diagonaux classes en ordre decroissant de
353 * leur valeur. La colonne j de p est ipvt[j] de la matrice
354 * identite. qtf Vecteur de taille n contenant les n premiers elements
355 * du vecteur qT * fvec.
356 *
357 * DESCRIPTION :
358 * La procedure minimize la somme de carre de m equation non lineaire a n
359 * variables par une modification de l'algorithme de Levenberg - Marquardt.
360 *
361 * REMARQUE :
362 * L'utilisateur doit fournir une procedure "fcn" qui calcule la fonction et
363 * le jacobien.
364 * "fcn" doit etre declare dans une instruction externe a la procedure et doit
365 * etre appele comme suit :
366 * fcn (int m, int n, int ldfjac, double *x, double *fvec, double *fjac, int
367 * *iflag)
368 *
369 * si iflag = 1 calcul de la fonction en x et retour de ce vecteur dans fvec.
370 * fjac n'est pas modifie.
371 * si iflag = 2 calcul du jacobien en x et retour de cette matrice dans fjac.
372 * fvec n'est pas modifie.
373 *
374 * RETOUR :
375 * En cas de succes, la valeur zero est retournee.
376 * Sinon la valeur -1 est retournee.
377 */
378int lmder(ComputeFunctionAndJacobian ptr_fcn,
379 int m, int n, double *x, double *fvec, double *fjac, int ldfjac, double ftol, double xtol,
380 double gtol, unsigned int maxfev, double *diag, int mode, const double factor, int nprint,
381 int *info, unsigned int *nfev, int *njev, int *ipvt, double *qtf, double *wa1, double *wa2,
382 double *wa3, double *wa4);
383
384/*
385 * PROCEDURE : lmder1
386 *
387 * ENTREE :
388 * fcn Fonction qui calcule la fonction et le jacobien de la
389 * fonction. m Nombre de fonctions. n Nombre de variables
390 * (parametres). n <= m x Vecteur de taille "n" contenant en
391 * entree une estimation initiale de la solution.
392 * ldfjac Taille maximale de la matrice "fjac". ldfjac >= "m".
393 * tol Tolerance. La terminaison de la procedure survient quand
394 * l'algorithme estime que l'erreur relative dans la somme des
395 * carres est au moins egal a tol ou bien que l'erreur relative
396 * entre x et la solution est au moins egal atol.
397 * wa Vecteur de travail de taille "lwa".
398 * lwa Taille du vecteur "wa". wa >= 5 * n + m.
399 *
400 *
401 * SORTIE :
402 * x Vecteur de taille "n" contenant en sortie l'estimee finale
403 * de la solution.
404 * fvec Vecteur de taille "m" contenant les fonctions evaluee en "x".
405 * fjac Matrice de taille "m" x "n". La sous matrice superieure de
406 * taille "n" x "n" de fjac contient une matrice triangulaire
407 * superieure r dont les elements diagonaux, classe dans le sens
408 * decroissant de leur valeur, sont de la forme :
409 *
410 * T T T
411 * p * (jac * jac) * p = r * r
412 *
413 * Ou p est une matrice de permutation et jac est le jacobien
414 * final calcule.
415 * La colonne j de p est la colonne ipvt (j) (voir ci apres) de
416 * la matrice identite. La partie trapesoidale inferieure de fjac
417 * contient les information genere durant le calcul de r.
418 * info Information de l'executionde la procedure. Lorsque la
419 * procedure a termine son execution, "info" est inialisee a la valeur
420 * (negative) de iflag. sinon elle prend les valeurs suivantes :
421 * info = 0 : parametres en entre non valides.
422 * info = 1 : estimation par l'algorithme que l'erreur relative
423 * de la somme des carre est egal a tol.
424 * info = 2 : estimation par l'algorithme que l'erreur relative
425 * entre x et la solution est egal a tol.
426 * info = 3 : conditions info = 1 et info = 2 tous deux requis.
427 * info = 4 : fvec est orthogonal aux colonnes du jacobien.
428 * info = 5 : nombre d'appels a fcn avec iflag = 1 a atteint
429 * 100 * (n + 1).
430 * info = 6 : tol est trop petit. Plus moyen de reduire de la
431 * somme des carres.
432 * info = 7 : tol est trop petit. Plus d'amelioration possible
433 * d' approximer la solution x.
434 * ipvt Vecteur de taille "n". Il definit une matrice de permutation p
435 * tel que jac * p = q * p, ou jac est le jacbien final calcule,
436 * q est orthogonal (non socke) et r est triangulaire superieur,
437 * avec les elements diagonaux classes en ordre decroissant de
438 * leur valeur. La colonne j de p est ipvt[j] de la matrice
439 * identite.
440 *
441 * DESCRIPTION :
442 * La procedure minimize la somme de carre de m equation non lineaire a n
443 * variables par une modification de l'algorithme de Levenberg - Marquardt.
444 * Cette procedure appele la procedure generale au moindre carre lmder.
445 *
446 * REMARQUE :
447 * L'utilisateur doit fournir une procedure "fcn" qui calcule la fonction et
448 * le jacobien.
449 * "fcn" doit etre declare dans une instruction externe a la procedure et doit
450 * etre appele comme suit :
451 * fcn (int m, int n, int ldfjac, double *x, double *fvec, double *fjac, int
452 * *iflag)
453 *
454 * si iflag = 1 calcul de la fonction en x et retour de ce vecteur dans fvec.
455 * fjac n'est pas modifie.
456 * si iflag = 2 calcul du jacobien en x et retour de cette matrice dans fjac.
457 * fvec n'est pas modifie.
458 *
459 * RETOUR :
460 * En cas de succes, la valeur zero est retournee.
461 * Sinon, la valeur -1.
462 */
463int lmder1(ComputeFunctionAndJacobian ptr_fcn,
464 int m, int n, double *x, double *fvec, double *fjac, int ldfjac, double tol, int *info,
465 int *ipvt, int lwa, double *wa);
466
467END_VISP_NAMESPACE
468
469#endif