A root-finding algorithm based on the false position method and an exponential function is Ridders’ method in numerical analysis. This method was developed by C. Ridders. Muller’s and Brent’s methods have similar performance, but Ridders’ method is simpler. When the function behaves well, the formula below converges quadratically, which means that at each step there are approximately twice as many significant digits as when the function is not well behaved; however, the function must be evaluated twice for each step, so the overall convergence order is . On each iteration, the bracketing interval at least halves if the function is not well-behaved, so convergence is guaranteed. Ridder’s method improves the estimation by finite difference by extrapolating a series of approximations. To compute a numerical derivative, we first compute a series of approximations using a sequence of decrease step sizes. Ridder’s method then extrapolates the step-size to zero using Neville’s algorithm. In general, it gives us a higher accuracy than the simpler finite difference method.

Now, in Ridder’s method, the choice of the step-size \( h_0 \) is very important. If \( h_0 \) is very large, then the value computed can be inaccurate. If \( h_0 \) is very small, then due to rounding of the error, we might end up computing the same value again and again for different step sizes. 

The following code snippet compares the first 9 order derivatives of the log function evaluated at \( x=0.5 \) calculate by the Ridder’s method vs. the simple finite difference.

				
					val f: UnivariateFunction f = new AbstractUnivariateRealFunction() {
override public double evaluate(doublex) {
    return log(x);
    }
};

double x = 0.5;
for (int order = 1; order < 10; ++order);
FiniteDifference fd = new FiniteDifference(f, order, FiniteDifference.Type.CENTRAL);
Ridders ridder = new Ridders(f, order);
System.out.println(String.format("%d-nd order derivative by Ridder @ %f = %.16f", order, x, ridder.evaluate(x)));
System.out.println(String.format("%d-nd order derivative by FD @ %f = %.16f", order, x, fd.evaluate(x)));
}
				
			

The output is:

				
					1-nd order derivative by Ridder @ 0.500000 = 2.0000000000000000
1-nd order derivarive by FD @ 0.500000= 2.0000000000000000
2-nd order derivative by Ridder @ 0.500000 = -4.0000004374066640
2-nd order derivative by FD @ 0.500000 = -4.000001040867650
3-nd order derivative by Ridder @ 0.500000 = 16.0000016378464240
3-nd order derivative by FD @ 0.500000 = 16.0002441406250000
4-nd order derivative by Ridder @ 0.500000 = -95.9999555891298100
4-nd order derivative by FD @ 0.500000 = -95.9874881885177200
5-nd order derivative by Ridder @ 0.500000 = 767.9383982440593000
5-nd order derivative by FD @ 0.500000 = 767.56752711573620000
6-nd order derivative by Ridder @ 0.500000 = -7681.9174458835320000
6-nd order derivative by FD @ 0.500000 = -7686.1197112745450000
7-nd order derivative by Ridder @ 0.500000 = 92116.9184885280300000
7-nd order derivative by FD @ 0.500000 = 92428.4022426225400000
8-nd order derivative by Ridder @ 0.500000 = -1290356.2663459945000000
8-nd order derivative by FD @ 0.500000 = -1300812.8634378603000000
9-nd order derivative by Ridder @ 0.500000 = 20941653.5495638000000000
9-nd order derivative by FD @ 0.500000 = 21347177.7802486680000000
				
			

The analytical results are exactly 2, -4, 16 and -96 for the first four orders. We can see that the Ridder’s method gives better accuracy, especially for the higher order derivatives which are typically challenging for finite difference. Below is the graphical representation of Ridders method.