关于计算机程序算法的一道题,请高手帮忙解决!

开发一个算法来求一个正数的平房根。开始时,把这个正数本身作为根的第一个猜测值,以后按下列方法重复地产生新的猜测值:原正数除以现在的猜测值得到商,取这个商和该猜测值的平均值作为下一个猜测值。分析对这个重复过程的控制,特别是,重复的终止条件是什么?

终止的条件可以设成
|x(k+1)-x(k)| < tol * x(k+1)
这里tol是一个事先给定的精度要求(比如tol=10^{-6})追问

这里的x和k分别表示什么?能写成c语言的形式吗?

追答

x(k)表示的是第k个猜测值

追问

如果要验证你的答案,比如求100的平方根,tol 应该设为多少合适?

追答

如果你用c语言的话,取决于你用float还是double
float可以用2e-7, double可以用2e-16

追问

我写了个c程序求100的平方根,结果怎么是50!
#include
#include

main()
{
float m = 100;
float n = 100, h;
float tol = 2e-7;

/*n表示x(k+1),m表示x(k)*/
while( fabs(n - m) < tol * n )
{
h = (m/n + n)/2;
m = n;
n = h;
}
printf( "%f\n", h );

return 0;
}

我写了个c程序求100的平方根,结果怎么是50!
#include
#include

main()
{
float m = 100;
float n = 100, h;
float tol = 2e-7;

/*n表示x(k+1),m表示x(k)*/
while( fabs(n - m) < tol * n )
{
h = (m/n + n)/2;
m = n;
n = h;
}
printf( "%f\n", h );

return 0;
}

追答

#include
#include

int main()
{
float a = 100;
float m = 100;
float n = 100, h;
float tol = 2e-7;

do
{
h = (a/n + n)/2;
m = n;
n = h;
} while( fabs(n - m) > tol * n );
printf( "%f\n", h );

return 0;
}

追问

#include

main(void)
{
float m = 100, n, h;

n = m;
while( n * n != m )
{
h = (m/n + n)/2;
n = h;
}
printf( "%f\n", n );

return 0;
}
只需这样就搞定了,呵呵。
我们都想复杂了,思维啊!

追答

你把问题想得太简单了,浮点数有舍入误差,如果要求n*n==m有可能会出现死循环

追问

其实连变量tol 都不需要,直接写为while(fabs(n-a) == 0)即可。因为不管有没有发生溢出,最终n减a都将是0!

其实连变量tol 都不需要,直接写为while(fabs(n-a) != 0)即可。因为不管有没有发生溢出,最终n减a都将是0!

追答

还是那句话,你把问题想得太简单了,你缺乏浮点运算的基本知识

尽管Newton法有二次收敛性,但要想用等号来判断至少需要排除浮点运算下迭代法出现交错的情况,要证明这一点需要加很多额外的条件,且不论这是不是真的成立,即使成立你也得验证所有条件都满足,绝不是像你想象的那么简单

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答