2023-07-07 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(三).md
2023-07-07 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(三)
1. 牛顿法
书接上回,对于一维最优化问题, 牛顿法是在迭代点处进行二次泰勒展开来近似原函数,然后求泰勒展开式的极小点,具体如下
设为当前迭代点,
在
处的二阶泰勒展开式为

为了求近似函数



令


牛顿法要求目标函数二阶可导,且根据上述推导可知牛顿法收敛到

- % 一维最优化问题的牛顿法
- % fun 目标函数, 可以是符号函数或函数句柄
- % epsil 指定终止条件(精度)
- % maxIt 最大迭代次数
- function [xk xlog] = OneNewton(f, x0, epsil, maxIt)
- k = 0;
- if isa(f,'function_handle')
- syms x;
- fun(x) = f(x);
- else
- fun = f;
- end
- diff_fun1 = diff(fun);
- diff_fun2 = diff(diff_fun1);
- diff_fun1_h = matlabFunction(diff_fun1);
- diff_fun2_h = matlabFunction(diff_fun2);
- while k <= maxIt
- xk = x0 - diff_fun1_h(x0) / diff_fun2_h(x0);
- if abs(xk- x0) <= epsil
- break;
- end
- k = k + 1;
- x0 = xk;
- xlog(k) = xk;
- end
- end
测试代码
- f = @(x) sin(x);
- epsil = 1e-6;
- maxIt = 1e3;
- plot((-10):0.01:10, f((-10):0.01:10))
- x0 = 1;
- [xk xlog] = OneNewton(f, x0, epsil, maxIt)
- x0 = 0.5;
- [xk xlog] = OneNewton(f, x0, epsil, maxIt)
- x0 = -0.5;
- [xk xlog] = OneNewton(f, x0, epsil, maxIt)
2. 抛物线法
牛顿法要求目标函数二次可导,而抛物线法则没有此要求,其主要思想是插值一个二次多项式来近似代替目标函数.
给定第次的搜索区间
, 任意选取
, 然后在
上取二次插值多项式

其满足

根据上述方程可以确定近似函数


由于只需要知道二次函数的最值所在点,因此不需要知道


抛物线法有如下缺点
1. 可能不收敛. 如果新的迭代点和当前迭代点充分接近,但是新迭代点并不是目标函数的极小点,则算法不收敛.
2. 选择的需要满足
, 但是没有提供一种满足此条件的方法.
抛物线法的原理导致其不能简单改进到适用于所有情况的一维搜索中.
抛物线法
Step 1. 给定初始区间, 选取
, 给出误差
, 置
.
Step 2. 按照上面的公式计算, 然后计算
. 若
, 停止算法,输出
; 否则转下步.
Step 3. 若, 令
; 若
, 令
.
抛物线法的实现只需要带入公式即可,没有特殊之处,这里不给出程序。考虑抛物线法和其他方法的结合或许更有意义.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix