网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1078|回复: 0
打印 上一主题 下一主题

用牛顿迭代法做开方运算-Java

[复制链接]

97

主题

98

帖子

447

积分

版主

Rank: 7Rank: 7Rank: 7

积分
447
跳转到指定楼层
楼主
发表于 2020-5-9 16:19:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 一秉 于 2020-5-9 16:19 编辑

在Java中,我们可以调用Math.sqrt()方法求解一个数的开方,我们将用牛顿迭代法 去求解一个数的开方。

首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后 x 的值就已经相当精确了。
例如,我们要求 根号2 等于多少。假如我猜测的结果为 1.6,虽然预测值不准,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号 2 了:


( 1.6 + 2/ 1.6 ) / 2 = 1.425
(
1.425 + 2/ 1.425 ) / 2 = 1.4142543..




这种算法的原理很简单,就是不断用 (x,f(x)的切线来逼近方程 x^2−a=0的根。根号 a 实际上就是 x^2−a=0的一个正实根。f(x)的导数是 2x。也就是说,函数上任一点 (x,f(x)) 处的切线斜率是 2x。那么,x−f(x)/(2x) 就是一个比 x 更接近的近似值。
代入 f(x)=x^2−a得到 x−(x^2−a)/(2x),也就是 (x+a/x)/2。

class Math {
       int s;
       public double sqrt(int x) {
             this.s=x;
             if(x==0) return 0;
                  return count(x);
             }
       }
       public double count(double x){
              double res = (x + s / x) / 2;
              if (Math.abs(res - x) < 0.0000001) {//当两个值相差的精度达到阈值时,结束代码
                  return x;
              } else {
                  return count(res);
              }
       }
}

代码如上所示。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 11:28 , Processed in 0.033672 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表