Problem using solve() and root muliplicity.

Why is this not working with the Rosenbrock ? It works with the test function. But how can I get it to work with Rosenb?
The error refers to the solutions of h with are not unique for this function. How can I go about this?
Error: "Unable to perform assignment because the left and right sides have a different number of elements."
clc
clear
format long
syms X Y;
%f = X - Y + 2*X^2 + 2*X*Y + Y^2; % Test function
f= 100*(Y-X^2)^2+ (1-X)^2; %ROSENBROCK FUNCTION !!!!!!!!!!!!!!!!!!!!!!!
x(1) = -1;
y(1) = 4;
e = 10^(-8);
i = 1;
% Gradient set up:
df_dx = diff(f, X);
df_dy = diff(f, Y);
J = [subs(df_dx,[X,Y], [x(1),y(1)]) subs(df_dy, [X,Y], [x(1),y(1)])];
S = -(J); % Search Direction
%Minimization Algorithm:
while norm(J) > e
I = [x(i),y(i)]';
syms h;
g = subs(f, [X,Y], [x(i)+S(1)*h,y(i)+h*S(2)]);
dg_dh = diff(g,h);
h = solve(dg_dh, h); %Problem here!!!!!!!!!!!!!!!!!!!!!
x(i+1) = I(1)+h*S(1);
y(i+1) = I(2)+h*S(2);
i = i+1;
J = [subs(df_dx,[X,Y], [x(i),y(i)]) subs(df_dy, [X,Y], [x(i),y(i)])]; % Updated Gradient
S = -(J);
end

Answers (1)

f= 100*(Y-X^2)^2+ (1-X)^2; %ROSENBROCK FUNCTION !!!!!!!!!!!!!!!!!!!!!!!
(Y-X^2) involves X to degree 2, and then you square that, (Y-X^2)^2, so your f is going to have X to degree 4. You substitute something+h in for X in f, so you are going to end up with h^4 . You differentiate with respect to h, getting a cubic in h. solve() of that for h is going to have three solutions.
Your test function ends up having only X^2 so the subs() gives you something in h^2, differentiate and you get something in h^1 which has only a single solution.
What can you do? Well, you can do the double-differentiate test to determine which values are local minima or maxima. However eventually at some input function you would run into there being multiple local minima or maxima, and then you would be stuck.
You should be reviewing the entire algorithm to figure out what the algorithm says to do if there are multiple solutions for h.

6 Comments

Thank you for the response.
h must be chosen to minimize the function ' f '.
I know this can be done using something like so
options = optimset('TolX', 1e-6, 'MaxIter', 500);
h = fminbnd(@phi,0,1,options,fun,xk,S);
But I then I would have to change a lot.
h must be chosen to minimize the function ' f '.
Evaluate f at all of the candidates, and take one of the ones that leads to least f.
I am trying to do that, but the run time is rather slow using the above code.
Any advice (aside from working out the derivatives) to improve efficiency ?
Use vpasolve() instead of solve() for one thing.
h must be chosen to minimize the function 'f'.
Which point does it need to be minimized at? [x(i), y(i)], or [x(i)+S(1)*h,y(i)+h*S(2)]) ?
[x(i),y(i)]. which does get updated via x(i+1),y(i+1)
Note that you are running the solve() with respect to [x(i)+S(1)*h,y(i)+h*S(2)]) . With the diff() you are doing at that point and solve() for the 0, you are using calculus to find the critical points with respect to [x(i)+S(1)*h,y(i)+h*S(2)]) . That is not necessarily going to be the same as minimization with respect to the location [x(i), y(i)]

Sign in to comment.

Asked:

on 28 Nov 2019

Commented:

on 29 Nov 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!