Bonjour,
J'utilise deux fonctions Matlab de la Optimization Toolbox: lsqnonlin et fmincon. Comme je minimise des énormes fonctions je donne moi-même le jacobien et le gradient (second argout de chaque fonction à minimiser). Dans les deux cas j'utilise l'option 'DerivativeCheck','on' pour vérifier que mes dérivées sont bonnes
Pour lsqnonlin, pas de problème. La fonction me rends ceci :
Pour la fonction fmincon, c'est le drame:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9____________________________________________________________ Derivative Check Information Objective function derivatives: Maximum relative difference between user-supplied and finite-difference derivatives = 5.36603e-005. Derivative Check successfully passed. ____________________________________________________________
L'ordre de grandeur de l'erreur est le même (elle est même plus petite dans le deuxième !) , or l'une passe le test, l'autre pas. Quelqu'un aurait-il une idée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ____________________________________________________________ Derivative Check Information Objective function derivatives: Maximum relative difference between user-supplied and finite-difference derivatives = 1.93882e-005. User-supplied derivative element (249,1): 0.0987307 Finite-difference derivative element (249,1): 0.0987501 ____________________________________________________________ Error using validateFirstDerivatives (line 89) Derivative Check failed: User-supplied and forward finite-difference derivatives do not match within 1e-006 relative tolerance.
Merci de m'éclairer !
PS. Les deux fonctions lsqnonlin et fmincon utilisent validateFirstDerivatives pour vérifier les dérivées, et le seuil d'erreur est fixé à
et le test est
Code : Sélectionner tout - Visualiser dans une fenêtre à part tol = 1e-6;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 relGradError = full(abs(grad_fd - grad)./max(1.0,abs(grad))); ... if any(relGradError > tol) ...
Partager