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的稍作修改。误差由函数值控制。