无约束最优化考虑的问题:
m
i
n
x
∈
R
n
f
(
x
)
(1)
min_{x \in R_n} f(x) \tag{1}
minx∈Rnf(x)(1)
一般把最优化算法的迭代过程分为如下四步
Step1: 选择初始点
x
(
0
)
x^{(0)}
x(0)
Step2: 确定搜索(下降)方向
d
k
d^k
dk,即按照一定规则构造函数
f
f
f在
x
(
k
)
x^{(k)}
x(k)处的下降方向作为下次迭代的搜索方向。
Step3: 利用一维搜索方法:确定步长因子
λ
k
=
λ
\lambda_k = \lambda
λk=λ:
{
m
i
n
f
(
x
(
k
)
+
λ
d
(
k
)
)
=
ψ
(
λ
)
s
.
t
.
λ
∈
S
(2)
\begin{cases} min\,\,f(x^{(k)}+\lambda d^{(k)}) = \psi(\lambda) \\ s.t.\,\,\lambda \in S \end{cases} \tag{2}
{minf(x(k)+λd(k))=ψ(λ)s.t.λ∈S(2)Step4:令
x
(
k
+
1
)
=
x
(
k
)
+
λ
k
d
k
x^{(k+1)} = x^{(k)}+\lambda_kd^k
x(k+1)=x(k)+λkdk,若
x
(
k
+
1
)
x^{(k+1)}
x(k+1)满足终止规则,则迭代停止,否则返回第一步继续迭代。
一维搜索:一元函数求极小及线性搜索均为一维搜索。
其中通过求极小的方法确定步长的方法称为精确一维搜索,如下:
{
m
i
n
f
(
x
(
k
)
+
λ
d
(
k
)
)
=
ψ
(
λ
)
s
.
t
.
λ
∈
S
(2)
\begin{cases} min\,\,f(x^{(k)}+\lambda d^{(k)}) = \psi(\lambda) \\ s.t.\,\,\lambda \in S \end{cases} \tag{2}
{minf(x(k)+λd(k))=ψ(λ)s.t.λ∈S(2)
1.前置知识
1.1 判断(局部)最优解的充分/必要条件
(1) 设
f
(
x
)
f(x)
f(x)在
x
∗
x^*
x∗处可微,则
x
∗
x^*
x∗为问题(1)的局部最优解的必要条件是:
∇
f
(
x
∗
)
=
0
\nabla f(x^*) =0
∇f(x∗)=0
(2) 设
f
(
x
)
f(x)
f(x)在
x
∗
x^*
x∗处二次可微,则
x
∗
x^*
x∗为问题(1)的局部最优解的充分条件是:
∇
f
(
x
∗
)
=
0
\nabla f(x^*) =0
∇f(x∗)=0 且Hessian矩阵正定,即
∇
2
f
(
x
∗
)
>
0
\nabla^2 f(x^*) >0
∇2f(x∗)>0。
(3) 设
f
(
x
)
f(x)
f(x)是定义在
R
n
R^n
Rn的可微凸函数,则
x
∗
x^*
x∗是问题(1)全局最优解的充要条件是:
∇
f
(
x
∗
)
=
0
\nabla f(x^*) =0
∇f(x∗)=0
1.2 收敛速度
设
x
∗
x^*
x∗为问题
m
i
n
f
(
x
)
,
x
∈
R
n
min\,f(x),x \in R^n
minf(x),x∈Rn的最优解,由算法A产生的序列
{
x
n
}
\lbrace x_n \rbrace
{xn}收敛于
x
∗
x^*
x∗,即
lim
n
→
+
∞
x
n
=
x
∗
\lim_{n \to +\infty}x_n = x^*
n→+∞limxn=x∗(1)线性收敛:若存在一个与
n
n
n无关的常数
β
∈
(
0
,
1
)
\beta \in (0,1)
β∈(0,1),某个正整数
n
0
n_0
n0,使得当
n
>
n
0
n>n_0
n>n0时
∣
∣
x
n
−
x
∗
∣
∣
≤
β
∣
∣
x
(
n
+
1
)
−
x
∗
∣
∣
(3)
||x_n - x^*|| \leq \beta|| x_(n+1) - x^* || \tag{3}
∣∣xn−x∗∣∣≤β∣∣x(n+1)−x∗∣∣(3)成立,则称
{
x
n
}
\lbrace x_n \rbrace
{xn}线性收敛,也说算法A线性收敛。
(2)超线性收敛:若存在与
n
n
n无关的常数:
1
<
α
<
2
,
β
>
0
1<\alpha<2,\beta>0
1<α<2,β>0,使得当
n
>
n
0
n>n_0
n>n0时
∣
∣
x
n
−
x
∗
∣
∣
≤
β
∣
∣
x
(
n
+
1
)
−
x
∗
∣
∣
α
(4)
||x_n - x^*|| \leq \beta|| x_(n+1) - x^*||^\alpha\tag{4}
∣∣xn−x∗∣∣≤β∣∣x(n+1)−x∗∣∣α(4)成立,或者(3)式中
β
=
0
\beta = 0
β=0,则称
{
x
n
}
\lbrace x_n \rbrace
{xn}超线性收敛,也说算法A超线性收敛。
(3)二阶收敛: 若(4)式中
α
=
2
\alpha=2
α=2,则称
{
x
n
}
\lbrace x_n \rbrace
{xn}二阶收敛,也说算法A二阶收敛。
2.精确一维搜索
精确一维搜索方法可以通过是否使用导数分为两类。不使用导数的方法包括:“成功-失败”法,黄金分割法(0.618法);使用导数的解析方法包括:Newton法,插值法,二分法。
使用导数的解析方法有如下一个重要性质(正交性)
🔺正交性:设函数
f
(
x
)
f(x)
f(x)具有一阶连续偏导数
(
f
∈
C
1
)
(f \in C^1)
(f∈C1),
x
(
k
+
1
)
x^{(k+1)}
x(k+1)由如下规则产生:
{
ψ
(
λ
k
)
=
m
i
n
λ
>
0
ψ
(
λ
)
=
m
i
n
λ
>
0
f
(
x
(
k
)
+
λ
d
k
)
x
(
k
+
1
)
=
x
(
k
)
+
λ
k
d
k
(5)
\begin{cases} \psi(\lambda_k)=min_{\lambda >0}\,\,\psi(\lambda)=min_{\lambda >0}\,\,f(x^{(k)}+\lambda d^k) \\ x^{(k+1)}= x^{(k)}+\lambda_k d^k \end{cases} \tag{5}
{ψ(λk)=minλ>0ψ(λ)=minλ>0f(x(k)+λdk)x(k+1)=x(k)+λkdk(5)则有
∇
f
(
x
(
k
+
1
)
)
T
d
k
=
0
\nabla f(x^{(k+1)})^Td^k=0
∇f(x(k+1))Tdk=0。
证明: 由于
f
(
x
)
f(x)
f(x)具有一阶连续偏导,设
λ
k
\lambda_k
λk为
ψ
(
λ
)
=
f
(
x
(
k
)
+
λ
d
k
)
\psi(\lambda)=f(x^{(k)}+\lambda d^k)
ψ(λ)=f(x(k)+λdk)的极小值点,则
ψ
′
(
λ
k
)
=
d
k
∇
f
(
x
(
k
)
+
λ
d
k
)
=
∇
f
(
x
(
k
+
1
)
)
T
d
k
=
0
\psi'(\lambda_k)=d^k\nabla f(x^{(k)}+\lambda d^k)=\nabla f(x^{(k+1)})^Td^k=0
ψ′(λk)=dk∇f(x(k)+λdk)=∇f(x(k+1))Tdk=0。
2.1 “成功-失败”法
令 F ( x ) = { f ( x ) , x ∈ S ∞ , x ∉ S (6) F(x)=\begin{cases} f(x),x \in S \\ \infty ,x \not \in S\end{cases} \tag{6} F(x)={f(x),x∈S∞,x∈S(6)S为初始要求区间。因此无约束最优化的搜索总可以考虑区间 R = ( − ∞ , ∞ ) R=(-\infty,\infty) R=(−∞,∞)。
1.使用条件
无特殊要求,具有一般适用性。
2.算法步骤
Step1:取初始点
x
0
∈
R
x_0 \in R
x0∈R,搜索步长
h
>
0
h>0
h>0(不能太小),及精度
ϵ
>
0
\epsilon>0
ϵ>0。
Step2:计算
x
1
=
x
0
+
h
,
f
(
x
1
)
x_1 = x_0 +h,f(x_1)
x1=x0+h,f(x1)
Step3:若
f
(
x
1
)
<
f
(
x
0
)
f(x_1) < f(x_0)
f(x1)<f(x0),则为搜索成功,下一次搜索就加大步长:
h
=
2
h
h=2h
h=2h,
x
0
=
x
1
x_0 = x_1
x0=x1,返回Step2:继续进行搜索,否则转Step4。
Step4:若
f
(
x
1
)
≥
f
(
x
0
)
f(x_1) \geq f(x_0)
f(x1)≥f(x0),则为搜索失败,下一次搜索就缩小步长且后退:
h
=
−
h
/
4
,
x
0
=
x
1
h=-h/4,x_0 = x_1
h=−h/4,x0=x1。
Step5:判断
∣
h
∣
<
ϵ
|h|<\epsilon
∣h∣<ϵ是否成立,若成立,则
x
∗
=
x
0
x^*= x_0
x∗=x0,结束;否则转Step2继续迭代。
3.优缺点
缺点:效率低。
优点:可以求搜索区间 。
4.代码实现(python)
# 1.“成功-失败”法
def resovle_YON(a,b,h,f,e):
x0 = (a+b)/2
# a,b,h,f,e分别为区间上下限,步长,优化函数,目标精度
k = 1 # 记录迭代次数
# 终止条件:|h|<e
while(abs(h) >= e):
# step1: 计算f(x0+h)并和f(x0)作比较
if f(x0+h) < f(x0):
# step2:点移动且步长加倍,迭代下一次
x0 = x0 + h
h = 2 * h
else:
# step2': 反向移动,且步长减至1/4,迭代下一次
h = -h / 4
k = k+1
print("‘成功-失败’法迭代次数为", k, "计算结果为:x=", x0, "y=", f(x0))
2.2 黄金分割法(0.618法)
考虑下列问题 { m i n ψ ( λ ) s . t . λ ∈ [ a , b ] (2) \begin{cases} min\,\,\psi(\lambda) \\ s.t.\,\,\lambda \in[a,b]\end{cases} \tag{2} {minψ(λ)s.t.λ∈[a,b](2)
1.使用条件
0.618法是求单峰函数极值的一种试探法。所谓的单峰函数是指只有一个峰值的函数,其严格定义如下:
即在
x
∗
x^*
x∗左边单减,右边则单增。也正是利用此逐步删剪区间,来寻找
x
∗
x^*
x∗。
2.算法步骤
Step1:取定
ϵ
>
0
\epsilon>0
ϵ>0为最后的搜索区间长度,令
α
=
0.618
,
k
=
1
\alpha =0.618,k=1
α=0.618,k=1。
Step2:判断
∣
b
−
a
∣
<
ϵ
|b-a|<\epsilon
∣b−a∣<ϵ是否成立,成立则结束,输出
x
∗
=
(
b
−
a
)
/
2
x^*=(b-a)/2
x∗=(b−a)/2,否则进行下一步。
Step3:令
λ
k
=
a
+
(
1
−
α
)
(
b
−
a
)
;
μ
k
=
a
+
α
(
b
−
a
)
\lambda_k=a+(1-\alpha)(b-a);\mu_k=a+\alpha(b-a)
λk=a+(1−α)(b−a);μk=a+α(b−a),并计算
ψ
(
λ
k
)
,
ψ
(
μ
k
)
\psi(\lambda_k),\psi(\mu_k)
ψ(λk),ψ(μk)。若
ψ
(
λ
k
)
>
ψ
(
μ
k
)
\psi(\lambda_k)>\psi(\mu_k)
ψ(λk)>ψ(μk),转Step4,否则转Step5。
Step4:令
a
=
λ
k
,
b
=
b
,
k
=
k
+
1
a=\lambda_k,b=b,k=k+1
a=λk,b=b,k=k+1(删去
λ
k
\lambda_k
λk左侧区间),返回Step2。
Step5:令
a
=
a
,
b
=
μ
k
,
k
=
k
+
1
a=a,b=\mu_k,k=k+1
a=a,b=μk,k=k+1(删去
μ
k
\mu_k
μk右侧区间),返回Step2。
3.优缺点
(和“成功-失败”法差不多,适用性方面不如“成功-失败”法)
优点:不要求函数可微,且每次迭代只需计算一个函数值,计算量小,程序简单。
缺点:收敛速度慢。
4.代码实现(python)
# 2.“0.618"法
def resovle_618(a,b,e,f):
# step1:计算初始两个函数点
x1 = a + (1-0.618)*(b-a)
x2 = a + 0.618*(b-a)
k = 1 # 用于记录迭代次数
# step2:判断是否满足精度,若满足精度即结束迭代
while abs(b-a) >= e:
# step3:若左侧函数值大于右侧函数值,去掉左侧部分,否则去掉右侧部分
if f(x1) > f(x2):
a = x1
x1 = x2
x2 = a + 0.618*(b-a)
else:
b = x2
x2 = x1
x1 = a+(1-0.618)*(b-a)
k = k+1
print("0.618法迭代次数为", k,"最终得到的近似解为:x =", (a+b)/2,"\n对应的函数值为: y =", f((a+b)/2))
2.3.二分法
1.使用条件
要求函数 f ( x ) f(x) f(x)在搜索区间上一阶连续可微的,且当导数为0时是解(极小点)。
2.算法步骤
Step1:取定
ϵ
>
0
\epsilon>0
ϵ>0为搜索精度并寻找初始区间
[
a
,
b
]
[a,b]
[a,b],满足
f
′
(
a
)
f
′
(
b
)
<
0
f'(a)f'(b)<0
f′(a)f′(b)<0,搜索方法如下:
Step2:判断
∣
b
−
a
∣
<
ϵ
|b-a|<\epsilon
∣b−a∣<ϵ是否成立(也可以使用
∣
f
′
(
(
b
−
a
)
/
2
)
∣
<
ϵ
|f'((b-a)/2)|<\epsilon
∣f′((b−a)/2)∣<ϵ),成立则取
x
∗
=
b
−
a
)
/
2
x^*=b-a)/2
x∗=b−a)/2,迭代结束,否则进行下一步。
Step3:取
x
0
=
(
b
−
a
)
/
2
x_0=(b-a)/2
x0=(b−a)/2,计算
f
′
(
x
0
)
f'(x_0)
f′(x0),若
f
′
(
x
0
)
>
0
f'(x_0)>0
f′(x0)>0转Step4,否则转Step5。
Step4:
f
′
(
x
0
)
>
0
f'(x_0)>0
f′(x0)>0意味着
x
>
x
0
x>x_0
x>x0时单增,因此去掉右侧区间,即令
a
=
a
,
b
=
x
0
a=a,b=x_0
a=a,b=x0,返回Step2。
Step5:
f
′
(
x
0
)
≤
0
f'(x_0)\leq 0
f′(x0)≤0意味着
x
>
x
0
x>x_0
x>x0时单减,因此去掉左侧区间,即令
a
=
x
0
,
b
=
b
a=x_0,b=b
a=x0,b=b,返回Step2。
3.优缺点
优点:计算量较少,而且总能收敛到一个局部极小点。
缺点:收敛速度较慢
4.代码实现(python)
# 3.二分法(这是等考完之后补充,之前写错啦/_ \)
def resolve_twodiv(a,b,h,e,f):
print("‘二分法’迭代次数为", k, "计算结果为:x=", x0, "y=", f(x0))
2.4 🔺Netwon法
1.使用条件
二阶可导,且迭代点的二阶导数函数值大于0。
2.算法思想
使用二阶泰勒(Taylor)展开代替原函数。
ψ
(
x
)
\psi(x)
ψ(x)在
x
0
x_0
x0处的二阶泰勒展开为:
ψ
(
x
)
=
ψ
(
x
0
)
+
ψ
′
(
x
0
)
(
x
−
x
0
)
+
ψ
′
′
(
x
0
)
2
(
x
−
x
0
)
2
+
o
(
∣
∣
(
x
−
x
0
)
2
∣
∣
)
\psi(x)=\psi(x_0)+\psi'(x_0)(x-x_0)+\frac{\psi''(x_0)}{2}(x-x_0)^2+o(||(x-x_0)^2||)
ψ(x)=ψ(x0)+ψ′(x0)(x−x0)+2ψ′′(x0)(x−x0)2+o(∣∣(x−x0)2∣∣)
略去高阶项得
g
(
x
)
=
ψ
(
x
0
)
+
ψ
′
(
x
0
)
(
x
−
x
0
)
+
ψ
′
′
(
x
0
)
2
(
x
−
x
0
)
2
g(x)=\psi(x_0)+\psi'(x_0)(x-x_0)+\frac{\psi''(x_0)}{2}(x-x_0)^2
g(x)=ψ(x0)+ψ′(x0)(x−x0)+2ψ′′(x0)(x−x0)2以此代替原函数,则当
ψ
′
′
(
x
0
)
>
0
\psi''(x_0)>0
ψ′′(x0)>0时,其驻点为极小点,
g
′
(
x
)
=
ψ
′
(
x
0
)
+
ψ
′
′
(
x
0
)
(
x
−
x
0
)
=
0
g'(x)=\psi'(x_0)+\psi''(x_0)(x-x_0)=0
g′(x)=ψ′(x0)+ψ′′(x0)(x−x0)=0进而得到
x
1
=
x
0
−
ψ
′
(
x
0
)
ψ
′
′
(
x
0
)
x_1=x_0-\frac{\psi'(x_0)}{\psi''(x_0)}
x1=x0−ψ′′(x0)ψ′(x0)类似的,若已知
x
k
x_k
xk,则有迭代公式
x
k
+
1
=
x
k
−
ψ
′
(
x
k
)
ψ
′
′
(
x
k
)
x_{k+1}=x_k-\frac{\psi'(x_k)}{\psi''(x_k)}
xk+1=xk−ψ′′(xk)ψ′(xk)直至
∣
ψ
′
(
x
k
)
∣
<
ϵ
|\psi'(x_k)|<\epsilon
∣ψ′(xk)∣<ϵ,迭代结束。
3.算法步骤
Step1:取定初始点
x
0
x_0
x0,目标精度
ϵ
>
0
\epsilon>0
ϵ>0,令
k
=
1
k=1
k=1。
Step2:判断
∣
ψ
′
(
x
0
)
∣
<
ϵ
|\psi'(x_0)|<\epsilon
∣ψ′(x0)∣<ϵ是否成立,成立则取
x
∗
=
x
0
x^*=x_0
x∗=x0,结束,否则进行下一步。
Step3:计算
ψ
′
(
x
0
)
,
ψ
′
′
(
x
0
)
\psi'(x_0),\psi''(x_0)
ψ′(x0),ψ′′(x0),若
ψ
′
′
(
x
0
)
≤
0
\psi''(x_0)\leq0
ψ′′(x0)≤0则牛顿法失败,无法求解,否则转下一步。
Step4:令
x
0
=
x
0
−
ψ
′
(
x
0
)
ψ
′
′
(
x
0
)
,
k
=
k
+
1
x_0=x_0-\frac{\psi'(x_0)}{\psi''(x_0)},k=k+1
x0=x0−ψ′′(x0)ψ′(x0),k=k+1,返回Step2,进行下次迭代。
4.算法收敛性与评价
(1)收敛性:
(2)优缺点
特点:收敛速度快,二阶收敛。
缺点:须计算二次导数,对初始点要求高、局部收敛 。
4.代码实现(python)
# 4.牛顿法
def resolve_Newton(a,b,e):
x0 = (a+b)/2
k = 1
# 终止条件:一介倒数<目标精度,如果二阶导<0则寻找失败
while(abs(df(x0)) >= e):
# step1:计算初始点的1、2阶导数
dy0 = df(x0)
ddy0 = ddf(x0)
if ddy0 <= 0:
print("\nNetwon法寻找失败")
break
# step2:计算下一个点
x0 = x0 - df(x0)/ddf(x0)
k = k+1
print("‘牛顿法’迭代次数为", k, "计算结果为:x=", x0, "y=", f(x0))
2.5 插值法(三点二次插值)
1.使用条件
ψ ( x ) ∈ C 1 \psi(x) \in C^1 ψ(x)∈C1(一阶连续可微),初始选点需满足 x 1 < x 0 < x 2 , ψ ( x 0 ) < ψ ( x 1 ) , ψ ( x 0 ) < ψ ( x 2 ) x_1<x_0<x_2,\psi(x_0)<\psi(x_1),\psi(x_0)<\psi(x_2) x1<x0<x2,ψ(x0)<ψ(x1),ψ(x0)<ψ(x2),以保证 a 2 > 0 a_2>0 a2>0。
2.算法思想
与Newton法相似,三点二次插值(抛物线)法使用
ψ
(
x
)
\psi(x)
ψ(x)在三个点
x
0
,
x
1
,
x
2
x_0,x_1,x_2
x0,x1,x2处的函数值来构造一个二次函数
y
=
g
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
y=g(x)=a_0+a_1x+a_2x^2
y=g(x)=a0+a1x+a2x2则二次函数
g
(
x
)
g(x)
g(x)的最小值(需要
a
2
>
0
)
a_2>0)
a2>0)即为
x
‾
=
−
a
1
2
a
2
\overline{x}=\frac{-a_1}{2a_2}
x=2a2−a1且满足
y
0
=
g
(
x
0
)
=
ψ
(
x
0
)
,
y
1
=
g
(
x
1
)
=
ψ
(
x
1
)
,
y
2
=
g
(
x
2
)
=
ψ
(
x
2
)
y_0=g(x_0)=\psi(x_0),y_1=g(x_1)=\psi(x_1),y_2=g(x_2)=\psi(x_2)
y0=g(x0)=ψ(x0),y1=g(x1)=ψ(x1),y2=g(x2)=ψ(x2)
利用这三个等式可以求得
{
(
y
1
−
y
0
)
/
(
x
1
−
x
0
)
=
b
1
(
y
2
−
y
1
)
/
(
x
2
−
x
1
)
=
b
2
\begin{cases} (y_1-y_0)/(x_1-x_0) =b_1 \\ (y_2-y_1)/(x_2-x_1) =b_2 \end{cases}
{(y1−y0)/(x1−x0)=b1(y2−y1)/(x2−x1)=b2
a
2
=
(
b
2
−
b
1
)
/
(
x
2
−
x
1
)
,
a
1
=
b
1
−
a
2
(
x
1
+
x
0
)
a_2=(b_2-b_1)/(x_2-x_1),a_1=b_1-a_2(x_1+x_0)
a2=(b2−b1)/(x2−x1),a1=b1−a2(x1+x0)即可求得极小点
x
‾
=
−
a
1
2
a
2
\overline{x}=\frac{-a_1}{2a_2}
x=2a2−a1。
3.算法步骤
Step1:选取初始
x
0
,
ϵ
>
0
x_0,\epsilon>0
x0,ϵ>0。
Step2:并通过探索法(如“成功-失败”法)向
x
0
x_0
x0两侧寻找符合条件的
x
1
,
x
2
x_1,x_2
x1,x2
Step3:计算
x
‾
\overline{x}
x,若
∣
ψ
(
x
‾
)
−
ψ
(
x
0
)
∣
<
ϵ
|\psi(\overline{x})-\psi(x_0)|<\epsilon
∣ψ(x)−ψ(x0)∣<ϵ则取
x
∗
=
x
0
x^*=x_0
x∗=x0,否则进行下一步。
Step4:在点
x
0
,
x
‾
x_0,\overline{x}
x0,x中选择使得
ψ
(
x
)
\psi(x)
ψ(x)最小的作为新的
x
0
x_0
x0(实际上为:新的
x
0
=
x
‾
)
x_0=\overline{x})
x0=x),返回Step2。
4.算法收敛性
算法的终止条件可能无法保证算法一定收敛,若算法收敛,则在一定条件下是超线性收敛的收敛阶数为1.3。
5.代码实现(python)
# 5.插值法(3点2次)
def resolve_cha(a,b,h,f,e):
# step1:寻找初始点(两头大,中间小),这里初始步长要取小点哦~
x0 = (a+b)/2
x_last = x0 - 2*e
k = 1
# 终止条件设置为x(二次多项式的极小点)与x0相差小于目标精度
while abs(x0-x_last) > e:
x1 = x0 - h
x2 = x0 + h
while f(x1) < f(x0):
if x1 < a:
print("插值法寻找初值点失败!\n")
break
h1 = 2*h
x1 = x1 - h1
#print(x1,f(x1))
while f(x2) < f(x0):
if x2 > b:
print("插值法寻找初值点失败!\n")
break
h2 = 2*h
x2 = x2 + h2
# step2:计算x(二次插值多项式的极小点)
p = ((f(x2)-f(x1))/(x2-x1)-(f(x1)-f(x0))/(x1-x0))/(x2-x0)
q = ((f(x1)-f(x0))/(x1-x0)-p*(x1+x0))
x = -q/(2*p)
k = k+1
# 判断如果x满足精度(与x0相差很小)
if abs(x0-x) < e:
x_end = x
break
# 进行下次迭代
else:
x_last = x0
x0 = x
print("‘插值法’迭代次数为", k, "计算结果为:x=", x_end, "y=", f(x_end))
3.不精确一维搜索
考虑从
x
(
0
)
x^{(0)}
x(0)出发,沿方向
d
k
d^k
dk寻找新的迭代点:
x
(
k
+
1
)
=
x
(
k
)
+
λ
k
x
(
k
)
x^{(k+1)}=x^{(k)}+\lambda_k x^{(k)}
x(k+1)=x(k)+λkx(k) 要求:
(1)
f
(
x
(
k
)
+
λ
k
d
k
)
<
f
(
x
(
k
)
)
f(x^{(k)}+\lambda_kd^k)<f(x^{(k)})
f(x(k)+λkdk)<f(x(k))
(2)
λ
k
\lambda_k
λk不能太小
总体希望收敛快,每一步 不要求达到精确最小,单步速度快, 虽然迭代步数增加,但整个收敛达到快速。 主要方法为:三大法则。
法则1:Goldstein法
设
d
k
d^k
dk为下降方向,即
d
k
∇
f
(
x
(
k
)
)
<
0
,
λ
k
d^k\nabla f(x^{(k)})<0,\lambda_k
dk∇f(x(k))<0,λk需要满足(以下为了方便,省略了上标):
1.
f
(
x
+
λ
d
)
≤
f
(
x
)
+
α
λ
∇
T
f
(
x
)
d
1.f (x+ λd) ≤ f (x)+\alpha \lambda \nabla^T f (x)d
1.f(x+λd)≤f(x)+αλ∇Tf(x)d
2.
f
(
x
+
λ
d
)
≥
f
(
x
)
+
(
1
−
α
)
λ
∇
T
f
(
x
)
d
2.f (x+ λd) ≥ f (x) +(1- \alpha) \lambda \nabla^Tf (x)d
2.f(x+λd)≥f(x)+(1−α)λ∇Tf(x)d
其中,
α
∈
(
0
,
1
/
2
)
α∈(0,1/2)
α∈(0,1/2)为取定参数 。 实际中常
α
=
0.1
α=0.1
α=0.1
算法步骤:
Step1:输入
λ
=
1
\lambda=1
λ=1或者
α
\alpha
α
Step2:判断条件1是否成立,成立则进行下一步,不成立则
λ
=
0.5
λ
\lambda=0.5\lambda
λ=0.5λ再次进行Step2。
Step3:判断条件3是否成立,成立则
λ
k
=
λ
\lambda_k=\lambda
λk=λ,结束,否则令
λ
=
1.5
λ
\lambda=1.5\lambda
λ=1.5λ返回Step2。
法则2:Armijio法
类似Goldstein法,条件2稍有改变。\lambda_k$需要满足以下条件:
1.
f
(
x
+
λ
d
)
≤
f
(
x
)
+
α
λ
∇
T
f
(
x
)
d
1.f (x+ λd) ≤ f (x)+\alpha \lambda \nabla^T f (x)d
1.f(x+λd)≤f(x)+αλ∇Tf(x)d
2.
f
(
x
+
λ
d
)
≥
f
(
x
)
+
μ
α
λ
∇
T
f
(
x
)
d
2.f (x+ λd) ≥ f (x) +\mu \alpha \lambda \nabla^T f (x)d
2.f(x+λd)≥f(x)+μαλ∇Tf(x)d
其中
α
∈
(
0
,
0.5
)
,
μ
∈
(
α
,
1
)
\alpha \in (0,0.5),\mu \in (\alpha,1)
α∈(0,0.5),μ∈(α,1)
迭代步骤同法则1。
法则3:Wolfe - Powell 法
类似Goldstein法,把条件2的要求改为对导数的要求。
λ
k
\lambda_k
λk需要满足以下条件:
1.
f
(
x
+
λ
d
)
≤
f
(
x
)
+
α
λ
∇
T
f
(
x
)
d
1.f (x+ λd) ≤ f (x)+\alpha \lambda \nabla^T f (x)d
1.f(x+λd)≤f(x)+αλ∇Tf(x)d
2.
∇
T
f
(
x
+
λ
d
)
≥
f
(
x
)
+
μ
∇
T
f
(
x
)
d
2. \nabla^Tf (x+ λd) ≥ f (x) +\mu \nabla^T f (x)d
2.∇Tf(x+λd)≥f(x)+μ∇Tf(x)d
其中
α
∈
(
0
,
0.5
)
,
μ
∈
(
α
,
1
)
\alpha \in (0,0.5),\mu \in (\alpha,1)
α∈(0,0.5),μ∈(α,1),实际中常取
α
=
0.1
,
μ
=
0.7
α=0.1 , \mu =0.7
α=0.1,μ=0.7附近 。
.