例题:采用牛顿法求平方根
给定一个正数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));
}
正文
牛顿法求平方根和立方根2005-08-23 19:28:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/elva6401/4076.html
阅读(9116) | 评论(2)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论