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)
+ %
+ % 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 at x.
+ %
+ % - ``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.
+ %
+ denom = (p' * Q * p);
+
+ % 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' * p)/denom;
end