minimize
For this example, we will assume that there are no analytic derivatives and no constraints. We will also assume that the subroutines that initialize and evaluate the function are in the same file. We step through the specifics below.
First, include the necessary header files. In this case, we need iostream so we can print error messages and the OPT++ header file, NLP.h, for some definitions. Also, because we are going to great a dynamically loadable library, we need to surround all of our code by an extern "C" statement.
#include <iostream> #include "NLP.h" extern "C" { |
The subroutine that initializes the problem should perform any one-time tasks that are needed for the problem. One part of that is checking for error conditions in the setup. In this case, the dimension, ndim, can only take on a value of 2. Using "exit" is not the ideal way to deal with error conditions, but it serves well as an example.
void init_rosen(int ndim, ColumnVector& x) { if (ndim != 2) { cerr << "Number of variables for Rosenbrock's function should be 2." << " The number of variables given is " << ndim << endl; exit (1); } //end if } //end init_rosen |
The other required subroutine will evaluate the function. In this problem, we are trying to find the minimum value of Rosenbrock's function, so it is necessary to write the code that compute the value of that function given some set of optimization parameters. Mathematically, Rosenbrock's function is:
The following code will compute the value of f(x).
First, some manipulation of the optimization parameters, x, is done.
void rosen0(int ndim, const ColumnVector& x, double& fx, int& result) { double f1, f2, x1, x2; x1 = x(1); x2 = x(2); f1 = (x2 - x1 * x1); f2 = 1. - x1; |
Then the function value, fx, is computed, and the variable, result, is set to indicate that a function evaluation was performed.
fx = 100.* f1*f1 + f2*f2; result = NLPFunction; } //end rosen0 } //end extern "C" |
Now that we have all of the code necessary to initialize and evaluate Rosenbrock's function, give it a try!
SOURCES = testexample.C
for csh or tcsh, <br> setenv LD_LIBRARY_PATH /home/pdhough/TooMuchFun
for bash, <br> set LD_LIBRARY_PATH=/home/pdhough/TooMuchFun export LD_LIBRARY_PATH
./testexample
If you like, you can compare your output to our results. There may be slight differences, but if you used the same input that we did, the results should look pretty much the same.
Next Example: Subroutine Example 2: Hock-Schittkowski Problem Number 14 | Back to Using the (beta) GUI/XML Interface
Last revised July 25, 2006