DEMSLV02

Compute root of Rosencrantz function

Compute root of

\begin{equation} f(x_1,x_2)= \begin{bmatrix}200x_1(x_2-x_1^2) + 1-x_1 \\ 100(x_1^2-x_2)\end{bmatrix} \end{equation}

using Newton and Broyden methods. Initial values generated randomly. True root is $x_1=1, \quad x_2=1$.

In [1]:
from demos.setup import np, tic, toc
from compecon import NLP

Set up the problem

In [2]:
def f(x):
    x1, x2 = x
    fval = [200 * x1 * (x2 - x1 ** 2) + 1 - x1, 100 * (x1 ** 2 - x2)]
    fjac = [[200 * (x2 - x1 ** 2) - 400 * x1 ** 2 - 1, 200 * x1],
            [200 * x1, -100]]
    return np.array(fval), np.array(fjac)

problem = NLP(f)

Randomly generate starting point

In [3]:
problem.x0 = np.random.randn(2)

Compute root using Newton method

In [4]:
t0 = tic()
x1 = problem.newton()
t1 = 100 * toc(t0)
n1 = problem.fnorm

Compute root using Broyden method

In [5]:
t0 = tic()
x2 = problem.broyden()
t2 = 100 * toc(t0)
n2 = problem.fnorm
In [6]:
print('Hundreds of seconds required to compute root of Rosencrantz function')
print('f(x1,x2)= [200*x1*(x2-x1^2)+1-x1;100*(x1^2-x2)] via Newton and Broyden')
print('methods, starting at x1 = {:4.2f} x2 = {:4.2f}'.format(*problem.x0))
print('\nMethod      Time   Norm of f        x1     x2\n', '-' * 45)
print('Newton  %8.2f    %8.0e     %5.2f  %5.2f' % (t1, n1, x1[0], x1[1]))
print('Broyden %8.2f    %8.0e     %5.2f  %5.2f' % (t2, n2, x2[0], x2[1]))
Hundreds of seconds required to compute root of Rosencrantz function
f(x1,x2)= [200*x1*(x2-x1^2)+1-x1;100*(x1^2-x2)] via Newton and Broyden
methods, starting at x1 = 1.22 x2 = 1.28

Method      Time   Norm of f        x1     x2
 ---------------------------------------------
Newton      1.60       5e-13      1.00   1.00
Broyden     1.60       6e-09      1.00   1.00