Calculates the zeros of a function using Muller's method.
Controller:
Interface
#include <codecogs/maths/rootfinding/muller.h>
using namespace Maths::RootFinding;
double | muller (double (*f)(double), double x0 = 0, double d = 3, double eps = 1E-10, int maxit = 1000)
Calculates the zeros of a function using Muller's method. |
Use the following HTML code to embed the calculators within other websites:
Muller
This method extends the idea of the secant method which works with a linear polynomial, to a quadratic polynomial.
Given three previous estimates
,
and
, for an unknown root, a new value is computed by
where
and
The values
may yield too large changes for
which possibly leads to another root and causes slow convergence.
This can be circumvented by allowing a fixed maximum increase of
from one iteration to another. Care must also
be taken when computing
which is necessary to compute
,
and
. If an estimate of
indicates a value greater than the maximum possible number, we choose
in place of the original relation, and repeat this until no overflow occurs. The algorithm stops whenever the actual
value
is smaller than the smallest value
until now and
holds where
is some small number depending on the computer accuracy. To avoid a lot of iterations where the
above condition fails, we allow only a fixed maximum number of iterations.
Convergence for this method is superlinear. However, it is one of those methods that will converge to both real and
complex roots from a real initial approximation.
This algorithm finds the roots of the user-defined function
f starting with an initial guess
x0 and iterating the
sequence above until either the accuracy
eps is achieved or the maximum number of iterations
maxit is exceeded.
Another required parameter is the bound on the error of the initial guess
d.
References:
- Jean-Pierre Moreau's Home Page, http://perso.wanadoo.fr/jean-pierre.moreau/
- F.R. Ruckdeschel, "BASIC Scientific Subroutines", Vol. II, BYTE/McGRAWW-HILL, 1981
- Wankere R. Mekwi, "Iterative Methods for Roots of Polynomials", Exeter College, University of Oxford
Example 1
#include <codecogs/maths/rootfinding/muller.h>
#include <iostream>
#include <iomanip>
// user-defined function
double f(double x) {
return sin(x);
}
int main()
{
double x = Maths::RootFinding::muller(f, 4);
std::cout << "The calculated zero is X = " << std::setprecision(15) << x << std::endl;
std::cout << "The associated ordinate value is Y = " << f(x) << std::endl;
return 0;
}
Output:
The calculated zero is X = 3.14159265358979
The associated ordinate value is Y = 1.22460635382238e-016
Parameters
f | the user-defined function |
x0 | Default value = 0 |
d | Default value = 3 |
eps | Default value = 1E-10 |
maxit | Default value = 1000 |
Authors
- Lucian Bentea (August 2005)
Source Code
Source code is available when you buy a Commercial licence.
Not a member, then Register with CodeCogs. Already a Member, then Login.