필터 지우기
필터 지우기

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

조회 수: 2 (최근 30일)
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
Jan
Jan 2011년 11월 4일
Walter asked you already to show the relevant parts of the code. Without seeing them, only wild guessing is possible.

댓글을 달려면 로그인하십시오.

답변 (3개)

21did21
21did21 2011년 11월 7일
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
Jan
Jan 2011년 11월 7일
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 2011년 11월 7일
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.)

댓글을 달려면 로그인하십시오.


21did21
21did21 2011년 11월 7일
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
Walter Roberson
Walter Roberson 2011년 11월 7일
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

댓글을 달려면 로그인하십시오.


21did21
21did21 2011년 11월 10일
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