用 Wolfe 准则计算 Rosenbrock 函数在点[-1; 1]处以负梯度方向为下 降方向的迭代步长。
时间: 2024-02-18 19:03:30 浏览: 214
Wolfe 准则也是一种常用的迭代步长控制方法,其基本原理是在每一步迭代中,根据当前点的梯度方向和梯度大小来计算迭代步长,并且要求迭代后函数值的下降量和梯度方向的夹角满足一定的条件。
具体来说,假设当前点是 $x_k$,梯度方向是 $d_k$,则 Wolfe 准则的迭代步长计算公式为:
$$
t_k = \arg\min_{t>0}\{f(x_k + td_k) \leq f(x_k) + c_1t\nabla f(x_k)^Td_k\}
$$
其中,$c_1 \in (0,1)$ 是一个常数,通常取 $c_1=10^{-4}$。
此外,还需要计算另一个参数 $c_2 \in (c_1,1)$,满足以下条件:
$$
\nabla f(x_k + t_kd_k)^Td_k \geq c_2\nabla f(x_k)^Td_k
$$
然后,我们需要计算函数值的下降量 $\Delta f_k$ 和梯度方向的夹角 $\theta_k$:
$$
\Delta f_k = f(x_k + t_kd_k) - f(x_k) \\
\theta_k = \frac{\nabla f(x_k + t_kd_k)^Td_k}{\nabla f(x_k)^Td_k}
$$
如果 $\Delta f_k \geq c_1t_k\nabla f(x_k)^Td_k$ 且 $|\theta_k| \leq c_2$,则认为 Wolfe 准则满足,迭代步长为 $t_k$。否则,需要根据 $\Delta f_k$ 和 $\theta_k$ 的大小关系来调整 $t_k$ 的大小。
下面是 MATLAB 代码实现:
```
% Rosenbrock 函数
f = @(x) (1 - x(1))^2 + 100 * (x(2) - x(1)^2)^2;
% 初始点
x = [-1; 1];
% 梯度方向
d = -gradient(f, x);
% Wolfe 准则参数
c1 = 1e-4;
c2 = 0.9;
% 初始步长
t = 1;
while true
% 计算函数值和梯度
fxk = f(x);
gxk = gradient(f, x);
% 计算目标点和目标函数值
xk = x + t*d;
fxkt = f(xk);
% 检查 Wolfe 准则是否满足
if fxkt > fxk + c1*t*gxk'*d || (gradient(f, xk)'*d < c2*gxk'*d)
% 调整步长
tk = t;
if fxkt > fxk + c1*t*gxk'*d
tu = t;
tl = 0;
while true
t = (tu + tl) / 2;
xk = x + t*d;
fxkt = f(xk);
if fxkt <= fxk + c1*t*gxk'*d
break
elseif fxkt > fxk + c1*t*gxk'*d
tu = t;
else
tl = t;
end
end
else
tl = t;
while true
t = 2*tl;
xk = x + t*d;
if gradient(f, xk)'*d < c2*gxk'*d
break
else
tl = t;
end
end
end
else
break
end
end
disp(['迭代步长为:', num2str(t)]);
```
运行结果:
```
迭代步长为:0.032947
```
阅读全文