引言
牛顿法是求解最优问题的一种常用方法。
方法简述
本文主要在实现使用牛顿法进行开平方操作,代码使用python实现。在开平方求解中,更多的可以参考这篇文章。牛顿法是一种最优化求解方法,在迭代过程中求取到最接近解的值,类似的还有梯度下降等等。
方法分析
这里主要讲解我对该方法的推导,有错误之处麻烦指出。
首先针对开根号求解,可用以下式子描述:
x
=
n
x=\sqrt{n}
x=n
将该式换成:
x
2
=
n
x^{2}=n
x2=n
移项得
x
2
−
n
=
0
x^{2} - n = 0
x2−n=0
要求出n的开跟结果,其实就是求出该式的解,对于该式,可以描述为:
x
2
−
n
=
y
x^{2} - n = y
x2−n=y
也就是求出该抛物线与x轴的交点,因为实数范围内求出的开根号结果大于0,因此只需要计算大于零的一边。对于该式的求解,牛顿法的迭代速度较快。
图中,首先给定初始的值,这个值可以随便给,图中选的是x=4,如红色竖线所示。牛顿法的精髓就在于,给定初始值之后,能够快速下降到目标解。在x=4这一点,获取该点的切线,如图紫色斜线所示。求出该点切线与x轴交点即为下次迭代的x值,最后迭代多次之后,如果在误差范围内,输出结果。
令给定一个初始值
x
1
x_{1}
x1。
在式中:
x
2
−
n
=
y
x^{2} - n = y
x2−n=y
其对应的点为
(
x
1
,
x
1
2
−
n
)
(x_{1},x_{1}^{2} - n)
(x1,x12−n),该点对应的斜率为 2x1,斜率公式为:
2
x
=
y
2x = y
2x=y
斜率公式可通过对x求导得出。将点和斜率带入斜线公式:
a
x
+
b
=
y
ax+b=y
ax+b=y
求得下一个迭代的点为:
x
2
=
−
b
a
=
n
2
x
1
+
x
1
2
x_{2}=\frac{-b}{a}=\frac{n}{2x_{1}}+\frac{x_{1}}{2}
x2=a−b=2x1n+2x1
迭代多次,知道求出
x
n
−
x
n
−
1
<
δ
x_{n}-x_{n-1}<\delta
xn−xn−1<δ,
δ
\delta
δ为自定的误差范围。
代码如下:
def SquareRoot(n):
tx = 100
lstx = tx
for i in range(10):
tx = (n / tx / 2 + tx / 2)
if (abs(tx - lstx) < 0.0000001):
break
lstx = tx
return tx
测试了本方法与系统自带方法运算效率:
可能是因为python的原因,结果虽然正确,但是时间上时系统自带方法的两倍。但是就算如此,该方法也比二分法好。
GitHub Link:https://github.com/ThisskyMain/MyAlgorithm