Convergence of Newton’s method

We again look at finding a solution of \(xe^x=2\) near \(x=1\). To apply Newton’s method, we need to calculate values of both the residual function \(f\) and its derivative.

using FundamentalsNumericalComputation
f = x -> x*exp(x) - 2;
dfdx = x -> exp(x)*(x+1);

We don’t know the exact root, so we use nlsolve to determine the “true” value.

r = nlsolve(x -> f(x[1]),[1.]).zero
1-element Array{Float64,1}:
 0.8526055020137259

We use \(x_1=1\) as a starting guess and apply the iteration in a loop, storing the sequence of iterates in a vector.

x = [1;zeros(6)]
for k = 1:6
    x[k+1] = x[k] - f(x[k]) / dfdx(x[k])
end
x
7-element Array{Float64,1}:
 1.0
 0.8678794411714423
 0.8527833734164099
 0.8526055263689221
 0.852605502013726
 0.8526055020137254
 0.8526055020137254

Here is the sequence of errors.

err = @. x - r
7-element Array{Float64,1}:
  0.14739449798627413
  0.015273939157716465
  0.00017787140268399337
  2.4355196193148743e-8
  1.1102230246251565e-16
 -4.440892098500626e-16
 -4.440892098500626e-16

Glancing at the exponents of the errors, they roughly form a neat doubling sequence until the error is comparable to machine precision. We can see this more precisely by taking logs.

logerr = @. log(abs(err))
7-element Array{Float64,1}:
  -1.9146426270180508
  -4.181607225912875
  -8.634449725601385
 -17.53052061416097
 -36.7368005696771
 -35.35050620855721
 -35.35050620855721

Quadratic convergence isn’t as graphically distinctive as linear convergence.

plot(0:6,abs.(err),m=:o,legend=:none,
    xlabel="\$k\$", yaxis=(:log10,"\$|x_k-r|\$"), title="Quadratic convergence")

This looks faster than linear convergence, but it’s not easy to say more. If we could use infinite precision, the curve would continue to steepen forever.