This example solves a nonlinear system of equations by Newton’s method. Let the nonlinear system be represented by
![]() |
where
is a vector and
is a vector-valued, possibly nonlinear function.
In order to find
such that
goes to 0, an initial estimate
is chosen, and Newton’s iterative method for converging to the solution is used:
![]() |
where
is the Jacobian matrix of partial derivatives of
with respect to
. (For more efficient computations, use the built-in NLPNRA subroutine.)
For optimization problems, the same method is used, where
is the gradient of the objective function and
becomes the Hessian (Newton-Raphson).
In this example, the system to be solved is
![]() |
![]() |
![]() |
|||
![]() |
![]() |
![]() |
The following statements are organized into three modules: NEWTON, FUN, and DERIV.
/* Newton's Method to Solve a Nonlinear Function */
/* The user must supply initial values, */
/* and the FUN and DERIV functions. */
/* On entry: FUN evaluates the function f in terms of x */
/* initial values are given to x */
/* DERIV evaluates jacobian j */
/* tuning variables: CONVERGE, MAXITER. */
/* On exit: solution in x, function value in f close to 0 */
/* ITER has number of iterations. */
proc iml;
start newton;
run fun; /* evaluate function at starting values */
do iter = 1 to maxiter /* iterate until maxiter */
while(max(abs(f))>converge); /* iterations or convergence */
run deriv; /* evaluate derivatives in j */
delta = -solve(j,f); /* solve for correction vector */
x = x+delta; /* the new approximation */
run fun; /* evaluate the function */
end;
finish newton;
maxiter = 15; /* default maximum iterations */
converge = .000001; /* default convergence criterion */
/* User-supplied function evaluation */
start fun;
x1 = x[1] ;
x2 = x[2] ; /* extract the values */
f = (x1+x2-x1*x2+2) //
(x1*exp(-x2)-1); /* evaluate the function */
finish fun;
/* User-supplied derivatives of the function */
start deriv;
/* evaluate jacobian */
j = ((1-x2)||(1-x1) ) // (exp(-x2)||(-x1*exp(-x2)));
finish deriv;
do;
print "Solving the system: X1+X2-X1*X2+2=0, X1*EXP(-X2)-1=0" ,;
x={.1, -2}; /* starting values */
run newton;
print x f;
end;
The results are shown in Output 9.2.1.
| Solving the system: X1+X2-X1*X2+2=0, X1*EXP(-X2)-1=0 |
| x | f |
|---|---|
| 0.0977731 | 5.3523E-9 |
| -2.325106 | 6.1501E-8 |