欢迎访问我的个人博客:青山白雪
非线性一维搜索
what?
沿某一已知方向求目标函数的极小点
思想
从某个初始点 x ( 0 ) x^{(0)} x(0)出发,沿方向 p ( 0 ) p^{(0)} p(0)进行搜索,得到目标值较小的点 x ( 1 ) x^{(1)} x(1);然后,从 x ( 1 ) x^{(1)} x(1)出发,沿方向 p ( 1 ) p^{(1)} p(1)再次进行一维搜索,得到目标函数更小的点 x ( 2 ) x^{(2)} x(2);依次进行下去。
在每次迭代寻求 x ( k + 1 ) x^{(k+1)} x(k+1)时,在确定的搜索方向 p ( k ) p^{(k)} p(k)上,求一个步长 λ k \lambda _k λk,使目标函数下降最多,即 f ( x ( k + 1 ) ) < f ( x ( k ) ) f(x^{(k+1)}) < f(x^{(k)}) f(x(k+1))<f(x(k))。
λ
k
\lambda _k
λk为最优步长因子,每次求解是一个求一元函数的极值问题,即:
f
(
x
(
k
)
+
λ
k
p
(
k
)
)
=
min
λ
f
(
x
(
k
)
+
λ
p
(
k
)
)
=
m
i
n
φ
(
λ
)
f(x^{(k)} + \lambda _k p^{(k)}) = \displaystyle \min_{\lambda} f(x^{(k)} + \lambda p^{(k)}) = min \varphi(\lambda)
f(x(k)+λkp(k))=λminf(x(k)+λp(k))=minφ(λ)
每一次一维搜索就是对函数
φ
(
λ
)
\varphi(\lambda)
φ(λ)求极值,极值
λ
∗
\lambda^*
λ∗就是本次迭代的最优步长。
因此求多元函数 f ( x ) = f ( x 1 , x 2 , ⋯ , x n ) f(x) = f(x_1,x_2, \cdots, x_n) f(x)=f(x1,x2,⋯,xn)的极值点问题,转化为一系列沿逐次确定方向求极值点的问题。
这里总结下更简单的形式:
一维函数寻优:
m
i
n
f
(
x
)
x
∈
[
a
,
b
]
min f(x) \qquad x \in [a,b]
minf(x)x∈[a,b]
基本思想为
- 确定 φ ( λ ) \varphi(\lambda) φ(λ)的搜索区间,即:函数极值点所在区间
- 用逐步逼近的方法,确定函数极值点
实施步骤
有初始点 x 1 x_1 x1和步长 h h h,确定搜索区间 [ a , b ] [a,b] [a,b]的方法
- 计算 f ( x 1 ) f(x_1) f(x1)与 f ( x 1 + h ) f(x_1 + h) f(x1+h)
若 f ( x 1 ) > f ( x 1 + h ) f(x_1) > f(x_1 + h) f(x1)>f(x1+h),
极小点在试探点右侧,从 x 1 + h x_1+h x1+h出发,步长加倍变为 2 h 2h 2h计算 f ( x 1 + 3 h ) f(x_1+3h) f(x1+3h),依次仿照此过程迭代……
若 f ( x 1 ) < f ( x 1 + h ) f(x_1) < f(x_1 + h) f(x1)<f(x1+h),
极小点在试探点左侧,方向错误,步长加负号变为 − h -h −h,计算 f ( x 1 − h ) f(x_1 -h) f(x1−h).
若 f ( x 1 ) ≤ f ( x 1 − h ) f(x_1) \le f(x_1 - h) f(x1)≤f(x1−h),极小点在 x 1 − h x_1 - h x1−h右侧,搜索区间设置为: [ x 1 − h , x 1 + h ] [x_1 - h, x_1 + h] [x1−h,x1+h]。
若 f ( x 1 ) > f ( x 1 − h ) f(x_1) > f(x_1 - h) f(x1)>f(x1−h),则从 x 1 − h x_1 -h x1−h向左步长加倍搜索,如上。
逐步缩小区间
初始单峰区间为 [ a , b ] [a,b] [a,b],任取两点 x 1 < x 2 x_1 < x_2 x1<x2,有:
- 若 f ( x 1 ) < f ( x 2 ) f(x_1) < f(x_2) f(x1)<f(x2),则缩小的新区间为 [ a , x 2 ] [a,x_2] [a,x2]
- 若 f ( x 1 ) > f ( x 2 ) f(x_1) > f(x_2) f(x1)>f(x2),则缩小的新区间为 [ x 1 , b ] [x_1,b] [x1,b]
- 若 f ( x 1 ) = f ( x 2 ) f(x_1) = f(x_2) f(x1)=f(x2),则缩小的新区间为 [ x 1 , x 2 ] [x_1,x_2] [x1,x2]
然后重复迭代。
how?
黄金分割法
又称0.618法。是一种等比例缩短区间的直接搜索方法。
基本思想
比较单峰区间内两点的函数值,不断舍弃单峰区间的左端或者右端的一部分,使区间按固定区间缩小率逐步缩小,直到极小点所在区间满足给定误差范围,得到近似最优解。
关键是:如何保证区间缩小率不变?
分析
在区间
[
a
,
b
]
[a,b]
[a,b]上选择两点
x
1
,
x
2
x_1, x_2
x1,x2,满足:
x
1
=
a
+
λ
(
b
−
a
)
x
2
=
b
−
λ
(
b
−
a
)
x_1 = a + \lambda (b - a) \\ x_2 = b - \lambda (b - a)
x1=a+λ(b−a)x2=b−λ(b−a)
即:位置对称!
再次寻找新的选取点 x 3 x_3 x3时,也要求与保留点对称。
不妨假设初始区间 [ a , b ] [a,b] [a,b]长度为1,并且 f ( x 1 ) < f ( x 2 ) f(x_1) < f(x_2) f(x1)<f(x2),则保留下的区间为: [ a , x 2 ] [a,x_2] [a,x2],长度为 λ \lambda λ。
在下一轮迭代中, x 1 x_1 x1记为新的点 x 2 ′ x_2' x2′,位置在原区间的 ( 1 − λ ) (1 - \lambda) (1−λ),新插入的点 x 1 ′ x_1' x1′位置应该在 λ ( 1 − λ ) \lambda (1 - \lambda) λ(1−λ)。
由相同的比例条件,得:
λ
1
=
1
−
λ
λ
\frac{\lambda}{1} = \frac{1 - \lambda}{\lambda}
1λ=λ1−λ
可解得:
λ
=
5
−
1
2
≈
0.618
\lambda = \frac{\sqrt{5} - 1}{2} \approx 0.618
λ=25−1≈0.618 。
示意图:
算法流程
(1)给出初始搜索空间 [ a , b ] [a,b] [a,b],收敛精度 ε \varepsilon ε,令 λ = 0.618 \lambda = 0.618 λ=0.618
(2)计算 x 1 , x 2 x_1, x_2 x1,x2 以及对应的 f ( x 1 ) , f ( x 2 ) f(x_1), f(x_2) f(x1),f(x2)
(3)比较 f ( x 1 ) , f ( x 2 ) f(x_1),f(x_2) f(x1),f(x2)的大小,缩小搜索区间
(4)检查区间是否足够小或者函数值收敛到足够接近,若不满足,进行(5),否则,进行(6)
(5)保留区间及一个点,计算新的试探点及其相应的函数值,进行(3)
(6)取最后两个试探点的平均值作为极小点的近似值,并计算该点的函数值作为目标函数的最优解
局限:算法收敛较慢,并且信息浪费,计算试探点的函数值仅仅比较大小!
牛顿法
插值法基本思想
利用几个探索点的函数值或者一阶导数值,产生一个二次或者三次的多项式逼近目标函数,然后用多项式的极小点逼近函数的极小点。
牛顿法的基本思想是将非线性方程 f ( x ) = 0 f(x) = 0 f(x)=0 线性化,利用函数值及其一二阶导数,推导出收敛到根 x ∗ x^* x∗的收敛序列 { x k } \{x^{k}\} {xk}。
算法分析
初始值
x
0
x_0
x0处泰勒展开:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
+
f
′
′
(
ξ
)
2
!
(
x
−
x
0
)
2
f(x) = f(x_0) + f'(x_0) (x - x_0) + \frac{f''(\xi)}{2!}(x - x_0)^2
f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(ξ)(x−x0)2
若
f
(
x
∗
)
=
0
f(x^*) = 0
f(x∗)=0,则,函数在零点估计值
x
k
x_k
xk邻域的一阶展开式为:
f
(
x
∗
)
≈
f
(
x
(
k
)
)
+
f
′
(
x
(
k
)
)
(
x
∗
−
x
(
k
)
)
f(x^*) \approx f(x^{(k)}) + f'(x^{(k)})(x^* - x^{(k)})
f(x∗)≈f(x(k))+f′(x(k))(x∗−x(k))
计算可得
x
∗
x^*
x∗的近似表达式:
x
∗
≈
x
(
k
)
−
f
(
x
(
k
)
)
f
′
(
x
(
k
)
)
x^* \approx x^{(k)} - \frac{f(x^{(k)})}{f'(x^{(k)})}
x∗≈x(k)−f′(x(k))f(x(k))
每一次迭代只得到
x
∗
x^*
x∗的估计值
x
(
k
+
1
)
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
x(k+1)=x(k)−αf′(x(k))f(x(k))k=0,1,2⋯
α
\alpha
α 称为搜索因子,可保证算法收敛,或者调整收敛速度,常取值为1。
示意图:
算法流程
(1)选区间 [ a , b ] [a,b] [a,b],使得 f ( a ) f ( b ) < 0 f(a)f(b) < 0 f(a)f(b)<0,且 ∀ x ∈ [ a , b ] , f ′ ( x ) ≠ 0 \forall x \in [a,b],f'(x) \ne 0 ∀x∈[a,b],f′(x)=0
(2)给定初始估计值和误差
(3)计算 f ( x ( k ) ) f(x^{(k)}) f(x(k))与 f ′ ( x ( k ) ) f'(x^{(k)}) f′(x(k))
(4)检验是否收敛,即 ∣ f ( x ( k ) ) ∣ ≤ ε |f(x^{(k)})| \leq \varepsilon ∣f(x(k))∣≤ε是否成立,或者两个近似点满足收敛条件,则 x ∗ = x ( k ) 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)})} x(k+1)=x(k)−αf′(x(k))f(x(k))
(6)返回(3)
收敛较快,但是迭代收敛性依赖初始点的选择,且计算工作量较大。
抛物线法
与牛顿法 的迭代公式不同:
x
(
k
)
=
A
2
B
x ^ {(k)} = \frac{A}{2B}
x(k)=2BA
其中:
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
)
)
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)})
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法的效果好。