Brent求根号2

本文介绍了一个使用Brent算法来寻找根号2近似值的Java程序。该算法通过迭代逐步逼近平方根,误差由函数值控制,展示了算法的精度和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


public class TestBrentSqrt2 {

   public static void main(String[] args) {
     double sqrt2 = brent(1,2,10e-2);
     System.out.println("sqrt2 = " + sqrt2);
   }

  private static double brent(double lo, double hi, double precison) {
    double fa = computeObjectiveValue(lo);
    double fb = computeObjectiveValue(hi);
    double a = lo;
    double b = hi;
    double c = lo;
    double fc = fa;
    double d = hi - lo;
    double e = d;
    double t = precison;
    double eps = 10E-14;

    while(true) {
      if (Math.abs(fc) < Math.abs(fb)) {
        a = b;
        b = c;
        c = a;
        fa = fb;
        fb = fc;
        fc = fa;
      }

      double tol = 2.0D * eps * Math.abs(b) + t;
      double m = 0.5D * (c - b);
      if (Math.abs(m) <= tol || Math.abs(fb)<t) {
        return b;
      }

      if (Math.abs(e) >= tol && Math.abs(fa) > Math.abs(fb)) {
        double s = fb / fa;
        double p;
        double q;
        if (a == c) {
          p = 2.0D * m * s;
          q = 1.0D - s;
        } else {
          q = fa / fc;
          double r = fb / fc;
          p = s * (2.0D * m * q * (q - r) - (b - a) * (r - 1.0D));
          q = (q - 1.0D) * (r - 1.0D) * (s - 1.0D);
        }

        if (p > 0.0D) {
          q = -q;
        } else {
          p = -p;
        }

        s = e;
        e = d;
        if (p < 1.5D * m * q - Math.abs(tol * q) && p < Math.abs(0.5D * s * q)) {
          d = p / q;
        } else {
          d = m;
          e = m;
        }
      } else {
        d = m;
        e = m;
      }

      a = b;
      fa = fb;
      if (Math.abs(d) > tol) {
        b += d;
      } else if (m > 0.0D) {
        b += tol;
      } else {
        b -= tol;
      }

      fb = computeObjectiveValue(b);
      if (fb > 0.0D && fc > 0.0D || fb <= 0.0D && fc <= 0.0D) {
        c = a;
        fc = fa;
        d = b - a;
        e = d;
      }
    }
  }

  private static double computeObjectiveValue(double x){
     return x*x-2;
  }
}

忽略了报错。代码是apach的稍作修改。误差由函数值控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值