24.用牛顿迭代法求平方根
假设a。欲求a的平方根,首先猜测一个值X1=a/2,然后根据迭代公式X(n+1)=(Xn+a/Xn)/2,算出X2,再将X2代公式的右边算出X3等等,直到连续两次算出的Xn和X(n+1)的差的绝对值小于某个值,即认为找到了精确的平方根。例算步骤如下。
1.假设求6的平方根,当Xn和X(n+1)的差值小于0.001时,可以认为已经找到了精确值。
2.根据牛顿迭代法的步骤,首先猜测一个值X1,猜测X1=6/2=3。
求6的平方根:6/2=3
3.将X1=3代入公式X(n+1)=(Xn+a/Xn)/2,则X2=(X1+6/X1)/2=(3+6/3)/2=2.5,由于3和2.5的差大于0.001,需要继续计算。
X2=(X1+6/X2)/2=(3+6/3)/2=2.5
3-2.5>0.001
4.将X2=2.5代入公式X(n+1)=(Xn+a/Xn)/2,则X3=(X2+6/X2)/2=(2.5+6/2.5)/2=2.45,由于2.5-2.45=0.5>0.001,故需要继续计算。
X3=(X2+6/X2)/2=(2.5+6/2.5)/2=2.45
2.5-2.45=0.5>0.001
5.将X3=2.45代入公式X(n+1)=(Xn+a/Xn)/2,则X4=(X3+6/X3)/2=(2.45+6/2.45)/2=2.4495,由于2.5-2.4495=0.0005<0.001,故不需要继续计算。
X4=(X3+6/X3)/2=(2.45+6/2.45)/2=2.4495
2.45-2.4495=0.0005<0.001
6.则可以确定6的平方根,在自己认为的精确的范围内,即误差小于0.001的范围内,值为2.4495,即 √(6)=2.4495。
用迭代法求x=根号a。求平方根的迭代公式为:X(n+1)=(Xn+a/Xn)/2要求前后两次求出的x的差的绝对值小于10-5
解:用迭代法求平方根的算法如下:
(1)设定一个x的初值X1
(2)用以上公式求出X的一个值X2
(3)再将X2代入以上公式的右侧的Xn,求出X的下一个值X3;
(4)如此继续下去,直到前后两次求出的X值(Xn和Xn+1)满足一下关系:
|Xn+1—Xn|<10-5
为了便于程序处理,今只用X1和X2,先令X的初值为X1=a/2(也可以是另外的值),求出X1:如果此时 |Xn+1—Xn|>=10-5,就使X1 => X2,然后用这个新的X1求出下一个X2;如此反复,直到 |Xn+1—Xn|<10-5为止
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 float a,x1,x2; 7 scanf("%f",&a); 8 x1 = a/2; 9 x2 = (x1+a/x1)/2; 10 do 11 { 12 x1 = x2; 13 x2 = (x1+a/x1)/2; 14 }while(fabs(x1-x2)>=1e-5);//|Xn+1—Xn|>=10-5时执行循环当|Xn+1—Xn|<10-5时循环结束 15 /*while(fabs(x2-x1)>=1e-5)//不能用whil循环,因为当满足 |Xn+1—Xn|<10-5时跳出循环,并没有执行循环体。 16 { 17 x1 = x2; //do。。while循环则是执行过循环体后判断不满足|Xn+1—Xn|》=10-5 18 x2 = (x1+a/x1)/2; 19 }*/ 20 printf("a = %5.2f的平方根为:%8.5f\n",a,x2); 21 return 0; 22 }