The NLIN Procedure

Automatic Derivatives

Depending on the optimization method you select, analytical first- and second-order derivatives are computed automatically. Derivatives can still be supplied using the DER.parm syntax. These DER.parm derivatives are not verified by the differentiator. If any needed derivatives are not supplied, they are computed and added to the programming statements. To view the computed derivatives, use the LISTDER or LIST option.

The following model is solved using Newton’s method. Analytical first- and second-order derivatives are automatically computed. The compiled program code is shown in Figure 69.6.

proc nlin data=Enzyme method=newton list;
   parms x1=4 x2=2;
   model Velocity = x1 * exp (x2 * Concentration);
run;

Figure 69.6: Model and Derivative Code Output

The NLIN Procedure

Listing of Compiled Program Code
Stmt Line:Col Statement as Parsed
1 1589:4 MODEL.Velocity = x1 * EXP(x2 * Concentration);
1 1589:4 @MODEL.Velocity/@x1 = EXP(x2 * Concentration);
1 1589:4 @MODEL.Velocity/@x2 = x1 * Concentration * EXP(x2 * Concentration);
1 1589:4 @@MODEL.Velocity/@x1/@x2 = Concentration * EXP(x2 * Concentration);
1 1589:4 @@MODEL.Velocity/@x2/@x1 = Concentration * EXP(x2 * Concentration);
1 1589:4 @@MODEL.Velocity/@x2/@x2 = x1 * Concentration * Concentration * EXP(x2 * Concentration);



Note that all the derivatives require the evaluation of EXP(X2 * Concentration). The actual machine-level code is displayed if you specify the LISTCODE option, as in the following statements:

proc nlin data=Enzyme method=newton listcode;
   parms x1=4 x2=2;
   model Velocity = x1 * exp (x2 * Concentration);
run;

Note that, in the generated code, only one exponentiation is performed (Figure 69.7). The generated code reuses previous operations to be more efficient.

Figure 69.7: LISTCODE Output

The NLIN Procedure

Code Listing
     
1 Stmt MODEL line 1596 column 4. (1) arg=MODEL.Velocity argsave=MODEL.Velocity  
  Source Text: model Velocity = x1 * exp (x2 * Concentration);
Oper * at 1596:34 (30,0,2). * : _temp1 <- x2 Concentration
Oper EXP at 1596:30 (103,0,1). EXP : _temp2 <- _temp1
Oper * at 1596:24 (30,0,2). * : MODEL.Velocity <- x1 _temp2
Oper eeocf at 1596:24 (18,0,1). eeocf : _DER_ <- _DER_
Oper = at 1596:24 (1,0,1). = : @MODEL.Velocity/@x1 <- _temp2
Oper * at 1596:30 (30,0,2). * : @1dt1_1 <- Concentration _temp2
Oper * at 1596:24 (30,0,2). * : @MODEL.Velocity/@x2 <- x1 @1dt1_1
Oper = at 1596:24 (1,0,1). = : @@MODEL.Velocity/@x1/@x2 <- @1dt1_1
Oper = at 1596:24 (1,0,1). = : @@MODEL.Velocity/@x2/@x1 <- @1dt1_1
Oper * at 1596:30 (30,0,2). * : @2dt1_1 <- Concentration @1dt1_1
Oper * at 1596:24 (30,0,2). * : @@MODEL.Velocity/@x2/@x2 <- x1 @2dt1_1