mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-27 06:10:34 +05:00
143 lines
3.9 KiB
C++
143 lines
3.9 KiB
C++
|
#ifndef FILE_OPTI
|
|||
|
#define FILE_OPTI
|
|||
|
|
|||
|
/**************************************************************************/
|
|||
|
/* File: opti.hpp */
|
|||
|
/* Author: Joachim Schoeberl */
|
|||
|
/* Date: 01. Jun. 95 */
|
|||
|
/**************************************************************************/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
namespace netgen
|
|||
|
{
|
|||
|
|
|||
|
/**
|
|||
|
Function to be minimized.
|
|||
|
*/
|
|||
|
class MinFunction
|
|||
|
{
|
|||
|
public:
|
|||
|
///
|
|||
|
virtual double Func (const Vector & x) const;
|
|||
|
///
|
|||
|
virtual void Grad (const Vector & x, Vector & g) const;
|
|||
|
/// function and gradient
|
|||
|
virtual double FuncGrad (const Vector & x, Vector & g) const;
|
|||
|
/// directional derivative
|
|||
|
virtual double FuncDeriv (const Vector & x, const Vector & dir, double & deriv) const;
|
|||
|
/// if |g| < gradaccuray, then stop bfgs
|
|||
|
virtual double GradStopping (const Vector & /* x */) const { return 0; }
|
|||
|
|
|||
|
///
|
|||
|
virtual void ApproximateHesse (const Vector & /* x */,
|
|||
|
DenseMatrix & /* hesse */) const;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
class OptiParameters
|
|||
|
{
|
|||
|
public:
|
|||
|
int maxit_linsearch;
|
|||
|
int maxit_bfgs;
|
|||
|
double typf;
|
|||
|
double typx;
|
|||
|
|
|||
|
OptiParameters ()
|
|||
|
{
|
|||
|
maxit_linsearch = 100;
|
|||
|
maxit_bfgs = 100;
|
|||
|
typf = 1;
|
|||
|
typx = 1;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/** Implementation of BFGS method.
|
|||
|
Efficient method for non-linear minimiztion problems.
|
|||
|
@param x initial value and solution
|
|||
|
@param fun function to be minimized
|
|||
|
*/
|
|||
|
extern double BFGS (Vector & x, const MinFunction & fun,
|
|||
|
const OptiParameters & par,
|
|||
|
double eps = 1e-8);
|
|||
|
|
|||
|
/** Steepest descent method.
|
|||
|
Simple method for non-linear minimization problems.
|
|||
|
@param x initial value and solution
|
|||
|
@param fun function to be minimized
|
|||
|
*/
|
|||
|
void SteepestDescent (Vector & x, const MinFunction & fun,
|
|||
|
const OptiParameters & par);
|
|||
|
|
|||
|
|
|||
|
extern void lines (
|
|||
|
Vector & x, // i: Ausgangspunkt der Liniensuche
|
|||
|
Vector & xneu, // o: Loesung der Liniensuche bei Erfolg
|
|||
|
Vector & p, // i: Suchrichtung
|
|||
|
double & f, // i: Funktionswert an der Stelle x
|
|||
|
// o: Funktionswert an der Stelle xneu, falls ifail = 0
|
|||
|
Vector & g, // i: Gradient an der Stelle x
|
|||
|
// o: Gradient an der Stelle xneu, falls ifail = 0
|
|||
|
|
|||
|
const MinFunction & fun, // function to minmize
|
|||
|
const OptiParameters & par, // parameters
|
|||
|
double & alphahat, // i: Startwert f<>r alpha_hat
|
|||
|
// o: Loesung falls ifail = 0
|
|||
|
double fmin, // i: untere Schranke f<>r f
|
|||
|
double mu1, // i: Parameter mu_1 aus Alg.2.1
|
|||
|
double sigma, // i: Parameter sigma aus Alg.2.1
|
|||
|
double xi1, // i: Parameter xi_1 aus Alg.2.1
|
|||
|
double xi2, // i: Parameter xi_1 aus Alg.2.1
|
|||
|
double tau, // i: Parameter tau aus Alg.2.1
|
|||
|
double tau1, // i: Parameter tau_1 aus Alg.2.1
|
|||
|
double tau2, // i: Parameter tau_2 aus Alg.2.1
|
|||
|
int & ifail); // o: 0 bei erfolgreicher Liniensuche
|
|||
|
// -1 bei Abbruch wegen Unterschreiten von fmin
|
|||
|
// 1 bei Abbruch, aus sonstigen Gr<47>nden
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
Solver for linear programming problem.
|
|||
|
|
|||
|
\begin{verbatim}
|
|||
|
min c^t x
|
|||
|
A x <= b
|
|||
|
\end{verbatim}
|
|||
|
*/
|
|||
|
extern void LinearOptimize (const DenseMatrix & a, const Vector & b,
|
|||
|
const Vector & c, Vector & x);
|
|||
|
|
|||
|
|
|||
|
#ifdef NONE
|
|||
|
|
|||
|
/**
|
|||
|
Simple projection iteration.
|
|||
|
|
|||
|
find $u = argmin_{v >= 0} 0.5 u A u - f u$
|
|||
|
*/
|
|||
|
extern void ApproxProject (const BaseMatrix & a, Vector & u,
|
|||
|
const Vector & f,
|
|||
|
double tau, int its);
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
CG Algorithm for quadratic programming problem.
|
|||
|
See: Dostal ...
|
|||
|
|
|||
|
d ... diag(A) ^{-1}
|
|||
|
*/
|
|||
|
extern void ApproxProjectCG (const BaseMatrix & a, Vector & x,
|
|||
|
const Vector & b, const class DiagMatrix & d,
|
|||
|
double gamma, int & steps, int & changes);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|