man wnconj (Fonctions bibliothèques) - conjugate directions function minimization package

NAME

wn_conj_direction_method, wn_force_conj_direction_stop, wn_conj_gradient_method, wn_force_conj_gradient_stop, wn_barrier, wn_dbarrier, wn_penalty, wn_dpenalty - conjugate directions function minimization package

SYNOPSIS

#include <wn/wnconj.h>

void wn_conj_direction_method(int *code, double
int code;
double val_min;
double vect[];
int len;
double (*pfunction)(/* vect */);
int max_iterations;

void wn_force_conj_direction_stop(void)

void wn_conj_gradient_method(int *code, double *val_min,
			 double *vect,int
void wn_conj_gradient_method(&code,&val_min,
int code;
double val_min;
double vect[];
int len;
double (*pfunction)(/* double vect[] */);
void (*pgradient)(/* double grad[],double vect[] */);
int max_iterations;

void wn_force_conj_gradient_stop(void)

double wn_barrier(x)
double x;

double wn_dbarrier(x)
double x;

double wn_penalty(x)
double x;

double wn_dpenalty(x)
double x;

DESCRIPTION

This package is useful for minimizing continuous, differentiable functions of many variables. The routines assume that the function to minimize is well approximated by a quadratic form with a positive definite Hessian. For functions which are well approximated this way, convergence rates are reasonably predictable. If all goes well, these routines converge to a local minimum; this local minimum is not necessarily a global minimum or even a good local minimum. If the function is not differentiable, the algorithms often get stuck in very sub-optimal solutions, and no warning is given that this has happened.

wn_conj_direction_method conducts a conjugate directions search without the need for derivatives of the function to minimize. That is, the function must be differentiable, but the derivatives need not be known explicitly. Consequently, it is the easiest to use, but it runs very slowly for medium-sized and large problems. code indicates the status of the completed search. val_min is the objective function value at the final solution. vect should be loaded with a solution used to begin the search; upon return it contains the final solution. len is the number of variables in vect. pfunction is a pointer to the function to minimize. max_iterations is the maximum number of iterations allowed; set to WN_IHUGE for no limit.

wn_conj_gradient_method conducts a conjugate directions search using derivatives of the function to minimize. Using derivatives usually results in a dramatic speedup, but it makes programming much more complicated. Furthermore, if the derivatives are in error, no warning is given; the result is either very slow convergence or convergence to an incorrect result. The arguments mean the same as the arguments to conj_direction_method. The additional argument pgradient is a pointer to a function which computes the gradient of the function to minimize; that is

grad[i] = d function / d vect[i]

Because of the difficulty in ensuring that the derivatives are correct, it is usually best to start by experimenting on a small problem using wn_conj_direction_method, even if you ultimately intend to use wn_conj_gradient_method. The solutions obtained from wn_conj_gradient_method using derivatives should be similar or the same as solutions obtained from wn_conj_directions_method not using derivatives. If this is not so, your derivatives are probably faulty.

wn_barrier, wn_dbarrier, wn_penalty, and wn_dpenalty are useful for implementing barrier and penalty methods of non-linear programming. They are designed to implement the constraint x >= 0.

wn_barrier(x) returns +infinity for x <= 0 and decreases in a continuous and differentiable way for x > 0.

wn_dbarrier(x) returns the derivative of wn_barrier(x).

wn_penalty(x) returns 0 for x >= 0 and x^2 for x < 0. It is continuous and differentiable for all x.

wn_dpenalty(x) returns the derivative of penalty(x).

RESOURCES

wn_conjugate_direction_method runs with AVERAGE CASE: time = len^2 * (len^2 + <time to evaluate function>)

stack memory = 1

dynamic memory = len*len wn_conjugate_gradient_method runs with AVERAGE CASE: time = len * (2*<time to evaluate function> + <time to evaluate gradien>)

stack memory = 1

dynamic memory = len Run time depends heavily on the problem being solved. If the function is badly behaved, convergence can take much longer than these times. If the function is not too badly behaved and the Hessian has distinct eigenvalues, the times given here usually apply. If the eigenvalues of the Hessian are not distinct, much faster convergence times are possible.

DIAGNOSTICS

code == WN_SUCCESS means successful completion, optimum found

code == WN_SUBOPTIMAL means termination before optimum found

code == WN_UNBOUNDED means function is unbounded

AUTHOR

Will Naylor

CETTE PAGE DOCUMENTE AUSSI :