python用牛顿迭代法求平方根_利用牛顿迭代法求平方根 - 业精于勤,荒于嬉;行成于思,毁于随! - OSCHINA - 中文开源技术交流社区...

本文介绍了如何利用牛顿迭代法求解平方根,通过数学推导展示了迭代过程,并提供了Python实现。文章还探讨了牛顿迭代法的通用性,不仅适用于平方根,还可用于求解其他根。最后,给出了C语言实现的一个简单求平方根的例子。
摘要由CSDN通过智能技术生成

数理介绍,不喜欢数学的言下之意也就是绝大部分人可以略过了。

简单推导

假设f(x)是关于X的函数:

61d79441b39371045595421edc48fc0a.gif

求出f(x)的一阶导,即斜率:

e6b0d899646c74d9e12db7f9834a4bde.gif

简化等式得到:

37c1198b80ca0253e1c942d497d630a4.gif

然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值,为什么可以用迭代法呢?理由是中值定理(Intermediate Value Theorem):

如果f函数在闭区间[a,b]内连续,必存在一点x使得f(x) = c,c是函数f在闭区间[a,b]内的一点

我们先猜测一X初始值,例如1,当然地球人都知道除了1本身之外任何数的平方根都不会是1。然后代入初始值,通过迭代运算不断推进,逐步靠近精确值,直到得到我们主观认为比较满意的值为止。例如要求768的平方根,因为252 = 625,而302 = 900,我们可先代入一猜测值26,然后迭代运算,得到较精确值:27.7128。

回到我们最开始的那个”莫名其妙”的公式,我们要求的是N的平方根,令x2 = n,假设一关于X的函数f(x)为:

f(X) = X2 - n

求f(X)的一阶导为:

f'(X) = 2X

代入前面求到的最终式中:

Xk+1 = Xk - (Xk2 - n)/2Xk

化简即得到我们最初提到的那个求平方根的神奇公式了:

64baa8211b65141fd758e18a8ce4ef12.gif

用泰勒公式推导

我之前介绍过在The Art and Science of C一书中有用到泰勒公式求平方根的算法,其实牛顿迭代法也可以看作是泰勒公式(Taylor Series)的简化,先回顾下泰勒公式:

168035073d7e8d77baeeb1f740fb10c2.gif

仅保留等式右边前两项:

62ebd1913ecd3dfa8bfb23bcf58ac4d1.gif

令f(X0+ε) = 0,得到:

32cf345c724d382dab15e6e0afe69787.gif

再令X1 = X0 + ε0,得到ε1…依此类推可知:

142e68d558258867f8a62813a8f04ac3.gif

转化为:

37c1198b80ca0253e1c942d497d630a4.gif

引申

从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。

同样,我们还可以利用C语言来实现下那个最简单的求平方根的公式(尽管我们可以直接用sqrt()完成)

#include

#include

#define N 768

main() {

float x=1;

int i;

for (i=1;i<=1000;i++) { // recursion times : 1000

x = (x + N/x)/2;

}

printf("The square root of %d is %f\n",N,x);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值