]> gitweb.michael.orlitzky.com - octave.git/blobdiff - optimization/step_length_positive_definite.m
Don't take a redundant parameter in step_length_positive_definite().
[octave.git] / optimization / step_length_positive_definite.m
index b1e5c4802ec96ba749375c44337f9d91d7219e1d..5d3e8a0b2e92a1d4d4b54606ab9453b5a96be215 100644 (file)
@@ -1,36 +1,43 @@
-function alpha = step_length_positive_definite(g, Q, p)
-  ##
-  ## Find the minimizer alpha of,
-  ##
-  ##   phi(alpha) = f(x + alpha*p)
-  ##
-  ## where ``p`` is a descent direction,
-  ##
-  ##   f(x) = (1/2)<Qx,x> - <b,x>
-  ##
-  ## and ``Q`` is positive-definite.
-  ##
-  ## The closed-form solution to this problem is given in Nocedal and
-  ## Wright, (3.55).
-  ##
-  ## INPUT:
-  ##
-  ##   - ``g`` -- The gradient of f.
-  ##
-  ##   - ``Q`` -- The positive-definite matrix in the definition of
-  ##     ``f`` above.
-  ##
-  ##   - ``p`` -- The direction in which ``f`` decreases. The line
-  ##     along which we minimize f(x + alpha*p).
-  ##
-  ## OUTPUT:
-  ##
-  ##   - ``alpha`` -- The value which causes ``f`` to decrease the
-  ##     most.
-  ##
-  ## NOTES:
-  ##
-  ## All vectors are assumed to be *column* vectors.
-  ##
-  alpha = -(g' * p)/(p' * Q * p)
+function alpha = step_length_positive_definite(g, Q)
+  %
+  % Find the minimizer alpha of,
+  %
+  %   phi(alpha) = f(x + alpha*p)
+  %
+  % where ``p`` is a descent direction,
+  %
+  %   f(x) = (1/2)<Qx,x> - <b,x>
+  %
+  % and ``Q`` is positive-definite.
+  %
+  % The closed-form solution to this problem is given in Nocedal and
+  % Wright, (3.55). The direction of steepest descent will always be
+  % the negative gradient direction; this simplified form is given in
+  % Guler.
+  %
+  % INPUT:
+  %
+  %   - ``g`` -- The gradient of f at x.
+  %
+  %   - ``Q`` -- The positive-definite matrix in the definition of
+  %   ``f`` above.
+  %
+  % OUTPUT:
+  %
+  %   - ``alpha`` -- The value which decreases ``f`` the most.
+  %
+  % NOTES:
+  %
+  % All vectors are assumed to be *column* vectors.
+  %
+  denom = (g' * Q * g);
+
+  % denom is non-negative, since it's a Q-norm. No need to abs() it.
+  if (denom < eps)
+    % Catch divide-by-zeros. If denom is effectively zero, set it to
+    % something tiny instead. This trick is also used in the PCGM.
+    denom = eps;
+  end
+
+  alpha = (g' * g)/denom;
 end