function opt=setoptim(nfun,optv,OKCallback)
% funcao setoptim
% Permite a edicao dos parametros do optimset
% setoptim() - carrega o default do matlab e escreve 
% o vetor options no workspace
% setoptim([],optv) - o padrao na abertura e dado por optv
% setoptim([],[],OKcallback) - o callback do botao ok pode ser inserido
% neste caso o default e escrever no workspace

% modificada 20/08/02 - MAF - corrigiu-se ausencia dos campos Hesspatern e Jacopatern
% modificada 23/08/02 - MAF - trocou-se fminimax por fgoalattain
% modificada 06/09/02 - MAF - corrigiu-se problema de entrada de optv e OKcallback

% se nao ha funcao de entrada a janela default e carregada

if nargin==0 | isempty(nfun) 
   % checagem no numero e tipo de entrada
   if nargin<3 
      OKCallback='opt=setoptim(1);';   
      %	OKCallback='okbt';   
   end
   
   % possiveis vetores de string utilizados no optimset
   a={'on','off'};
   b={'off','iter','final'};
   c={'dfp','gillmurr','steepdesc','bfgs'};
   d={'cubicpoly','quadcubic'};
   e={'singleobj', 'multiobj'}; 
   
   h0 = figure('Color',[0.8 0.8 0.8], ...
      'Name','Optimset selecion', ...
      'Menubar','none', ...
      'NumberTitle','off', ...
      'PaperPosition',[18 180 576 432], ...
      'PaperUnits','points', ...
      'Position',[54 104 709 420], ...
      'Tag','Fig1', ...
      'ToolBar','none');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'ListboxTop',0, ...
      'Position',[120.75 9 400.5 300], ...
      'Style','frame', ...
      'Tag','Frame1');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',14, ...
      'FontWeight','demi', ...
      'ListboxTop',0, ...
      'Position',[144 289.5 342 15], ...
      'String','OPTIMSET SELECTION', ...
      'Style','text', ...
      'Tag','StaticText1');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 266.25 97.5 15], ...
      'String','DerivativeCheck', ...
      'Style','text', ...
      'Tag','text1', ...
      'TooltipString','Compare user-supplied analytic derivatives to finite differencing derivatives.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 266.25 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','DerivativeCheck', ...
      'Value',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 247.5 97.5 15], ...
      'String','Diagnostics', ...
      'Style','text', ...
      'Tag','text2', ...
      'TooltipString','Print diagnostic information about the function to be minimized or solved.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 247.5 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','Diagnostics', ...
      'Value',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 228.75 97.5 15], ...
      'String','DiffMaxChange', ...
      'Style','text', ...
      'Tag','text3', ...
      'TooltipString','Maximum change in variables for finite difference derivatives.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 228.75 52.5 15], ...
      'String','0.1', ...
      'Style','edit', ...
      'Tag','DiffMaxChange');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 209.25 97.5 15], ...
      'String','DiffMinChange', ...
      'Style','text', ...
      'Tag','text4', ...
      'TooltipString','Minimum change in variables for finite difference derivatives.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 209.25 52.5 15], ...
      'String','1e-008', ...
      'Style','edit', ...
      'Tag','DiffMinChange');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 190.5 97.5 15], ...
      'String','Display', ...
      'Style','text', ...
      'Tag','text5', ...
      'TooltipString','Level of display. off displays no output; iter displays output at each iteration; final displays just the final output.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 190.5 52.5 15], ...
      'String',b, ...
      'Style','popupmenu', ...
      'Tag','Display', ...
      'Value',3);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 171.75 97.5 15], ...
      'String','GoalsExactAchieve', ...
      'Style','text', ...
      'Tag','text6', ...
      'TooltipString','Number of goals to achieve exactly (do not over- or underachieve).');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 171.75 52.5 15], ...
      'String','1e-008', ...
      'Style','edit', ...
      'Tag','GoalsExactAchieve');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 152.25 97.5 15], ...
      'String','GradConstr', ...
      'Style','text', ...
      'Tag','text7', ...
      'TooltipString','Gradients for the nonlinear constraints defined by user.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 152.25 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','GradConstr', ...
      'Value',1);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 133.5 97.5 15], ...
      'String','GradObj', ...
      'Style','text', ...
      'Tag','text8', ...
      'TooltipString','Gradient(s) for the objective function(s) defined by user.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 133.5 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','GradObj', ...
      'Value',1);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 114.75 97.5 15], ...
      'String','Hessian', ...
      'Style','text', ...
      'Tag','text9', ...
      'TooltipString','Hessian for the objective function defined by user.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 114.75 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','Hessian', ...
      'Value',1);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 95.25 97.5 15], ...
      'String','HessPattern', ...
      'Style','text', ...
      'Tag','text10', ...
      'TooltipString','Sparsity pattern of the Hessian for finite differencing.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 95.25 52.5 15], ...
      'Style','edit', ...
      'Tag','HessPattern');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 76.5 97.5 15], ...
      'String','HessUpdate', ...
      'Style','text', ...
      'Tag','text11', ...
      'TooltipString','Quasi-Newton updating scheme.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 76.5 52.5 15], ...
      'String',c, ...
      'Style','popupmenu', ...
      'Tag','HessUpdate', ...
      'Value',4);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 57.75 97.5 15], ...
      'String','JacobPattern', ...
      'Style','text', ...
      'Tag','text12', ...
      'TooltipString','Sparsity pattern of the Jacobian for finite differencing.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 57.75 52.5 15], ...
      'Style','edit', ...
      'Tag','JacobPattern');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 38.25 97.5 15], ...
      'String','Jacobian', ...
      'Style','text', ...
      'Tag','text13', ...
      'TooltipString','Jacobian for the objective function defined by user.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 38.25 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','Jacobian', ...
      'Value',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[129 19.5 97.5 15], ...
      'String','LargeScale', ...
      'Style','text', ...
      'Tag','text14', ...
      'TooltipString','Use large-scale algorithm if possible.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[234 19.5 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','LargeScale', ...
      'Value',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 266.25 97.5 15], ...
      'String','LevenbergMarquardt', ...
      'Style','text', ...
      'Tag','text15', ...
      'TooltipString','Chooses Levenberg-Marquardt over Gauss-Newton algorithm.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 267 52.5 15], ...
      'String',a, ...
      'Style','popupmenu', ...
      'Tag','LevenbergMarquardt', ...
      'Value',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 247.5 97.5 15], ...
      'String','LineSearchType', ...
      'Style','text', ...
      'Tag','text16', ...
      'TooltipString','Line search algorithm choice.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 247.5 52.5 15], ...
      'String',d, ...
      'Style','popupmenu', ...
      'Tag','LineSearchType', ...
      'Value',1);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 228.75 97.5 15], ...
      'String','MaxFunEvals', ...
      'Style','text', ...
      'Tag','text17', ...
      'TooltipString','Maximum number of function evaluations allowed.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 228.75 52.5 15], ...
      'Style','edit', ...
      'Tag','MaxFunEvals');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 209.25 97.5 15], ...
      'String','MaxIter', ...
      'Style','text', ...
      'Tag','text18', ...
      'TooltipString','Maximum number of iterations allowed.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 209.25 52.5 15], ...
      'String','400', ...
      'Style','edit', ...
      'Tag','MaxIter');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 190.5 97.5 15], ...
      'String','MaxPCGIter', ...
      'Style','text', ...
      'Tag','text19', ...
      'TooltipString','Maximum number of PCG iterations allowed.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 190.5 52.5 15], ...
      'Style','edit', ...
      'Tag','MaxPCGIter');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 171.75 97.5 15], ...
      'String','MeritFunction', ...
      'Style','text', ...
      'Tag','text20', ...
      'TooltipString','Use goal attainment/minimax merit function (multiobjective) vs. fmincon (single objective).');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 171.75 52.5 15], ...
      'String',e, ...
      'Style','popupmenu', ...
      'Tag','MeritFunction', ...
      'Value',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 152.25 97.5 15], ...
      'String','MinAbsMax', ...
      'Style','text', ...
      'Tag','text21', ...
      'TooltipString','Number of F(x) to minimize the worst case absolute values.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 152.25 52.5 15], ...
      'Style','edit', ...
      'Tag','MinAbsMax');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 133.5 97.5 15], ...
      'String','PrecondBandWidth', ...
      'Style','text', ...
      'Tag','text22', ...
      'TooltipString','Upper bandwidth of preconditioner for PCG.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 133.5 52.5 15], ...
      'String','0', ...
      'Style','edit', ...
      'Tag','PrecondBandWidth');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 114.75 97.5 15], ...
      'String','TolCon', ...
      'Style','text', ...
      'Tag','text23', ...
      'TooltipString','Termination tolerance on the constraint violation.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 114.75 52.5 15], ...
      'Style','edit', ...
      'Tag','TolCon');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 95.25 97.5 15], ...
      'String','TolFun', ...
      'Style','text', ...
      'Tag','text24', ...
      'TooltipString','Termination tolerance on the function value.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 95.25 52.5 15], ...
      'String','1e-006', ...
      'Style','edit', ...
      'Tag','TolFun');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 76.5 97.5 15], ...
      'String','TolPCG', ...
      'Style','text', ...
      'Tag','text25', ...
      'TooltipString','Termination tolerance on the PCG iteration.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 76.5 52.5 15], ...
      'String','0.1', ...
      'Style','edit', ...
      'Tag','TolPCG');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 57.75 97.5 15], ...
      'String','TolX', ...
      'Style','text', ...
      'Tag','text26', ...
      'TooltipString','Termination tolerance on x.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 57.75 52.5 15], ...
      'String','1e-006', ...
      'Style','edit', ...
      'Tag','TolX');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'ListboxTop',0, ...
      'Position',[310.5 38.25 97.5 15], ...
      'String','TypicalX', ...
      'Style','text', ...
      'Tag','text27', ...
      'TooltipString','Typical x values.');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[425.25 38.25 52.5 15], ...
      'Style','edit', ...
      'Tag','TypicalX');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'Callback',OKCallback, ...
      'ListboxTop',0, ...
      'Position',[471 13.5 45 15], ...
      'String','OK', ...
      'Tag','Pushbutton1');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'Callback','closereq', ...
      'ListboxTop',0, ...
      'Position',[420.75 13.5 45 15], ...
      'String','CANCEL', ...
      'Tag','Pushbutton2');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'Callback','setoptim(3)', ...
      'ListboxTop',0, ...
      'Position',[371.25 13.5 45 15], ...
      'String','LOAD', ...
      'Tag','Pushbutton3');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'Callback','setoptim(5)', ...
      'ListboxTop',0, ...
      'Position',[321 13.5 45 15], ...
      'String','SAVE', ...
      'ButtonDownFcn','setoptim(2)', ...
      'Tag','pushbutton4');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'ListboxTop',0, ...
      'Position',[9 8.25 103.5 300], ...
      'Style','frame', ...
      'Tag','Frame2');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',12, ...
      'FontWeight','demi', ...
      'ListboxTop',0, ...
      'Position',[16.5 289.5 85.5 15], ...
      'String','FUNCTION', ...
      'Style','text', ...
      'Tag','StaticText3');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'ListboxTop',0, ...
      'Position',[114.75 9 1 300], ...
      'Style','frame', ...
      'Tag','Frame3');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'ForegroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[116.25 9 1 300], ...
      'Style','frame', ...
      'Tag','Frame3');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 266.25 72.75 15], ...
      'String','FSOLVE', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',1);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 246 72.75 15], ...
      'String','FMINSEARCH', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',2);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 226.5 72.75 15], ...
      'String','FMINUNC', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',3);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 206.25 72.75 15], ...
      'String','FMINBND', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',4);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 186 72.75 15], ...
      'String','FMINCON', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',5);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 166.5 72.75 15], ...
      'String','LINPROG', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',6);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 146.25 72.75 15], ...
      'String','QUADPROG', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',7);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 126 72.75 15], ...
      'String','LSQNONLIN', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',8);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 106.5 72.75 15], ...
      'String','LSQCURVEFIT', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',9);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'callback','setoptim(4)', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'ListboxTop',0, ...
      'Position',[21 86.25 72.75 15], ...
      'String','FGOALATTAIN', ...
      'Style','checkbox', ...
      'Tag','Checkbox1', ...
      'UserData',10);
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[0.8 0.8 0.8], ...
      'FontSize',10, ...
      'FontWeight','demi', ...
      'ListboxTop',0, ...
      'Position',[16.5 57.25 80 15], ...
      'String','OTHER', ...
      'Style','text', ...
      'Tag','StaticText4');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'BackgroundColor',[1 1 1], ...
      'ListboxTop',0, ...
      'Position',[16.5 37.25 80 15], ...
      'Style','edit', ...
      'Tag','funcao');
   h1 = uicontrol('Parent',h0, ...
      'Units','points', ...
      'Callback','setoptim(4,0)', ...
      'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
      'ListboxTop',0, ...
      'Position',[16.5 17.25 80 15], ...
      'String','OK', ...
      'Tag','Pushbutton4');
   
   if nargin==2 & ~isempty(optv)
      setdef(optv)
   end
