一,牛顿迭代法一般用来求f(x)为0的解
通过先选一个x的近似值开始逐渐逼近。初始Xn的选择也是有讲究的。
简单来说,一阶导数是自变量的变化率,二阶导数就是一阶导数的变化率,也就是一阶导数变化率的变化率。 连续函数的一阶导数就是相应的切线斜率。一阶导数大于0,则递增;一阶倒数小于0,则递减;一阶导数等于0,则不增不减。 而二阶导数可以反映图象的凹凸。二阶导数大于0,图象为凹;二阶导数小于0,图象为凸;二阶导数等于0,不凹不凸。
二,牛顿迭代法的优缺点
牛顿法优点:二阶收敛,收敛速度快;牛顿法可以求最优化问题,而且求解精确,一般用牛顿法求得的解成为ground-truth。
牛顿法缺点:
1 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。二阶方法实践中对高维数据不可行。
2 可能发生被零除错误。当函数在它的零点附近,导函数的绝对值非常小时,运算会出现被零除错误。
3 是可能出现死循环。当函数在它的零点有拐点时,可能会使迭代陷入死循环。Note:f(x) = arctanx, 2阶导产生(拐点) f''(x*) = 0。
4 定步长迭代。改进是阻尼牛顿法。
三,python主要函数介绍
3.1定义变量-Symbols函数
x = symbols(‘x‘)
x + 1
x + 1
3.2 变量替换subs函数
x = symbols(‘x‘)
expr = x + 1
expr.subs(x, 2)
3
3.3微分-Symbols函数
from sympy import *
x = Symbol(‘x‘)
diff(sin(x), x)
cos(x)
四,python代码实现
迭代计算4次迭代停止。还有一种方法就是S(n+1)-Sn设置为某个精度值来停止。
def NewTon(f, s = 1, maxiter = 100, prt_step = False):
for i in range(maxiter):
s = s - f.subs(x,s)/f.diff().subs(x,s)
if prt_step == True:
print ("After {0} iteration, the solution is updated to {1}".format(i+1,s))
return s
from sympy import *
import matplotlib.pyplot as plt
import numpy as np
x = Symbol("x")
f = x*2-2x-4
print (NewTon(f, s = 2, maxiter = 4, prt_step = True))
x = np.linspace(0,5,100)
y = [val*2-2val-4 for val in x]
plt.axhline(y=0,xmin=0,xmax=1,color = 'black')
plt.plot(x, y) # plotting x and y
plt.show()
五,牛顿迭代法推导