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

其中




得到

即得到牛顿法迭代格式

其中下降方向为

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

取



由于(这个不等式需要一定技术)

因此

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

因此对任意的


反复带入上式,得到

即结论1成立.
注意到

我们有

由于


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

Step 4. 求一维线搜索

解得



修订了前面数值梯度算法中的一个错误
- %% 数值梯度
- 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)
牛顿法的收敛速度比前面的共轭梯度法更快,因为使用了二阶梯度信息以及线搜索方法,但是数值黑塞矩阵的计算比较复杂,如果提前知道黑塞矩阵的具体表达式则可接受.
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)