package utils;
interface Function {
public double f(double x);
}
class AnnuityFunction implements Function {
public double f(double r) {
return (12 * 250 / r) * Math.pow((1 + r / 12), 240) - 1 - 250000;
}
}
public class RootFinder {
public static void main(String args[]) {
double i = bisection(0.1, 0.2, new AnnuityFunction());
System.out.println("i=" + i);
}
public static double bisection(double a, double b, Function fi) {
double m = 0.0;
int trys = 0;
while (isNotCloseEnough(a, b)) {
m = (a + b) / 2;
if (fi.f(m) == 0) break;
if (fi.f(a) * fi.f(m) < 0)
b = m;
else
a = m;
trys++;
} System.out.println("done in:" + trys + " trys");
return m;
}
public static final double falsePosition(double a, double b, Function fi) {
double xold = a,
xn = b,
m = 0.0;
while (isNotCloseEnough(a, b)) {
xold = xn;
m = (a * fi.f(b) - b * fi.f(a)) / (deltaF(b, a, fi));
if (fi.f(m) == 0) break;
if (fi.f(a) * fi.f(m) < 0)
b = m;
else
a = m;
xn = m;
}
return m;
}
private static final double deltaF(double b, double a, Function fi) {
return fi.f(b) - fi.f(a);
}
public static final double secant(double a, double b, Function fi) {
double m = 0.0;
while (isNotCloseEnough(a, b)) {
m = (a * fi.f(b) - b * fi.f(a)) / (deltaF(b, a, fi));
a = b;
b = m;
}
return m;
}
private static final boolean isNotCloseEnough(double a, double b) {
double stopCriterion = 0.0000001;
return Math.abs(a - b) > stopCriterion;
}
}