牛顿拉弗森迭代法
-
原始数学问题
在以前的数学家研究函数的根点的时候,牛顿和拉弗森分别都发现了一种使用作图来求解根点的方法。
根点 --- 方程的 0 点
如下图的 f ( x ) = x 2 f(x) = x ^ 2 f(x)=x2
如果我们随机在定义域里面取一个值作为我们的始点 x n x_n xn 并且我们做一条经过 ( x n , f ( x n ) ) (x_n,f(x_n)) (xn,f(xn)) 的切线如下图
而该切线的方程我们可以知道是: f ( x n ) − 0 = f ′ ( x n ) ( x n − X ) f(x_n) - 0 = f^{'}(x_n)(x_n -X) f(xn)−0=f′(xn)(xn−X) ,接着我们可以导出这条切线的根点也就是
X = x n − f ( x n ) f ′ ( x n ) X = x_n - \frac{f(x_n)}{f^{'}(x_n)} X=xn−f′(xn)f(xn)
我们可以发现上面公司导出的
X
X
X 是接近我们的 0
点的因此我们可以选择使用 这个
X
X
X 来作为我们的新的
x
n
+
1
x_{n+1}
xn+1
使用这个新的数字作为所及的一个点,然后在 $ (x_{n+1},f(x_{n+1})) $的新的切线然后再求一个新的 x n + 2 x_{n+2} xn+2
如此迭代我们就能求到一个逼近的根点。
但是这个办法也不是在所有的函数都适用,我们发现上面的公司里面有出现 f ′ ( x n ) f^{'}(x_{n}) f′(xn) 作为分母,因此我们在$f^{’}(x_{n}) == 0 $ 的时候是不能使用这种办法的。
使用牛顿拉弗森法求开平方
求解平方的问题,其实可以转化成为 $f(x) = x^2 - n = 0 $ 因此我们直接使用上面的公司进行迭代就行了。
int sqrt(int n){
int t= n / 2;
while(t*t>n){
t = (t + n / t)/2;
}
return t;
}