Path: news.mathworks.com!not-for-mail From: <HIDDEN> Newsgroups: comp.soft-sys.matlab Subject: Re: Finding the minimimum of a 2D surface Date: Mon, 10 May 2010 03:28:04 +0000 (UTC) Organization: The MathWorks, Inc. Lines: 38 Message-ID: <hs7ug4$a96$1@fred.mathworks.com> References: <hs7kqn$s12$1@fred.mathworks.com> Reply-To: <HIDDEN> NNTP-Posting-Host: webapp-05-blr.mathworks.com Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: fred.mathworks.com 1273462084 10534 172.30.248.35 (10 May 2010 03:28:04 GMT) X-Complaints-To: news@mathworks.com NNTP-Posting-Date: Mon, 10 May 2010 03:28:04 +0000 (UTC) X-Newsreader: MATLAB Central Newsreader 1187260 Xref: news.mathworks.com comp.soft-sys.matlab:634101 "CFY30 CFY30" <cfy30@yahoo.com> wrote in message <hs7kqn$s12$1@fred.mathworks.com>... > Hi all, > > I am trying to find the minimum of a 2D surface, (x-4)^2/a + y^2/b by gradient search. The code I have is as follows. I expect x should converge to 4 and y should converge to 0 but both of them converge to 2. Can anyone help what is wrong with my code? > > Thanks, > cfy30 > > a = 4; > b = 4; > mu = 0.01; > x_old = 0; > x_new = 1; > y_old = 0; > y_new = 1; > z_old = 0; > for n=1:100000 > z_new = (x_new-4)^2/a + y_new^2/b; > dz = z_new - z_old; > dx = x_new - x_old; > dy = y_new - y_old; > if ((abs(dz)<1e-12)) > break; > end; > x_old = x_new; > y_old = y_new; > z_old = z_new; > x_new = x_new - mu*dz/dx; > y_new = y_new - mu*dz/dy; > end; - - - - - - - This algorithm is fundamentally flawed in my opinion. The quantities you call dz/dx and dz/dy are apparently intended to be approximate gradient components. However, gradient values are obtained by varying x and y independently from one another to determine their separate effects on z. That is the definition of partial derivatives - they are rates of changes with respect to independent variable changes. Here you are only varying x and y in a single way and attempting to judge the gradient components as being inversely proportional to the sizes of the x and y changes, and not from independent effects. Therefore you are not really following in the direction of the downhill gradient. Even worse, your first amounts of change for x and y were equal for each one. The effect is therefore that subsequent changes in x and y must remain forever equal and you are locked into moving along a straight line x-y = 0, and that is consistent with your erroneous (2,2) result. However, I suspect you would have serious troubles even with a different starting direction. Instead you need to alter the basic nature of the algorithm to calculate a much more realistic gradient direction. Roger Stafford