解题思路:
牛顿迭代法公式:X[n+1]=(X[n]+a/X[n])/2 ,由此可知牛顿迭代法需要知道两个临近的X值,一个是 X[n] ,另一个则是它的后一项 X[n+1] ,根据题目要求,当两个X值之差的绝对值,也即 |X[n+1]-X[n]|<=0.00001 时,即可认为此时的结果就是这个要求的数的平方根,由于事先并不知道X[n+1]和X[n]的值,而牛顿迭代法求解平方根也只需要关注前后两个X值之差的绝对值是否在误差范围内,对于X的值是多少并不重要,因此不妨假设初值X1=1,或者X1=a/2(a是要求平方根的数),总而言之,X的值可以是不为负数的任意值(负数没有平方根),然后根据初值X1,可以求出相邻下一项的值即X2,然会带入表达式 X[n+1] = (X[n]+a/X[n])/2中,继续重复之前的操作,直到X1与X2之差的绝对值小于0.00001,此时X[n+1]的值就是这个数的平方根。
注意事项:
1、牛顿迭代法公式:X[n+1] = (X[n] + a/X[n])/2
2、负数是没有平方根的,所以初值和需要求解的值不能为负数
3、只有当|X[n+1]-X[n]|<=0.00001时,才会结束迭代,也就是退出循环
参考代码:
#include "stdio.h" #include "math.h" int main() { double X1, X2, a; while (scanf("%lf", &a) && a >= 0) // 输入不能为负数 { X1 = a / 2; // 随机猜测一个非负数作为初值,不妨猜测X1为a/2 X2 = (X1 + a / X1) / 2; while (fabs(X1 - X2) >= 1e-5) // 判断结束条件,当前后两个x值之差小于1e-5时结束循环 { X1 = X2; // 把当前X2的值赋值给X1,也就是把X[n+1]的值赋值给X[n] X2 = (X1 + a / X1) / 2; // 重新根据牛顿迭代法求出新的X2的值,也就是X[n+1]的值 } printf("%0.3lf\n", X2); // 此时的X2的值近似等于a的平方根 break; // 去掉break就可以实现循环求解输入的a的平方根 } return 0; }
0.0分
2 人评分