黄金分割法
黄金分割法每次缩小区间的比例都是一致的,每次将区间长度缩小到原来的0.618倍;找到一个区间[a, b]满足
∣
a
−
b
∣
<
ϵ
{\left|a-b\right|}<\epsilon
∣a−b∣<ϵ 即可以粗略地确认极小值点为
x
m
i
n
=
a
+
b
2
x_{min}=\frac{a+b}{2}
xmin=2a+b。
算法步骤
对于给定的a,b,其中
(
a
<
b
)
{\left(a<b\right)}
(a<b)
- 令 x 2 = a + 0.618 ( b − a ) , f 2 = f ( x 2 ) x_2=a+0.618{\left(b-a\right)},f_2=f{\left(x_2\right)} x2=a+0.618(b−a),f2=f(x2)
- 令 x 1 = a + 0.382 ( b − a ) , f 1 = f ( x 1 ) x_1=a+0.382{\left(b-a\right)},f_1=f{\left(x_1\right)} x1=a+0.382(b−a),f1=f(x1)
- 若 ∣ a − b ∣ < ϵ {\left|a-b\right|}<\epsilon ∣a−b∣<ϵ,则 x m i n = a + b 2 x_{min}=\frac{a+b}{2} xmin=2a+b,终止算法
- 若
f
1
<
f
2
f_1<f_2
f1<f2,则
b
=
x
2
,
x
2
=
x
1
,
f
2
=
f
1
b=x_2,x_2=x_1,f_2=f_1
b=x2,x2=x1,f2=f1,转步骤2;
若 f 1 = f 2 f_1=f_2 f1=f2,则 a = x 1 , b = x 2 a=x_1,b=x_2 a=x1,b=x2,转步骤1;
若 f 1 > f 2 f_1>f_2 f1>f2,则 a = x 1 , x 1 = x 2 , f 1 = f 2 a=x_1,x_1=x_2,f_1=f_2 a=x1,x1=x2,f1=f2,转步骤5; - 令 x 2 = a + 0.618 ( b − a ) x_2=a+0.618{\left(b-a\right)} x2=a+0.618(b−a),转步骤3
斐波那契法
Fibonacci法是黄金分割法的一般形式,在黄金分割法中,参数始终保持不变,如果动态的改变参数 ρ \rho ρ则会产生一种新的搜索算法。假设第 k k k次的参数为 ρ k {\rho}_k ρk,第 k + 1 k+1 k+1次的参数为 ρ k + 1 {\rho}_{k+1} ρk+1,则参数之间也满足两次迭代之间的关系式 ρ k + 1 ( 1 − ρ k ) = 1 − 2 ρ k {\rho}_{k+1}{\left(1-{\rho}_k\right)}=1-2{\rho}_k ρk+1(1−ρk)=1−2ρk;整理之后得到 ρ k + 1 = 1 − ρ k 1 − ρ k {\rho}_{k+1}=1-\frac{{\rho}_k}{1-{\rho}_k} ρk+1=1−1−ρkρk
算法步骤
- 给定一个初始区间[a, b] ( a < b ) {\left(a<b\right)} (a<b),以及最终精度 ϵ ( ϵ < 0 ) \epsilon{\left(\epsilon<0\right)} ϵ(ϵ<0)。假设Fibonacci数列为 F ( n ) F\left(n\right) F(n),设初始值 n = 3 n=3 n=3
- 令 x 2 = a + F ( n − 1 ) F ( n ) ( b − a ) , f 2 = f ( x 2 ) x_2=a+\frac{F\left(n-1\right)}{F\left(n\right)}{\left(b-a\right)},f_2=f{\left(x_2\right)} x2=a+F(n)F(n−1)(b−a),f2=f(x2)
- 令 x 1 = a + F ( n − 2 ) F ( n ) ( b − a ) , f 1 = f ( x 1 ) x_1=a+\frac{F\left(n-2\right)}{F\left(n\right)}{\left(b-a\right)},f_1=f{\left(x_1\right)} x1=a+F(n)F(n−2)(b−a),f1=f(x1)
- 若
f
1
<
f
2
f_1<f_2
f1<f2,则
b
=
x
2
,
x
2
=
x
1
,
f
2
=
f
1
,
x
1
=
a
+
F
(
n
−
2
)
F
(
n
)
(
b
−
a
)
,
f
1
=
f
(
x
1
)
b=x_2,x_2=x_1,f_2=f_1,x_1=a+\frac{F\left(n-2\right)}{F\left(n\right)}{\left(b-a\right)},f_1=f{\left(x_1\right)}
b=x2,x2=x1,f2=f1,x1=a+F(n)F(n−2)(b−a),f1=f(x1);
若 f 1 = f 2 f_1=f_2 f1=f2,则 a = x 1 , b = x 2 , x 1 = a + F ( n − 2 ) F ( n ) ( b − a ) , f 1 = f ( x 1 ) , x 2 = a + F ( n − 1 ) F ( n ) ( b − a ) , f 2 = f ( x 2 ) a=x_1,b=x_2,x_1=a+\frac{F\left(n-2\right)}{F\left(n\right)}{\left(b-a\right)},f_1=f{\left(x_1\right)},x_2=a+\frac{F\left(n-1\right)}{F\left(n\right)}{\left(b-a\right)},f_2=f{\left(x_2\right)} a=x1,b=x2,x1=a+F(n)F(n−2)(b−a),f1=f(x1),x2=a+F(n)F(n−1)(b−a),f2=f(x2)
若 f 1 > f 2 f_1>f_2 f1>f2,则 a = x 1 , x 1 = x 2 , f 1 = f 2 , x 2 = a + F ( n − 1 ) F ( n ) ( b − a ) , f 2 = f ( x 2 ) a=x_1,x_1=x_2,f_1=f_2,x_2=a+\frac{F\left(n-1\right)}{F\left(n\right)}{\left(b-a\right)},f_2=f{\left(x_2\right)} a=x1,x1=x2,f1=f2,x2=a+F(n)F(n−1)(b−a),f2=f(x2),
转步骤5 - 若满足 ∣ a − b ∣ < ϵ {\left|a-b\right|}<\epsilon ∣a−b∣<ϵ ,则 x m i n = a + b 2 , f m i n = f ( x m i n ) x_{min}=\frac{a+b}{2},f_{min}=f{\left({x_{min}}\right)} xmin=2a+b,fmin=f(xmin),停止计算,否则转到步骤6
- 令 n = n + 1 {n}={n+1} n=n+1,转步骤4
进退法
进退法是用来确定搜索区间(包含极小值点的区间)的算法,理论依据是单谷函数(只有一个极值点),且[a, b]为其极小值点的一个搜索区间,对于任意
x
1
,
x
2
∈
[
a
,
b
]
{x_1},{x_2}\in\left[a,b\right]
x1,x2∈[a,b],如果
f
1
<
f
2
f_1<f_2
f1<f2,则
[
a
,
x
2
]
\left[a,x_2\right]
[a,x2]为极小值的搜索区间,如果
f
1
>
f
2
f_1>f_2
f1>f2,则
[
x
1
,
b
]
\left[x_1,b\right]
[x1,b]为极小值的搜索区间。
基本思想:对
f
(
x
)
f{\left(x\right)}
f(x)任选一个初始点
x
1
{x_1}
x1及初始步长
h
0
{h_0}
h0,通过比较这两点函数值的大小,确定第三点位置,比较这三点的函数值大小,确定是否为“高-低-高”形态。
算法原理
- 试探搜索
选定初始点 x 1 , x 2 = x 1 + h 0 {x_1},{x_2}={x_1}+{h_0} x1,x2=x1+h0,计算 y 1 = f ( x 1 ) , y 2 = f ( x 2 ) {y_1}=f{\left(x_1\right)},{y_2}=f{\left(x_2\right)} y1=f(x1),y2=f(x2),如果 y 1 > y 2 {y_1}>{y_2} y1>y2,转2向右前进;如果 y 1 < y 2 {y_1}<{y_2} y1<y2,转3向左前进 - 前进搜索
加大步长 h = 2 h h=2h h=2h,产生新点 x 3 = x 2 + h x_3=x_2+h x3=x2+h;
如果 y 2 ≤ y 3 {y_2}\le{y_3} y2≤y3,则函数在[ x 1 x_1 x1, x 3 x_3 x3]内必有极小点,令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,搜索区间为[a, b];
如果 y 2 > y 3 {y_2}\gt{y_3} y2>y3,令 x 1 = x 2 , y 1 = y 2 , x 2 = x 3 , y 2 = y 3 , h = 2 h x_1=x_2,y_1=y_2,x_2=x_3,y_2=y_3,h=2h x1=x2,y1=y2,x2=x3,y2=y3,h=2h;重新构造新点 x 3 = x 2 + h x_3=x_2+h x3=x2+h,并比较 y 2 , y 3 y_2,y_3 y2,y3的大小,直到 y 2 ≤ y 3 y_2\le{y_3} y2≤y3 - 后退搜索
令 x 3 = x 2 , y 3 = y 2 , h = 1 2 h x_3=x_2,y_3=y_2,h=\frac{1}{2}h x3=x2,y3=y2,h=21h,产生新点 x 2 = x 3 − h x_2=x_3-h x2=x3−h;
如果 y 2 ≤ y 1 {y_2}\le{y_1} y2≤y1,则函数在[ x 1 x_1 x1, x 3 x_3 x3]内必有极小点,令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,搜索区间为[a, b];
如果 y 2 > y 1 {y_2}\gt{y_1} y2>y1,令 x 3 = x 2 , y 3 = y 2 , h = 1 2 h x_3=x_2,y_3=y_2,h=\frac{1}{2}h x3=x2,y3=y2,h=21h;重新构造新点 x 2 = x 3 − h x_2=x_3-h x2=x3−h,并比较 y 1 , y 2 y_1,y_2 y1,y2的大小,直到 y 2 ≤ y 1 y_2\le{y_1} y2≤y1,令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,搜索区间为[a, b];
算法步骤
- 给定初始点 x 1 {x_1} x1,初始步长 h 0 {h_0} h0,令 h = h 0 h=h_0 h=h0
- 令 x 2 = x 1 + h 0 {x_2}={x_1}+{h_0} x2=x1+h0,如果 y 1 > y 2 {y_1}>{y_2} y1>y2,则转步骤3,否则转步骤6
- 令 h = 2 h , x 3 = x 2 + h h=2h,x_3=x_2+h h=2h,x3=x2+h,如果 y 2 ≤ y 3 {y_2}\le{y_3} y2≤y3则转步骤4,否则转步骤5
- 令 a = x 1 , b = x 3 a=x_1,b=x_3 a=x1,b=x3,极小值一定存在于区间[a, b];
- x 1 = x 2 , y 1 = y 2 , x 2 = x 3 , y 2 = y 3 x_1=x_2,y_1=y_2,x_2=x_3,y_2=y_3 x1=x2,y1=y2,x2=x3,y2=y3,转步骤3
- 令 h = 1 2 h , x 3 = x 2 , y 3 = y 2 , x 2 = x 3 − h h=\frac{1}{2}h,x_3=x_2,y_3=y_2,x_2=x_3-h h=21h,x3=x2,y3=y2,x2=x3−h;如果 y 2 ≤ y 1 y_2\le{y_1} y2≤y1则转步骤4,否则转步骤6
二分法
若
f
(
x
)
f{\left(x\right)}
f(x)的导数存在且容易计算,则线性搜索的速度可以得到提高,下面的二分法每次将区间缩小至原来的二分之一
设
f
(
x
)
f{\left(x\right)}
f(x)为下单峰函数,若
f
(
x
)
f{\left(x\right)}
f(x)在[a, b]具有连续的一阶导数,且
f
′
(
a
)
<
0
,
f
′
(
b
)
>
0
f^{'}{\left(a\right)}<0,f^{'}{\left(b\right)}>0
f′(a)<0,f′(b)>0,取
c
=
a
+
b
2
c=\frac{a+b}{2}
c=2a+b,
若
f
′
(
c
)
=
0
f^{'}{\left(c\right)}=0
f′(c)=0,则c为极小点;
若
f
′
(
c
)
>
0
f^{'}{\left(c\right)}>0
f′(c)>0,则以[a, c]代替[a, b]作为新区间;
若
f
′
(
c
)
<
0
f^{'}{\left(c\right)}<0
f′(c)<0,则以[c, b]代替[a, b]作为新区间;
抛物线法(二次插值法)
在求一元函数的极小点问题上,我们可以利用若干点处的函数值来构造一个多项式,用这个多项式的极小点作为原来函数极小点的近似值。 抛物线法就是一个用二次函数来逼近f(x)的方法,这也是我们常说的二次插值法。
设在已知的三点
x
1
<
x
0
<
x
2
x_1\lt x_0\lt x_2
x1<x0<x2处对应的函数值
f
(
x
i
)
=
f
i
f\left(x_i\right)=f_i
f(xi)=fi,且满足:
f
1
>
f
0
,
f
0
<
f
2
f_1\gt f_0,f_0\lt f_2
f1>f0,f0<f2
过三点
(
x
1
,
f
1
)
,
(
x
0
,
f
0
)
,
(
x
2
,
f
2
)
\left(x_1,f_1\right),\left(x_0,f_0\right),\left(x_2,f_2\right)
(x1,f1),(x0,f0),(x2,f2)作二次函数
y
=
ϕ
(
x
)
y=\phi\left(x\right)
y=ϕ(x),即作一条抛物线,则可推导出:
ϕ
(
x
)
=
(
x
−
x
0
)
(
x
−
x
2
)
(
x
1
−
x
0
)
(
x
1
−
x
2
)
f
1
+
(
x
−
x
1
)
(
x
−
x
2
)
(
x
0
−
x
1
)
(
x
0
−
x
2
)
f
0
+
(
x
−
x
0
)
(
x
−
x
1
)
(
x
2
−
x
0
)
(
x
2
−
x
1
)
f
2
\phi\left(x\right)=\frac{\left(x-x_0\right)\left(x-x_2\right)}{\left(x_1-x_0\right)\left(x_1-x_2\right)}f_1+\frac{\left(x-x_1\right)\left(x-x_2\right)}{\left(x_0-x_1\right)\left(x_0-x_2\right)}f_0+\frac{\left(x-x_0\right)\left(x-x_1\right)}{\left(x_2-x_0\right)\left(x_2-x_1\right)}f_2
ϕ(x)=(x1−x0)(x1−x2)(x−x0)(x−x2)f1+(x0−x1)(x0−x2)(x−x1)(x−x2)f0+(x2−x0)(x2−x1)(x−x0)(x−x1)f2,
为求
ϕ
(
x
)
\phi\left(x\right)
ϕ(x)的极小点,令
ϕ
′
(
x
)
=
0
\phi' \left(x\right)=0
ϕ′(x)=0得
x
‾
=
1
2
(
x
2
2
−
x
0
2
)
f
1
+
(
x
0
2
−
x
1
2
)
f
2
+
(
x
1
2
−
x
2
2
)
f
0
(
x
2
−
x
0
)
f
1
+
(
x
0
−
x
1
)
f
2
+
(
x
1
−
x
2
)
f
0
\overline x=\frac{1}{2}\frac{\left(x_2^2-x_0^2\right)f_1+\left(x_0^2-x_1^2\right)f_2+\left(x_1^2-x_2^2\right)f_0}{\left(x_2-x_0\right)f_1+\left(x_0-x_1\right)f_2+\left(x_1-x_2\right)f_0}
x=21(x2−x0)f1+(x0−x1)f2+(x1−x2)f0(x22−x02)f1+(x02−x12)f2+(x12−x22)f0
若
x
‾
\overline x
x充分接近
x
0
x_0
x0 ,即对于预先给定的精度
ϵ
>
0
\epsilon\gt0
ϵ>0 , 有
∣
x
0
−
x
‾
∣
<
ϵ
\left|x_0-\overline x\right|\lt\epsilon
∣x0−x∣<ϵ,则把
x
‾
\overline x
x作为近似极小点.
否则计算 ,找出
f
(
x
‾
)
f\left(\overline x\right)
f(x)和
f
‾
\overline f
f之间的大者,去掉
x
1
x_1
x1或
x
2
x_2
x2,使新的三点仍具有两端点的函数值大于中间点的函数值的性质.利用新的点再构造二次函数,继续进行迭代.
例题
用Fibonacci算法、进退算法分别求函数
f
(
x
)
=
x
2
−
x
+
2
f\left(x\right)=x^2-x+2
f(x)=x2−x+2在区间
[
0
,
3
]
\left[0,3\right]
[0,3]上的极小值,要求区间长度不大于原始区间长的0.09。(进退法初始步长
Δ
x
=
0.1
\Delta{x}=0.1
Δx=0.1)
用Fibonacci法求解:
迭代次数 | [ a , b ] \left[a,b\right] [a,b] | x 1 x_1 x1 | x 2 x_2 x2 | f 1 f_1 f1 | f 2 f_2 f2 | n n n | a b s ( a − b ) < ϵ abs(a-b){\lt}{\epsilon} abs(a−b)<ϵ |
---|---|---|---|---|---|---|---|
0 | [ 0 , 3 ] \left[0,3\right] [0,3] | 1 | 2 | 2 | 4 | 3 | 否 |
1 | [ 0 , 2 ] \left[0,2\right] [0,2] | 2 3 \frac{2}{3} 32 | 1 | 1.78 | 2 | 4 | 否 |
2 | [ 0 , 1 ] \left[0,1\right] [0,1] | 2 5 \frac{2}{5} 52 | 2 3 \frac{2}{3} 32 | 1.76 | 1.78 | 5 | 否 |
3 | [ 0 , 2 3 ] \left[0,\frac{2}{3}\right] [0,32] | 1 4 \frac{1}{4} 41 | 2 5 \frac{2}{5} 52 | 1.8285 | 1.76 | 6 | 否 |
4 | [ 1 4 , 2 3 ] \left[\frac{1}{4},\frac{2}{3}\right] [41,32] | 2 5 \frac{2}{5} 52 | 79 156 \frac{79}{156} 15679 | 1.76 | 1.75 | 7 | 否 |
5 | [ 2 5 , 2 3 ] \left[\frac{2}{5},\frac{2}{3}\right] [52,32] | 79 156 \frac{79}{156} 15679 | 178 315 \frac{178}{315} 315178 | 1.75 | 1.754 | 7 | 是 |
所以 x m i n = 2 5 + 2 3 2 = 8 15 , f m i n = f ( x m i n ) = 1.751 x_{min}=\frac{\frac{2}{5}+\frac{2}{3}}{2}=\frac{8}{15},f_{min}=f\left(x_{min}\right)=1.751 xmin=252+32=158,fmin=f(xmin)=1.751
用进退法求解:
由题意可以得知此时的
ϵ
=
0.27
\epsilon=0.27
ϵ=0.27
迭代次数 | [ a , b ] \left[a,b\right] [a,b] | x 1 x_1 x1 | x 2 x_2 x2 | x 3 x_3 x3 | y 1 y1 y1 | y 2 y_2 y2 | y 3 y_3 y3 | h h h | a b s ( a − b ) < ϵ abs(a-b){\lt}{\epsilon} abs(a−b)<ϵ |
---|---|---|---|---|---|---|---|---|---|
0 | [ 0 , 3 ] \left[0,3\right] [0,3] | 0 | 0.1 | ----- | 2 | 1.91 | ----- | 0.1 | 否 |
1 | [ 0.1 , 0.7 ] \left[0.1,0.7\right] [0.1,0.7] | 0.1 | 0.3 | 0.7 | 1.91 | 1.79 | 1.79 | 0.4 | 否 |
2 | [ 0.2 , 0.8 ] \left[0.2,0.8\right] [0.2,0.8] | 0.2 | 0.4 | 0.8 | 1.84 | 1.76 | 1.84 | 0.4 | 否 |
3 | [ 0.3 , 0.9 ] \left[0.3,0.9\right] [0.3,0.9] | 0.3 | 0.5 | 0.9 | 1.79 | 1.75 | 1.91 | 0.4 | 否 |
4 | [ 0.3 , 0.6 ] \left[0.3,0.6\right] [0.3,0.6] | 0.3 | 0.4 | 0.6 | 1.79 | 1.76 | 1.76 | 0.2 | 否 |
5 | [ 0.3 , 0.6 ] \left[0.3,0.6\right] [0.3,0.6] | 0.4146 | 0.4854 | ----- | 1.7573 | 1.7502 | ----- | ----- | 否 |
6 | [ 0.4146 , 0.6 ] \left[0.4146,0.6\right] [0.4146,0.6] | 0.4854 | 0.52 | ----- | 1.7502 | 1.7509 | ----- | ----- | 是 |
所以 x m i n = 0.4146 + 0.6 2 = 0.5073 , f m i n = f ( x m i n ) = 1.7501 x_{min}=\frac{0.4146+0.6}{2}=0.5073,f_{min}=f\left(x_{min}\right)=1.7501 xmin=20.4146+0.6=0.5073,fmin=f(xmin)=1.7501