end   
if nargin>0 & ~isempty(nfun)
   switch nfun
   case 1
      opt=read;
   case 2
      getdef;
   case 3
      if nargin==1
         setdef;
      else
         setdef(optv);
      end
   case 4
      if nargin==1
         setfun;
      else
         setfun(optv);
      end
   case 5
      opt=read2;
   end    
end


% ==========================================================
% function read
% ==========================================================

function opt=read()
% funcao que faz a leitura dos campos numericos e a torna
% com os parametros do optimset
% da leitura obtem-se apenas valores numericos que sao convertidos
% nos strings e numeros

% MAF 2002

% possiveis campos do optimset
field = {'DerivativeCheck','Diagnostics','Display','GradConstr','GradObj',...
      'Hessian','HessUpdate','Jacobian','LargeScale','LevenbergMarquardt', ...
      'LineSearchType','MeritFunction','DiffMaxChange','DiffMinChange', ...
      'GoalsExactAchieve','HessPattern','JacobPattern', ...
      'MaxFunEvals','MaxIter','MaxPCGIter','MinAbsMax','PrecondBandWidth', ...
      'TolCon','TolFun','TolPCG','TolX','TypicalX'};

% inicializacao da estrutura
opt=[];

% leitura dos popup
for i=1:12
   % verifica o status do campo
   % caso este nao for utilizado pelo metodo este deve estar desabilitado
   stat=get(findobj(gcf,'tag',field{i}),'enable');
   if strcmp(stat,'on');
      valor=get(findobj(gcf,'tag',field{i}),'value');
      pos=get(findobj(gcf,'tag',field{i}),'string');
      opt=setfield(opt,field{i},pos{valor});
   end
