牛顿切线法(算法分析+代码解释)

前言:

在经历了之前三期的一维搜素算法之后,我们今天介绍一个利用目标函数二阶泰勒多项式的最优解作为函数的近似最优解的方法——牛顿切线法,又名抛物线法。

黄金分割算法(算法分析+python代码解释)

黄金分割算法(算法分析+python代码解释)

二分法(算法分析+python代码解释)

算法原理:

牛顿切线法利用目标函数二阶泰勒多项式的最优解作为函数的近似最优解,如果新的近似最优解满足计算精度,如在新的近似最优解的一阶导数为零,则终止计算,否则再将函数在新点展开成二阶泰勒展多项式,用新的泰勒多项式的最优解作为函数的近似最优解,如此迭代,直到导数为零或者其绝对值小于事先给定的精度ε为止。由于该方法可看成切线法求导函数的零点,因此被称为牛顿切线法。

f(x)x_{k}点二阶泰勒展开:

f(x)=f(x_{k})+f'(x_{k})(x-x_{k})+\frac{1}{2}f''(x_{k})(x-x_{k})^{2}+o((x-x_{k})^{2})

略去高阶项得:

f(x)\approx f(x_{k})+f'(x_{k})(x-x_{k})+\frac{1}{2}f''(x_{k})(x-x_{k})^{2}

两边对x求导:

f'(x)\approx f'(x_{k})+f''(x_{k})(x-x_{k})

f'(x)=0,得到

x\approx x_{k}-\frac{f'(x_{k})}{f''(x_{k})}

取:

x_{k+1}\approx x_{k}-\frac{f'(x_{k})}{f''(x_{k})}

最为新的迭代点,继续迭代,直到达到精度,这样就得到了函数f的一个驻点x^{*}

在一定条件下(如:f''(x^{*})> 0),这个驻点是极小点。若f是二次函数,则一次迭代就可以得到极小点。

算法步骤:

步骤1:给定初始点x_{1} \in R,ε>0,令k=1.

步骤2:计算f'(x_{k}),f''(x_{k})

步骤3:若\left | f'(x_{k}) \right |<ε,停止,x^{*}\approx x_{k},否则转步骤4.

步骤4:计算x_{k+1}= x_{k}-\frac{f'(x_{k})}{f''(x_{k})},令k=k+1,转步骤2.

例题分析:

下面我们通过一道例题来加深一下对算法的认识。

例题:试用Newton法求函数f(x)=x^{4}-4x^{3}-6x^{2}-16x+4的最优解。(x_{0}=6,ε=10^{-2}

解:


算法代码:

'''
Newton算法
2023.10.8
'''
from sympy import *
x = symbols("x")
f = 2*x**3-12*x+9
# 一阶求导
first_grad = diff(f,x)
print("first_grad",first_grad)
# 二阶求导
second_grad = diff(first_grad,x)
print("second_grad",second_grad)
def run(x0,ε):
    count = 1

    x1=x0-first_grad.subs({x:x0})/second_grad.subs({x:x0})
    while True:
        if abs(first_grad.subs({x:x1}))> ε:
            print("第{}次迭代".format(count))
            x1 = x1 - first_grad.subs({x: x1}) / second_grad.subs({x: x1})
            print("得到的新的x1为:%f" %x1)
            count = count+1
            continue
        else:
            print("{:.4}".format(x1))
            break
    return x1


run(x0=2.0,ε=0.01)

用该代码所运算的结果为:

first_grad 6*x**2 - 12
second_grad 12*x
第1次迭代
得到的新的x1为:1.416667
第2次迭代
得到的新的x1为:1.414216
1.414

总结:

该方法的优点是:收敛速度快,局部二阶收敛。但是于此同时,缺点也较为明显:须计算二阶导数,工作量大;对初始点要求高,要求初 始点离极小点不太远,否则有可能使极小化发散或收敛到非极小点;局部收敛。

(行文中若有纰漏,希望大家指正)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

背对人潮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值