方程求根
有如下方程,求解方程 根:
求根不是求极值点,理解清楚区别!
如果是求极值点,那么牛顿法和梯度下降都可以。但是求根,那么梯度下降就不行了。
牛顿迭代

假设方程 在 附近有一个根,那么使用以下迭代公式, 将会无限逼近方程的根 :
上述公式是由泰勒一阶展开得到的:
首先对 一阶展开
, 所以有
牛顿迭代法就是在不断迭代的过程中逼近曲线的根,可以看做,它就是用来求曲线的根的。
所以它是怎么个迭代的过程,先上个动图:

具体迭代步骤如下:
- 先选取一个 初始近似值
cur_root = ini_root
- 然后 根据上述公式不断的迭代 cur_root
def newton_method(ini_root, epison): # 方程 f(x) def f(x): pass # f(x) 的导函数 def df(x): pass cur_root = ini_root # 初始迭代值,可以任意选取 # epison 为精度 while abs(f(cur_root )) > epison: nxt_root = cur_root - f(cur_root ) / df(cur_root ) cur_root = nxt_root return cur_root
割线法
在牛顿迭代法中,当前根的更新公式为:
在牛顿法中,每一步都需要计算当前点的导数值,需要手动求导。如果不想人工求导,可以使用两点割线来代替切线,从而得到割线法,因此割线法又称分立牛顿法。
此时,需要回忆导数的定义,即用导数的定义来求解当前点的导数:
二分法
数学基础:对于连续函数 f(x) 构成的方程 :f(x) = 0, 如果在区间[a, b]上满足:
- f(a)f(b) < 0, 那么 区间 [a, b] 内至少存在一点 x_* 使得f(x_*) = 0
基本思想:取中间点 c = \frac{a+b}{2} ,如果 f(a)f(c) < 0, 则根位于区间[a, c] 内,否则根位于 区间[c, b]内。对根存在的区间继续取中点,直到当前根 cur_root 的函数值小于可接受误差为止。
def f(x): pass def binary_method(l, r, epison): if f(l) * f(r) > 0: return None error = f(l) while error > epison: m = l + (r - l) / 2 if f(m) * f(l) < 0: r = m else: l = m error = abs(f(l)) return l