end

% leitura dos edits
for i=13:27
   % verifica o status do campo
   % caso este nao for utilizado pelo metodo este deve estar desabilitado
   stat=get(findobj(gcf,'tag',field{i}),'enable');
   if strcmp(stat,'on');
      valor=str2num(get(findobj(gcf,'tag',field{i}),'string'));
      if ~isempty(valor)
         opt=setfield(opt,field{i},valor);
      end
   end
end

% ==========================================================
% function getdef
% ==========================================================

function getdef()
% funcao getdef()
% Le os campos da janela e salva o arquivo .opt
% Esta funcao e o callback do botao save
% Este arquivo pode ser lido como -mat
% O arquivo e salvo como uma sequencia de numeros

% MAF - 2002

% leitura dos campos
optv=read;

% abertura da janela para escolha do nome
[newmatfile, newpath] = uiputfile('*.opt', 'Save As');

% se o usuario nao inserir nada
if newpath==0
   break
end

% salva o nome como .opt
% na verdade e um . mat
% para trazer o arquivo
% load nome.opt -mat
% se o usuario nao colocar extensao
if strcmp(newmatfile(end-3:end),'.opt')
   feval('save',[newpath newmatfile],'optv');
else
   feval('save',strcat([newpath newmatfile],'.opt'),'optv');  
