正文

牛顿法求平方根和立方根2005-08-23 19:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/elva6401/4076.html

分享到:

例题:采用牛顿法求平方根
给定一个正数x,如何计算x的平方根呢?
牛顿的逐步逼近法
对于x的平方根,给定一个猜测值y,则y与x/y的平均值是比y更好的一个猜测值,继续这一过程,会得到越来越好的猜测值。
如何用过程语言表述这一计算过程?
初始条件:给定 x 和 猜测值 guess
sqrt(guess,x){
if(goodEnough(guess,x)) return guess;
return sqrt(improve(guess,x),x);
}
goodEnough(guess,x){
    if(abs(guess*guess-x)<threshold) return true;
    return false;
}
Improve(guess,x){    return (guess+x/guess)/2;    }
这个例子体现了
可以通过一个过程递归的方法得到越来越好的猜测值;
可以把过程抽象成一个个的黑箱,来完成不同的操作,过程的抽象一方面隐蔽了一些细节,使求解的过程更清晰,另一方面可以通过局部的修改改进整个求值过程的功能;
例如,通过修改goodEnough里面的threshold就可以改变求解的精度,而不必修改其它部分。


求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:
            (x/y2+2y)/3
    请利用这一公式实现一个类似平方根过程的求立方根的过程。

代码:
#include<stdio.h>
#include <math.h>
float fun(float guess,float x)
{
    if(abs(guess*guess*guess-x)<0.0000001) return guess;
    else
    return fun((x/guess/guess+2*guess)/3,x);
}
int main()
{
float a,b;
while(scanf("%f%f",&a,&b))
printf("%f\n",fun(a,b));
}

阅读(8972) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册