Professional Documents
Culture Documents
Lecture 8
Lecture 8
Lecture 8
Engineers
EE0903301
Lecture 8: Roots: Open Methods (Part 2)
Dr. Yanal Faouri
Brent’s Methods
• The approach was developed by Richard Brent (1973) based on an earlier algorithm
of Theodorus Dekker (1969).
• The bracketing technique is the trusty bisection method, whereas two different open
methods are employed. The first is the secant method. The second is inverse
quadratic interpolation (see next slide).
Inverse Quadratic Interpolation
• If the three points are designated as (xi–2, yi–2), (xi–1, yi–1), and (xi, yi), a quadratic function of y that passes through
the points can be generated as:
• This form is called a Lagrange polynomial. Substitute the root, xi+1, corresponds to y = 0, yields
• Problem Statement.
• Develop quadratic equations in both x and y for the data points depicted in the Figure in slide 4: (1, 2), (2, 1), and
(4, 5).
• For the first, y = f(x), employ the quadratic formula to illustrate that the roots are complex. For the latter, x = g(y),
use inverse quadratic interpolation equation to determine the root estimate.
• Solution.
• By reversing the x’s and y’s, Lagrange polynomial can be used to generate a quadratic in x as
f(x) = x2 − 4x + 5
• Finally, inverse quadratic interpolation can be used to determine the root as:
Inverse Quadratic Interpolation: An Issue
• One case where inverse quadratic interpolation does not work. If the three y values are not distinct
(i.e., yi−2 = yi−1 or yi−1 = yi), an inverse quadratic function does not exist. So, this is where the secant
method comes into play. If we arrive at a situation where the y values are not distinct, we can always
revert to the less efficient secant method to generate a root using two of the points. If yi−2 = yi−1, we
use the secant method with xi−1 and xi. If yi−1 = yi, we use xi−2 and xi−1.
Brent’s Method Algorithm: fzerosimp
q = 1-s;
function b = fzerosimp(xl,xu) else %Inverse quadratic interpolation
a = xl; b = xu; fa = f(a); fb = f(b); q = fc/fa; r = fb/fa;
c = a; fc = fa; d = b-c; e = d; p = s * (2*m*q * (q-r)-(b-c)*(r-1));
while (1) q = (q-1)*(r-1)*(s-1);
if fb == 0, break, end end
if sign(fa) == sign(fb) %If needed, rearrange points if p > 0, q = -q;
a = c; fa = fc; d = b-c; e = d; else p = -p;
end end
if abs(fa) < abs(fb) if 2*p < 3*m*q-abs(tol*q) && p < abs(0.5*e*q)
c = b; b = a; a = c; e = d; d = p/q;
fc = fb; fb = fa; fa = fc; else
end d = m; e = m;
m = 0.5*(a-b); %Termination test and possible exit end
tol = 2 * eps * max(abs(b), 1); else %Bisection
if abs(m) <= tol || fb == 0. d = m; e = m;
break end
end c = b; fc = fb;
%Choose open methods or bisection if abs(d) > tol, b = b + d;
if abs(e) >= tol && abs(fc) > abs(fb) else
s = fb/fc; b = b−sign(b − a)*tol; end
if a == c %Secant method fb = f(b);
p = 2*m*s; end
MATLAB Function: fzero
• The fzero function is designed to find the real root of a single equation. A simple representation of its syntax is
>> fzero(function,x0)
• Where function is the name of the function being evaluated, and x0 is the initial guess. Note that two guesses that
bracket the root can be passed as a vector:
>> fzero(function,[x0 x1])
• where x0 and x1 are guesses that bracket a sign change.
• Here is a MATLAB session that solves for the root of a simple quadratic: x2 − 9.
• Clearly two roots exist at −3 and 3. To find the negative root:
>> x = fzero(@(x) x^2−9,−4)
➔ x = −3
• If we want to find the positive root, use a guess that is near it:
>> x = fzero(@(x) x^2 − 9,4)
>> x = 3
MATLAB Function: fzero
• The fzero function works as follows. If a single initial guess is passed, it first performs a search to identify a sign
change. This search differs from the incremental search described before. In that the search starts at the single
initial guess and then takes increasingly bigger steps in both the positive and negative directions until a sign
change is detected.
• Thereafter, the fast methods (secant and inverse quadratic interpolation) are used unless an unacceptable result
occurs (e.g., the root estimate falls outside the bracket). If an unacceptable result happens, bisection is
implemented until an acceptable root is obtained with one of the fast methods. As might be expected, bisection
typically dominates at first but as the root is approached, the technique shifts to the faster methods.
• A more complete representation of the fzero syntax can be written as
>> [x,fx] = fzero(function,x0,options,p1,p2,...)
• where [x,fx] = a vector containing the root x and the function evaluated at the root fx, options is a data structure
created by the optimset function, and p1, p2... are any parameters that the function requires.
• Note that if you desire to pass in parameters but not use the options, pass an empty vector [] in its place.
>> [x,fx] = fzero(function,x0,[],p1,p2,...)
Example: The fzero and optimset Functions
• Problem Statement.
• Solve again for the positive root of f (x) = x10 − 1 found before using the Newton-Raphson method with an initial guess
of 0.5. Solve the same problem with optimset and fzero.
• Solution.
• Enter these commands in the workspace and examine the results:
>> options = optimset('display','iter');
display: When set to 'iter' displays a detailed record of all the iterations.
>> [x,fx] = fzero(@(x) x^10-1,0.5,options)
tolx: A positive scalar that sets a termination tolerance on x.
➔x=1
➔ fx = 0
• Thus, after 25 iterations of searching, fzero finds a sign change. It then uses interpolation and bisection until it gets
close enough to the root so that interpolation takes over and rapidly converges on the root.
>> options = optimset ('tolx', 1e-3); % for less accurate results
>> [x,fx] = fzero(@(x) x^10-1,0.5,options)
➔ x = 1.0009
➔ fx = 0.0090
Polynomials
• Polynomials are a special type of nonlinear algebraic equation of the general form
• fn(x) = a1 xn + a2 xn−1 + ・ ・ ・ + an−1 x2 + an x + an+1
• where n is the order of the polynomial, and the a’s are constant coefficients. In many
(but not all) cases, the coefficients will be real. For such cases, the roots can be real
and/or complex.
• In general, an nth order polynomial will have n roots.
• Polynomials have many applications in engineering and science. For example, they
are used extensively in curve fitting. However, one of their most interesting and
powerful applications is in characterizing dynamic systems—and, in particular, linear
systems. Examples include reactors, mechanical devices, structures, and electrical
circuits.
MATLAB Function: roots
• Unfortunately, simple techniques like bisection and Newton-Raphson are not available for
determining all the roots of higher-order polynomials. However, MATLAB has an excellent built-in
capability, the roots function, for this task.
• The roots function has the syntax,
>> x = roots(c)
• where x is a column vector containing the roots and c is a row vector containing the polynomial’s
coefficients.
• So how does the roots function work? MATLAB is very good at finding the eigenvalues of a matrix.
Consequently, the approach is to recast the root evaluation task as an eigenvalue problem.
• For this polynomial, a1 x5 + a2 x4 + a3 x3 + a4 x2 + a5 x + a6 = 0
Example: Using MATLAB to Manipulate
Polynomials and Determine Their Roots
• Problem Statement.
• Use the following equation to explore how MATLAB can be employed to manipulate polynomials:
• f5(x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25
• Note that this polynomial has three real roots: 0.5, −1.0, and 2; and one pair of complex roots: 1 ∓ 0.5i
• Solution.
• Polynomials are entered into MATLAB by storing the coefficients as a row vector.
>> a = [1 −3.5 2.75 2.125 −3.875 1.25];
• To evaluate the polynomial at x = 1, use
>> polyval(a,1) % evaluate the function at x = 1
➔ans = −0.2500
>> b = poly([0.5 -1])
➔b = 1.0000 0.5000 −0.5000
>> x = roots(b)
➔ x = -1.0000 0.5000
Case Study: Pipe Friction
• In this case study, we will illustrate how the numerical methods covered in this part of the book can be employed
to determine f for air flow through a smooth, thin tube. For this case, the parameters are ρ = 1.23 kg/m3, μ =
1.79 × 10–5 N.s/m2, D = 0.005 m, V = 40 m/s, and ε = 0.0015 mm. Note that friction factors range from about
0.008 to 0.08. In addition, an explicit formulation called the Swamee-Jain equation provides an approximate
estimate: