欢迎访问我的个人博客:青山白雪

非线性一维搜索

what?

沿某一已知方向求目标函数的极小点

思想

从某个初始点x(0)x^{(0)}出发,沿方向p(0)p^{(0)}进行搜索,得到目标值较小的点x(1)x^{(1)};然后,从x(1)x^{(1)}出发,沿方向p(1)p^{(1)}再次进行一维搜索,得到目标函数更小的点x(2)x^{(2)};依次进行下去。

在每次迭代寻求x(k+1)x^{(k+1)}时,在确定的搜索方向p(k)p^{(k)}上,求一个步长λk\lambda _k,使目标函数下降最多,即f(x(k+1))<f(x(k))f(x^{(k+1)}) < f(x^{(k)})

λk\lambda _k为最优步长因子,每次求解是一个求一元函数的极值问题,即:
f(x(k)+λkp(k))=minλf(x(k)+λp(k))=minφ(λ) f(x^{(k)} + \lambda _k p^{(k)}) = \displaystyle \min_{\lambda} f(x^{(k)} + \lambda p^{(k)}) = min \varphi(\lambda)
每一次一维搜索就是对函数φ(λ)\varphi(\lambda)求极值,极值λ\lambda^*就是本次迭代的最优步长。

因此求多元函数f(x)=f(x1,x2,,xn)f(x) = f(x_1,x_2, \cdots, x_n)的极值点问题,转化为一系列沿逐次确定方向求极值点的问题。

这里总结下更简单的形式:

一维函数寻优:
minf(x)x[a,b] min f(x) \qquad x \in [a,b]
基本思想为

  1. 确定φ(λ)\varphi(\lambda)的搜索区间,即:函数极值点所在区间
  2. 用逐步逼近的方法,确定函数极值点

实施步骤

有初始点x1x_1和步长hh,确定搜索区间[a,b][a,b]的方法

  1. 计算f(x1)f(x_1)f(x1+h)f(x_1 + h)

f(x1)>f(x1+h)f(x_1) > f(x_1 + h)

​ 极小点在试探点右侧,从x1+hx_1+h出发,步长加倍变为2h2h计算f(x1+3h)f(x_1+3h),依次仿照此过程迭代……

f(x1)<f(x1+h)f(x_1) < f(x_1 + h)

​ 极小点在试探点左侧,方向错误,步长加负号变为h-h,计算f(x1h)f(x_1 -h).

​ 若f(x1)f(x1h)f(x_1) \le f(x_1 - h),极小点在x1hx_1 - h右侧,搜索区间设置为:[x1h,x1+h][x_1 - h, x_1 + h]

​ 若f(x1)>f(x1h)f(x_1) > f(x_1 - h),则从x1hx_1 -h向左步长加倍搜索,如上。

逐步缩小区间

初始单峰区间为[a,b][a,b],任取两点x1<x2x_1 < x_2,有:

  1. f(x1)<f(x2)f(x_1) < f(x_2),则缩小的新区间为[a,x2][a,x_2]
  2. f(x1)>f(x2)f(x_1) > f(x_2),则缩小的新区间为[x1b][x_1,b]
  3. f(x1)=f(x2)f(x_1) = f(x_2),则缩小的新区间为[x1x2][x_1,x_2]

然后重复迭代。

how?

黄金分割法

又称0.618法。是一种等比例缩短区间的直接搜索方法。

基本思想

比较单峰区间内两点的函数值,不断舍弃单峰区间的左端或者右端的一部分,使区间按固定区间缩小率逐步缩小,直到极小点所在区间满足给定误差范围,得到近似最优解。

关键是:如何保证区间缩小率不变?

分析

在区间[a,b][a,b]上选择两点x1,x2x_1, x_2,满足:
x1=a+λ(ba)x2=bλ(ba) x_1 = a + \lambda (b - a) \\ x_2 = b - \lambda (b - a)
即:位置对称!

再次寻找新的选取点x3x_3时,也要求与保留点对称。

不妨假设初始区间[a,b][a,b]长度为1,并且f(x1)<f(x2)f(x_1) < f(x_2),则保留下的区间为:[a,x2][a,x_2],长度为λ\lambda

在下一轮迭代中,x1x_1记为新的点x2x_2',位置在原区间的(1λ)(1 - \lambda),新插入的点x1x_1'位置应该在λ(1λ)\lambda (1 - \lambda)

由相同的比例条件,得:
λ1=1λλ \frac{\lambda}{1} = \frac{1 - \lambda}{\lambda}
可解得:λ=5120.618\lambda = \frac{\sqrt{5} - 1}{2} \approx 0.618

示意图:

非线性一维搜索

算法流程

(1)给出初始搜索空间[a,b][a,b],收敛精度ε\varepsilon,令λ=0.618\lambda = 0.618

(2)计算x1,x2x_1, x_2 以及对应的f(x1),f(x2)f(x_1), f(x_2)

(3)比较f(x1),f(x2)f(x_1),f(x_2)的大小,缩小搜索区间

(4)检查区间是否足够小或者函数值收敛到足够接近,若不满足,进行(5),否则,进行(6)

(5)保留区间及一个点,计算新的试探点及其相应的函数值,进行(3)

(6)取最后两个试探点的平均值作为极小点的近似值,并计算该点的函数值作为目标函数的最优解

局限:算法收敛较慢,并且信息浪费,计算试探点的函数值仅仅比较大小!

牛顿法

插值法基本思想

利用几个探索点的函数值或者一阶导数值,产生一个二次或者三次的多项式逼近目标函数,然后用多项式的极小点逼近函数的极小点。

牛顿法的基本思想是将非线性方程f(x)=0f(x) = 0 线性化,利用函数值及其一二阶导数,推导出收敛到根xx^*的收敛序列{xk}\{x^{k}\}

算法分析

初始值x0x_0处泰勒展开:
f(x)=f(x0)+f(x0)(xx0)+f(ξ)2!(xx0)2 f(x) = f(x_0) + f'(x_0) (x - x_0) + \frac{f''(\xi)}{2!}(x - x_0)^2
f(x)=0f(x^*) = 0,则,函数在零点估计值xkx_k邻域的一阶展开式为:
f(x)f(x(k))+f(x(k))(xx(k)) f(x^*) \approx f(x^{(k)}) + f'(x^{(k)})(x^* - x^{(k)})
计算可得xx^*的近似表达式:
xx(k)f(x(k))f(x(k)) x^* \approx x^{(k)} - \frac{f(x^{(k)})}{f'(x^{(k)})}
每一次迭代只得到xx^*的估计值x(k+1)x^{(k + 1)},于是可得迭代表达式:
x(k+1)=x(k)αf(x(k))f(x(k))k=0,1,2 x^{(k + 1)} = x^{(k)} - \alpha \frac{f(x^{(k)})}{f'(x^{(k)})} \qquad k = 0, 1, 2 \cdots
α\alpha 称为搜索因子,可保证算法收敛,或者调整收敛速度,常取值为1。

示意图:

非线性一维搜索

算法流程

(1)选区间[a,b][a,b],使得f(a)f(b)<0f(a)f(b) < 0,且x[a,b],f(x)0\forall x \in [a,b],f'(x) \ne 0

(2)给定初始估计值和误差

(3)计算f(x(k))f(x^{(k)})f(x(k))f'(x^{(k)})

(4)检验是否收敛,即f(x(k))ε|f(x^{(k)})| \leq \varepsilon是否成立,或者两个近似点满足收敛条件,则x=x(k)x^* = x^{(k)}。计算结束。否则,继续。

(5)计算x(k+1)=x(k)αf(x(k))f(x(k))x ^ {(k + 1)} = x ^ {(k)} - \alpha \frac{f(x ^ {(k)})}{f'(x^{(k)})}

(6)返回(3)

收敛较快,但是迭代收敛性依赖初始点的选择,且计算工作量较大。

抛物线法

与牛顿法 的迭代公式不同:
x(k)=A2B x ^ {(k)} = \frac{A}{2B}
其中:
A=((x(k1))2(x(k2))2)f(x(k3))+((x(k3))2(x(k1))2)f(x(k2))+((x(k2))2(x(k3))2)f(x(k1))B=((x(k1))(x(k2)))f(x(k3))+((x(k3))(x(k1)))f(x(k2))+((x(k2))(x(k3)))f(x(k1)) A = ((x^{(k-1)})^2 - (x^{(k-2)})^2)f(x^{(k-3)}) + ((x^{(k-3)})^2 - (x^{(k-1)})^2)f(x^{(k-2)}) + ((x^{(k-2)})^2 - (x^{(k-3)})^2)f(x^{(k-1)}) \\ B = ((x^{(k-1)}) - (x^{(k-2)}))f(x^{(k-3)}) + ((x^{(k-3)}) - (x^{(k-1)}))f(x^{(k-2)}) + ((x^{(k-2)}) - (x^{(k-3)}))f(x^{(k-1)})

小结

介绍了黄金分割法、牛顿法、抛物线法。当函数有比较好的解析性质时,牛顿法与抛物线法一般比0.618法的效果好。

相关文章:

  • 2021-08-31
  • 2021-12-04
  • 2022-12-23
  • 2022-12-23
  • 2021-11-28
  • 2022-12-23
  • 2022-01-29
  • 2021-10-08
猜你喜欢
  • 2021-10-27
  • 2021-11-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-02
  • 2022-12-23
相关资源
相似解决方案