00001 #ifndef MCCORMICK_H
00002 #define MCCORMICK_H
00003 #include <iostream>
00004 #include <vector>
00005 #include <cmath>
00006
00007 using namespace std;
00008
00009 extern double mid( const double, const double, const double, int& );
00010 extern double mid( const double*, const double*, const int, const int );
00011 extern double arh( const double, const double );
00012 extern double xlog( const double );
00013
00016 class MC_Excp
00018 {
00019 public:
00020
00022 enum MC_Err{
00023 SIZE=1,
00024 DIV,
00025 INV,
00026 LOG,
00027 SQRT,
00028 ARH
00029 };
00030
00032 MC_Excp( MC_Err ierr ) : _ierr( ierr ){}
00033
00035 int ierr(){ return _ierr; }
00036
00037 private:
00038
00039 MC_Err _ierr;
00040 };
00041
00042
00050 class McCormick
00052 {
00053
00054 friend McCormick operator+ ( const McCormick& );
00055 friend McCormick operator+ ( const McCormick&, const McCormick& );
00056 friend McCormick operator+ ( const double, const McCormick& );
00057 friend McCormick operator+ ( const McCormick&, const double );
00058 friend McCormick operator- ( const McCormick& );
00059 friend McCormick operator- ( const McCormick&, const McCormick& );
00060 friend McCormick operator- ( const double, const McCormick& );
00061 friend McCormick operator- ( const McCormick&, const double );
00062 friend McCormick operator* ( const McCormick&, const McCormick& );
00063 friend McCormick operator* ( const McCormick&, const double );
00064 friend McCormick operator* ( const double, const McCormick& );
00065 friend McCormick operator/ ( const McCormick&, const McCormick& );
00066 friend McCormick operator/ ( const McCormick&, const double );
00067 friend McCormick operator/ ( const double, const McCormick& );
00068 friend ostream& operator<< ( ostream&, const McCormick& );
00069
00070
00071 friend McCormick inv ( const McCormick& );
00072 friend McCormick exp ( const McCormick& );
00073 friend McCormick log ( const McCormick& );
00074 friend McCormick fabs ( const McCormick& );
00075 friend McCormick sqrt ( const McCormick& );
00076 friend McCormick xlog ( const McCormick& );
00077 friend McCormick arh ( const McCormick&, const double );
00078 friend McCormick pow ( const McCormick&, const int );
00079 friend McCormick pow ( const McCormick&, const double );
00080 friend McCormick pow ( const McCormick&, const McCormick& );
00081 friend double mid( const double, const double, const double, int& );
00082 friend double mid( const double*, const double*, const int, const int );
00083
00084 public:
00085
00086
00087 McCormick& operator=
00088 ( const McCormick& );
00089 McCormick& operator=
00090 ( const double );
00091
00095
00096 McCormick
00097 ( const double c )
00098 { Init_McCormick( c, c, c, c ); };
00100 McCormick
00101 ( const double l, const double u, const double c, const int ip=-1 )
00102 { Init_McCormick( l, u, c, c, ip, ip ); };
00104 McCormick
00105 ( const double l, const double u, const double cv, const double cc,
00106 const int icv=-1, const int icc=-1 )
00107 { Init_McCormick( l, u, cv, cc, icv, icc ); };
00109 McCormick
00110 ( const McCormick& );
00111
00113 ~McCormick();
00114
00115 McCormick();
00116
00118 int np() const
00119 { return _np; };
00121 double l() const
00122 { return _l; };
00124 double u() const
00125 { return _u; };
00127 double cv() const
00128 { return _cv; };
00130 double cc() const
00131 { return _cc; };
00133 const double* dcvdp() const
00134 { return _dcvdp; };
00136 const double* dccdp() const
00137 { return _dccdp; };
00139 double dcvdp( const int ip ) const
00140 { return _dcvdp[ip]; };
00142 double dccdp( const int ip ) const
00143 { return _dccdp[ip]; };
00144
00146 void l ( double l ) { _l = l; };
00148 void u ( double u ) { _u = u; };
00150 void cv( double cv ) { _cv = cv; };
00152 void cc( double cc ) { _cc = cc; };
00153
00155 static void np( int npar ) { _np = npar; };
00158 private:
00159
00160 static int _ITINY;
00161 static double _RTINY;
00162
00164 static int _np;
00166 int _sizep;
00168 double _l;
00170 double _u;
00172 double _cv;
00174 double _cc;
00176 double *_dcvdp;
00178 double *_dccdp;
00179
00181 void Init_McCormick
00182 ( const double, const double, const double, const double,
00183 const int=-1, const int=-1 );
00184
00186 static double _machprec();
00188 static bool _isequal
00189 ( const double real1, const double real2, const double atol,
00190 const double rtol );
00192 static bool _isequal
00193 ( const double real1, const double real2 );
00194 };
00195
00197 inline McCormick::McCormick()
00198 : _l( 0. ), _u( 0. ), _cv( 0. ), _cc( 0. )
00200 {
00201 _sizep = _np;
00202
00203
00204 if( _sizep > 0 ){
00205 _dcvdp = new double[ _sizep ];
00206 _dccdp = new double[ _sizep ];
00207 }
00208 else{
00209 _dcvdp = _dccdp = NULL;
00210 }
00211 }
00212
00214 inline McCormick::~McCormick()
00216 {
00217 delete [] _dcvdp;
00218 delete [] _dccdp;
00219 }
00220
00221 #endif