Combining two optimization functions
3 views (last 30 days)
Show older comments
Hi,
I'm trying to combine two optimization functions: fminbnd and fminsearch. With fminbnd I want to minimize the result of one function for one variable. With fminsearch I want to minimize the same function, but for two variables. The problem I'm getting is: 'Not enough input arguments'. I think it has to do with the fact I use repmat in one function. The functions are shown below:
x=fminbnd(@(alpha) gaussian(x0,y0,alpha,xpositie,ypositie,zpositie),0,2*pi);
function [ x,fval ] = gaussian( x0,y0,alpha,xposition,yposition,zposition )
[x,fval]=fminsearch(@Objective, [x0 y0]);
Objective
function result = Objective(x0,y0)
cs = cos(alpha)^2;
sn = sin(alpha)^2;
sc = sin(2*alpha);
x0 = repmat(x0,size(xposition),1);
y0 = repmat(y0,size(xposition),1); %'Not enough input arguments' at this line
a1 = cs*(xposition-x0).^2 +(xposition-x0).*(yposition-y0)*sc...
+ sn.*(yposition-y0).^2;
a2 = sn*(xposition-x0).^2 +(xposition-x0).*(yposition-y0)*sc...
+ cs.*(yposition-y0).^2;
A = [-a1 -a2];
A(:,3)=ones(size(a1,1),1);
B = log(zposition);
xgauss=A\B;
result=norm(A*xgauss-B);
end
end
I'm aware that I can use fminsearch to minimize the function 'gaussian' for three variable, but I'm afraid that it wouldn't give accurate results (because it's a local minimizer). Is there a solution for using two tools or is there a better optimization tool that might solve this problem ?
With kind regards
0 Comments
Answers (2)
Alan Weiss
on 4 Jan 2016
Without reading your code in detail, I can tell you that the syntax error is because you have defined Objective as a function of two variables, x0 and y0. Then you try to call fminsearch on the handle @Objective. The problem there is that fminsearch expects to address a function of one variable alone. Either change Objective to be a function of the vector x, where x = [x0,y0], or in some other way change things so fminsearch has a single vector of variables.
Alan Weiss
MATLAB mathematical toolbox documentation
2 Comments
Brendan Hamm
on 4 Jan 2016
Changing that line of code does not change how Objective is defined in the line:
function result = Objective(x0,y0)
which has 2 inputs.
Brendan Hamm
on 4 Jan 2016
Your problem is simply that fminsearch is passing only 1 input to the objective function (this is common among optimization routines) and thus y0 is never passed to the function. What you need to do is modify the Objective function to take only one input: a vector of design variables. So assuming x0 and y0 are each scalar valued, it should be something like:
function result = Objective(designs)
x0 = designs(1);
y0 = designs(2);
cs = cos(alpha)^2;
sn = sin(alpha)^2;
sc = sin(2*alpha);
x0 = repmat(x0,size(xposition),1);
y0 = repmat(y0,size(xposition),1);
a1 = cs*(xposition-x0).^2 +(xposition-x0).*(yposition-y0)*sc...
+ sn.*(yposition-y0).^2;
a2 = sn*(xposition-x0).^2 +(xposition-x0).*(yposition-y0)*sc...
+ cs.*(yposition-y0).^2;
A = [-a1 -a2];
A(:,3)=ones(size(a1,1),1);
B = log(zposition);
xgauss=A\B;
result=norm(A*xgauss-B);
end
I would also suggest to not use a nested function (make this a local function ) and pass the extra parameters in using an anonymous function handle:
function [ x,fval ] = gaussian( x0,y0,alpha,xposition,yposition,zposition )
myObj = @(designs) Objective(designs,alpha,xposition,yposition,zposition);
[x,fval]=fminsearch(myObj, [x0 y0]);
end
function result = Objective(designs,alpha,xposition,yposition,zposition)
x0 = designs(1);
y0 = designs(2);
cs = cos(alpha)^2;
sn = sin(alpha)^2;
sc = sin(2*alpha);
x0 = repmat(x0,size(xposition),1);
y0 = repmat(y0,size(xposition),1);
a1 = cs*(xposition-x0).^2 +(xposition-x0).*(yposition-y0)*sc...
+ sn.*(yposition-y0).^2;
a2 = sn*(xposition-x0).^2 +(xposition-x0).*(yposition-y0)*sc...
+ cs.*(yposition-y0).^2;
A = [-a1 -a2];
A(:,3)=ones(size(a1,1),1);
B = log(zposition);
xgauss=A\B;
result=norm(A*xgauss-B);
end
0 Comments
See Also
Categories
Find more on Parameter Estimation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!