In the case #3 of uncprb, the Powell badly scaled case, optim reaches the maximum number of function evaluations. It does not produce a warning, so that the user may fail to detect that the solution may be unoptimal.
nprob = 3;
[n,m,x0] = uncprb_getinitf(nprob)
[fopt,xopt] = uncprb_getopt(nprob,n,m)
function printsummary(nprob,algo,xoptC,foptC,goptC,feval)
[fopt,xopt] = uncprb_getopt(nprob,n,m)
mprintf("%s\n",algo)
mprintf("|gopt|=%e\n",norm(goptC))
mprintf("|f-fopt|=%e\n",abs(fopt-foptC))
mprintf("|x-xopt|=%e\n",norm(xopt-xoptC))
mprintf("feval=%d\n",feval)
endfunction
function [fout,gout,ind] = objfun(x,ind,n,m,nprob)
global _DATA_
_DATA_.feval = _DATA_.feval + 1
fout=uncprb_getobjfcn(n,m,x,nprob)
gout=uncprb_getgrdfcn(n,m,x,nprob)
endfunction
nprob = 3;
[n,m,x0] = uncprb_getinitf(nprob);
global _DATA_
_DATA_.feval = 0;
[foptC,xoptC,goptC]=optim(list(objfun,n,m,nprob),x0);
printsummary(nprob,"optim",xoptC,foptC,goptC,_DATA_.feval);