less progress per iteration than Muller's method and Newton's method makes more progress. More precisely, if ξ denotes a single root of f (so f(ξ) = 0 and f'(ξ) ≠ 0), f is three times continuously differentiable, and the initial guesses x0, x1, and x2 are taken sufficiently close to ξ, then the iterates satisfy where μ ≈ 1.84 is the positive solution of . Generalizations and related methods Muller's method fits a parabola, i.e. a second-order polynomial, to the last three obtained points f(xk-1), f(xk-2) and f(xk-3) in each iteration. One can generalize this and fit a polynomial pk,m(x) of degree m to the last m+1 points in the kth iteration. Our parabola yk is written as pk,2 in this notation. The degree m must be 1 or larger. The next approximation xk is now one of the roots of the pk,m, i.e. one of the solutions of pk,m(x)=0. Taking m=1 we obtain the secant method whereas m=2 gives Muller's method. Muller calculated that the sequence {xk} generated this way converges to the root ξ with an order μm where μm is the positive solution of . The method is much more difficult though for m>2 than it is for m=1 or m=2 because it is much harder to determine the roots of a polynomial of degree 3 or higher. Another problem is that there seems no prescription of which of the roots of pk,m to pick as the next approximation xk for m>2. These difficulties are overcome by Sidi's generalized secant method which also employs the polynomial pk,m. Instead of trying to solve pk,m(x)=0, the next approximation xk is calculated with the aid of the derivative of pk,m at xk-1 in this method. Computational example Below, Muller's method is implemented in the Python programming language. It is then applied to find a root of the function . from typing import * from cmath import sqrt # Use the complex sqrt as we may generate complex numbers Num = Union[float, complex] Func = Callable[[Num], Num] def div_diff(f: Func, xs: list[Num]): """Calculate the divided difference f[x0, x1, ...].""" if len(xs) == 2: a, b = xs return (f(a) - f(b)) / (a - b) else: return (div_diff(f, xs[1:]) - div_diff(f, xs[0:-1])) / (xs[-1] - xs[0]) def mullers_method(f: Func, xs: (Num, Num, Num), iterations: int) -> float: """Return the root calculated using Muller's method.""" x0, x1, x2 = xs for _