Lecture 8

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 17

Numerical Methods for

Engineers
EE0903301
Lecture 8: Roots: Open Methods (Part 2)
Dr. Yanal Faouri
Brent’s Methods

• Brent’s root-location method is a hybrid approach that combined the reliability of


bracketing with the speed of the open methods. Works by applying a speedy open
method wherever possible but reverting to a reliable bracketing method if
necessary.

• 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

• It is similar in spirit to the secant method. As in Fig. a, the secant


method is based on computing a straight line that goes through two
guesses. The intersection of this straight line with the x axis represents
the new root estimate. For this reason, it is sometimes referred to as a
linear interpolation method.
• Now suppose that we had three points. In that case, we could
determine a quadratic function of x that goes through the three points
(Fig. b). Just as with the linear secant method, the intersection of this
parabola with the x axis would represent the new root estimate. And
by using a curve rather than a straight line often yields a better
estimate.
Inverse Quadratic Interpolation

• Although this would seem to represent a great improvement, the


approach has a fundamental flaw: it is possible that the parabola
might not intersect the x axis! Such would be the case when the
resulting parabola had complex roots as represented by the parabola,
y = f(x).
• The difficulty can be rectified by employing inverse quadratic
interpolation. That is, rather than using a parabola in x, we can fit the
points with a parabola in y. This amounts to reversing the axes and
creating a “sideways” parabola [the curve, x = f(y).
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

• This is called inverse quadratic interpolation equation.


Example: Inverse Quadratic Interpolation

• 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

• Which has roots as:


Example: Inverse Quadratic Interpolation

• Lagrange polynomial can be used to generate the quadratic in y as

g(y) = 0.5y2 − 2.5y + 4

• 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

• If we put in an initial guess of zero, it finds the negative root:


>> x = fzero(@(x) x^2 − 9,0)
➔ x = −3
• If we wanted to ensure that we found the positive root, we could enter two guesses as in
>> x = fzero(@(x) x^2−9,[0 4])
➔x=3
• Also, if a sign change does not occur between the two guesses, an error message is displayed
>> x = fzero(@(x) x^2−9,[−4 4])
➔ ??? Error using ==> fzero
➔ The function values at the interval endpoints must differ in sign.
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:

>> rho = 1.23;mu = 1.79e − 5;D = 0.005;V = 40;e = 0.0015/1000;


>> Re = rho*V*D/mu;
>> g = @(f) 1/sqrt(f)+2*log10(e/(3.7*D)+2.51/(Re*sqrt(f)));
>> fplot(g,[0.008 0.08]),grid,xlabel('f'),ylabel('g(f)')

You might also like