Java使用牛顿迭代法求一个数的算术平方根

转自:https://blog.csdn.net/howroad/article/details/79284465

牛顿迭代法:

随便找一个曲线上的A点,做一个切线,切线的根与曲线的根还有一定的距离。从这个切线的根出发,做一根垂线,和曲线相交于B点,继续重复刚才的工作,经过多次迭代会越来越接近 曲线的根,迭代收敛.

方程f(x)-M=0;

二次方程,首先不考虑震荡/多根/远离等情况

首先随意给一个值 x0,得到过该点的切线方程

f’(x0)(x-x0)+f(x0)=0;

求得该切线的跟

x1=x0-f(x0)/f’(x0);

从图像上看x1比x0更接近原始方程的解.

再求点(x1,f(x1))的切线方程;

f’(x1)(x-x1)+f(x1)=0;

根为:x2=x1-f(x1)/f’(x1);

x2比x1更接近方程的解

所以若干次重复后,xn就是非常接近二次方程的解.

其中f’(x)=2x;x0为随便的一个数字;f(x)=x^2-m

用java傻瓜方式写出来如下:

    public static void main(String[] args) {

        System.out.println(sqrt(2));//1.414213562373095
    }
    public static double sqrt(double m) {
        double x=5201314;//随便给一个数
        for(int i=0;i<30;i++) {//迭代50次,求过切线的根x的切线的根...
            x=(x*x+m)/2/x;
        }
        return x;
    }

便于理解把这个方程拆成以下几个

    public static double sqrt2(double m) {
        double x0=1.0;//随便给一个值
        for(int i=0;i<20;i++) {//重复20次
            x0= myGetX(x0,m);
        }
        return x0;
    }
    public static double myGetY(double x,double m) {
        return x*x-m;
    }
    public static double myGetX(double x,double m) {
        return x-myGetY(x,m)/2/x;
    }

最终版

    public static double sqrt3(double c) {
        if(c<0) return Double.NaN;
        double err=1e-15;//定义一个很小的误差
        double t=c;
        while(Math.abs(t-c/t)>err*t) {//实际上为t^2-c>err,表示最终结果和真实的平方根相差不超过1的负15次方
            t=(c/t+t)/2.0;
        }
        return t;
    }

参考:http://www.matongxue.com/madocs/205.html#/madoc

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值