实现信赖域框架下的狗腿算法,matlab代码:
function [x_opt, y] = dogLeg()
% init
x = [10 * rand(1), 10 * rand(1)]';
nIter = 100;
delta = 2;
x_iter = zeros(nIter, 2);
h = zeros(nIter, 1);
y = zeros(nIter, 1);
% iteration
for i = 1 : nIter
if sum(abs(g(x))) < 0.0001
break
end
% unconstrained min
pU = -g(x)' * g(x) * g(x) / (g(x)' * B(x) * g(x));
% full step
pB = -B(x)^-1 * g(x);
if pB' * pB > delta * delta
t = sqrt( ( delta * delta - pU' * pU ) / ((pB - pU)' * (pB - pU)) ) + 1;
if t < 1
pk = t * pU;
else
pk = pU + (t - 1) * (pB - pU);
end
else % pB' * pB <= delta
pk = pB;
end
% update trust region
% reduction ratio
r = ( f(x) - f(x + pk) ) / ( m(x,zeros(2,1)) - m(x,pk) );
if r &l