end

% ==========================================================
% function setdef
% ==========================================================

function setdef(arquivo)
% funcao setdef()
% funcao destinada a leitura de um arquivo .opt
% e posterior escrita desses parametros na interface
% setdef(arquivo) seta na figura o conteudo do arquivo.opt

% se nao houver argumento de entrada o arquivo abre a janela
if nargin==0 | isempty(arquivo)
   [filename, pathname] = uigetfile('*.*', 'Load file'); % abertura da janela
  
   % se o usuario nao entrar nada ...
   if filename==0
      break
   end
   
   % leitura do arquivo .opt
   try
      feval('load',[pathname filename],'-mat');        
   catch
      try
         optv=readarq(filename);
      catch
         disp('arquivo invalido')
         break
      end      
   end
end

% se existir argumento de entrada a funcao seta estes argumentos
if nargin==1
   % se o arquivo for uma estrutura do optimset pode ser utilizado
   if isstruct(arquivo)
      optv=arquivo;
   else
      % se o argumento de entrada for uma matriz
      feval('load',[arquivo '.opt'],'-mat');
   end
end
   
% se o usuario tentar carregar arquivo invalido
if ~exist('optv')
   disp('arquivo inválido')
   break
end

% procedimento da leitura
% possiveis campos do optimset
field = {'DerivativeCheck','Diagnostics','Display','GradConstr','GradObj',...
      'Hessian','HessUpdate','Jacobian','LargeScale','LevenbergMarquardt', ...
      'LineSearchType','MeritFunction','DiffMaxChange','DiffMinChange', ...
      'GoalsExactAchieve','HessPattern','JacobPattern', ...
      'MaxFunEvals','MaxIter','MaxPCGIter','MinAbsMax','PrecondBandWidth', ...
      'TolCon','TolFun','TolPCG','TolX','TypicalX'};

