Maxima and Minima using fminsearch()?
    11 views (last 30 days)
  
       Show older comments
    
    Karan Sandhu
 on 9 Mar 2016
  
    
    
    
    
    Commented: Karan Sandhu
 on 9 Mar 2016
            I am trying to find the minima and maxima of this function. The first section of my code is the graph of a surface I had to create using this function. The second section of my code is my (failed) attempt at using fminsearch() to find the minimum of the function (though I also have to find the max as well). I require some assistance on how this fminsearch() function is formatted, and how it can be used to find the max too. The picture I linked is what my answers are supposed to look like. Here is my code
x=[-10:1:10];
y=x;
   subplot(2,2,1)  % separates figure window into 2 rows and 2 columns
  [xGrid yGrid]=meshgrid(x,y);
  z=(1./((xGrid+3).^2+(yGrid-1).^2+2))+((xGrid-yGrid)./((xGrid-1).^2+(yGrid-2).^2+4)); % function of x/y
  surf(x,y,z) % standard projection of surface is isometric
  title('Isometric View') % graph title
  xlabel('x'),ylabel('y'),zlabel('z') % graph labels
   NegFunction=@(x)(1./((x(1)+3).^2+(x(2)-1).^2+2))+((x(1)-x(2))./((x(1)-1).^2+(x(2)-2).^2+4)); 
  [xyMinVector,zMin]=fminsearch(NegFunction,[3.5,0]);
  xMin = xyMinVector(1); % value of x when z is a minimum
  yMin = xyMinVector(2); % value of y when z is a minimum
  fprintf('The minimum value was: z(%0.3f,%0.3f)=%2.0f\n',xMin,yMin,zMin)
0 Comments
Accepted Answer
  Walter Roberson
      
      
 on 9 Mar 2016
        You do not define NegFunction in what you posted.
5 Comments
  Walter Roberson
      
      
 on 9 Mar 2016
				
      Edited: Walter Roberson
      
      
 on 9 Mar 2016
  
			fminsearch() is not a global minimizer. It can get stuck in local minima. For this function, there is a minima of value 0 as x(1) approaches infinity and x(2) is something smaller. If you do not happen to enter into the catch-basin of negative values near the solution, then you can end up chasing the 0 out at infinity.
Judging by eye, along y = 0, it appears to me that the watershed for the catch-basin is x = 3.0, so [3.5,0] happens to be at risk of that behaviour. If the starting point had been, for example, [2.5,0] then it would have quickly gone to the minima.
Let this be a cautionary tale about using fminsearch! It is very useful, but it is a local minimizer that cannot always overcome bad starting points.
More Answers (1)
  John BG
      
 on 9 Mar 2016
        with x step 1 you get
min(min(z))
ans =  -0.433333333333333
max(max(z))
ans =   0.309523809523810
zmax_lin_index=find(z==max(max(z)))
=159
zmin_lin_index=find(z==min(min(z)))
=224
[xmax ymax]=ind2sub(size(z),zmax_lin_index)
xmax =
    12
ymax =
     8
[xmin ymin]=ind2sub(size(z),zmin_lin_index)
xmin =
    14
ymin =
    11
refining x step down to .01
min(min(z))
 =
  -0.436048111705817
 max(max(z))
 =
   0.314386299028360
 zmax_lin_index=find(z==max(max(z)))
zmax_lin_index =
     1393784
 zmin_lin_index=find(z==min(min(z)))
zmin_lin_index =
     2030325
 [xmax ymax]=ind2sub(size(z),zmax_lin_index)
xmax =
        1088
ymax =
   697
 [xmin ymin]=ind2sub(size(z),zmin_lin_index)
xmin =
        1311
ymin =
        1015
If you find this answer of any help solving this question, please click on the thumbs-up vote link,
thanks in advance
John
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!