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) - % % 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