% leitura dos campos do tipo popup
% analisa se campo existe na estrutura original
% depois le e seta na figura
for i=1:12
   if isfield(optv,field{i})
      pos=get(findobj(gcf,'tag',field{i}),'string');
      campo=getfield(optv,field{i});
      f=finds(pos,campo);
      set(findobj(gcf,'tag',field{i}),'value',f);  
   end
end

% leitura dos campos do tipo edit
% analisa se campo existe na estrutura original
% depois le e seta na figura
for i=13:length(field)
   if isfield(optv,field{i})
      campo=getfield(optv,field{i});
      % para muitos campos ha uma formula de calculo
      % logo esta nao vai ser impressa ou editada
      if isstr(campo)
         set(findobj(gcf,'tag',field{i}),'string','');  
      else              
         set(findobj(gcf,'tag',field{i}),'string',campo);  
      end
   end
end

% ===================================================================
% funcao readarq
% ===================================================================
function str=readarq(nome)
% funcao que faz a leitura de arquivos diferentes de .opt
% so le arquivos escritos pelo proprio programa

% le o arquivo especificado
struc = textread(nome,'%s');

% seleciona as linhas adequadas
for i=3:length(struc)
   eval(struc{i}); 
end

% elimina as variaveis inuteis
clear i nome struc

% capta o nome da estrutura
arqs=whos;

% verifica a existencia e a coerencia desta
if isempty(arqs) | ~isstruct(arqs)
   disp('arquivo invalido');
   break
else
   eval(['str=',arqs.name,';']);
end
% atribui o nome str a estrutura

% ===================================================================
% funcao finds
% ===================================================================

