MATLAB: Supply gradient to fmincon

fminconoptimization

I'm trying to use fmincon, but when I run it I get the following warning:
Warning: To use the default trust-region-reflective algorithm you must supply the gradient in the objective function and set the GradObj option to 'on'. FMINCON will use the active-set algorithm instead. For information on applicable algorithms, see Choosing the Algorithm in the documentation.
I've read the documentation and looked for examples but I can't seem to figure out HOW to supply the gradient. I've defined it with my objective function and used optimoptions to turn it on, but I still get the warning.
function [f,gradf] = objfun(x)
InputData=importdata('LED_Spectra.txt');
s=importdata('input_spectra.txt');
Wavelength=350:.5:850;
tempWave=InputData(:,1);
r=[];
for n=2:size(InputData,2)
data=spline(tempWave,InputData(:,n),Wavelength);
data(Wavelength < min(tempWave))=0;
data(Wavelength > max(tempWave))=0;
r=[r data'];
end
s=spline(s(:,1),s(:,2),Wavelength);
s=s';
f=sum((s-x(1)*r(:,1)-x(2)*r(:,2)-x(3)*r(:,3)-x(4)*r(:,4)-x(5)*r(:,5)).^2);
gradf=sum(-2*r'*(s-r(:,1)-r(:,2)-r(:,3)-r(:,4)-r(:,5)));
end
x0=[1 1 1 1 1];
options = optimoptions('fmincon','GradObj','on');
[x,fval]=fmincon('objfun',x0,[],[],[],[],[0 0 0 0 0],[100 100 100 100 100])
I have already solved this particular problem with lsqlin, but I'm going to need to solve more complex problems with fmincon or something similar, so I'm just practicing with this example to try to figure out how to use it. fmincon returns the correct results, but it runs far too slowly to be useful right now. I'm hoping that using the gradient will speed it up.

Best Answer

You need to pass the options to fmincon:
[x,fval]=fmincon('objfun',x0,[],[],[],[],[0 0 0 0 0],[100 100 100 100 100],[],options)
You might also want to pass the objective as a function handle:
[x,fval]=fmincon(@objfun,x0,...
Alan Weiss
MATLAB mathematical toolbox documentation