Finding roots of an equation is important in solving problems. In programming, numerical methods are used to find the roots. One of the popular method of root finding is secant method.
In each iteration, we compute the next value.
The above formula translates to
x2 = x1 - f(x1) * (x1 - x0) / (f(x1) - f(x0))
We reassign the variables and compute the next iteration.
x0 = x1;
x1 = x2;
So there are two ways, either we can define the fixed iterations, so we know beforehand the number of iterations or we check the difference between the last two x values.
if(Math.abs(x2 - x1) < 0.1f) break; // x1 and x2 are very close
If the two values are close to each other, then we can break the loop as we do not require further iterations.
def secant_method(f, x0, x1){
int n = 0; float x2 = 0.0f;
// Return the root calculated using the secant method.
while(true){
x2 = x1 - f(x1) * (x1 - x0) / (f(x1) - f(x0))
if(Math.abs(x2 - x1) < 0.000001f) break; // x1 and x2 are very close
x0 = x1;
x1 = x2;
println "iteration:"+ n++
}
return x2
}
def f_example = { x ->
return f = x**2 + 2*x + 1;
}
root = secant_method(f_example, -10, 10)
println root.round(6);
In groovy, if x2 is not defined explicity as float. If not, it will lead to computation of BigDecimal by default.
The above method will not work for complex roots sqrt(-1)
. For example, f = x**2 + 1
will consume a lot of iteratios and will not produce any value.
Secant method. (2022, November 14). In Wikipedia. https://en.wikipedia.org/wiki/Secant_method