function f=finds(vetstr,str)
% acha no vetor vetstr o string str

f=[];

for i=1:length(vetstr)
   comp=strcmp(vetstr{i},str);
   if comp
      f=[f i];
   end
end

% ===================================================================
% funcao setfun
% ===================================================================
function setfun(call)
% funcao destinada a selecao dos campos apropriados para cada 
% funcao que utiliza o optimset
% os campos nao utilizados sao desabilitados

if nargin==0
   % detecta o botao selecionado
   ch=(get(gco,'userdata'));
   
   % verifica se o botao foi selecionado ou descelecionado
   stat=get(gco,'value');
   
   if stat
      % seta todos os check como descelecionado
      set(findobj('tag','Checkbox1'),'value',0)
      % seta o campo que foi selecionado
      set(findobj('userdata',ch),'value',1)
   end
      
   % inicialmente posiciona todos os campos como enable on
   field = {'DerivativeCheck','Diagnostics','DiffMaxChange','DiffMinChange', ...
         'Display','GoalsExactAchieve','GradConstr','GradObj','Hessian', ...
         'HessPattern','HessUpdate','JacobPattern','Jacobian','LargeScale', ...
         'LevenbergMarquardt','LineSearchType','MaxFunEvals','MaxIter', ...
         'MaxPCGIter','MeritFunction','MinAbsMax','PrecondBandWidth', ...
         'TolCon','TolFun','TolPCG','TolX','TypicalX'};
   
   % observa quais campos estao vazios e seta estes como enable off
   for i=1:27
      set(findobj(gcf,'tag',field{i}),'enable','on');
      set(findobj(gcf,'tag',['text' int2str(i)]),'enable','on');  
   end
   
   % se nao ha arquivo selecionado e permitido alterar qualquer campo
   if stat==0
      break
   else
      switch ch  
      case 1
         escfun('fsolve');
      case 2
         escfun('fminsearch');
      case 3
         escfun('fminunc');
      case 4
         escfun('fminbnd');
      case 5
         escfun('fmincon');
      case 6
         escfun('linprog');
      case 7
         escfun('quadprog');
      case 8
         escfun('lsqnonlin');
      case 9
         escfun('lsqcurvefit');
      case 10
         escfun('fgoalattain');
      end
   end
else   
   funcao=get(findobj('Tag','funcao'),'string');
   escfun(funcao);
end
% ===================================================================
% funcao escfun
% ===================================================================
function escfun(fun)
% permite a utilizacao na janela setoptim apenas os campos utilizados pelo
% optimset da funcao fun

% checagem da existencia da funcao
try
   op=optimset(fun);
catch
   errordlg('unknown function','ERROR')
   break
end

% possiveis campos do optimset
field = {'DerivativeCheck','Diagnostics','DiffMaxChange','DiffMinChange', ...
      'Display','GoalsExactAchieve','GradConstr','GradObj','Hessian', ...
      'HessPattern','HessUpdate','JacobPattern','Jacobian','LargeScale', ...
      'LevenbergMarquardt','LineSearchType','MaxFunEvals','MaxIter', ...
      'MaxPCGIter','MeritFunction','MinAbsMax','PrecondBandWidth', ...
      'TolCon','TolFun','TolPCG','TolX','TypicalX'};

% observa quais campos estao vazios e seta estes como enable off
for i=1:27
   f=getfield(op,field{i});
   if isempty(f)
      set(findobj(gcf,'tag',field{i}),'enable','off');
      set(findobj(gcf,'tag',['text' int2str(i)]),'enable','off');
      op=rmfield(op,field{i});
   end
end

% verifica se a hessiana e o jacobiano sao parte do optimset da funcao
% e seta estes como ativos
if isfield(op,'Hessian')
   set(findobj(gcf,'tag','HessPattern'),'enable','on');
   set(findobj(gcf,'tag','text10'),'enable','on');  
end

if isfield(op,'Jacobian')
   set(findobj(gcf,'tag','JacobPattern'),'enable','on');
   set(findobj(gcf,'tag','text12'),'enable','on');  
