牛顿迭代简单来说就是不断递归的过程
话不多说直接上代码后面解释原理
float my_sqrt(float number) {
float new_guess;
float last_guess;
if (number < 0) {
printf("Cannot compute the square root of a negative number!\n");
return -1;
}
new_guess = 1;
do {
last_guess = new_guess;
new_guess = (last_guess + number / last_guess) / 2;
printf("%.15e\n", new_guess);
} while (new_guess != last_guess);
return new_guess;
}
简单来说 求出根号a的近似值:首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了。
例如,我想求根号2等于多少。假如我猜测的结果为4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号2了:
( 4 + 2/4 ) / 2 = 2.25
( 2.25 + 2/2.25 ) / 2 = 1.56944…
( 1.56944…+ 2/1.56944…) / 2 = 1.42189…
( 1.42189…+ 2/1.42189…) / 2 = 1.41423…
….
用数学角度来说
求解步骤:
- 原函数:f(x)=xm−af(x)=xm−a
- 原函数的导函数:f′(x)=mxm−1f′(x)=mxm−1
- 使用牛顿迭代公式xn+1=xn−f(xn)f′(xn)xn+1=xn−f(xn)f′(xn):
曲线的斜率就是x的跟
或者节点为0的地方是跟