Problem using lsqnonlin on Six-hump camel back
1 次查看(过去 30 天)
显示 更早的评论
Hi,
I am currently creating a computer-based lessen for students. For this I wanted to show the optimization of a function with different algorithms. As a function I used the Six-hump camel back function. Using the starting-point (x,y) = (-1,-0.5) the algorithm should find the minimum (x,y) = (0.0898,-0.7126). Fminsearch and fminunc are working just fine, but I can not get the Levenerg-Marquardt algorithm (lsqnonlin) to work. It just stops half the way.
Here is a short example of how I am using the Levenerg-Marquardt algorithm.
x0 = [-1;-0.5];
f = @(x)(4-2.1*x(1)^2+1/3*x(1)^4)*x(1)^2+x(1)*x(2)+(-4+4*x(2)^2)*x(2)^2;
%%Levenerg-Marquardt:
OPTIONS = optimset('Algorithm','levenberg-marquardt','Jacobian','off','MaxFunEvals',20000,'MaxIter',20000);
[x,resnorm,residual,exitflag,output] = lsqnonlin(f,x0,[],[],OPTIONS);
str = sprintf(' Number of iterations: %g. Number of function evaluations: %g. Solution: (%g, %g).',...
output.iterations, output.funcCount, x(1), x(2));
disp(str);
I hope you can help me.
Jens
0 个评论
回答(3 个)
Alan Weiss
2012-12-12
编辑:Alan Weiss
2012-12-12
The problem is a misunderstanding of what lsqnonlin does. It attempts to minimize the sum of squares of the components of the objective function. In fact, it did minimize that sum of squares, and found a root of the function.
When I just ran your code I got the result:
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
Number of iterations: 5. Number of function evaluations: 18. Solution: (-0.27025, -0.918189).
To see that it found a root:
f(x)
ans =
2.9599e-13
Root found, NOT a minimum.
Alan Weiss
MATLAB mathematical toolbox documentation
0 个评论
Jens
2012-12-13
3 个评论
Alan Weiss
2012-12-14
lsqnonlin works well for the banana function because that function is a sum of squares, and lsqnonlin minimizes sums of squares. The six-hump camel back function is not a sum of squares, so lsqnonlin is an inappropriate solver.
Matt's workaround, where you know the value of the minimum, is clever, but beside the point. In my opinion you should teach your students to use appropriate techniques. The optimization decision table has its entries for good reasons. Since you are using the six-hump camel back function, you might want to show your students the information in the Global Optimization decision table, too, and the Solver Characteristics table.
Alan Weiss
MATLAB mathematical toolbox documentation
Matt J
2012-12-14
编辑:Matt J
2012-12-14
The six-hump camel back function is not a sum of squares, so lsqnonlin is an inappropriate solver.
Except, Alan, that the OP's ulterior motive sounded like it was to apply Levenberg-Marquardt to this function and currently the toolbox only makes Levenberg-Marquardt accessible through LSQNONLIN and FSOLVE. So, it is necessary to recast the problem into a form that they will process properly.
I don't think it's clear in advance (at least not to me) that Levenberg-Marquardt would perform badly for this function, if it were available in its more general form through FMINUNC. Regardless, sometimes you do want to run inappropriate algorithms for illustration purposes, which also sounds like what the OP was after.
Matt J
2012-12-13
编辑:Matt J
2012-12-14
Since you know the minimum value fmin already (e.g., because you already found it with fminunc), you can use it to shift the objective uniformly, and make it strictly positive.
lsqnonlin(@(x) f(x)-fmin +1, x0,[],[],OPTIONS)
Because this is a scalar-valued objective, this will convert a root finding problem to a min finding problem.
Incidentally, since you are not applying any constraints, FSOLVE seems more appropriate than LSQNONLIN here. Both have a Levenberg-Marquardt solver. You would still have to apply the same tactic though to force it to do min-finding as opposed to root-finding.
0 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!