一个求平方根方法
昨天在论坛上看到一个算法,是算平方根的,很是惊艳,颇有艺术性。
公式:
(X1 + n/X1 )/2 = X2
n为要算的值,x1一开始随便取个值,然后算出x2,然后不断的把x2带入x1,算出x3,以此类推,大概迭代几次就很逼近要算的平方根了。
如:要算 7659的平方根
x1取10
x2 近似等于 388
x3 近似等于204
x4 近似 92
x5近似 87.6
x6近似 87.5157
87.5157^2 =7658.99775
迭代5次以后,取值范围已经很接近了,其他随便举例子基本上也都是五次左右就很接近了。
这么牛逼的算法是谁提出的呢?哪个大公司的大牛?这种老艺术家肯定年薪千万了吧。。
查了下资料,果然不出所望,这个公式是牛顿(对,头上落了个苹果的老艺术,真正的大牛,大牛鼻祖的牛)提出的牛顿迭代法求平方根。
这个算法的知识用到了我们高中数学学过的线性方程和导数方程。
已知n,求x的解 : x2 = n
f(x) = x2 -n 令 f(x) = 0,也就是求曲线与x轴相交时,x的值
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数, 也就是切线斜率,求证方法在下面,本题中斜率为2x。
令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。
一顿数学运算简化后:xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2
这个算法可以运用在编程中,具体不写了,数值稍微修改也可以求多次幂或者其他曲线函数的根。
幂函数导数公式的证明:
y=x^a
两边取对数lny=alnx
两边对x求导(1/y)*y'=a/x
所以y'=ay/x=ax^a/x=ax^(a-1)
这里,y'=2x
原理可参考,通俗易懂:https://blog.csdn.net/ccnt_2012/article/details/81837154