已知连续函数
f
(
x
)
f(x)
f(x)在
x
∗
x^*
x∗近旁存在最优解
x
0
x_0
x0。对博文《最优化方法Python计算:连续函数的单峰区间计算》讨论的
f
(
x
)
f(x)
f(x)单峰区间的包围算法稍加修改,可算得
f
(
x
)
f(x)
f(x)包含
x
0
x_0
x0的单峰区间
[
a
,
c
]
[a,c]
[a,c]及含于
(
a
,
c
)
(a,c)
(a,c)内的满足
f
(
a
)
>
f
(
b
)
<
f
(
c
)
f(a)>f(b)f(b)ya: #s为上升方向
a,b=b,a #交换a,b
ya,yb=yb,ya
s=-s #调整s为下降方向
c=b+s #c置为b+s
yc=f(c)
while ycc: #若a大c小
a,c=c,a #交换a,c
return a,b,c
令
y
a
=
f
(
a
)
y_a=f(a)
ya=f(a),
y
b
=
f
(
b
)
y_b=f(b)
yb=f(b)及
y
c
=
f
(
c
)
y_c=f(c)
yc=f(c)。构造通过点
(
a
,
y
a
)
(a,y_a)
(a,ya),
(
b
,
y
b
)
(b,y_b)
(b,yb)及
(
c
,
y
c
)
(c,y_c)
(c,yc)的二次函数
q
(
x
)
=
p
0
+
p
1
x
+
p
2
x
2
q(x)=p_0+p_1x+p_2x^2
q(x)=p0+p1x+p2x2,即
{
y
a
=
p
0
+
p
1
a
+
p
2
a
2
y
b
=
p
0
+
p
1
b
+
p
2
b
2
y
c
=
p
0
+
p
1
c
+
p
2
c
2
.
\begin{cases} y_a=p_0+p_1a+p_2a^2\\ y_b=p_0+p_1b+p_2b^2\\ y_c=p_0+p_1c+p_2c^2 \end{cases}.
⎩
⎨
⎧ya=p0+p1a+p2a2yb=p0+p1b+p2b2yc=p0+p1c+p2c2. 解出
p
0
p_0
p0,
p
1
p_1
p1和
p
2
p_2
p2:
{
p
0
=
b
c
y
a
(
b
−
a
)
(
c
−
a
)
−
a
c
y
b
(
b
−
a
)
(
c
−
b
)
+
a
b
y
c
(
c
−
a
)
(
c
−
b
)
p
1
=
−
(
b
+
c
)
y
a
(
b
−
a
)
(
c
−
a
)
+
(
a
+
c
)
y
c
(
b
−
a
)
(
c
−
b
)
−
(
a
+
b
)
y
c
(
c
−
a
)
(
c
−
b
)
p
2
=
y
a
(
b
−
a
)
(
c
−
a
)
−
y
b
(
b
−
a
)
(
c
−
b
)
+
y
c
(
c
−
a
)
(
c
−
b
)
.
\begin{cases} p_0=\frac{bcy_a}{(b-a)(c-a)}-\frac{acy_b}{(b-a)(c-b)}+\frac{aby_c}{(c-a)(c-b)}\\ p_1=-\frac{(b+c)y_a}{(b-a)(c-a)}+\frac{(a+c)y_c}{(b-a)(c-b)}-\frac{(a+b)y_c}{(c-a)(c-b)}\\ p_2=\frac{y_a}{(b-a)(c-a)}-\frac{y_b}{(b-a)(c-b)}+\frac{y_c}{(c-a)(c-b)}\end{cases}.
⎩
⎨
⎧p0=(b−a)(c−a)bcya−(b−a)(c−b)acyb+(c−a)(c−b)abycp1=−(b−a)(c−a)(b+c)ya+(b−a)(c−b)(a+c)yc−(c−a)(c−b)(a+b)ycp2=(b−a)(c−a)ya−(b−a)(c−b)yb+(c−a)(c−b)yc. 二次式
q
(
x
)
=
p
0
+
p
1
x
+
p
2
x
2
q(x)=p_0+p_1x+p_2x^2
q(x)=p0+p1x+p2x2 称为
f
(
x
)
f(x)
f(x)在
a
,
b
,
c
a,b,c
a,b,c处的二次插值多项式。由于
q
(
a
)
=
f
(
a
)
q(a)=f(a)
q(a)=f(a),
q
(
b
)
=
f
(
b
)
q(b)=f(b)
q(b)=f(b),
q
(
c
)
=
f
(
c
)
q(c)=f(c)
q(c)=f(c),故
q
(
a
)
>
q
(
b
)
<
q
(
c
)
q(a)>q(b)q(b)
f
(
b
)
<
f
(
c
)
f(x)>f(b)f(b) |