简介
牛顿法(Newton’s method)又称为牛顿-拉普森法(Newton-Raphson method),是一种用于数值优化的迭代方法。它以数学家艾萨克·牛顿的名字命名,用于寻找函数的根或近似解。牛顿法的基本思想是:
用
ϕ
(
x
)
\phi(x)
ϕ(x)在已知点
x
0
x_0
x0处的二阶Taylor展开式来近似代替
ϕ
(
x
)
\phi(x)
ϕ(x),令
ϕ
(
x
)
≈
g
(
x
)
\phi(x)\approx g(x)
ϕ(x)≈g(x),其中:
g
(
x
)
=
ϕ
(
x
0
)
+
ϕ
′
(
x
0
)
(
x
−
x
0
)
+
(
1
/
2
)
ϕ
′
′
(
x
0
)
(
x
−
x
0
)
2
g(x)=\phi(x_0)+\phi^{'}(x_0)(x-x_0)+(1/2)\phi^{''}(x_0)(x-x_0)^{2}
g(x)=ϕ(x0)+ϕ′(x0)(x−x0)+(1/2)ϕ′′(x0)(x−x0)2,用
g
(
x
)
g(x)
g(x)的极小点
x
∗
x^*
x∗作为
ϕ
(
x
)
\phi(x)
ϕ(x)的近似极小点。由于
g
′
(
x
)
=
ϕ
′
x
0
+
ϕ
′
′
(
x
0
)
(
x
−
x
0
)
g^{'}(x)=\phi^{'}x_0+\phi^{''}(x_0)(x-x_0)
g′(x)=ϕ′x0+ϕ′′(x0)(x−x0),令
g
′
(
x
)
=
0
g^{'}(x)=0
g′(x)=0,则
x
1
=
x
0
−
ϕ
′
(
x
0
)
ϕ
′
′
(
x
0
)
x_1=x_0-\frac{\phi^{'}(x_0)}{\phi^{''}(x_0)}
x1=x0−ϕ′′(x0)ϕ′(x0),故可以得到近似极小点的迭代公式
x
k
+
1
=
x
k
−
ϕ
′
(
x
k
)
ϕ
′
′
(
x
k
)
x_{k+1}=x_k-\frac{\phi^{'}(x_k)}{\phi^{''}(x_k)}
xk+1=xk−ϕ′′(xk)ϕ′(xk),
k
=
0
,
1
,
2
,
…
k=0,1,2,\ldots
k=0,1,2,…。当
∣
ϕ
′
(
x
k
)
∣
<
δ
\lvert\phi^{'}(x_k)\lvert<\delta
∣ϕ′(xk)∣<δ时,收敛,
δ
\delta
δ表示给定的收敛精度。
值得注意的是牛顿法产生的序列即使是收敛的,他的极限也不一定是
ϕ
(
x
)
\phi(x)
ϕ(x)的极小点,只能保证他是
ϕ
(
x
)
\phi(x)
ϕ(x)的驻点,驻点可能是极大点、极小点,或者二者都不是。只有当
ϕ
′
′
(
x
k
)
>
0
\phi^{''}(x_k)>0
ϕ′′(xk)>0时,才能保证收敛到极小点。
牛顿法的优点是收敛速度很快,至少二阶收敛,缺点是需要计算二阶导数,并且初始点对结果收敛性影响较大
优化问题
求
f
(
x
)
=
x
4
−
4
x
3
−
6
x
2
−
16
x
+
4
f(x)=x^{4}-4x^{3}-6x^{2}-16x+4
f(x)=x4−4x3−6x2−16x+4的极小值点。
计算程序如下:
def newton_method_f(x0, gap):
"""
采用牛顿法求解函数极小值/极大值
:param x0:初始点
:param gap:收敛精度
"""
i = 0
d_x = derivative_cal_f1(x0) # 一阶导数
x = x0 # 近似点
while abs(d_x) > gap:
if i > 0:
d_x = derivative_cal_f1(x) # 一阶导数
dd_x = derivative_cal_f2(x) # 二阶导数
if abs(dd_x) < 1e-3:
print(f"函数在{x}点二阶导数为0请更换方法!")
break
elif dd_x > 1e-3:
name = "极小值"
else:
name = "极大值"
temp_x = x-d_x/dd_x
x = temp_x
i += 1
print(f"第{i}次迭代{name}点", x)
def derivative_cal_f1(x):
"""
一阶导数计算函数
"""
return 4*x**3-12*x**2-12*x-16
def derivative_cal_f2(x):
"""
二阶导数计算函数
"""
return 12*x**2-24*x-12
if __name__ == "__main__":
newton_method_f(6, 1e-3)
输出结果:
第1次迭代极小值点 4.753623188405797
第2次迭代极小值点 4.164536065619037
第3次迭代极小值点 4.010504477133655
第4次迭代极小值点 4.000046976980266
第5次迭代极小值点 4.000000000945759
第6次迭代极小值点 4.0
可以看出牛顿法收敛速度很快,仅仅迭代6次就找到了极小值点4。