采用牛顿法进行一维搜索

简介

牛顿法(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)(xx0)+(1/2)ϕ′′(x0)(xx0)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)(xx0),令 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)=x44x36x216x+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.7536231884057972次迭代极小值点 4.1645360656190373次迭代极小值点 4.0105044771336554次迭代极小值点 4.0000469769802665次迭代极小值点 4.0000000009457596次迭代极小值点 4.0

可以看出牛顿法收敛速度很快,仅仅迭代6次就找到了极小值点4。

  • 51
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知情人士黄某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值