Advertisement
Guest User

Untitled

a guest
Apr 27th, 2015
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.58 KB | None | 0 0
  1. % We use gradient descent to ascend g:R3-->R
  2.  
  3. % Params
  4. dStepSize = 1;
  5. initialGuess = [0, 0, 0];
  6.  
  7. % Define g
  8. f1 = @(vX) 3*vX(1) - cos(vX(2)*vX(3))-(1/2);
  9. f2 = @(vX) (vX(1)^2) - (81*(vX(2)+0.1)^2) + sin(vX(3))+1.06;
  10. f3 = @(vX) exp(-vX(1)*vX(2)) + 20*vX(3) + ((10*pi-3)/3);
  11.  
  12. g = @(vX) f1(vX)^2 + f2(vX)^2 + f3(vX)^2;
  13.  
  14. grad_g = @(vX) [ 2*f1(vX)*3 + 2*f2(vX)*2*vX(1) + 2*f3(vX)*(-vX(1))*exp(-vX(1)*vX(2)), ...
  15.                     2*f1(vX)*vX(3)*sin(vX(2)*vX(3)) - 2*f2(vX)*(2*81*(vX(2)+0.1)) + 2*f3(vX)*((-vX(1))*exp(-vX(1)*vX(2))), ...
  16.                     2*f1(vX)*vX(2)*sin(vX(2)*vX(3)) + 2*f2(vX)*cos(vX(3))+2*f3(vX)*20 ];
  17.  
  18. % The magnitude of grad_g at vX
  19. dMagnitude = @(vX) norm(grad_g(vX));
  20.  
  21. % A unit vector in the direction the slope points at vX
  22. vecDirection = @(vX) grad_g(vX)./dMagnitude(vX);
  23.  
  24.  
  25. % Now start looping.
  26.  
  27. % vecP0 represents our current best guess.
  28. vecP0 = initialGuess;
  29. vecP1 = initialGuess;
  30. for k = 1:3
  31.     % Update our best guess
  32.     vecP0 = vecP1;
  33.    
  34.     % Now from our guess, we're going to make 3 new guesses, corresponding to different step sizes.
  35.     alpha1 = 0;
  36.     alpha2 = dStepSize/2;
  37.     alpha3 = dStepSize;
  38.  
  39.     % Form guess position vectors
  40.     vecA1Guess = vecP0 - alpha1*vecDirection(vecP0);
  41.     vecA2Guess = vecP0 - alpha2*vecDirection(vecP0);
  42.     vecA3Guess = vecP0 - alpha3*vecDirection(vecP0);
  43.  
  44.     % Evaluate the function at each guess
  45.     dGuessA1Height = g(vecA1Guess);
  46.     dGuessA2Height = g(vecA2Guess);
  47.     dGuessA3Height = g(vecA3Guess);
  48.  
  49.     h1 = (dGuessA2Height-dGuessA1Height)/(alpha2-alpha1);
  50.     h2 = (dGuessA3Height-dGuessA2Height)/(alpha3-alpha2);
  51.     h3 = (dGuessA3Height-dGuessA1Height)/(alpha3-alpha1);
  52.    
  53.     % We will use these guesses to make a new, 'descended guess'
  54.     vecDescendedGuess = [0,0,0];
  55.     while dGuessA3Height >= dGuessA1Height
  56.         % Take a smaller step
  57.         alpha3 = alpha3/2;
  58.         alpha2 = alpha3/2;
  59.            
  60.         % Form guess position vectors
  61.         vecA1Guess = vecP0 - alpha1*vecDirection(vX);
  62.         vecA2Guess = vecP0 - alpha2*vecDirection(vX);
  63.         vecA3Guess = vecP0 - alpha3*vecDirection(vX);
  64.  
  65.         % Evaluate the function at each guess
  66.         dGuessA1Height = g(vecA1Guess);
  67.         dGuessA2Height = g(vecA2Guess);
  68.         dGuessA3Height = g(vecA3Guess);
  69.  
  70.         h1 = (dGuessA2Height-dGuessA1Height)/(alpha2-alpha1);
  71.         h2 = (dGuessA3Height-dGuessA2Height)/(alpha3-alpha2);
  72.         h3 = (dGuessA3Height-dGuessA1Height)/(alpha3-alpha1);
  73.        
  74.         vecA = [dGuessA1Height; dGuessA3Height; dGuessA3Height];
  75.         vecB = [vecA1Guess; vecA2Guess; vecA3Guess]'
  76.         [~, idx] = max(A)
  77.         vecDescendedGuess = B(idx);
  78.     end
  79.  
  80.     alphaK = -(h1-alpha2*h3)/(2*h3);
  81.    
  82.     % Form a new best guess
  83.     vecP1 = vecP0 - alphaK*vecDirection(vecDescendedGuess)
  84.  
  85. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement