Visual Servoing Platform
version 3.7.0
Toggle main menu visibility
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
46
BEGIN_VISP_NAMESPACE
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
*/
131
double
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
*/
204
int
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
*/
220
double
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
*/
266
int
qrfac(
int
m,
int
n,
double
*a,
int
lda,
int
*pivot,
int
*ipvt,
int
lipvt,
double
*rdiag,
double
*acnorm,
double
*wa);
267
271
typedef
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
*/
378
int
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
*/
463
int
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
467
END_VISP_NAMESPACE
468
469
#endif
BEGIN_VISP_NAMESPACE
Definition
vpMbtDistanceCircle.cpp:55
modules
vision
src
pose-estimation
private
vpLevenbergMarquartd.h
Generated by
1.17.0