The OPTMODEL Procedure

Example 6.2: Reading from and Creating a Data Set

This example demonstrates how to use the READ DATA statement to read parameters from a SAS data set. The objective is the Bard function, which is the following least-squares problem with i=\{1,2, ... ,15\}:

 f(x) = \frac{1}2 \sum_{k \in i} [ y_k - ( x_1 + \frac{k}{v_k x_2 + w_k x_3} )]^2
 x = (x_1,x_2,x_3),  y = (y_1,y_2, ... ,y_{15})
where  v_k=16-k,  w_k=\min(k, v_k) (k \in i), and
 y= ( 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, 0.96,   1.34, 2.10, 4.39 )
The minimum function value  f(x^*) = 4.107E-3 is at the point (0.08,1.13,2.34). The starting point  x^0 = (1,1,1) is used. This problem is identical to the section "4.1" in the PROC NLP documentation. The following code uses the READ DATA statement to input parameter values and the CREATE DATA statement to save the solution in a SAS data set:

    data bard;
       input y @@;
       datalines;
    .14  .18  .22  .25  .29  .32  .35  .39 
    .37  .58  .73  .96 1.34 2.10 4.39 
    ;
    proc optmodel;
       set I = 1..15;
       number y{I};
       read data bard into [_n_] y;
       number v{k in I} = 16 - k;
       number w{k in I} = min(k, v[k]);
       var x{1..3} init 1;
       min f = 0.5*
          sum{k in I}
             (y[k] - (x[1] + k / 
                      (v[k]*x[2] + w[k]*x[3])))**2;
       solve;
       print x;
       create data xdata from [i] xd=x;
 

In this code the values for parameter y are read from the BARD data set. The set I indexes the terms of the objective as well as the y array.

The code defines two utility parameters that contain coefficients used in the objective function. These coefficients could have been defined in the expression for the objective, f, but it was convenient to give them names and simplify the objective expression.

The result is shown in Output 6.2.1.

Output 6.2.1: Bard Function Solution
The OPTMODEL Procedure

[1] x
1 0.082411
2 1.133125
3 2.343610



The final CREATE DATA statement saves the solution values determined by the solver into the data set XDATA. The data set contains an observation for each x index. Each observation contains two variables. The output variable i contains the index, while xd contains the value for the indexed entry in the array x. The resulting data can be seen by using the PRINT procedure as follows:

    proc print data=xdata;
    run;
 

The output from PROC PRINT is shown in Output 6.2.2.

Output 6.2.2: Output Data Set Contents
Obs i xd
1 1 0.08241
2 2 1.13312
3 3 2.34361



Previous Page | Next Page | Top of Page