Borrar filtros
Borrar filtros

always this message : The first-order optimality measure, 0.0, is less than options

2 visualizaciones (últimos 30 días)
hello all,
Recently I came to the forum to ask for help about the functions of the tool box "optimization". I used "lsqnonlin" "lsqcurvefit" "finminuc" and every time I the same result:
my optimization stops after one iteration and the result: The first-order optimality measure, 0.000000e +000, IS = Less than options.TolFun 1.000000e-006.
after reading the documentation, it understand that is possible that i have a local minimum, yet when I change a little the starting values i have always the same problem: it seems odd to me that every time I put a game parameters of the algorithm says I have a local minimum?!?
can you tell me your opinion on that and how can I solve this. thank you very much
  1 comentario
Jan
Jan el 4 de Nov. de 2011
Walter asked you already to show the relevant parts of the code. Without seeing them, only wild guessing is possible.

Iniciar sesión para comentar.

Respuestas (3)

21did21
21did21 el 7 de Nov. de 2011
Gamma=0.21;
A=5100;
B=-0.07;
parametresInitiaux=[Gamma A B];
lb=[0.13 3500 -1.5];
ub=[2.6 8000 5];
options = optimset('Display','iter','MaxIter',40,'TolX',1e-16,'TolFun',1e-25)
[x,resnorm] = lsqnonlin(@calculs,parametresInitiaux,lb,ub,options);
and for calculs:
function RESIDU=calculs(parametresI)
[Rm_num,Fv_num] = WriteCalculTreatment(parametresI(1),parametresI(2),parametresI(3));
RmMine=Rm_num;
FvMine=Fv_num;
residuVect=abs(Rm_exp-Rm_num)+abs(Fv_exp-Fv_num);
RESIDU=residuVect';
the function "WriteCalculTreatment" launch calculations from a software to get Rm_num et Fv_num
when i use fminuc i do this in my function "calcul"
residuVect=(Rm_exp-Rm_num)'*(Rm_exp-Rm_num)+(Fv_exp-Fv_num)'*(Fv_exp-Fv_num);
RESIDU=residuVect;
  2 comentarios
Jan
Jan el 7 de Nov. de 2011
Please post the code by editing the original image and use code formatting as explained in the "Markup help" link. In the current form, the code is not readable.
Walter Roberson
Walter Roberson el 7 de Nov. de 2011
We would need to see WriteCalculTreatment to determine more.
What also need to see the functions Rm_exp and Fv_exp. We deduce they are functions because if they were variables they would have to be initialized within the scope of calculs.
Why do you bother to set RmMine or FvMine ? They are not global or persistent variables, so their value is going to be thrown away (unless they happen to be shared within a scope that you do not show us.)

Iniciar sesión para comentar.


21did21
21did21 el 7 de Nov. de 2011
thank for your help !
Jan : i have already put the matlab code with code formatting...?
Walter : Rm_exp and Fv_exp are global variables. RmMine and FvMine are not necessary.
the function "writeCalculTreatment" is this :
function [Rm_num,Rv_num]=WriteCalculTreatment(Gamma1,A1,B1,DO_mg,DO_si,timeT6)
currentFolder=cd('E:\methodeINVERSE'); T6folder = cd('E:\methodeINVERSE\T6'); T200folder = cd('E:\methodeINVERSE\T200'); T300folder = cd('E:\methodeINVERSE\T300'); T400folder = cd('E:\methodeINVERSE\T400'); T500folder = cd('E:\methodeINVERSE\T500'); T560folder = cd('E:\methodeINVERSE\T560');
currentFolder='E:\methodeINVERSE';
T6folder = 'E:\methodeINVERSE\T6';
T200folder = 'E:\methodeINVERSE\T200';
T300folder = 'E:\methodeINVERSE\T300';
T400folder = 'E:\methodeINVERSE\T400';
T500folder = 'E:\methodeINVERSE\T500';
T560folder = 'E:\methodeINVERSE\T560';
writeT6DataFile(Gamma1,A1,B1,DO_mg,DO_si,timeT6,T6folder,currentFolder);
writeDataFile(Gamma1,A1,B1,DO_mg,DO_si,T200folder,currentFolder);
writeDataFile(Gamma1,A1,B1,DO_mg,DO_si,T300folder,currentFolder);
writeDataFile(Gamma1,A1,B1,DO_mg,DO_si,T400folder,currentFolder);
writeDataFile(Gamma1,A1,B1,DO_mg,DO_si,T500folder,currentFolder);
writeDataFile(Gamma1,A1,B1,DO_mg,DO_si,T560folder,currentFolder);
%%on lance calcul T6 et on transfert ces resultats dans autres dossier
launchT6calcul(T6folder,currentFolder);
%%on ecrit toutes les distributions initiales et lance les calculs
%associés
writeInputFile(T200folder,currentFolder);
writeInputFile(T300folder,currentFolder);
writeInputFile(T400folder,currentFolder);
writeInputFile(T500folder,currentFolder);
writeInputFile(T560folder,currentFolder);
%%detection de la fin des resultats
finishCalculation(T200folder,currentFolder);
finishCalculation(T300folder,currentFolder);
finishCalculation(T400folder,currentFolder);
finishCalculation(T500folder,currentFolder);
finishCalculation(T560folder,currentFolder);
%%traitement des resultats
resultRayon=zeros(6,1);
resultFraction=zeros(6,1);
[R1,F1]=resultTreatment(T6folder,currentFolder);
resultRayon(1,1)=R1;
resultFraction(1,1)=F1;
[R2,F2]=resultTreatment(T200folder,currentFolder);
resultRayon(2,1)=R2;
resultFraction(2,1)=F2;
[R3,F3]=resultTreatment(T300folder,currentFolder);
resultRayon(3,1)=R3;
resultFraction(3,1)=F3;
[R4,F4]=resultTreatment(T400folder,currentFolder);
resultRayon(4,1)=R4;
resultFraction(4,1)=F4;
[R5,F5]=resultTreatment(T500folder,currentFolder);
resultRayon(5,1)=R5;
resultFraction(5,1)=F5;
[R6,F6]=resultTreatment(T560folder,currentFolder);
resultRayon(6,1)=R6;
resultFraction(6,1)=F6;
%%renvoi des donnees
Rm_num=resultRayon;
Rv_num=resultFraction;
here i write data for the software and i launch calculs with the software and i retrieve results. => when i use my programm without lsqnonlin it works nice (my resultats are the results which i have directly with the software) => when i use lsqnonlin it says that the gradient of my function is null ??? (but if i change the value manually i can see what i haven't a minimum...)
  1 comentario
Walter Roberson
Walter Roberson el 7 de Nov. de 2011
No variable is global unless it has been declared as global in the scope of the routine that is using it. The most obvious way to do that is with a "global" statement right inside calculs; the other methods require that the various routines be "nested" within the routine that declares the variable as global.
Your WriteCalculTreatment function needs all 6 of the variables declared in its header, as it attempts to pass all 6 of them to WriteT6DataFile() . Your calcul() routine is, however, only passing three parameters to WriteCalculTreatment

Iniciar sesión para comentar.


21did21
21did21 el 10 de Nov. de 2011
1°) thank walter i will see this
2°) i have one general question :
how i can increase the discretisation for the gradient in all this optimization function ?

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by