Preconditioning in fmincon
    82 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Daniel Wells
 el 6 de Jul. de 2011
  
    
    
    
    
    Comentada: Catalytic
      
 el 6 de Oct. de 2025 a las 15:13
            I am trying to find the minimum of a nonlinear, multivariate function using fmincon in MATLAB. Currently, my set of options is
 options = optimset('Algorithm', 'interior-point', 'Hessian',{'lbfgs', 5}, 'Display', 'iter','MaxIter', 75, 'MaxFunEvals', 12000, 'TolCon', 1e-10, 'TolFun', 1e-10);
I would like to precondition the Hessian matrix, but I can't figure out how to do so using the current command and options set. Any advice or direction on this matter would be great.
1 comentario
  Mariano
 el 4 de Oct. de 2025 a las 9:35
				
      Movida: Matt J
      
      
 el 4 de Oct. de 2025 a las 14:17
  
			I have a similar question.
I am using fmincon with the algorithm trust-region-reflective and the option HessianMultiplyFcn, so that the quadratic subproblems that appear in the process are solved internally by the preconditioned conjugate gradient method. 
If I have understood correcty the documentation, fmincon somehow builds a preconditioner by itsef, but for my problem it is not very effective.
I would like to know if there is a way to pass a specific preconditioner. I have in mind a diagonal matrix D. 
Thanks,
Mariano
Respuesta aceptada
  Catalytic
      
 el 6 de Oct. de 2025 a las 5:03
        
      Editada: Catalytic
      
 el 6 de Oct. de 2025 a las 15:12
  
      I would like to know if there is a way to pass a specific preconditioner. I have in mind a diagonal matrix D. 
Unless I am mistaken, preconditioning is equivalent to making a change of variables x=D*y in the optimization problem. So, you could just do - 
fun=@(y)wrapper(y,D,fun);
x = D*fmincon(fun,D\x0,A*D, b, Aeq*D,beq,D\lb,D\ub);
function varargout=wrapper(y,D,fun)
  [varargout{1:nargout}]=fun(D*y);
  if nargout>1
      varargout{2}=D'*varargout{2}; %scale the gradient
  end
  if nargout>2
     varargout{3}= D'*varargout{3}*D; %scale the Hessian
  end
end
If you have nonlinear constraints, you would need a similar wrapper for the nonlcon argument as well.
2 comentarios
Más respuestas (1)
  Matt J
      
      
 el 4 de Oct. de 2025 a las 14:24
        
      Editada: Matt J
      
      
 el 6 de Oct. de 2025 a las 1:22
  
      EDIT: You cannot pass a preconditioner on its own, nor would you want to if the true Hessian can be computed. However, using either the HessianFcn or HessianMultiplyFcn options, you can return a matrix of the form D*H*D' to simulate the effect of preconditioing. In other words, you have to take on the responsibility of computing the entirety of what you want the Hessian approximation to be.
3 comentarios
  Matt J
      
      
 el 6 de Oct. de 2025 a las 0:45
				
      Editada: Matt J
      
      
 el 6 de Oct. de 2025 a las 1:21
  
			The true Hessian is the ideal preconditioner, so if the true Hessian can be computed, there is no point to preconditioning artificially. However, if computing the true Hessian is too burdensome, an approximate Hessian can work in the trust-region algorithm, as shown in the example below. 
Q=rand(4); Q=Q*Q';
Qapprox=diag(diag(Q));
x0=rand(4,1);
e=ones(4,1);
tol=1e-10;
opts=optimoptions('fmincon','Algorithm','trust-region-reflective', ...
                            'SpecifyObjectiveGradient', true, ...
                            'HessianFcn',"objective",'StepTol',0, ...
                            'FunctionTol',0,'OptimalityTol',tol, ...
                            'MaxFunEvals',inf,'MaxIter',1e5);
%% Use true Hessian
fun=@(x)objFcn(x,Q);
[x,fval,ef,stats]=fmincon(fun,x0,[],[],[],[],-5*e,+5*e,[],opts)
%% Use approximate Hessian
fun=@(x)objFcn(x,Q,Qapprox);
[x,fval,ef,stats]=fmincon(fun,x0,[],[],[],[],-5*e,+5*e,[],opts)
function [f,g,H]=objFcn(x,Q,Qapprox)
arguments
  x (:,1);
  Q; Qapprox=Q;
end
  dx=(x-[1;2;3;4]);
  f=dx'*Q*dx/2;
  if nargout>1
       g=Q*dx;
       H=Qapprox;
  end
end
Ver también
Categorías
				Más información sobre Solver Outputs and Iterative Display en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



