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.
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. –
Content de t'aider, ta question était bonne, j'aurai probablement besoin de la solution à l'avenir :) – atru