# Compute root of Rosencrantz function¶

Compute root of

$$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}$$

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