end

% seta o default de cada funcao na janela
setdef(op);


% ===================================================================
% funcao read2
% ===================================================================  
function opt=read2()
% funcao que faz a leitura dos campos numericos e a torna
% com os parametros do optimset
% da leitura obtem-se apenas valores numericos que sao convertidos
% nos strings e numeros
% neste caso escreve-se a funcao em arquivo que e uma function

% MAF 2002

% possiveis campos do optimset
field = {'DerivativeCheck','Diagnostics','Display','GradConstr','GradObj',...
      'Hessian','HessUpdate','Jacobian','LargeScale','LevenbergMarquardt', ...
      'LineSearchType','MeritFunction','DiffMaxChange','DiffMinChange', ...
      'GoalsExactAchieve','HessPattern','JacobPattern', ...
      'MaxFunEvals','MaxIter','MaxPCGIter','MinAbsMax','PrecondBandWidth', ...
      'TolCon','TolFun','TolPCG','TolX','TypicalX'};

% inicializacao da estrutura
opt=[];

% leitura dos popup
for i=1:12
   % verifica o status do campo
   % caso este nao for utilizado pelo metodo este deve estar desabilitado
   stat=get(findobj(gcf,'tag',field{i}),'enable');
   if strcmp(stat,'on');
      valor=get(findobj(gcf,'tag',field{i}),'value');
      pos=get(findobj(gcf,'tag',field{i}),'string');
      opt=setfield(opt,field{i},pos{valor});
   end
end

% leitura dos edits
for i=13:27
   % verifica o status do campo
   % caso este nao for utilizado pelo metodo este deve estar desabilitado
   stat=get(findobj(gcf,'tag',field{i}),'enable');
   if strcmp(stat,'on');
      valor=str2num(get(findobj(gcf,'tag',field{i}),'string'));
      if ~isempty(valor)
         opt=setfield(opt,field{i},valor);
      end
   end
end

% abre a janela que permite o arquivo ser escrito
nome=uiputfile('*.*', 'Save As');

% teste se o usuario nao inseriu nome invalido
if nome==0
   break
end

% escreve o arquivo
writearq(opt,nome)


% ===================================================================
% funcao writearq
% ===================================================================  

function writearq(options,nome)
% writearq(options,nome)
% escreve num arquivo de nome 'nome' o conteudo do vetor options
% sendo composto de todos os parametros do optimset

% abertura do arquivo a ser lido
fid = fopen(nome,'w');
[fpath,nvar]=fileparts(nome);

% na primeira linha insere o cabecalho para tornar o arquivo uma funcao
fprintf(fid,'function %s=%s()\n',nvar,nvar);

% inicialmente escreve o conteudo dos popups
% fazendo a checagem se estes existem
if isfield(options,'DerivativeCheck')
   fprintf(fid,'%s.DerivativeCheck=''%0.5s'';\n',nvar,options.DerivativeCheck);  
end

if isfield(options,'Diagnostics')
   fprintf(fid,'%s.Diagnostics=''%0.5s'';\n',nvar,options.Diagnostics);  
end

if isfield(options,'Display')
   fprintf(fid,'%s.Display=''%0.5s'';\n',nvar,options.Display);  
end

if isfield(options,'GradConstr')
   fprintf(fid,'%s.GradConstr=''%0.5s'';\n',nvar,options.GradConstr);
end

if isfield(options,'GradObj')
   fprintf(fid,'%s.GradObj=''%0.5s'';\n',nvar,options.GradObj);
end

if isfield(options,'Hessian')
   fprintf(fid,'%s.Hessian=''%0.5s'';\n',nvar,options.Hessian);
end

if isfield(options,'HessUpdate')
   fprintf(fid,'%s.HessUpdate=''%0.5s'';\n',nvar,options.HessUpdate);
end

if isfield(options,'Jacobian')
   fprintf(fid,'%s.Jacobian=''%0.5s'';\n',nvar,options.Jacobian);
