牛顿法

原文地址:http://www.sosmath.com/calculus/diff/der07/der07.html

早在巴比伦时期人们就已经知道怎么用逼近的方法去求平方根。例如求\sqrt{2}的近似值。

首先需要从一个接近的值开始,我们取x_1 = 3/2 = 1.5,那么x_1 的平方是9/4, 显然是一个大于2 的数字,也就是说3/2 > \sqrt{2}. 然后我们在考虑2/x_1 = 4/3,它的平方是16/9,小于2,所以2/x_1 < \sqrt{2}

进一步的,我们取它们的平均值,记为x_2

x_2 = \frac{1}{2}(x_1+\frac{2}{x_1})=\frac{17}{12}.

再对x_2 进行平方,我们得到了289/144,这是一个比2 大的数字。如果我们再考虑2/x_2 = 24/17,它的平方是576/289 < 2.

再取它们的平均值x_3:

x_3 = \frac{1}{2}(x_2+\frac{2}{x_2}) = \frac{577}{408}.

x_3 已经是一个2 的平方根的很好的接近了:

x_3^2 = 332929/166464 \approx 2.000006007305,

如果对这个精度仍不满意,我们只需要重复之前的动作,直到得到足够的精度。

牛顿和拉夫森用微积分的思想,把这个古老的方法扩展到了求任意方程的零点

f(x) = 0.

底层的思路是用函数f(x)的切线去进行逼近。

令r为函数f(x)的一个零点,我们有f(r)=0. 假设f'(r) \ne 0. 选择离r较接近的一个数字,记为x_1(例如从函数图像上来找到这样一个点)。f(x) 在点(x_1,f(x_1)) 处的切线在x 轴的截距记为x_2.

从图像中我们看到x_2 距离r更近一些,同时很容易计算

x_2=x_1-\frac{f(x_1)}{f'(x_1)}.

因为我们已经假设了f'(r) \ne 0, 这里不会有0 作为除数的问题。我们继续这个过程来获得x_3

x_3=x_2-\frac{f(x_2)}{f'(x_2)}.

继续重复这个动作,我们可以获得一个数列{x_n} 趋近于r.

这个通过连续趋近的方式找到真正的零点的方法就叫做牛顿法,或者牛顿-拉夫森法。

例如,我们用牛顿法找到一个精确到十位小数的\sqrt{5} 的趋近值。

首先要注意到\sqrt{5} 是一个无理数,小数点后的位数是无尽的。很明显r=\sqrt{5} 是函数f(X)=x^2-5 在区间[1,3] 上的唯一零点,如图所示。

用牛顿法获取逐渐趋近的数列{x_n}:

x_{n+1} = x_n-\frac{f(x_n)}{f'(x_n)} = x_n – \frac{x_n^2-5}{2x_n}.

x_1=2 开始这个过程,我们有:

x_1=2

x_2=2.25

x_3=2.236111111111111111111111111111111

x_4=2.236067977915804002760524499654934

x_5=2.236067977499789696447872828327110

x_6=2.236067977499789696409173668731276

仅仅五次迭代我们就找到了精度超过小数点后十位的结果!

发表评论