2023-07-07 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(三)
数值优化方法Matlab一维线搜索牛顿法抛物线法非精确线搜索1. 牛顿法
书接上回,对于一维最优化问题, 牛顿法是在迭代点处进行二次泰勒展开来近似原函数,然后求泰勒展开式的极小点,具体如下
设为当前迭代点,
在
处的二阶泰勒展开式为
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194259563-649558051.png)
为了求近似函数
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194259913-1859650032.png)
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194300251-302166630.png)
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194300691-267221946.png)
令
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194301063-597418555.png)
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194301415-373450150.png)
牛顿法要求目标函数二阶可导,且根据上述推导可知牛顿法收敛到
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194301777-620682061.png)
- % 一维最优化问题的牛顿法
- % 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. 抛物线法
牛顿法要求目标函数二次可导,而抛物线法则没有此要求,其主要思想是插值一个二次多项式来近似代替目标函数.
给定第次的搜索区间
, 任意选取
, 然后在
上取二次插值多项式
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194303357-1361753587.png)
其满足
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194303752-244125915.png)
根据上述方程可以确定近似函数
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194304189-1120253074.png)
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194304590-422180681.png)
由于只需要知道二次函数的最值所在点,因此不需要知道
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194304899-945563158.png)
![](/i/l/?n=23&i=blog/1005300/202307/1005300-20230707194305251-992713906.png)
抛物线法有如下缺点
1. 可能不收敛. 如果新的迭代点和当前迭代点充分接近,但是新迭代点并不是目标函数的极小点,则算法不收敛.
2. 选择的需要满足
, 但是没有提供一种满足此条件的方法.
抛物线法的原理导致其不能简单改进到适用于所有情况的一维搜索中.
抛物线法
Step 1. 给定初始区间, 选取
, 给出误差
, 置
.
Step 2. 按照上面的公式计算, 然后计算
. 若
, 停止算法,输出
; 否则转下步.
Step 3. 若, 令
; 若
, 令
.
抛物线法的实现只需要带入公式即可,没有特殊之处,这里不给出程序。考虑抛物线法和其他方法的结合或许更有意义.
标签:epsil,md,07,xk,肖现,抛物线,diff,x0 From: https://www.cnblogs.com/NEFPHYS/p/17535926.html