end

if isfield(options,'LargeScale')
   fprintf(fid,'%s.LargeScale=''%0.5s'';\n',nvar,options.LargeScale);
end

if isfield(options,'LevenbergMarquardt')
   fprintf(fid,'%s.LevenbergMarquardt=''%0.5s'';\n',nvar,options.LevenbergMarquardt);
end

if isfield(options,'LineSearchType')
   fprintf(fid,'%s.LineSearchType=''%s'';\n',nvar,options.LineSearchType);
end

if isfield(options,'MeritFunction')
   fprintf(fid,'%s.MeritFunction=''%s'';\n',nvar,options.MeritFunction);
end


% escreve o conteudo dos campos do edit
% para que este escreva e necessario que o campo exista e seja nao vazio
if ~isempty(options.GoalsExactAchieve) & isfield(options,'GoalsExactAchieve')
   fprintf(fid,'%s.GoalsExactAchieve=%0.5e;\n',nvar,options.GoalsExactAchieve);  
end

if isfield(options,'DiffMaxChange')
   if ~isempty(options.DiffMaxChange)
      fprintf(fid,'%s.DiffMaxChange=%0.5e;\n',nvar,options.DiffMaxChange);  
   end
end

if isfield(options,'DiffMaxChange')
   if ~isempty(options.DiffMinChange) 
      fprintf(fid,'%s.DiffMinChange=%0.5e;\n',nvar,options.DiffMinChange);  
   end
end

if isfield(options,'HessPattern')
   if ~isempty(options.HessPattern) 
      fprintf(fid,'%s.HessPattern=%0.5i;\n',nvar,options.HessPattern);
   end
end

if isfield(options,'JacobPattern')
   if ~isempty(options.JacobPattern)
      fprintf(fid,'%s.JacobPattern=%0.5e;\n',nvar,options.JacobPattern);  
   end
end

if isfield(options,'MaxFunEvals')
   if ~isempty(options.MaxFunEvals) 
      fprintf(fid,'%s.MaxFunEvals=%0.5e;\n',nvar,options.MaxFunEvals);  
   end
end

if isfield(options,'MaxIter')
   if ~isempty(options.MaxIter) 
      fprintf(fid,'%s.MaxIter=%0.5e;\n',nvar,options.MaxIter);  
   end
end

if isfield(options,'MaxPCGIter')
   if ~isempty(options.MaxPCGIter) 
      fprintf(fid,'%s.MaxPCGIter=%0.5e;\n',nvar,options.MaxPCGIter);  
   end
end

if isfield(options,'MinAbsMax')
   if ~isempty(options.MinAbsMax)  
      fprintf(fid,'%s.MinAbsMax=%0.5e;\n',nvar,options.MinAbsMax);  
   end
end

if isfield(options,'PrecondBandWidth')
   if ~isempty(options.PrecondBandWidth)
      fprintf(fid,'%s.PrecondBandWidth=%0.5e;\n',nvar,options.PrecondBandWidth);  
   end
end

if isfield(options,'TolCon')
   if ~isempty(options.TolCon) 
      fprintf(fid,'%s.TolCon=%0.5e;\n',nvar,options.TolCon);  
   end
end

if isfield(options,'TolFun')
   if ~isempty(options.TolFun)
      fprintf(fid,'%s.TolFun=%0.5e;\n',nvar,options.TolFun);  
   end
end

if isfield(options,'TolPCG')
   if ~isempty(options.TolPCG) 
      fprintf(fid,'%s.TolPCG=%0.5e;\n',nvar,options.TolPCG);  
   end
end

if isfield(options,'TolX')
   if ~isempty(options.TolX)
      fprintf(fid,'%s.TolX=%0.5e;\n',nvar,options.TolX);  
   end
end

if isfield(options,'TypicalX')
   if ~isempty(options.TypicalX) 
      fprintf(fid,'%s.TypicalX=%0.5e;\n',nvar,options.TypicalX);  
   end
end

fclose(fid);


