/home/coin/SVN-release/OS-2.2.0/Couenne/src/util/funtriplets.hpp

Go to the documentation of this file.
00001 /* $Id: funtriplets.hpp 154 2009-06-16 18:52:53Z pbelotti $ */
00002 /*
00003  * Name:    funtriplets.hpp
00004  * Author:  Pietro Belotti
00005  * Purpose: class for representing a function and its first- and second-order derivative
00006  *
00007  * (C) Carnegie-Mellon University, 2007. 
00008  * This file is licensed under the Common Public License (CPL)
00009  */
00010 
00011 #ifndef FUNTRIPLETS_HPP
00012 #define FUNTRIPLETS_HPP
00013 
00014 #include <math.h>
00015 
00016 #include "exprPow.hpp"
00017 
00018 
00020 class funtriplet {
00021 
00022 public:
00023 
00025   funtriplet () {}
00026 
00028   virtual ~funtriplet () {}
00029 
00030   virtual CouNumber F     (CouNumber x) = 0; //< main funtion
00031   virtual CouNumber Fp    (CouNumber x) = 0; //< first-order derivative of main funtion
00032   virtual CouNumber Fpp   (CouNumber x) = 0; //< second-order derivative of main funtion
00033   virtual CouNumber FpInv (CouNumber x) = 0; //< inverse of the first-order derivative
00034 };
00035 
00036 
00038 class simpletriplet: public funtriplet {
00039 
00040 protected:
00041 
00042   unary_function f_;   //< the function 
00043   unary_function fp_;  //< the first-order derivative
00044   unary_function fpp_; //< the second-order derivative 
00045   unary_function fpI_; //< the inverse of the first-order derivative 
00046 
00047 public:
00048 
00050   simpletriplet (unary_function f   = NULL, 
00051                  unary_function fp  = NULL, 
00052                  unary_function fpp = NULL,
00053                  unary_function fpI = NULL):
00054     f_   (f),
00055     fp_  (fp),
00056     fpp_ (fpp),
00057     fpI_ (fpI) {}
00058 
00060   virtual ~simpletriplet () {}
00061 
00062   virtual CouNumber F     (CouNumber x) {return f_   (x);} //< main funtion
00063   virtual CouNumber Fp    (CouNumber x) {return fp_  (x);} //< first-order derivative
00064   virtual CouNumber Fpp   (CouNumber x) {return fpp_ (x);} //< second-order derivative
00065   virtual CouNumber FpInv (CouNumber x) {return fpI_ (x);} //< inverse of first-order derivative
00066 };
00067 
00068 
00070 class powertriplet: public funtriplet {
00071 
00072 protected:
00073 
00074   CouNumber exponent_; //< defines the power function triplet
00075 
00076 public:
00077 
00079   powertriplet (CouNumber exponent):
00080     exponent_ (exponent) {}
00081 
00083   virtual ~powertriplet () {}
00084 
00085   virtual CouNumber F   (CouNumber x) 
00086   {return safe_pow (x, exponent_);}                                   //< main funtion
00087 
00088   virtual CouNumber Fp  (CouNumber x) 
00089   {return exponent_ * safe_pow (x, exponent_ - 1);}                   //< first-order derivative 
00090 
00091   virtual CouNumber Fpp (CouNumber x) 
00092   {return exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2);} //< second-order derivative 
00093 
00094   virtual CouNumber FpInv (CouNumber x) 
00095   {return safe_pow (x / exponent_, 1 / (exponent_ - 1));} //< inverse of first derivative
00096 };
00097 
00098 
00100 class kpowertriplet: public powertriplet {
00101 
00102 protected:
00103 
00104   CouNumber mult_; //< pre-multiplier
00105 
00106 public:
00107 
00109   kpowertriplet (CouNumber exponent, CouNumber k):
00110     powertriplet (exponent),
00111     mult_ (k) {}
00112 
00114   virtual ~kpowertriplet () {}
00115 
00116   virtual CouNumber F   (CouNumber x)  //< main funtion
00117   {return mult_ * safe_pow (x, exponent_);}
00118 
00119   virtual CouNumber Fp  (CouNumber x)  //< first-order derivative 
00120   {return mult_ * exponent_ * safe_pow (x, exponent_ - 1);}
00121 
00122   virtual CouNumber Fpp (CouNumber x)  //< second-order derivative 
00123   {return mult_ * exponent_ * (exponent_ - 1) * safe_pow (x, exponent_ - 2);}
00124 
00125   virtual CouNumber FpInv (CouNumber x) 
00126   {return safe_pow (x / (mult_ * exponent_), 1 / (exponent_ - 1));} //< inverse of first derivative
00127 };
00128 
00129 #endif

Generated on Thu Aug 5 03:02:57 2010 by  doxygen 1.4.7