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 }

原文地址:https://www.cnblogs.com/spore/p/10372015.html

时间: 2024-11-11 06:39:02

24.用牛顿迭代法求平方根的相关文章

经典算法:牛顿迭代法求平方根

//牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/(2*x); 7 y = x*x-num; 8 if(y<0) y = -y; 9 } while(y>0.0001); 10 return x; 11 } 12 int main(int argc, char* argv[]) 13 { 14 printf("%.3f",my

141. Sqrt(x)【牛顿迭代法求平方根 by java】

Description Implement int sqrt(int x). Compute and return the square root of x. Example sqrt(3) = 1 sqrt(4) = 2 sqrt(5) = 2 sqrt(10) = 3 Challenge O(log(x)) 题意:求给定数的平方根,如果用一般的方法,例如二分法之类的,需要考虑一下int型的范围,别溢出.最好的方法时牛顿迭代法.代码如下: public class Solution { /**

C语言之基本算法11—牛顿迭代法求平方根

//迭代法 /* ================================================================== 题目:牛顿迭代法求a的平方根!迭代公式:Xn+1=(Xn+a/Xn)/2. ================================================================== */ #include<stdio.h> #include<math.h> main() { float a,x0,x1;

利用牛顿迭代法求平方根

求n的平方根,先如果一推測值X0 = 1,然后依据下面公式求出X1,再将X1代入公式右边,继续求出X2…通过有效次迭代后就可以求出n的平方根,Xk+1 先让我们来验证下这个巧妙的方法准确性,来算下2的平方根 (Computed by Mathomatic) 1-> x_new = ( x_old + y/x_old )/2 y (x_old + -----) x_old #1: x_new = --------------- 2 1-> calculate x_old 1 Enter y: 2

[LeetCode]牛顿迭代法求平方根

题目 Implement int sqrt(int x). Compute and return the square root of x. 思路 用Math.sqrt就没什么意义了 二分法估计也行,但是估计没有牛顿下山法快 牛顿下山法 公式推导: 在x0处的值是f(x0),这个点的切线可以表示为 y = f`(x0)*(x - x0)+f(x0) 求得当y = 0的时候,x1 = x0 - f(x0)/f`(x0) 由此迭代下去可以收敛 牛顿法的形象解法 代码 public class Sol

[Swift算法]巴比伦法(牛顿迭代法)求平方根

数学原理推导: f(X) = X2 - n   ---公式(1) n为要求平方根的数值 比如 要求100的平方根 n = 100; 所以问题就转换成了求f(X)的零点问题了 f(Xn)的导数就是Xn+1 的斜率 所以就有了公式 所以 Xn+1 = Xn - f(Xn)/f'(Xn) 代入 公式1 f(Xn)=X2  -n f'(Xn)=2X Xn+1 = Xn - (Xn2 - n) / (2Xn) = Xn - 1/2 (Xn-n / Xn) = 1 / 2 (Xn + n / Xn) Xn

数学:牛顿迭代法求平方根和立方根

一. 求x的平方根,先假定初始值y(可以是1) 随后用迭代y=(y+x/y)/2  进行迭代循环求出x的平方根y. 二. 求x的立方根,先假定初始值为y 随后用跌打y=(2y+x/y^2)/2 进行迭代循环求出x的立方根y. 迭代次数越多,越接近真实值.误差=|y^2-x|

牛顿迭代法求平方根

1 #include <stdio.h> 2 #include <math.h> 3 4 double mysqrt(double n, double x0) 5 { 6 double x1; 7 double y; 8 9 x1 = (x0 + n/x0)/2.0; 10 11 if (fabs(x1-x0) >= 0.00001) 12 y = mysqrt(n, x1); 13 else 14 y = x1; 15 16 return y; 17 } 18 19 int

牛顿迭代法求平方根(c++代码)

闲着无聊随便写一写 #include <iostream> #include <math.h> float mSqrt( float number ){ float result = 0x5f3759df; //出自雷神中的开根号算法的黑魔法数 while ( fabs(result * result - number) > 0.0000001 ) { float temp = number / result; result = ( temp + result ) / 2;