clear;clc
x=[0.1 0]';%初值
maxiter = 100; %最大迭代次数
iter = 1; %统计迭代次数
Delta = 0.5;%信赖域半径
Delta_max=2;%信赖域最大半径
eta=0;
while iter < maxiter%迭代终止条件1:超过迭代次数
if sum(abs(g(x))) < 1e-6%迭代终止条件2:达到精度
break;
end
iter = iter + 1;%迭代次数+1
%%狗腿法确定方向
pU = -g(x)' * g(x) * g(x) / (g(x)' * B(x) * g(x));%计算$p^U$
pB = -B(x)^-1 * g(x);%计算$p^B$
tau = 2;
if pU'*pU >= Delta*Delta%如果$p^U$在信赖域外,直接从信赖域边界上截断
tau = Delta / sqrt((pU'*pU));%只有这样取tau,才能保证tau*p^U正好在边界上
else
if pB'*pB > Delta*Delta%$p^B$的长度如果超过信赖域半径,而$p^U$落在信赖域内
tau=(-pU'*(pB-pU)+sqrt((pU'*(pB-pU))^2-(pB-pU)'*(pB-pU)*(pU'*pU-Delta^2)))/((pB-pU)'*(pB-pU));
end
end
if tau < 1
pk = tau * pU;
else
pk = pU + (tau - 1) * (pB - pU);
end
%更新信赖域,按照课本P68(4.4)更新
rho = (f(x)-f(x+pk))/(m(x,zeros(2,1))-m(x,pk));
if rho > 0.75 && sqrt(abs(pk'*pk) - Delta) < 0.001
Delta = min(2 * Delta, Delta_max);
else
if rho < 0.25
Delta = 0.25*Delta;
end
end
if rho > eta%在这里取$\eta=0$
x = x + pk;
end
end
- 1
- 2
- 3
前往页