2023-07-22 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(七).md
2023-07-22 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(七)
在前面我们研究了共轭方向法和共轭梯度法,两种方法都有二次终止性,那么是否可以在每次迭代的时候都用一个二次函数去近似目标函数呢?这就是牛顿法的基本思想。
我们知道函数
在
处的二阶泰勒展开式为

其中
. 考虑
的极小点,即
, 我们有
得到

即得到牛顿法迭代格式

其中下降方向为
.
定理 1.11 设
是二阶连续可微的
, 黑塞矩阵
在
的局部极小点
附近是利普西茨连续的(常数为
),
正定. 则牛顿法产生的点列
满足
- 若初始点
充分靠近
, 则
; - 迭代点列
二阶收敛于
;
二阶收敛于0.
证明:由于
在
附近利普西茨连续且
正定,因此存在
,
在
上是可逆的, 满足

取
, 当
时,有
由于(这个不等式需要一定技术)

因此

即结论2成立.
由
的取值范围可知

因此对任意的
, 都有
.
反复带入上式,得到

即结论1成立.
注意到

我们有

由于
, 所以
由于牛顿法的步长始终为1,在某些情况下可能不收敛,因此可以结合一维线搜索方法得到全局收敛性的牛顿法(阻尼牛顿法)
算法8 阻尼牛顿法
Step 1. 取初始点
, 给定精度
, 置
.
Step 2. 检验
, 若成立,则停,否则转下步.
Step 3. 计算牛顿方向

Step 4. 求一维线搜索
,解得
, 令
,
, 转Step 2.
修订了前面数值梯度算法中的一个错误
- %% 数值梯度
- function [gd] = My_Gradient(f, x)
- gd = x;
- epsil = 1e-5;
- d = [-2* epsil, -epsil 0 epsil 2*epsil];
- tz = [x x x x x];
- fx = [0,0,0,0,0];
- for i = 1:length(x)
- tx = tz;
- tx(i,:) = tx(i,:) + d;
- for h = 1:5
- fx(h) = f(tx(:,h));
- end
- gf = gradient(fx) / epsil;
- gd(i) = gf(3);
- end
- end
- %% 数值黑塞矩阵
- function [mz] = My_Hessian(f, x)
- % 计算以当前点为中心点的一张网格
- % 根据网格数据计算最终Hessian矩阵
- n = length(x);
- mz = zeros(n,n);
- mx = zeros(5,5);
- epsil = 1e-5;
- d = [-2* epsil, -epsil 0 epsil 2*epsil];
- for i = 1:n
- for h = 1:n
- % 针对i h方向生成网格
- for j = 1:5
- for k = 1:5
- y = x;
- y(i) = y(i) + d(j);
- y(h) = y(h) + d(k);
- mx(j,k) = f(y);
- end
- end
- my = mx;
- for j = 1:5
- my(j,:) = gradient(mx(j,:)) / epsil;
- end
- myy = gradient(my(:,3)) / epsil;
- mz(i,h) = myy(3);
- end
- end
- end
- %% 主函数
- % Fletcher-Reeves 共轭梯度法
- function [x xlog] = Newton(f, x0, epsilon)
- % f 目标函数,函数句柄
- % g 梯度函数 函数句柄
- % epsilon 精度要求
- % method 线搜索方法
- k = 0;
- iter = 0;
- maxIt = 1e4;
- n = length(x0);
- while iter <= maxIt
- d1 = - inv(My_Hessian(f,x0)) * My_Gradient(f, x0);
- [alpha tx] = SuccFa(f, 1, x0, d1, 1, epsilon, 1e4);
- x1 = x0 + alpha * d1;
- d2 = My_Gradient(f, x1);
- xlog(iter+1) = norm(d2);
- x = x1;
- x0 = x1;
- if norm(d2) < epsilon
- break
- end
- iter = iter + 1;
- end
- end
- function [alphak xlog] = SuccFa(fun, alpha, x0, diff_x, h, epsil, maxIt)
- k = 0;
- xlog = alpha;
- while k <= maxIt
- alphak = alpha + h;
- if fun(x0 + alphak * diff_x) < fun(x0 + alpha * diff_x)
- h = 2 * h;
- alpha = alphak;
- else
- h = - h / 4;
- end
- k = k + 1;
- xlog(k) = alphak;
- if abs(h) < epsil
- break
- end
- end
- end
测试用例
- f = @(x) sin(x(1)) + cos(x(2));
- x0 = [1, 1]';
- epsilon = 1e-6;
- [x xlog] = Newton(f, x0, epsilon)
- %% 书上的例子
- f = @(x) 2*x(1)^4 - 4 * x(1)^2*x(2) + x(1)^2 + 2* x(2)^2-2*x(1)+5;
- x0 = [0 ,0]';
- epsilon = 1e-6;
- [x xlog] = Newton(f, x0, epsilon)
牛顿法的收敛速度比前面的共轭梯度法更快,因为使用了二阶梯度信息以及线搜索方法,但是数值黑塞矩阵的计算比较复杂,如果提前知道黑塞矩阵的具体表达式则可接受.






浙公网安备 33010602011771号