2017-08-11 4 views
1

J'utilise lsqnonlin comme routine d'optimisation. J'ai besoin de tracer la fonction de coût à chaque itération tout en montrant toutes les valeurs précédentes. Donc, je veux montrer quelque chose comme this:Tracé de l'évolution de la valeur de la fonction pendant toutes les itérations à l'aide de lsqnonlin

enter image description here

Cependant, l'utilisation lsqnonlin, je ne ai pu tracer la valeur de la fonction de coût à l'itération en cours. en utilisant ces options:

options   = optimset('TolFun', 1e-5, 'TolX',1e-5, 'MaxFunEvals', 10000, 'PlotFcns', @optimplotfval,'Display','iter') 

Est-il un moyen de définir les options de la lsqnonlin telle que je reçois quelque chose de similaire à la figure ci-dessus?

Répondre

2

Si vous regardez dans le programme pour optimplotfval.m (dans le terminal de Matlab entrer edit optimplotfval.m vous verrez le commentaire suivant:

% STOP = OPTIMPLOTFVAL(X,OPTIMVALUES,STATE) plots OPTIMVALUES.fval. If 
% the function value is not scalar, a bar plot of the elements at the 
% current iteration is displayed. If the OPTIMVALUES.fval field does not 
% exist, the OPTIMVALUES.residual field is used. 

Ainsi, par exemple, fminsearch vous obtiendrez une parcelle de valeurs de la fonction objective de coût/par rapport à nombre d'itérations mais en cas de lsqnonlin il semble que vous avez trouvé une parcelle de barre de valeurs résiduelles à une itération donnée.

un correctif à est est de faire votre propre fonction de traçage basée sur optimplotfval.m. Copiez-collez optimplotfval.m dans un autre fichier, par ex. my_opt_plot.m puis changer l'option résiduelle dans la partie initiale du programme:

stop = false; 
switch state 
    case 'iter' 
     if isfield(optimValues,'fval') 
      if isscalar(optimValues.fval) 
       plotscalar(optimValues.iteration,optimValues.fval); 
      else 
       plotvector(optimValues.iteration,optimValues.fval); 
      end 
     else 
      % Plot the squared norm of residuals as a function of iteration number instead of bar plot of residual values at current iteration 
      fval = norm(optimValues.residual)^2; 
      % Call the scalar function instead 
      plotscalar(optimValues.iteration,fval);  
end 

Vous pouvez appeler cette nouvelle fonction de la même manière que vous avez appelé optimplotfval.m: dans mon cas

options = optimoptions('lsqnonlin','Display','iter','PlotFcns',@my_opt_plot); 
[x,resnorm,residual,exitflag,output] = lsqnonlin(@simple_fun,xc0,[],[],options); 

simple_fun était basée sur un exemple de l'entrée de doc pour Matlab lsqnonlin:

function f = simple_fun(xc) 
    x = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3]; 
    y = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5]; 

    f = xc(1)*exp(xc(2)*x)-y; 
end 

Si vous comparez les valeurs de la fonction objectif comploté avec les pr inted sur l'écran, ils correspondent en effet.

+0

merci beaucoup, c'est exactement ce que je voulais. On ne peut pas souhaiter obtenir une réponse meilleure et plus précise que la vôtre. –

+0

Content de t'aider, ta question était bonne, j'aurai probablement besoin de la solution à l'avenir :) – atru