Changeset 2808 in Sophya for trunk/SophyaLib/NTools
- Timestamp:
- Jun 14, 2005, 1:25:05 PM (20 years ago)
- Location:
- trunk/SophyaLib/NTools
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/FSAppIrrSmpl.h
r2322 r2808 25 25 26 26 //////////////////////////////////////////////////////////////////// 27 // Un signal donne , suppose a bande de frequences limitee, de longueur 28 // finie est periodise. Ce signal periodise est suppose developpe 29 // en serie de Fourier finie: l'approximation consiste a rechercher 30 // les coefficients de cette serie de Fourier. Cela est fait en utilisant 31 // le fait que la matrice du systeme a ecrire est Toeplitz. On utilise 32 // une classe ToeplitzMatrix, qui utilise les FFT pour la resolution 33 // L'utilisation standard comporte les etapes suivantes : 34 // 35 // constructeur --> definit l'echantillonnage et l'amplitude 36 // des abscisses (pour periodisation) 37 // 38 // methode approximateSignal(nbFreq, signal) : definit la bande 39 // de frequences et les valeurs du signal 40 // 41 // recuperation de valeurs approximees ou interpolees : 42 // methodes: . restaureSignal() (signal "debruite" aux valeurs 43 // d'echantionnage) 44 // . restaureRegularlySampledSignal() (signal recalcule 45 // sur un echantillonnage regulier quelconque) 46 // . computeSignalOnASampling() (signal recalcule 47 // sur un echantillonnage irregulier quelconque) 48 // 49 // on peut aussi recuperer les valeurs des coefficients du developpement 50 // en serie de Fourier (methodes complexFourierCoef() et coeffCosSin() 27 /*! 28 \ingroup NTools 29 \class SOPHYA::FSApproximationIrregularSampling 30 \brief Signal interpolation/approximation using Fourier series with irregularly 31 sampled data 32 33 \verbatim 34 Un signal donne , suppose a bande de frequences limitee, de longueur 35 finie est periodise. Ce signal periodise est suppose developpe 36 en serie de Fourier finie: l'approximation consiste a rechercher 37 les coefficients de cette serie de Fourier. Cela est fait en utilisant 38 le fait que la matrice du systeme a ecrire est Toeplitz. On utilise 39 une classe ToeplitzMatrix, qui utilise les FFT pour la resolution 40 L'utilisation standard comporte les etapes suivantes : 41 42 constructeur --> definit l'echantillonnage et l'amplitude 43 des abscisses (pour periodisation) 44 45 methode approximateSignal(nbFreq, signal) : definit la bande 46 de frequences et les valeurs du signal 47 48 recuperation de valeurs approximees ou interpolees : 49 methodes: . restaureSignal() (signal "debruite" aux valeurs 50 d'echantionnage) 51 . restaureRegularlySampledSignal() (signal recalcule 52 sur un echantillonnage regulier quelconque) 53 . computeSignalOnASampling() (signal recalcule 54 sur un echantillonnage irregulier quelconque) 55 56 on peut aussi recuperer les valeurs des coefficients du developpement 57 en serie de Fourier (methodes complexFourierCoef() et coeffCosSin() 58 59 \endverbatim 60 \sa SOPHYA::ToeplitzMatrix 61 */ 51 62 ///////////////////////////////////////////////////////////////////// 52 63 53 64 namespace SOPHYA { 54 65 class FSApproximationIrregularSampling 55 66 { … … 163 174 }; 164 175 176 } // namespace SOPHYA 165 177 166 178 #endif -
trunk/SophyaLib/NTools/cspline.cc
r2615 r2808 14 14 #include "cspline.h" 15 15 16 //++ 17 // Class CSpline 18 // Lib Outils++ 19 // include cspline.h 20 // 21 // Classe de spline 1D 22 //-- 23 24 //++ 25 // Titre Constructeurs 26 //-- 27 28 ////////////////////////////////////////////////////////////////////////////// 29 //++ 16 /*! 17 \class SOPHYA::CSpline 18 \ingroup NTools 19 Spline 3 smoother (interpolator) for 1-D data points (y = f(x)) 20 \sa CSpline2 21 */ 22 23 /*! 24 Createur pour spline 3 sur "x[0->n],y[0->n]" avec "yp1,ypn" derivees 25 au premier et dernier points et "natural" indiquant les types de 26 contraintes sur les derivees 2sd au premier et dernier point. 27 "order" doit etre mis a "true" si le tableau de "x[]" n'est pas ordonne 28 dans l'ordre des "x" croissants ("x[i]<x[i+1]"): cette option 29 realloue la place pour les tableaux "x,y" autrement seule une 30 connection aux tableaux "x,y" externes est realisee. 31 */ 30 32 CSpline::CSpline(int n,double* x,double* y,double yp1,double ypn 31 33 ,int natural,bool order) 32 //33 // Createur pour spline 3 sur "x[0->n],y[0->n]" avec "yp1,ypn" derivees34 // au premier et dernier points et "natural" indiquant les types de35 // contraintes sur les derivees 2sd au premier et dernier point.36 // "order" doit etre mis a "true" si le tableau de "x[]" n'est pas ordonne37 // dans l'ordre des "x" croissants ("x[i]<x[i+1]"): cette option38 // realloue la place pour les tableaux "x,y" autrement seule une39 // connection aux tableaux "x,y" externes est realisee.40 //--41 34 : Nel(0), corrupt_Y2(true), XY_Created(false), Natural(natural) 42 35 , YP1(yp1), YPn(ypn), X(NULL), Y(NULL), Y2(NULL), tmp(NULL) … … 47 40 } 48 41 49 ////////////////////////////////////////////////////////////////////////////// 50 //++ 42 //! Createur par defaut. 51 43 CSpline::CSpline(double yp1,double ypn,int natural) 52 //53 // Createur par defaut.54 //--55 44 : Nel(0), corrupt_Y2(true), XY_Created(false), Natural(natural) 56 45 , YP1(yp1), YPn(ypn), X(NULL), Y(NULL), Y2(NULL), tmp(NULL) … … 59 48 60 49 ////////////////////////////////////////////////////////////////////////////// 50 //! destructeur 61 51 CSpline::~CSpline() 62 // destructeur63 52 { 64 53 DelTab(); 65 54 } 66 55 67 //++ 68 // Titre Methodes 69 //-- 70 71 ////////////////////////////////////////////////////////////////////////////// 72 //++ 56 /*! 57 Pour changer les tableaux sans recreer la classe, 58 memes arguments que dans le createur. 59 Pour connecter les tableaux "x[n],y[n]" aux pointeurs internes "X,Y" 60 Si "order=true", on considere que x n'est pas range par ordre 61 des "x" croissants. La methode alloue de la place pour des tableaux 62 internes "X,Y" qu'elle re-ordonne par "x" croissant. 63 "force=true" impose la reallocation des divers buffers, sinon 64 la reallocation n'a lieu que si le nombre de points augmente. 65 */ 73 66 void CSpline::SetNewTab(int n,double* x,double* y,bool order,bool force) 74 //75 // Pour changer les tableaux sans recreer la classe,76 // memes arguments que dans le createur.77 // Pour connecter les tableaux "x[n],y[n]" aux pointeurs internes "X,Y"78 // Si "order=true", on considere que x n'est pas range par ordre79 // des "x" croissants. La methode alloue de la place pour des tableaux80 // internes "X,Y" qu'elle re-ordonne par "x" croissant.81 // "force=true" impose la reallocation des divers buffers, sinon82 // la reallocation n'a lieu que si le nombre de points augmente.83 //--84 67 { 85 68 ASSERT( n>3 ); … … 132 115 133 116 ////////////////////////////////////////////////////////////////////////////// 117 //! destruction des divers tableaux en tenant compte des allocations/connections 134 118 void CSpline::DelTab() 135 // destruction des divers tableaux en tenant compte des allocations/connections136 119 { 137 120 if( X != NULL && XY_Created ) delete [] X; X = NULL; … … 142 125 143 126 ////////////////////////////////////////////////////////////////////////////// 144 //++ 127 /*! 128 Pour changer les valeurs des derivees 1ere au 1er et dernier points 129 Valeurs imposees des derivees 1ere au points "X[0]" et "X[Nel-1]". 130 */ 145 131 void CSpline::SetBound1er(double yp1,double ypn) 146 //147 // Pour changer les valeurs des derivees 1ere au 1er et dernier points148 // Valeurs imposees des derivees 1ere au points "X[0]" et "X[Nel-1]".149 //--150 132 { 151 133 if( yp1 == YP1 && ypn == YPn ) return; … … 157 139 } 158 140 159 ////////////////////////////////////////////////////////////////////////////// 160 //++ 141 //! Pour calculer les tableaux de coeff permettant le calcul des interpolations spline. 161 142 void CSpline::ComputeCSpline() 162 //163 // Pour calculer les tableaux de coeff permettant le calcul164 // des interpolations spline.165 //--166 143 { 167 144 // on ne fait rien si les tableaux ne sont pas connectes … … 206 183 } 207 184 208 ////////////////////////////////////////////////////////////////////////////// 209 //++ 185 //! Interpolation spline en \b x 210 186 double CSpline::CSplineInt(double x) 211 //212 // Interpolation spline en "x"213 //--214 187 { 215 188 int klo,khi,k; … … 243 216 } 244 217 245 /////////////////////////////////////////////////////////////// 246 ///////// rappel des inlines pour commentaires //////////////// 247 /////////////////////////////////////////////////////////////// 248 249 //++ 250 // inline void SetNaturalCSpline(int type = NaturalAll) 251 // Pour changer le type de contraintes sur les derivees 2sd 252 //-- 253 //++ 254 // inline void Free_Tmp() 255 // Pour liberer la place tampon qui ne sert que 256 // dans ComputeCSpline() et pas dans CSplineInt 257 //-- 258 259 ////////////////////////////////////////////////////////////////////////////// 260 ////////////////////////////////////////////////////////////////////////////// 261 262 //++ 263 // Class CSpline2 264 // Lib Outils++ 265 // include cspline.h 266 // 267 // Classe de spline 2D 268 //-- 269 270 //++ 271 // Titre Constructeurs 272 //-- 273 274 ////////////////////////////////////////////////////////////////////////////// 275 //++ 218 219 ////////////////////////////////////////////////////////////////////////////// 220 ////////////////////////////////////////////////////////////////////////////// 221 222 /*! 223 \class SOPHYA::CSpline2 224 \ingroup NTools 225 Spline smoother (interpolator) for 2-D data points (y = f(x1,x2)) 226 \sa CSpline 227 */ 228 229 /*! 230 Contructeur - Meme commentaire que pour CSpline avec: 231 \verbatim 232 x1[n1]: liste des coordonnees selon l axe 1 233 x2[n2]: liste des coordonnees selon l axe 2 234 y[n1*n2]: liste des valeurs avec le rangement suivant 235 x1[0]......x1[n1-1] x1[0]......x1[n1-1] ... x1[0]......x1[n1-1] 236 | 0<=i<n1 | | 0<=i<n1 | ... | 0<=i<n1 | 237 | j=0 X2[0] j=1 X2[1] j=n2-1 X2[n2-1] 238 \endverbatim 239 */ 276 240 CSpline2::CSpline2(int n1,double* x1,int n2,double* x2,double* y 277 241 ,int natural,bool order) 278 //279 // Meme commentaire que pour CSpline avec:280 //| x1[n1]: liste des coordonnees selon l axe 1281 //| x2[n2]: liste des coordonnees selon l axe 2282 //| y[n1*n2]: liste des valeurs avec le rangement suivant283 //| x1[0]......x1[n1-1] x1[0]......x1[n1-1] ... x1[0]......x1[n1-1]284 //| | 0<=i<n1 | | 0<=i<n1 | ... | 0<=i<n1 |285 //| j=0 X2[0] j=1 X2[1] j=n2-1 X2[n2-1]286 //--287 242 : Nel1(0), Nel2(0), corrupt_Y2(true), XY_Created(false), Natural(natural) 288 243 , X1(NULL), X2(NULL), Y(NULL), Y2(NULL) … … 294 249 } 295 250 296 ////////////////////////////////////////////////////////////////////////////// 297 //++ 251 //! Createur par defaut. 298 252 CSpline2::CSpline2(int natural) 299 //300 // Createur par defaut.301 //--302 253 : Nel1(0), Nel2(0), corrupt_Y2(true), XY_Created(false), Natural(natural) 303 254 , X1(NULL), X2(NULL), Y(NULL), Y2(NULL) … … 312 263 } 313 264 314 //++ 315 // Titre Methodes 316 //-- 317 318 ////////////////////////////////////////////////////////////////////////////// 319 //++ 265 ////////////////////////////////////////////////////////////////////////////// 266 //! Voir commentaire meme methode de CSpline 320 267 void CSpline2::SetNewTab(int n1,double* x1,int n2,double* x2,double* y 321 268 ,bool order,bool force) 322 //323 // Voir commentaire meme methode de CSpline324 //--325 269 { 326 270 ASSERT( n1>3 && n2>3 ); … … 430 374 431 375 ////////////////////////////////////////////////////////////////////////////// 432 // ++376 //! Voir commentaire meme methode de CSpline 433 377 void CSpline2::ComputeCSpline() 434 //435 // Voir commentaire meme methode de CSpline436 //--437 378 { 438 379 // on ne fait rien si X1 ou X2 ou Y non connectes … … 454 395 455 396 ////////////////////////////////////////////////////////////////////////////// 456 // ++397 //! Calcule la valeur interpole (spline) pour le point \b (x1,x2) 457 398 double CSpline2::CSplineInt(double x1,double x2) 458 //459 // Voir commentaire meme methode de CSpline460 //--461 399 { 462 400 // calcul de la valeur Y pour x=x1 et remplissage du tampon tmp … … 471 409 } 472 410 473 ///////////////////////////////////////////////////////////////474 ///////// rappel des inlines pour commenatires ////////////////475 ///////////////////////////////////////////////////////////////476 477 //++478 // inline void SetNaturalCSpline(int type = NaturalAll)479 // Voir commentaire meme methode de CSpline480 //-- -
trunk/SophyaLib/NTools/cspline.h
r896 r2808 31 31 void SetBound1er(double yp1 = 0.,double yp2 = 0.); 32 32 33 //! Pour changer le type de contraintes sur les derivees 2sd 33 34 inline void SetNaturalCSpline(int type = NaturalAll) 34 35 { Natural = type;} 35 36 37 //! Pour liberer la place tampon qui ne sert que dans ComputeCSpline() et pas dans CSplineInt 36 38 inline void Free_Tmp() 37 39 { if(tmp != NULL) delete [] tmp; tmp=NULL;} … … 88 90 ,bool order=true,bool force=false); 89 91 92 //! Pour changer le type de contraintes sur les derivees 2sd 90 93 inline void SetNaturalCSpline(int type = CSpline::NaturalAll) 91 94 { Natural = type;} -
trunk/SophyaLib/NTools/dates.cc
r2615 r2808 11 11 #include "dates.h" 12 12 13 //++ 14 // Class TimeZone 15 // Lib Outils++ 16 // include dates.h 17 // 18 // Classe de fuseau horaire. Permet les conversion 19 // GMT <-> temps local, en gérant les changements 20 // d'heure hiver-été. 21 // Deux fuseaux horaires sont prédéfinis, "France" 22 // et "Chili". 23 //-- 13 /*! 14 \class TimeZone 15 \ingroup NTools 16 Management of time zones - This class is used with class Date. 17 \warning Unless necessary, DO NOT USE this class. 18 \sa SOPHYA::TimeStamp 19 20 \verbatim 21 22 Classe de fuseau horaire. Permet les conversion 23 GMT <-> temps local, en gérant les changements 24 d'heure hiver-été. 25 Deux fuseaux horaires sont prédéfinis, "France" 26 et "Chili". 27 \endverbatim 28 */ 24 29 25 30 TimeZone* gTimeZone = NULL; 26 31 27 //++ 28 // Titre Constructeurs 29 //-- 30 31 //++ 32 33 /*! 34 Constructeur par défaut. Il lit la variable 35 d'environnement ACQ_TZ pour choisir le fuseau 36 horaire. Si la variable n'est pas définie, nous 37 sommes en France... 38 */ 32 39 TimeZone::TimeZone() 33 //34 // Constructeur par défaut. Il lit la variable35 // d'environnement ACQ_TZ pour choisir le fuseau36 // horaire. Si la variable n'est pas définie, nous37 // sommes en France...38 //--39 40 { 40 41 char* p = getenv("ACQ_TZ"); … … 47 48 } 48 49 49 // ++50 //! Constructeur à partir du nom d'un fuseau horaire. 50 51 TimeZone::TimeZone(const char* nom) 51 //52 // Constructeur à partir du nom d'un fuseau horaire.53 //--54 52 { 55 53 SetZone(nom); 56 54 } 57 55 58 //++ 56 /*! 57 Choisit un fuseau horaire. Contient la définition 58 du fuseau "France" (GMT+1, DST : dernier dimanche 59 de mars - dernier dimanche de septembre, c'est-à-dire 60 pré-gouvernement Juppé), et Chili (GMT-4, DST : 61 deuxième dimanche d'octobre - deuxième dimanche de mars). 62 */ 59 63 void TimeZone::SetZone(const char* nom) 60 //61 // Choisit un fuseau horaire. Contient la définition62 // du fuseau "France" (GMT+1, DST : dernier dimanche63 // de mars - dernier dimanche de septembre, c'est-à-dire64 // pré-gouvernement Juppé), et Chili (GMT-4, DST :65 // deuxième dimanche d'octobre - deuxième dimanche de mars).66 //--67 64 { 68 65 if (!strcmp(nom,"France")) { … … 96 93 } 97 94 98 // ++95 //! Teste si une date est en heure d'été (DST). 99 96 int TimeZone::IsDst(const Date& date) 100 //101 // Teste si une date est en heure d'été (DST).102 //--103 97 { 104 98 Date dt = date; … … 139 133 } 140 134 141 //++ 135 /*! 136 Retourne la difference TL-GMT pour une date donnée, 137 en tenant compte de l'heure d'été éventuelle. 138 */ 142 139 int TimeZone::GetOffset(const Date& date) 143 //144 // Retourne la difference TL-GMT pour une date donnée,145 // en tenant compte de l'heure d'été éventuelle.146 //--147 140 { 148 141 return IsDst(date) ? gmtOffset+dstOffset : gmtOffset; 149 142 } 150 143 151 //++ 152 // Class Date 153 // Lib Outils++ 154 // include dates.h 155 // 156 // Une classe date comme une autre, avec gestion 157 // temps local / GMT / changement d'heure, et un 158 // jour temps sidéral. 159 // 160 // Une partie de la date (heure, jour...) peut être 161 // indéterminée. Les comparaisons sont alors faites 162 // de façon astucieuse... 163 // 164 // La date peut être déterminée de minuit à minuit 165 // ou de midi à midi (nuit d'observation). Logique 166 // complexe et peut-être foireuse pour passer de 167 // l'un à l'autre, mais pas encore d'ennuis pour le 168 // moment... Une date-nuit doit avoir une heure 169 // indéterminée. 170 // 171 // Il faut que Date::gTimeZone soit initialisé pour 172 // éviter des gros pépins, mais PeidaInit() le fait. 173 // 174 // An 2000 : Lorsqu'on gère des dates sous forme de chaine : 175 // * En sortie, 2 caractères pour l'année entre 1950 et 1999 176 // et 4 caractères sinon 177 // * En entrée, si AA<100 on ajoute 1900. 178 //-- 179 180 //++ 144 145 146 /*! 147 \class Date 148 \ingroup NTools 149 Date manipulation classe 150 \warning Unless necessary, DO NOT USE this class. 151 Use SOPHYA::TimeStamp instead. 152 153 \verbatim 154 155 Une classe date comme une autre, avec gestion 156 temps local / GMT / changement d'heure, et un 157 jour temps sidéral. 158 159 Une partie de la date (heure, jour...) peut être 160 indéterminée. Les comparaisons sont alors faites 161 de façon astucieuse... 162 163 La date peut être déterminée de minuit à minuit 164 ou de midi à midi (nuit d'observation). Logique 165 complexe et peut-être foireuse pour passer de 166 l'un à l'autre, mais pas encore d'ennuis pour le 167 moment... Une date-nuit doit avoir une heure 168 indéterminée. 169 170 Il faut que Date::gTimeZone soit initialisé pour 171 éviter des gros pépins, mais PeidaInit() le fait. 172 173 An 2000 : Lorsqu'on gère des dates sous forme de chaine : 174 * En sortie, 2 caractères pour l'année entre 1950 et 1999 175 et 4 caractères sinon 176 * En entrée, si AA<100 on ajoute 1900. 177 178 */ 179 //! Retourne le nombre de jours dans le mois 181 180 short Date::MonthDays(short mois, short annee) 182 //183 // Retourne le nombre de jours dans le mois184 //--185 181 { 186 182 if (mois<1 || mois>12) throw ParmError(PExcLongMessage("")); … … 206 202 } 207 203 208 // ++204 //! Retourne le nombre de jours dans l'année 209 205 short Date::YearDays(short annee) 210 //211 // Retourne le nombre de jours dans l'année212 //--213 206 { 214 207 return (((annee%4 == 0) && (annee%100 != 0)) || (annee%400 == 0)) ? 366 : 365; 215 208 } 216 209 217 //++218 210 bool Date::UndetDate() const 219 / /220 // Retourne true si une partie de la date (jour 221 //ou mois ou année) est indéterminée.222 //-- 211 /*! 212 Retourne true si une partie de la date (jour 213 ou mois ou année) est indéterminée. 214 */ 223 215 { 224 216 return ((AA == -1) || (MM == -1) || (JJ == -1)); 225 217 } 226 218 227 //++ 219 /*! 220 Retourne true si toute la date (jour 221 et mois et année) est indéterminée. 222 */ 228 223 bool Date::AllUndetDate() const 229 //230 // Retourne true si toute la date (jour231 // et mois et année) est indéterminée.232 //--233 224 { 234 225 return ((AA == -1) && (MM == -1) && (JJ == -1)); 235 226 } 236 227 237 //++238 228 bool Date::UndetTime() const 239 / /240 //Retourne true si une partie de l'heure (heure241 //ou minutes ou secondes) est indéterminée.242 //-- 229 /*! 230 Retourne true si une partie de l'heure (heure 231 ou minutes ou secondes) est indéterminée. 232 */ 243 233 { 244 234 return ((hh == -1) || (mm == -1) || (ss == -1)); 245 235 } 246 236 247 //++ 237 238 /*! 239 Retourne true si toute l'heure (heure 240 et minutes et secondes) est indéterminée. 241 */ 248 242 bool Date::AllUndetTime() const 249 //250 // Retourne true si toute l'heure (heure251 // et minutes et secondes) est indéterminée.252 //--253 243 { 254 244 return ((hh == -1) && (mm == -1) && (ss == -1)); … … 257 247 //Date::operator double() const 258 248 259 // ++249 //! Jours écoulés depuis le 0 janvier 1901 0h TU 260 250 double 261 251 Date::GetDays() const 262 //263 // Jours écoulés depuis le 0 janvier 1901 0h TU264 //--265 252 { 266 253 if (UndetTime() && !AllUndetTime()) throw ParmError(PExcLongMessage("")); … … 281 268 } 282 269 283 // ++270 //! Initialisation a partir jours écoulés depuis le 0 janvier 1901 0h TU 284 271 void Date::Set(double t) 285 //286 // Jours écoulés depuis le 0 janvier 1901 0h TU287 //--288 272 { 289 273 t += 1/8640000.0; … … 323 307 nuit = 0; 324 308 } 325 //++ 309 310 //! Constructeur. Prend l'heure courante... 326 311 Date::Date() 327 //328 // Constructeur. Prend l'heure courante...329 //--330 312 : timeZone(gTimeZone) 331 313 { … … 342 324 } 343 325 344 // ++326 //! Constructeur simple. 345 327 Date::Date(int J, int M, int A, int h, int m, double s) 346 //347 // Constructeur simple.348 //--349 328 : JJ(J), MM(M), AA(A), hh(h), mm(m), ss(s), timeZone(gTimeZone), nuit(0) 350 329 { 351 330 } 352 331 353 // ++332 //! Constructeur à partir des jours écoulés depuis le 0 janvier 1901 0h TU 354 333 Date::Date(double t) 355 //356 // Constructeur à partir des357 // jours écoulés depuis le 0 janvier 1901 0h TU358 //359 //--360 334 : timeZone(gTimeZone) 361 335 { … … 363 337 } 364 338 365 // ++339 //! On change de fuseau horaire. 366 340 void Date::SetTimeZone(TimeZone* tz) 367 //368 // On change de fuseau horaire.369 //--370 341 { 371 342 timeZone = tz; 372 343 } 373 344 374 //++ 345 /*! 346 Constructeur à partir de la date sous la forme 347 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 348 (par défaut) ou Date::kLocalTime. 349 */ 375 350 Date::Date(const char* date, const char* heure, int tOpt) 376 //377 // Constructeur à partir de la date sous la forme378 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime379 // (par défaut) ou Date::kLocalTime.380 //381 // Tout ou partie de la date peut être indéterminée ('??').382 //--383 351 : timeZone(gTimeZone) 384 352 { … … 386 354 } 387 355 388 //++ 356 /*! 357 Constructeur à partir de la date sous la forme 358 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 359 (par défaut) ou Date::kLocalTime. 360 361 Tout ou partie de la date peut être indéterminée ('??'). 362 */ 389 363 Date::Date(string const& date, string const& heure, int tOpt) 390 //391 // Constructeur à partir de la date sous la forme392 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime393 // (par défaut) ou Date::kLocalTime.394 //395 // Tout ou partie de la date peut être indéterminée ('??').396 //--397 364 : timeZone(gTimeZone) 398 365 { … … 400 367 } 401 368 402 //++ 369 /*! 370 Positionne la date sous la forme 371 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 372 (par défaut) ou Date::kLocalTime. 373 374 Tout ou partie de la date peut être indéterminée ('??'). 375 */ 403 376 void Date::Set(string const& date, string const& heure, int tOpt) 404 //405 // Positionne la date sous la forme406 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime407 // (par défaut) ou Date::kLocalTime.408 //409 // Tout ou partie de la date peut être indéterminée ('??').410 //--411 377 { 412 378 Set(date.c_str(), heure == "" ? (char*)NULL : heure.c_str(), tOpt); 413 379 } 414 380 415 //++ 381 /*! 382 Positionne la date sous la forme 383 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 384 (par défaut) ou Date::kLocalTime. 385 386 Tout ou partie de la date peut être indéterminée ('??'). 387 */ 416 388 void Date::Set(const char* date, const char* heure, int tOpt) 417 //418 // Positionne la date sous la forme419 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime420 // (par défaut) ou Date::kLocalTime.421 //422 // Tout ou partie de la date peut être indéterminée ('??').423 //--424 389 { 425 390 nuit = 0; … … 538 503 } 539 504 540 //++ 505 /*! 506 Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY' 507 en tOpt = Date::kGMTTime ou Date::kLocalTime. 508 */ 541 509 void Date::GetDateStr(char* s, int tOpt) const 542 //543 // Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'544 // en tOpt = Date::kGMTTime ou Date::kLocalTime.545 //--546 510 { 547 511 Date dt(*this); … … 566 530 } 567 531 568 // ++532 //! Code EROS de la date. 569 533 void Date::GetDateCode(char* s, int tOpt) const 570 //571 // Code EROS de la date.572 //--573 534 { 574 535 Date dt(*this); … … 603 564 } 604 565 605 // ++566 //! Récupère l'heure sous la forme 'HH:MM:SS' 606 567 void Date::GetTimeStr(char* s, int tOpt) const 607 //608 // Récupère l'heure sous la forme 'HH:MM:SS'609 //--610 568 { 611 569 Date dt(*this); … … 624 582 } 625 583 626 // ++584 //! Récupèrera un jour le temps sidéral. 627 585 void Date::GetSidTStr(char* s) const 628 //629 // Récupèrera un jour le temps sidéral.630 //--631 586 { 632 587 strcpy(s,"TOBEDONE!!"); 633 588 } 634 589 635 //++636 590 string Date::DateStr(int tOpt) const 637 / /638 //Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'639 //en tOpt = Date::kGMTTime ou Date::kLocalTime.640 //-- 591 /*! 592 Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY' 593 en tOpt = Date::kGMTTime ou Date::kLocalTime. 594 */ 641 595 { 642 596 char s[20]; … … 645 599 } 646 600 647 // ++601 //! Code EROS de la date. 648 602 string Date::DateCode(int tOpt) const 649 //650 // Code EROS de la date.651 //--652 603 { 653 604 char s[20]; … … 656 607 } 657 608 658 // ++609 //! Récupère l'heure sous la forme 'HH:MM:SS' 659 610 string Date::TimeStr(int tOpt) const 660 //661 // Récupère l'heure sous la forme 'HH:MM:SS'662 //--663 611 { 664 612 char s[20]; … … 667 615 } 668 616 669 // ++617 //! Récupèrera un jour le temps sidéral. 670 618 string Date::SidTStr() const 671 //672 // Récupèrera un jour le temps sidéral.673 //--674 619 { 675 620 char s[20]; … … 678 623 } 679 624 680 // ++625 //! Retourne le jour dans la semaine, 0-6 avec 0 = Date::jour_Lundi. 681 626 int Date::DayOfWeek(int tOpt) const 682 //683 // Retourne le jour dans la semaine, 0-6684 // avec 0 = Date::jour_Lundi.685 //--686 627 { 687 628 double t = GetDays(); … … 696 637 } 697 638 698 //++ 639 /*! 640 Retourne la date correspondant au ieme joursem dans le mois 641 correspondant (exemple, 2e dimanche de mars 1960). 642 */ 699 643 short Date::NthMonthDay(short i, short joursem, short mois, short annee) 700 //701 // Retourne la date correspondant au ieme joursem dans le mois702 // correspondant (exemple, 2e dimanche de mars 1960).703 //--704 644 { 705 645 if (i>0) { … … 717 657 } 718 658 719 // ++659 //! Ajout un nombre \b dt en jours 720 660 Date& Date::operator += (double dt) 721 //722 // dt en jours723 //--724 661 { 725 662 int u = UndetTime(); … … 729 666 } 730 667 731 // ++668 //! retranche un intervalle de temps \b dt en jours 732 669 Date& Date::operator -= (double dt) 733 //734 // dt en jours735 //--736 670 { 737 671 int u = UndetTime(); … … 741 675 } 742 676 743 //++744 677 Date operator + (Date const& d, double dt) 745 //746 //--747 678 { 748 679 Date a(d); … … 751 682 } 752 683 753 //++754 684 Date operator - (Date const& d, double dt) 755 //756 //--757 685 { 758 686 Date a(d); … … 761 689 } 762 690 763 // ++691 //! Résultat en jours 764 692 double operator - (Date const& a, Date const& b) 765 //766 // Résultat en jours767 //--768 693 { 769 694 if (a.UndetTime() != b.UndetTime()) throw ParmError(PExcLongMessage("")); … … 772 697 } 773 698 774 // ++699 //! On n'a pas égalite dès que des éléments déterminés sont différents 775 700 bool operator == (Date const& a, Date const& b) 776 //777 // On n'a pas égalite dès que des éléments déterminés sont différents778 //--779 701 { 780 702 if (a.nuit && a.UndetTime() && !b.nuit && !b.UndetTime() && b.hh<12) … … 792 714 } 793 715 794 //++795 716 bool operator != (Date const& a, Date const& b) 796 //797 //--798 717 { 799 718 return !(a == b); 800 719 } 801 720 802 // ++721 //! Inégalité large. Pas de subtilités 803 722 bool operator <= (Date const& a, Date const& b) 804 //805 // Inégalité large. Pas de subtilités806 //--807 723 { 808 724 if (a.nuit && a.UndetTime() && !b.nuit && !b.UndetTime() && b.hh<12) … … 838 754 } 839 755 840 //++ 756 /*! 757 Inégalité stricte, codée à partir de la large pour résoudre 758 sans cas particuliers les subtilités 759 01/02/95 < ??/03/95 mais pas 01/02/95 < ??/02/95 760 */ 841 761 bool operator < (Date const& a, Date const& b) 842 //843 // Inégalité stricte, codée à partir de la large pour résoudre844 // sans cas particuliers les subtilités845 // 01/02/95 < ??/03/95 mais pas 01/02/95 < ??/02/95846 //--847 762 { 848 763 return (a <= b) && !(a == b); 849 764 } 850 765 851 //++852 766 bool operator >= (Date const& a, Date const& b) 853 //854 //--855 767 { 856 768 return (b <= a); 857 769 } 858 770 859 //++860 771 bool operator > (Date const& a, Date const& b) 861 //862 //--863 772 { 864 773 return (b < a); 865 774 } 866 775 867 //++868 776 ostream& operator << (ostream& s, Date const& d) 869 //870 //--871 777 { 872 778 char x[20]; … … 877 783 return s; 878 784 } 785 -
trunk/SophyaLib/NTools/dates.h
r2322 r2808 14 14 15 15 class TimeZone; 16 // <summary> Dates, conversions, operations </summary>16 //! Dates, conversions, operations 17 17 // Classe generale de date et heure, operation, TU/TL ... 18 18 class Date { 19 19 public: 20 // Enumerations jours et mois 21 // <group> 20 //! Enumerations jours et mois 22 21 enum Jour {jour_Lundi=0, jour_Mardi, jour_Mercredi, jour_Jeudi, jour_Vendredi, jour_Samedi, jour_Dimanche}; 23 22 enum Mois {mois_Janvier=1, mois_Fevrier, mois_Mars, mois_Avril, mois_Mai, mois_Juin, mois_Juillet, 24 23 mois_Aout, mois_Septembre, mois_Octobre, mois_Novembre, mois_Decembre}; 25 24 enum {kGMTTime=0, kLocalTime=1}; 26 // </group>27 25 28 26 // Constructeur : maintenant -
trunk/SophyaLib/NTools/datime.c
r682 r2808 16 16 17 17 /* Fonctions de calcule de date et temps (Heure) */ 18 /* 19 ++ 20 Module Dates (C) 21 Lib LibsUtil 22 include datime.h 23 24 Ce groupe de fonctions permettent de manipuler des dates et heures. 25 En particulier, il est possible de calculer l'ecart (en nombre de jours 26 ou de secondes separant deux dates, ou le temps sideral correspondant 27 a une date et heure legale. Deux structures simples sont definies 28 afin de faciliter le passage des arguments entre differentes fonctions: 29 - *JMA* : Jour, Mois, Annee 30 - *HMS* : Heure, Minutes, Secondes 31 32 -- 33 */ 34 /* 35 ++ 36 Links Voir aussi: 37 Temps Sideral, Universel (C) 38 -- 39 */ 40 /* 41 ++ 42 Titre Quelques Macros 43 -- 18 /*! 19 \ingroup NTools 20 \file datime.c 21 \brief Set of C functions and macros to manipulate date and time + Sidereal time 22 and simple astronomical functions. 23 24 \warning If possible, use class SOPHYA::TimeStamp in module BaseTools 25 for date/time computation. 26 27 Ce groupe de fonctions permettent de manipuler des dates et heures. 28 En particulier, il est possible de calculer l'ecart (en nombre de jours 29 ou de secondes separant deux dates, ou le temps sideral correspondant 30 a une date et heure legale. Deux structures simples sont definies 31 afin de faciliter le passage des arguments entre differentes fonctions: 32 - JMA : Jour, Mois, Annee 33 - HMS : Heure, Minutes, Secondes 34 35 \sa SOPHYA::TimeStamp 44 36 */ 45 37 … … 68 60 -- 69 61 */ 70 62 /*! 63 \ingroup NTools 64 Decodage d'une chaine de caracteres "strg" sous forme de "hh:mm:ss 10:43:60.5" 65 en structure HMS "hms" avec gestion des signes (decodage correcte de -44:30:05.23) 66 */ 71 67 void StrtoHMS(char *s,HMS* h) 72 68 /* On ne peut pas ecrire 1:-05:-45 pas gere et debile! (mn et sec >=0.) cmv 12/8/97 */ … … 101 97 } 102 98 103 99 /*! 100 \ingroup NTools 101 Ecrit le contenu de la structure HMS "hms" sous forme de "hh:mm:ss" dans la chaine 102 de caracteres "strg" avec gestion des signes 103 */ 104 104 void HMStoStr(HMS h,char *s) 105 105 /* L'ecriture est forcee a h:mn:sec avec mn et sec >=0 cmv 12/8/97 */ … … 117 117 118 118 /* Nouvelle-Fonction */ 119 /*! 120 \ingroup NTools 121 \brief Retourne le nombre de jours dans le mois m, annee a 122 */ 119 123 int NbJourMois(int a, int m) 120 124 /* Retourne le nombre de jours dans le mois m, annee a */ … … 130 134 } 131 135 136 /*! 137 \ingroup NTools 138 Calcule le Nombre de jours ecoules depuis 0 Jan 1901. 139 Si annee < 100 On considere annee = annee+1900 (1900-1999) 140 */ 132 141 /* Nouvelle-Fonction */ 133 142 long JMAtoJ(JMA jma) 134 /* Calcule le Nb. de jours ecoules depuis 0 Jan 1901 */135 /* Si annee < 100 On considere annee = annee+1900 (1900-1999) */136 137 143 { 138 144 long rc,nban; … … 162 168 } 163 169 170 /*! 171 \ingroup NTools 172 \brief retourne la date correspondant a \b j jours ecoules depuis le 0/1/1901 173 */ 164 174 /* Nouvelle-Fonction */ 165 175 JMA JtoJMA(long j) 166 /* retourne la date correspondant a j jours ecoules depuis le 0/1/1901 */167 176 { 168 177 long i; … … 215 224 } 216 225 226 /*! 227 \ingroup NTools 228 \brief Cette fonction calcule le numero de jour de la semaine (Lundi=1 .. Dimanche=7) 229 */ 217 230 /* Nouvelle-Fonction */ 218 231 int NumJour(JMA jma) 219 /* Cette fonction calcule le numero de jour de la semaine */220 /* (Lundi=1 .. Dimanche=7) */221 222 232 { 223 233 int l; … … 289 299 } 290 300 301 /*! 302 \ingroup NTools 303 Pour "nj=dd*10+jj", calcule la date correspondant au jour 304 "jj" (1 .. 7 - Lundi .. Dimanche) du mois "mm" , annee "aa" 305 se trouvant apres (ou egal a) la date "dd/mm/aa" . 306 Si annee "aa" <= 99 -> annee de 1901 - 1999 307 */ 291 308 JMA JApmmaatoJMA(int nj, int mm, int aa) 292 /* Pour "nj=dd*10+jj", calcule la date correspondant au jour293 "jj" (1 .. 7 - Lundi .. Dimanche) du mois "mm" , annee "aa"294 se trouvant apres (ou egal a) la date "dd/mm/aa" .295 Si annee "aa" <= 99 -> annee de 1901 - 1999 */296 309 { 297 310 int i, dd, jj; … … 311 324 } 312 325 326 /*! 327 \ingroup NTools 328 Cette fonction calcule le nombre d'heures en decimales pour \b hms. 329 Heures/Minutes/Secondes peuvent etre +/- avec toutes les combinaisons possibles 330 */ 313 331 /* Nouvelle-Fonction */ 314 332 double HMStoH(HMS hms) … … 321 339 322 340 323 341 /*! 342 \ingroup NTools 343 \brief Conversion en secondes de la structure HMS "hms" 344 */ 324 345 /* Nouvelle-Fonction */ 325 346 double HMStoSec(HMS hms) … … 330 351 } 331 352 353 /*! 354 \ingroup NTools 355 Calcule le nombre de secondes correspondant a "date,heure" 356 a partir de l'origine 1er Janv 1990 0H00 ( Date entre 1930 - 2050 ) 357 */ 332 358 /* Nouvelle-Fonction */ 333 359 long DatetoSec(char const* date, char const* heure) … … 348 374 } 349 375 376 /*! 377 \ingroup NTools 378 Calcule le nombre de secondes correspondant a "date,heure" 379 a partir de l'origine 1er Janv 1990 0H00 ( Date entre 1930 - 2050 ) 380 en tenant compte des decalages des heures legales. 381 */ 350 382 /* Nouvelle-Fonction */ 351 383 long DatetoSecOff(char const* date, char const* heure) … … 368 400 } 369 401 402 /*! 403 \ingroup NTools 404 \brief Conversion heures en decimales en structure HMS 405 */ 370 406 /* Nouvelle-Fonction */ 371 407 HMS HtoHMS(double h) … … 386 422 } 387 423 424 /*! 425 \ingroup NTools 426 Conversion degres decimaux en structure HMS (deg,min,sec) 427 Degres decimaux en D , M , Sec Il y a un modulo 360. 428 la sortie est telle que -180 < deg <= 180. 429 */ 388 430 /* Nouvelle-Fonction */ 389 431 HMS DtoDMS(double h) 390 /* Degres decimaux en D , M , Sec Il y a un modulo 360 */391 /* la sortie est telle que -180 < deg <= 180. */392 432 { 393 433 HMS hms; … … 408 448 } 409 449 450 /*! 451 \ingroup NTools 452 Conversion degres/heures decimaux en structure HMS (deg/heure,min,sec) 453 SANS modulo 360/24 454 */ 410 455 /* Nouvelle-Fonction */ 411 456 HMS DoubletoHMS(double h) … … 875 920 } 876 921 877 922 /*! 923 \ingroup NTools 924 \brief Cette fonction donne le temps sideral moyen a greenwich a 0h UT 925 */ 878 926 /* Nouvelle-Fonction */ 879 927 HMS GMST_at_0h_UT (JMA date) … … 925 973 -- 926 974 */ 927 975 /*! 976 \ingroup NTools 977 Cette fonction calcule le temps sideral GMT a partir du temps 978 universel et de la date GMT. 979 \verbatim 980 Temps sideral 981 Jour Sideral = 86400 Sec. Sid. ( = 24 H Sid. ) 982 Annee Solaire = 365 J 5H 48' 46" =~ 365.2422 J 983 Annee Solaire = 365.2422 Jours Solaire Moyen = 366.2422 Jours Sideraux 984 Jour Sol. Moyem = 24 H Sol. = 24 H Sid. * (366.2422 / 365.2422) 985 Jour Solaire Moyen = 86636.555359 Sec. Sid. = 24 H 3' 56.555359" 986 Heure Solaire Moyen = 3609.85647 Sec. Sid. 987 Sec. Sol. = 1.0027379 Sec. Sid. 988 Le 1er Janvier 1989 0H TU Il etait 6H 42' 30" GMT_Sideral 989 \endverbatim 990 */ 928 991 /* Nouvelle-Fonction */ 929 992 HMS TUtoTSid(JMA date, HMS TU) … … 964 1027 } 965 1028 1029 /*! 1030 \ingroup NTools 1031 Cette fonction calcule les temps universels a partir du temps 1032 sideral GMT et de la date GMT. Selon la valeur du TS, il peut y avoir 1033 une ou deux possibilites pour le TU (return code). 1034 */ 966 1035 /* Nouvelle-Fonction */ 967 1036 int TSidtoTU(JMA date, HMS TS, HMS *TU1, HMS *TU2) … … 1027 1096 } 1028 1097 1029 /* 1030 ++ 1031 void TSidSetupLaSilla() 1032 Fonction d'initialisation de conversion de temps sideral et legal 1033 pour la ESO-Silla "SetTSolMOff() , SetTLegOff()". 1034 | Longitude = 70 deg 43.8 min ouest 1035 | Latitude = 29 deg 15.4 min Sud 1036 | T Sol. Moyen - TU = -4.715333 Heures 1037 | TLegal-TU : -4 Heures de Mars a Octobre, -3 Heures sinon 1038 | Changement le 1er dimanche >= 8/03 8/10 a midi (12:00:00) 1039 -- 1040 */ 1041 1098 /*! 1099 \ingroup NTools 1100 Fonction d'initialisation de conversion de temps sideral et legal 1101 pour la ESO-Silla "SetTSolMOff() , SetTLegOff()". 1102 \verbatim 1103 Longitude = 70 deg 43.8 min ouest 1104 Latitude = 29 deg 15.4 min Sud 1105 T Sol. Moyen - TU = -4.715333 Heures 1106 TLegal-TU : -4 Heures de Mars a Octobre, -3 Heures sinon 1107 Changement le 1er dimanche >= 8/03 8/10 a midi (12:00:00) 1108 \endverbatim 1109 */ 1042 1110 /* Fonction d'initialisation de calcul de temps sideral pour la Silla */ 1043 1111 void TSidSetupLaSilla() … … 1053 1121 1054 1122 1055 /* 1056 ++ 1057 double ToJulianDay(JMA dateTU, HMS hmsTU); 1058 Calcul du jour Julien pour une date TU. 1059 Uniquement valable a partir du 15/10/1582 00:00:00. 1060 -- 1061 */ 1062 1123 /*! 1124 \ingroup NTools 1125 Calcul du jour Julien pour une date TU. 1126 Uniquement valable a partir du 15/10/1582 00:00:00. 1127 1128 */ 1063 1129 double ToJulianDay(JMA dateTU, HMS hmsTU) 1064 1130 /* Cf Fundamental astronomie, Springer Verlag 2sd ed. cmv 4/12/98 */ … … 1074 1140 } 1075 1141 1076 /* 1077 ++ 1078 int FromJulianDay(double JD,JMA* dateTU, HMS* hmsTU); 1079 Calcul de la date date et l'heure TU a partir d'un jour Julien. 1080 Retourne 0 si succes. 1081 -- 1082 */ 1083 1142 /*! 1143 \ingroup NTools 1144 Calcul de la date date et l'heure TU a partir d'un jour Julien. 1145 Retourne 0 si succes. 1146 */ 1084 1147 int FromJulianDay(double JD,JMA* dateTU, HMS* hmsTU) 1085 1148 /* Cf Fundamental astronomie, Springer Verlag 2sd ed. cmv 4/12/98 */ … … 1115 1178 1116 1179 1117 /* 1118 ++ 1119 double StrgtoDegDec(char *strg) 1120 Cette fonction renvoie la valeur decimale en heures 1121 d'un angle specifie sous forme de [-][+]dd:mm:ss. 1122 -- 1123 */ 1124 1180 /*! 1181 \ingroup NTools 1182 Cette fonction renvoie la valeur decimale en heures 1183 d'un angle specifie sous forme de [-][+]dd:mm:ss. 1184 */ 1125 1185 double StrgtoDegDec(char *strg) 1126 1186 /* cmv 4/12/98 */ … … 1143 1203 } 1144 1204 1145 /* 1146 ++ 1147 char * DegDectoStrg(double deg, char *strg) 1148 Cette fonction ecrit une valeur en degre decimal sous 1149 forme de [-]dd:mm:ss. 1150 -- 1205 /*! 1206 \ingroup NTools 1207 Cette fonction ecrit une valeur en degre decimal sous 1208 forme de [-]dd:mm:ss. 1151 1209 */ 1152 1210 … … 1172 1230 } 1173 1231 1174 /* 1175 ++ 1176 double EccEarth(JMA dateTU) 1177 Valeur de l'eccentricite de l'orbite terrestre 1178 a la date TU ``dateTU''. 1179 -- 1232 /*! 1233 \ingroup NTools 1234 Valeur de l'eccentricite de l'orbite terrestre 1235 a la date TU ``dateTU''. 1236 Cf Fundamental astronomie, Springer Verlag 2sd ed p477 table E10 1180 1237 */ 1181 1238 double EccEarth(JMA dateTU) … … 1191 1248 } 1192 1249 1193 /* 1194 ++ 1195 double ObliqEarth(JMA dateTU) 1196 Valeur de l'obliquite de l'orbite terrestre 1197 a la date TU ``dateTU'' (en degres decimaux). 1198 -- 1250 /*! 1251 \ingroup NTools 1252 Valeur de l'obliquite de l'orbite terrestre 1253 a la date TU ``dateTU'' (en degres decimaux). 1199 1254 */ 1200 1255 double ObliqEarth(JMA dateTU) … … 1209 1264 } 1210 1265 1211 /* 1212 ++ 1213 double LongEcPerihelie(JMA dateTU) 1214 Retourne la Longitude Ecliptique du perihelie de 1215 l'orbite terrestre a la date TU ``dateTU'' (en degres decimaux). 1216 -- 1266 /*! 1267 \ingroup NTools 1268 Retourne la Longitude Ecliptique du perihelie de 1269 l'orbite terrestre a la date TU ``dateTU'' (en degres decimaux). 1217 1270 */ 1218 1271 double LongEcPerihelie(JMA dateTU) … … 1229 1282 } 1230 1283 1231 /* 1232 ++ 1233 void EquatToEclip(double a,double d,double* l,double *b,JMA dateTU); 1234 Renvoie les coordonnees ecliptiques ``l,b'' a partir de 1235 coordonnees equatoriales ``a,d'' a la date TU ``dateTU''. 1236 La date permet de corriger la variation annuelle 1237 de l'obliquite terrestre. 1238 -- 1284 /*! 1285 \ingroup NTools 1286 Renvoie les coordonnees ecliptiques \b (l,b) a partir de 1287 coordonnees equatoriales \b (a,d) a la date TU \b dateTU. 1288 La date permet de corriger la variation annuelle 1289 de l'obliquite terrestre. 1239 1290 */ 1240 1291 void EquatToEclip(double a,double d,double* l,double *b,JMA dateTU) -
trunk/SophyaLib/NTools/datime.h
r220 r2808 10 10 11 11 12 /*! 13 \ingroup NTools 14 \file datime.h 15 Set of C functions and macros to manipulate date and time + Sidereal time. 16 \sa datime.c 17 \warning : If possible, use class SOPHYA::TimeStamp 18 */ 19 /*! 20 \ingroup NTools 21 \brief Structure JMA pour representer une date (Jour, Mois Annee) */ 12 22 typedef struct 13 23 { … … 17 27 } JMA ; 18 28 19 29 /*! 30 \ingroup NTools 31 \brief Structure HMS pour representer une heure (Heure, Minute Seconde) 32 */ 20 33 typedef struct 21 34 { … … 25 38 } HMS ; 26 39 40 /* \cond 27 41 /* ---------- 2) Donnees constantes ---------- */ 28 42 #ifdef DATIMEPRIVEE … … 43 57 #endif 44 58 59 /* \endcond */ 45 60 /* ------ 3) Macro de manipulation de date et heure ------- */ 46 47 61 #define NomJour(d) (NomJo[NumJour(d)-1]) 48 62 #define NomMois(d) (NomMo[d.Mois-1]) 49 63 50 /* Chaine de forme hh:mm:sec <-> structure HMS */ 64 /* Chaine de forme hh:mm:sec <-> structure HMS */ 65 /*! \brief Decodage de Chaine de forme hh:mm:sec -> structure HMS */ 51 66 #define StrgtoHMS(s,h) ( sscanf(s,"%d:%d:%lf", &(h.Heures),&(h.Minutes),&(h.Secondes)) ) 67 /*! \brief structure HMS -> Chaine de forme hh:mm:sec */ 52 68 #define HMStoStrg(h,s) ( sprintf(s,"%02d:%02d:%02.0f", h.Heures,h.Minutes,h.Secondes) ) 53 69 … … 55 71 /* EA 140998, machin infame pour que ca marche pour 1998/09/14... Pourquoi avoir fait */ 56 72 /* des macros ??????????????????????????????????????????????????????????????????????? */ 73 /*! \brief Chaine de caracteres sous forme de dd/mm/aaaa -> structure JMA jma. */ 57 74 #define StrgtoJMA(strg,j) ( sscanf(strg,"%d/%d/%d", &(j.Jour),&(j.Mois),&(j.Annee)),\ 58 75 (j.Jour>1900 ? sscanf(strg,"%d/%d/%d", &(j.Annee),&(j.Mois),&(j.Jour)) : 1) ) 59 76 /*! \brief structure JMA -> Chaine de forme jj/mm/aa */ 60 77 #define JMAtoStrg(j,strg) ( sprintf(strg,"%02d/%02d/%4d", j.Jour,j.Mois,j.Annee) ) 78 /*! \brief structure JMA -> Chaine de forme jj/mm/aa */ 61 79 #define JMAtoStrgLong(j,strg) ( sprintf(strg,"%s , %d %s %d", NomJo[NumJour(j)-1], j.Jour, NomMo[j.Mois-1], j.Annee) ) 62 80 -
trunk/SophyaLib/NTools/difeq.cc
r2615 r2808 3 3 #include "ctimer.h" 4 4 5 //++ 6 // Class DiffEqSolver 7 // Lib Outils++ 8 // include difeq.h 9 // 10 // Classe abstraite de résolveur d'équation différentielles. 11 // Beaucoup de méthodes renvoient l'objet afin de pouvoir 12 // utiliser une notation chaînée du type 13 //| s.Step(...).Start(...).Solve(...) 14 //-- 15 //++ 16 // Links Implementations 17 // RK4DiffEq 18 // RK4CDiffEq 19 //-- 20 21 //++ 22 // Titre Constructeurs 23 //-- 24 25 //++ 5 /*! 6 \ingroup NTools 7 \class SOPHYA::DiffEqSolver 8 \brief Classe abstraite de résolveur d'équation différentielles. 9 10 Beaucoup de méthodes renvoient l'objet afin de pouvoir 11 utiliser une notation chaînée du type: 12 13 s.Step(...).Start(...).Solve(...) 14 15 \warning statut EXPERIMENTAL , NON TESTE 16 17 \sa SOPHYA::DiffEqFunction 18 \sa SOPHYA::RK4DiffEq SOPHYA::RK4CDiffEq 19 */ 20 21 //! Constructeur vide. 26 22 DiffEqSolver::DiffEqSolver() 27 //28 // Constructeur vide.29 //--30 23 : mFunc(NULL), mOwnFunc(false), 31 24 mYStart(1), mXStart(0), mStep(0.01) 32 25 {} 33 26 34 // ++27 //! Constructeur général. L'équation est donnée sous forme de DiffEqFunction 35 28 DiffEqSolver::DiffEqSolver(DiffEqFunction* f) 36 //37 // Constructeur général. L'équation est donnée sous forme38 // de DiffEqFunction39 //--40 29 : mFunc(f), mOwnFunc(false), 41 30 mYStart(mFunc->NFuncReal()), mXStart(0), mStep(0.01) 42 31 {} 43 32 44 //++ 33 /*! 34 Constructeur pour le cas particulier d'une équation du premier 35 ordre. Voir DiffEqFcn1. La fonction f correspond à l'équation 36 y' = f(y). 37 */ 45 38 DiffEqSolver::DiffEqSolver(DIFEQFCN1 f) 46 //47 // Constructeur pour le cas particulier d'une équation du premier48 // ordre. Voir DiffEqFcn1. La fonction f correspond à l'équation49 // y' = f(y).50 //--51 39 : mFunc(new DiffEqFcn1(f)), mOwnFunc(true), 52 40 mYStart(mFunc->NFuncReal()), mXStart(0), mStep(0.01) … … 58 46 } 59 47 60 //++ 61 // Titre Méthodes 62 //-- 63 64 //++ 48 49 /*! 50 Permet de spécifier l'équation différentielle, sous la forme 51 d'une DiffEqFunction. Retourne l'objet DiffEqSolver : notation 52 chaînée possible 53 */ 65 54 DiffEqSolver& 66 55 DiffEqSolver::Func(DiffEqFunction* f) 67 //68 // Permet de spécifier l'équation différentielle, sous la forme69 // d'une DiffEqFunction. Retourne l'objet DiffEqSolver : notation70 // chaînée possible71 //--72 56 { 73 57 if (mFunc && mOwnFunc) delete mFunc; … … 77 61 } 78 62 79 //++ 63 /*! 64 Permet de spécifier l'équation différentielle, sous la forme 65 d'une fonction f telle que y' = f(y). Retourne l'objet DiffEqSolver : 66 notation chaînée possible. 67 */ 80 68 DiffEqSolver& 81 69 DiffEqSolver::Func(DIFEQFCN1 f) 82 //83 // Permet de spécifier l'équation différentielle, sous la forme84 // d'une fonction f telle que y' = f(y). Retourne l'objet DiffEqSolver :85 // notation chaînée possible.86 //--87 70 { 88 71 if (mFunc && mOwnFunc) delete mFunc; … … 92 75 } 93 76 94 //++ 77 /*! 78 Spécifie le pas d'intégration de l'équation différentielle (pour 79 les méthodes où ce pas a un sens). La valeur par défaut est 0.01. 80 Retourne l'objet DiffEqSolver : notation chaînée possible. 81 */ 95 82 DiffEqSolver& 96 83 DiffEqSolver::Step(double step) 97 //98 // Spécifie le pas d'intégration de l'équation différentielle (pour99 // les méthodes où ce pas a un sens). La valeur par défaut est 0.01.100 // Retourne l'objet DiffEqSolver : notation chaînée possible.101 //--102 84 { 103 85 mStep = step; … … 105 87 } 106 88 107 //++ 89 90 /*! 91 Spécifie le point de départ de l'intégration de l'équadif. 92 Le vecteur \b y contient les valeurs intiales. Voir la description 93 de chaque fonction-objet-équation différentielle pour connaître 94 le rôle de chaque élément du vecteur. \b t est la valeur initiale 95 du temps. 96 La dimension de y doit correspondre au nombre apparent de fonctions. 97 Retourne l'objet DiffEqSolver : notation chaînée possible. 98 */ 108 99 DiffEqSolver& 109 100 DiffEqSolver::StartV(Vector const& yi, double t) 110 //111 // Spécifie le point de départ de l'intégration de l'équadif.112 // Le vecteur y contient les valeurs intiales. Voir la description113 // de chaque fonction-objet-équation différentielle pour connaître114 // le rôle de chaque élément du vecteur. t est la valeur initiale115 // du temps.116 // La dimension de y doit correspondre au nombre apparent de fonctions.117 // Retourne l'objet DiffEqSolver : notation chaînée possible.118 //--119 101 { 120 102 ASSERT(mFunc != NULL); … … 127 109 } 128 110 129 //++ 111 /*! 112 Spécifie le point de départ de l'intégration de l'équadif, 113 pour une équation y' = f(y). On donne le temps et la valeur de y. 114 Retourne l'objet DiffEqSolver : notation chaînée possible. 115 */ 130 116 DiffEqSolver& 131 117 DiffEqSolver::Start1(double y, double t) 132 //133 // Spécifie le point de départ de l'intégration de l'équadif,134 // pour une équation y' = f(y). On donne le temps et la valeur de y.135 // Retourne l'objet DiffEqSolver : notation chaînée possible.136 //--137 118 { 138 119 ASSERT(mFunc != NULL); … … 146 127 } 147 128 148 //++ 129 130 /*! 131 Spécifie le point de départ de l'intégration de l'équadif. 132 Le tableau \b yi contient les valeurs intiales. Voir la description 133 de chaque fonction-objet-équation différentielle pour connaître 134 le rôle de chaque élément du tableau. t est la valeur initiale 135 du temps. 136 Le nombre d'éléments de yi doit correspondre au nombre apparent 137 de fonctions. 138 Retourne l'objet DiffEqSolver : notation chaînée possible. 139 */ 149 140 DiffEqSolver& 150 141 DiffEqSolver::Start(double const* yi, double t) 151 //152 // Spécifie le point de départ de l'intégration de l'équadif.153 // Le tableau yi contient les valeurs intiales. Voir la description154 // de chaque fonction-objet-équation différentielle pour connaître155 // le rôle de chaque élément du tableau. t est la valeur initiale156 // du temps.157 // Le nombre d'éléments de yi doit correspondre au nombre apparent158 // de fonctions.159 // Retourne l'objet DiffEqSolver : notation chaînée possible.160 //--161 142 { 162 143 mYStart.Realloc(mFunc->NFunc()); … … 169 150 } 170 151 171 //++ 172 // virtual void DiffEqSolver::SolveArr(Matrix& y, double* t, double tf, int n)=0 173 // Lance la résolution de l'équadif, jusqu'à la valeur 174 // tf du temps. N valeurs intermédiaires sont retournées dans 175 // les tableaux y et t : 176 // t[i] est le temps au pas i, pour 0<=i<n 177 // y[i] sont les valeurs des fonctions au pas i. 178 // Voir la description 179 // de chaque fonction-objet-équation différentielle pour connaître 180 // le rôle de chaque élément de y[i]. 181 // t[n-1] vaut tf. 182 // Le nombre d'éléments de y[i] doit correspondre au nombre apparent 183 // de fonctions. 184 // Cette fonction doit être redéfinie pour chaque méthode de résolution 185 // d'équations. Elle est appelée par toutes les autres fonctions de 186 // résolution (autres SolveArr, et Solve). 187 //-- 188 189 190 //++ 152 /*! 153 \fn virtual void DiffEqSolver::SolveArr(Matrix& y, double* t, double tf, int n) 154 155 Lance la résolution de l'équadif, jusqu'à la valeur 156 tf du temps. N valeurs intermédiaires sont retournées dans 157 les tableaux y et t : 158 - t[i] est le temps au pas i, pour 0<=i<n 159 - y[i] sont les valeurs des fonctions au pas i. 160 161 Voir la description 162 de chaque fonction-objet-équation différentielle pour connaître 163 le rôle de chaque élément de y[i]. 164 t[n-1] vaut tf. 165 Le nombre d'éléments de y[i] doit correspondre au nombre apparent 166 de fonctions. 167 Cette fonction doit être redéfinie pour chaque méthode de résolution 168 d'équations. Elle est appelée par toutes les autres fonctions de 169 résolution (autres SolveArr, et Solve). 170 */ 171 172 173 /*! 174 Lance la résolution de l'équadif, jusqu'à la valeur 175 tf du temps. Les valeurs finales sont retournées dans yf. 176 Voir la description 177 de chaque fonction-objet-équation différentielle pour connaître 178 le rôle de chaque élément de yf. 179 Le nombre d'éléments de yf doit correspondre au nombre apparent 180 de fonctions. 181 */ 191 182 void 192 183 DiffEqSolver::SolveV(Vector& yf, double tf) 193 //194 // Lance la résolution de l'équadif, jusqu'à la valeur195 // tf du temps. Les valeurs finales sont retournées dans yf.196 // Voir la description197 // de chaque fonction-objet-équation différentielle pour connaître198 // le rôle de chaque élément de yf.199 // Le nombre d'éléments de yf doit correspondre au nombre apparent200 // de fonctions.201 //--202 184 { 203 185 double t; … … 209 191 } 210 192 211 //++ 193 194 /*! 195 Lance la résolution de l'équadif, jusqu'à la valeur 196 tf du temps, pour une équation du premier ordre y' = f(y). 197 La valeur finale de y est retournée dans yf. 198 */ 212 199 void 213 200 DiffEqSolver::Solve1(double& yf, double tf) 214 //215 // Lance la résolution de l'équadif, jusqu'à la valeur216 // tf du temps, pour une équation du premier ordre y' = f(y).217 // La valeur finale de y est retournée dans yf.218 //--219 201 { 220 202 ASSERT(mFunc->NFunc() == 1); … … 225 207 } 226 208 227 //++ 209 210 /*! 211 Lance la résolution de l'équadif, jusqu'à la valeur 212 tf du temps. Les valeurs finales sont retournées dans yf. 213 Voir la description 214 de chaque fonction-objet-équation différentielle pour connaître 215 le rôle de chaque élément de yf. 216 Le nombre d'éléments de yf doit correspondre au nombre apparent 217 de fonctions. 218 */ 228 219 void 229 220 DiffEqSolver::Solve(double* yf, double tf) 230 //231 // Lance la résolution de l'équadif, jusqu'à la valeur232 // tf du temps. Les valeurs finales sont retournées dans yf.233 // Voir la description234 // de chaque fonction-objet-équation différentielle pour connaître235 // le rôle de chaque élément de yf.236 // Le nombre d'éléments de yf doit correspondre au nombre apparent237 // de fonctions.238 //--239 221 { 240 222 double t; … … 245 227 } 246 228 247 //++ 229 /*! 230 Lance la résolution de l'équadif (du premier ordre), jusqu'à la valeur 231 tf du temps. N valeurs intermediaires sont retournées dans 232 les tableaux y et t : 233 t[i] est le temps au pas i, pour 0<=i<n 234 y[i] est la valeur de la fonction au pas i. 235 t[n-1] vaut tf. 236 */ 248 237 void 249 238 DiffEqSolver::SolveArr1(double* y, double* t, double tf, int n) 250 //251 // Lance la résolution de l'équadif (du premier ordre), jusqu'à la valeur252 // tf du temps. N valeurs intermediaires sont retournées dans253 // les tableaux y et t :254 // t[i] est le temps au pas i, pour 0<=i<n255 // y[i] est la valeur de la fonction au pas i.256 // t[n-1] vaut tf.257 //--258 239 259 240 { … … 265 246 } 266 247 267 //++ 248 /*! 249 Lance la résolution de l'équadif, jusqu'à la valeur 250 tf du temps. N valeurs intermédiaires sont retournées dans 251 les tableaux y et t : 252 t[i] est le temps au pas i, pour 0<=i<n 253 y[i] sont les valeurs des fonctions au pas i. 254 Voir la description 255 de chaque fonction-objet-équation différentielle pour connaître 256 le rôle de chaque élément de y[i]. 257 t[n-1] vaut tf. 258 Le nombre d'éléments de y[i] doit correspondre au nombre apparent 259 de fonctions. 260 */ 268 261 void 269 262 DiffEqSolver::SolveArr2(double** y, double* t, double tf, int n) 270 //271 // Lance la résolution de l'équadif, jusqu'à la valeur272 // tf du temps. N valeurs intermédiaires sont retournées dans273 // les tableaux y et t :274 // t[i] est le temps au pas i, pour 0<=i<n275 // y[i] sont les valeurs des fonctions au pas i.276 // Voir la description277 // de chaque fonction-objet-équation différentielle pour connaître278 // le rôle de chaque élément de y[i].279 // t[n-1] vaut tf.280 // Le nombre d'éléments de y[i] doit correspondre au nombre apparent281 // de fonctions.282 //--283 263 { 284 264 Matrix m(n, mFunc->NFuncReal()); … … 290 270 291 271 292 //++ 293 // Class DiffEqFunction 294 // Lib Outils++ 295 // include difeq.h 296 // 297 // Classe de fonctions pour la résolution d'équations différentielles. 298 // On résoud de facon générale un système de n équations différentielles 299 // du premier ordre, donnant les dérivées fpi de n fonctions fi. 300 // Cette méthode permet de résoudre toutes les sortes d'équations : 301 // pour une équation du second ordre on crée une fonction intermédiaire 302 // qui est la dérivée de la fonction cherchée. 303 //-- 304 305 //++ 306 // DiffEqFunction::DiffEqFunction(int n) 307 // Constructeur. N est le nombre de fonctions dans le 308 // système. 309 //-- 310 311 //++ 312 // DiffEqFunction::DiffEqFunction(int n, int napp) 313 // Constructeur. N est le nombre réel de fonctions dans le 314 // système, et napp le nombre apparent (pour l'utilisateur). 315 // En effet, dans certains cas, on peut avoir besoin de fonctions 316 // supplémentaires masquées à l'utilisateur, par exemple la fonction 317 // constante valant 1, si l'équadif fait intervenir le temps (t). 318 //-- 319 320 //++ 321 // virtual void ComputeV(Vector& fpi, Vector const& fi) 322 // Calcule les valeurs des dérivées fpi à partir des valeurs 323 // des fonctions fi. A redéfinir. 324 //-- 325 326 //++ 327 // virtual void Compute(double& fp, double f) 328 // Dans le cas où il y a une seule fonction, calcule la dérivée 329 // fp à partir de la valeur de la fonction f. A redéfinir. 330 //-- 331 332 //++ 333 // int NFunc() 334 // Nombre apparent de fonctions dans le système 335 //-- 336 337 //++ 338 // int NFuncReal() {return mNFunc;} 339 // Nombre réel de fonctions dans le système 340 //-- 272 /*! 273 \ingroup NTools 274 \class SOPHYA::DiffEqFunction 275 276 \brief Classe de fonctions pour la résolution d'équations différentielles. 277 278 On résoud de facon générale un système de n équations différentielles 279 du premier ordre, donnant les dérivées fpi de n fonctions fi. 280 Cette méthode permet de résoudre toutes les sortes d'équations : 281 pour une équation du second ordre on crée une fonction intermédiaire 282 qui est la dérivée de la fonction cherchée. 283 284 \warning statut EXPERIMENTAL , NON TESTE 285 286 \sa SOPHYA::DiffEqSolver 287 */ 288 289 290 291 /*! 292 \fn DiffEqFunction::DiffEqFunction(int n, int napp) 293 Constructeur. N est le nombre réel de fonctions dans le 294 système, et napp le nombre apparent (pour l'utilisateur). 295 En effet, dans certains cas, on peut avoir besoin de fonctions 296 supplémentaires masquées à l'utilisateur, par exemple la fonction 297 constante valant 1, si l'équadif fait intervenir le temps (t). 298 */ 299 300 /*! 301 \fn virtual void ComputeV(Vector& fpi, Vector const& fi) 302 Calcule les valeurs des dérivées fpi à partir des valeurs 303 des fonctions fi. A redéfinir. 304 */ 305 306 /*! 307 \fn virtual void Compute(double& fp, double f) 308 Dans le cas où il y a une seule fonction, calcule la dérivée 309 fp à partir de la valeur de la fonction f. A redéfinir. 310 */ 311 341 312 342 313 //++ … … 348 319 349 320 350 //++ 351 // Class DiffEqFcn1 352 // Lib Outils++ 353 // include difeq.h 354 // 355 // Objet-fonction générique pour la résolution d'équations 356 // différentielles de la forme y' = f(y). 357 // On fournit une fonction de type 358 //| typedef double(*DIFEQFCN1)(double); 359 // qui retourne y' en fonction de y. 360 //-- 361 //++ 362 // Links Parents 363 // DiffEqFunction 364 //-- 365 366 //++ 321 /*! 322 \ingroup NTools 323 \class SOPHYA::DiffEqFcn1 324 325 \brief Objet-fonction générique pour la résolution d'équations 326 différentielles de la forme y' = f(y). 327 328 On fournit une fonction de type <br> 329 <tt> typedef double(*DIFEQFCN1)(double); </tt> <br> 330 qui retourne y' en fonction de y. 331 332 \warning statut EXPERIMENTAL , NON TESTE 333 */ 334 335 336 //! Constructeur. On fournit la fonction f tq y'=f(y) 367 337 DiffEqFcn1::DiffEqFcn1(DIFEQFCN1 fcn) 368 //369 // Constructeur. On fournit la fonction f tq y'=f(y)370 //--371 338 : DiffEqFunction(1), mFcn(fcn) 372 339 {} 373 340 341 342 //! Implementation de Compute qui va utiliser la fonction fournie au constructeur. 374 343 void 375 344 DiffEqFcn1::Compute(double& fp, double f) … … 378 347 } 379 348 380 / /++381 // Class DiffEqFcnT1 382 // Lib Outils++ 383 // include difeq.h 384 // 385 // Objet-fonction générique pour la résolution d'équations 386 // différentielles de la forme y' = f(y,t). 387 // On fournit une fonction de type 388 //| typedef double(*DIFEQFCNT1)(double, double); 389 // qui retourne y' en fonction de y et t. 390 // Note : le système résolu est alors en fait 391 //| y'[0] = fcn(y[0], y[1]) 392 //| y'[1] = 1 393 //-- 394 //++ 395 // Links Parents 396 // DiffEqFunction 397 //-- 398 399 // ++349 /*! 350 \ingroup NTools 351 \class SOPHYA::DiffEqFcnT1 352 353 Objet-fonction générique pour la résolution d'équations 354 différentielles de la forme y' = f(y,t). 355 On fournit une fonction de type 356 <tt> typedef \tt double(*DIFEQFCNT1)(double, double); </tt> 357 qui retourne y' en fonction de y et t. 358 359 \verbatim 360 Note : le système résolu est alors en fait 361 y'[0] = fcn(y[0], y[1]) 362 y'[1] = 1 363 \endverbatim 364 365 \warning statut EXPERIMENTAL , NON TESTE 366 */ 367 368 //! Constructeur. On fournit la fonction f tq y' = f(y,t) 400 369 DiffEqFcnT1::DiffEqFcnT1(DIFEQFCNT1 fcn) 401 //402 // Constructeur. On fournit la fonction f tq y' = f(y,t)403 //--404 370 : DiffEqFunction(2, 1), mFcn(fcn) 405 371 {} … … 419 385 } 420 386 421 //++ 422 // Class DiffEqFcn2 423 // Lib Outils++ 424 // include difeq.h 425 // 426 // Objet-fonction générique pour la résolution d'équations 427 // différentielles de la forme y'' = f(y',y). 428 // On fournit une fonction de type 429 //| typedef double(*DIFEQFCN2)(double, double); 430 // qui retourne y'' en fonction de y' et y. 431 // Note : le système résolu est en fait 432 //| y'[0] = y[1] 433 //| y'[1] = f(y[1], y[0]) 434 //-- 435 //++ 436 // Links Parents 437 // DiffEqFunction 438 //-- 439 440 //++ 387 /*! 388 \ingroup NTools 389 \class SOPHYA::DiffEqFcn2 390 391 Objet-fonction générique pour la résolution d'équations 392 différentielles de la forme y'' = f(y',y). 393 On fournit une fonction de type 394 <tt> typedef double(*DIFEQFCN2)(double, double); </tt> 395 qui retourne y'' en fonction de y' et y. 396 \verbatim 397 Note : le système résolu est en fait 398 y'[0] = y[1] 399 y'[1] = f(y[1], y[0]) 400 \endverbatim 401 402 \warning statut EXPERIMENTAL , NON TESTE 403 */ 404 405 //! Constructeur. On fournit la fonction f tq y''=f(y',y) 441 406 DiffEqFcn2::DiffEqFcn2(DIFEQFCN2 fcn) 442 //443 // Constructeur. On fournit la fonction f tq y''=f(y',y)444 //--445 407 : DiffEqFunction(2), mFcn(fcn) 446 408 {} … … 453 415 } 454 416 455 //++ 456 // Class DiffEqFcnT2 457 // Lib Outils++ 458 // include difeq.h 459 // 460 // Objet-fonction générique pour la résolution d'équations 461 // différentielles de la forme y'' = f(y',y,t). 462 // On fournit une fonction de type 463 //| typedef double(*DIFEQFCNT2)(double, double, double); 464 // qui retourne y'' en fonction de y', y et t. 465 // Note : le système résolu est alors en fait 466 //| y'[0] = y[1] 467 //| y'[1] = f(y[1], y[0], y[2]) 468 //| y'[2] = 1 469 //-- 470 //++ 471 // Links Parents 472 // DiffEqFunction 473 //-- 474 475 //++ 417 /*! 418 \ingroup NTools 419 \class SOPHYA::DiffEqFcnT2 420 421 Objet-fonction générique pour la résolution d'équations 422 différentielles de la forme y'' = f(y',y,t). 423 On fournit une fonction de type <br> 424 <tt> typedef double(*DIFEQFCNT2)(double, double, double); </tt> <br> 425 qui retourne y'' en fonction de y', y et t. 426 \verbatim 427 Note : le système résolu est alors en fait 428 y'[0] = y[1] 429 y'[1] = f(y[1], y[0], y[2]) 430 y'[2] = 1 431 \endverbatim 432 433 \warning statut EXPERIMENTAL , NON TESTE 434 */ 435 436 //! Constructeur. On fournit la fonction f tq y'' = f(y',y,t) 476 437 DiffEqFcnT2::DiffEqFcnT2(DIFEQFCNT2 fcn) 477 //478 // Constructeur. On fournit la fonction f tq y'' = f(y',y,t)479 //--480 438 : DiffEqFunction(3,2), mFcn(fcn) 481 439 {} … … 497 455 498 456 499 //++ 500 // Class DiffEqFcnV 501 // Lib Outils++ 502 // include difeq.h 503 // 504 // Objet-fonction générique pour la résolution d'équations 505 // différentielles 3D de la forme y'' = f(y',y), ou y est 506 // un vecteur de dimension 3. 507 // On fournit une fonction de type 508 //| typedef void(*DIFEQFCNV)(Vector& y2, Vector const& y1, 509 //| Vector const& y); 510 // qui retourne y'' en fonction de y' et y. 511 // Note : le système résolu est alors en fait 512 //| v(0-2) = y, v(3-5) = y' 513 //| 514 //| v'[0] = v[3] 515 //| v'[1] = v[4] 516 //| v'[2] = v[5] 517 //| v'[3-5] = f(v[3-5], v[0-2]) 518 //-- 519 //++ 520 // Links Parents 521 // DiffEqFunction 522 //-- 457 /*! 458 \ingroup NTools 459 \class SOPHYA::DiffEqFcnV 460 461 Objet-fonction générique pour la résolution d'équations 462 différentielles 3D de la forme y'' = f(y',y), ou y est 463 un vecteur de dimension 3. 464 On fournit une fonction de type <br> 465 <tt> typedef void(*DIFEQFCNV)(Vector& y2, Vector const& y1, <br> 466 Vector const& y); </tt> <br> 467 qui retourne y'' en fonction de y' et y. 468 \verbatim 469 Note : le système résolu est alors en fait 470 v(0-2) = y, v(3-5) = y' 471 472 v'[0] = v[3] 473 v'[1] = v[4] 474 v'[2] = v[5] 475 v'[3-5] = f(v[3-5], v[0-2]) 476 \endverbatim 477 478 \warning statut EXPERIMENTAL , NON TESTE 479 */ 523 480 524 481 DiffEqFcnV::DiffEqFcnV(DIFEQFCNV fcn) … … 543 500 544 501 545 //++ 546 // Class RK4DiffEq 547 // Lib Outils++ 548 // include difeq.h 549 // 550 // Classe de résolution d'équadif par la méthode de 551 // Runge-Kutta d'ordre 4. 552 // Voir DiffEqSolver pour les méthodes. 553 //-- 554 //++ 555 // Links Parents 556 // DiffEqSolver 557 //-- 558 559 //++ 560 // Titre Constructeurs 561 //-- 502 /*! 503 \ingroup NTools 504 \class SOPHYA::RK4DiffEq 505 506 Classe de résolution d'équadif par la méthode de 507 Runge-Kutta d'ordre 4. 508 Voir DiffEqSolver pour les méthodes. 509 510 \warning statut EXPERIMENTAL , NON TESTE 511 */ 562 512 563 513 RK4DiffEq::RK4DiffEq() … … 565 515 {} 566 516 567 // ++517 //! Constructeur général 568 518 RK4DiffEq::RK4DiffEq(DiffEqFunction* f) 569 //570 // Constructeur général571 //--572 519 : DiffEqSolver(f), k1(f->NFuncReal()), 573 520 k2(f->NFuncReal()), k3(f->NFuncReal()), k4(f->NFuncReal()) 574 521 {} 575 522 576 //++ 523 524 //! Constructeur pour y' = f(y) 577 525 RK4DiffEq::RK4DiffEq(DIFEQFCN1 f) 578 //579 // Constructeur pour y' = f(y)580 //--581 526 : DiffEqSolver(f), k1(1), k2(1), k3(1), k4(1) 582 527 {} -
trunk/SophyaLib/NTools/difeq.h
r1371 r2808 21 21 class DiffEqFunction { 22 22 public: 23 // Constructeur. n = nombre de fonctions dans le systeme23 //! Constructeur. n = nombre de fonctions dans le systeme 24 24 DiffEqFunction(int n) : mNFunc(n), mNFuncApp(n) {} 25 25 26 // Constructeur. n = nombre reel de fonctions dans le systeme,27 // m = nombre apparent (il y a dans certaines cas des fonctions a28 // usage interne, par exemple la fonction constante valant 1...)29 26 27 // Constructeur. n = nombre reel de fonctions dans le systeme, 28 // m = nombre apparent (il y a dans certaines cas des fonctions a 29 // usage interne, par exemple la fonction constante valant 1.... 30 30 DiffEqFunction(int n, int m) : mNFunc(n), mNFuncApp(m) {} 31 31 … … 42 42 { ASSERT(mNFunc == 1); } 43 43 44 // Nombre apparent de fonctions dans le systeme44 //! Nombre apparent de fonctions dans le systeme 45 45 int NFunc() {return mNFuncApp;} 46 46 47 // Nombre reel de fonctions dans le systeme47 //! Nombre reel de fonctions dans le systeme 48 48 int NFuncReal() {return mNFunc;} 49 49 50 // Pour ajuster vecteur de depart quand il y a des fonctions a usage 51 // interne... 50 //! Pour ajuster vecteur de depart quand il y a des fonctions a usage v interne... 52 51 virtual void AdjustStart(Vector& /*start*/, double /*tstart*/) 53 52 {} … … 68 67 class DiffEqFcn1 : public DiffEqFunction { 69 68 public: 70 // Constructeur, on fournit une fonction double->double 69 // Constructeur, on fournit une fonction double->double 71 70 // qui donne y' en fonction de y. 72 71 DiffEqFcn1(DIFEQFCN1); 73 72 74 // Implementation de Compute qui va utiliser la fonction fournie75 // au constructeur.73 // Implementation de Compute qui va utiliser la fonction 74 // fournie au constructeur. 76 75 virtual void Compute(double& fp, double f); 77 76 protected: -
trunk/SophyaLib/NTools/dynccd.cc
r2615 r2808 11 11 #include "dynccd.h" 12 12 13 //++ 14 // Class DynCCD 15 // Lib Images++ 16 // include dynccd.h 17 // 18 // Cette classe permet la specification des parametres 19 // definissant la dynamique du CCD, et doit etre utilise 20 // pour le calcul des images de bruit. 21 // - TypNoise = 1 : 22 // Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain ) 23 // - TypNoise = 2 : 24 // Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain ) 25 // - TypNoise = 0 26 // Bruit = 1 (Constant pour tous les pixels) 27 // - TypNoise = 3 28 // Bruit = Sqrt(Abs(ValPix)) 29 // 30 // Les pixels hors dynamique sont marques (Bruit = 0) 31 // ( < MinADU ou > MaxADU) pour toutes valeurs de TypNoise. 32 // Gain est exprime en electron par ADU, RONoise en electron, 33 // Bruit, ValPix et RefFond en ADU. 34 //-- 13 /*! 14 \class SOPHYA::DynCCD 15 \ingroup NTools 16 17 Cette classe permet la specification des parametres 18 definissant la dynamique du CCD, et doit etre utilise 19 pour le calcul des images de bruit. 35 20 36 //++ 37 // Links Parents 38 // PPersist 39 //-- 40 //++ 41 // Links Autres 42 // RzImage 43 // Image<T> 44 //-- 45 //++ 46 // Titre Methodes 47 //-- 48 //++ 49 // DynCCD(int_4TypNoise=0, r_8 MinADU=-9.e19, r_8 MaxADU=9.e19, r_8 Gain=1., r_8 RONoise=0., r_8 RefFond=0., r_8 RefSFond=0.); 50 // Creation d'un objet DynCCD ("typ" determine la methode de calcul du bruit) 51 // |Test verbatim 52 // 53 // void Set(int_4TypNoise=0, r_8 MinADU=-9.e19, r_8 MaxADU=9.e19, r_8 Gain=1., r_8 RONoise=0., r_8 RefFond=0., r_8 RefSFond=0.); 54 // Modification des parametres de la dynamique 55 // void Print() 56 // r_8 Noise(r_8 pixel) const 57 // Renvoie la valeur du bruit pour "pixel" en ADU. 58 //-- 21 - TypNoise = 1 22 Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain ) 23 - TypNoise = 2 : 24 Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain ) 25 - TypNoise = 0 26 Bruit = 1 (Constant pour tous les pixels) 27 - TypNoise = 3 28 Bruit = Sqrt(Abs(ValPix)) 29 30 Les pixels hors dynamique sont marques (Bruit = 0) 31 ( < MinADU ou > MaxADU) pour toutes valeurs de TypNoise. 32 Gain est exprime en electron par ADU, RONoise en electron, 33 Bruit, ValPix et RefFond en ADU. 34 35 \sa SOPHYA::Image 36 */ 37 59 38 60 39 /* ............................................................ */ … … 63 42 64 43 /* --Methode-- */ 44 //! Creation d'un objet DynCCD ("typ" determine la methode de calcul du bruit) 65 45 DynCCD::DynCCD(int_4 typ, r_8 min, r_8 max, r_8 g, 66 46 r_8 ron, r_8 rf, r_8 rfs) … … 74 54 75 55 /* --Methode-- */ 56 //! Modification des parametres de la dynamique 76 57 void DynCCD::Set(int_4 typ, r_8 min, r_8 max, r_8 g, 77 58 r_8 ron, r_8 rf, r_8 rfs) … … 93 74 } 94 75 76 //! Renvoie la valeur du bruit pour "pixel" en ADU. 77 /*! 78 Cette fonction calcule la valeur du bruit pour pixel 79 - Si TypNoise = 1 : 80 Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain ) 81 - Si TypNoise = 2 : 82 Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain ) 83 - Si TypNoise = 0 84 Bruit = 1 (Constant pour tous les pixels) 85 - Si TypNoise = 3 86 Bruit = Sqrt(Abs(PixelADU)) 87 88 Les pixels hors dynamique sont marques (Bruit = 0) 89 ( < MinADU ou > MaxADU) pour tout valeur de TypNoise 90 */ 95 91 /* --Methode-- */ 96 92 r_8 DynCCD::Noise(r_8 pixel) const 97 98 /* Cette fonction calcule la valeur du bruit pour pixel */99 /* Si TypNoise = 1 : */100 /* Bruit = Sqrt( (RONoise/Gain)**2 + ValPix/Gain ) */101 /* Si TypNoise = 2 : */102 /* Bruit = Sqrt( RefSFond**2 + (ValPix-RefFond)/Gain ) */103 /* Si TypNoise = 0 */104 /* Bruit = 1 (Constant pour tous les pixels) */105 /* Si TypNoise = 3 */106 /* Bruit = Sqrt(Abs(PixelADU)) */107 /* Les pixels hors dynamique sont marques (Bruit = 0) */108 /* ( < MinADU ou > MaxADU) pour tout valeur de TypNoise */109 110 93 { 111 94 r_8 h,s,ronsq; … … 133 116 /* -------------------------------------------------------------- */ 134 117 135 //++136 // Module Images de bruit137 // Lib Images++138 // include dynccd.h139 //140 // Ces fonctions permettent le calcul d'image de bruit a partir d'une141 // image (RzImage ou Image<T>) et d'un objet DynCCD142 //--143 //++144 // Links Voir classes145 // DynCCD146 // RzImage147 // Image<T>148 //--149 //++150 // Titre Les fonctions151 //--152 153 //++154 // Function RzImage * NoiseImage(RzImage const *pim, DynCCD const * dynccd)155 // Construit et renvoie l'image du bruit pour l'image "*pim" (RzImage)156 // Function Image<T> * NoiseImage(Image<T> const * pim, DynCCD const * dynccd)157 // Meme fonctionalite pour une image typee (ImageU2, ImageR4, ...)158 // Function ImgAddNoise(Image<T>&, DynCCD const&)159 // Calcule l'image du bruit et le rajoute a l'image originale160 //--161 118 162 119 /* Nouvelle-Fonction */ 120 /*! 121 Construit et renvoie l'image du bruit pour l'image "*pim" 122 123 Creation et Calcul d'une image de bruit a partir de l'image 124 pim et de dynccd. Voir la methode DynCCD::Noise() pour la 125 description du calcul 126 */ 163 127 template <class T> 164 128 Image<T> NoiseImage(Image<T> const & pim, DynCCD const & dynccd) 165 166 /* Creation et Calcul d'une image de bruit a partir de l'image */167 /* pim et de dynccd. Voir la methode DynCCD::Noise() pour la */168 /* description du calcul */169 129 170 130 { … … 190 150 191 151 /* Nouvelle-Fonction */ 152 //! Calcule l'image du bruit et le rajoute a l'image originale 192 153 template <class T> 193 154 void ImgAddNoise(Image<T>& img, DynCCD const& dyn) 155 194 156 { 195 157 int_4 nPix = img.XSize() * img.YSize(); -
trunk/SophyaLib/NTools/dynccd.h
r1110 r2808 11 11 namespace SOPHYA { 12 12 13 enum {kConstantNoise = 0, kPhotonNoise, kSigFondNoise, kSqrtADUNoise};14 13 14 //! Readout and photon noise calculation for images 15 15 class DynCCD 16 16 { 17 17 public : 18 enum {kConstantNoise = 0, kPhotonNoise, kSigFondNoise, kSqrtADUNoise}; 18 19 19 20 int_4 TypNoise; // Type de calcul du bruit … … 37 38 38 39 40 //! Return an image corresponding to the noise described by \b dynccd 39 41 template <class T> 40 42 Image<T> NoiseImage(Image<T> const & pim, DynCCD const & dynccd); 41 43 44 //! Add noise to the image 42 45 template <class T> 43 46 void ImgAddNoise(Image<T>&, DynCCD const&); -
trunk/SophyaLib/NTools/integ.cc
r2615 r2808 10 10 // utilisant le (1) 11 11 12 //++ 13 // Class Integrator 14 // Lib Outils++ 15 // include integ.h 16 // 17 // Classe abstraite d'intégration numérique 1D. 18 // On fournit une fonction double f(double) au constructeur, ou 19 // une GeneralFunction avec des paramètres définis. 20 // L'objet Integrator est convertible en valeur double qui est la valeur 21 // de l'intégrale. Diverses méthodes permettent de choisir des options 22 // de calcul, et ces méthodes retournent une référence sur l'objet, pour 23 // permettre une notation chaînée. 24 //-- 25 //++ 26 // Links Implementations 27 // TrpzInteg 28 // GLInteg 29 //-- 30 31 //++ 32 // Titre Constructeurs 33 //-- 34 35 //++ 12 /*! 13 \ingroup NTools 14 \class SOPHYA::Integrator 15 16 \brief Classe abstraite d'intégration numérique 1D. 17 18 On fournit une fonction double f(double) au constructeur, ou 19 une GeneralFunction avec des paramètres définis. 20 L'objet Integrator est convertible en valeur double qui est la valeur 21 de l'intégrale. Diverses méthodes permettent de choisir des options 22 de calcul, et ces méthodes retournent une référence sur l'objet, pour 23 permettre une notation chaînée. 24 25 \sa TrpzInteg GLInteg 26 */ 27 28 //! Constructeur par défaut. L'objet n'est pas utilisable en l'état. 36 29 Integrator::Integrator() 37 //38 // Constructeur par défaut. L'objet n'est pas utilisable en l'état.39 //--40 41 30 : mFunc(NULL), mGFF(NULL), mGFFParm(NULL), 42 31 mNStep(50), mDX(-1), mReqPrec(-1), … … 44 33 {} 45 34 46 // ++35 //! Constructeur à partir de la fonction double->double, et des bornes d'intégration. 47 36 Integrator::Integrator(FUNC f, double xmin, double xmax) 48 //49 // Constructeur à partir de la fonction double->double, et des50 // bornes d'intégration.51 //--52 37 : mFunc(f), mGFF(NULL), mGFFParm(NULL), 53 38 mNStep(50), mDX(-1), mReqPrec(-1), … … 55 40 {} 56 41 42 //! Constructeur à partir de la fonction double->double, et des bornes d'intégration. 57 43 Integrator::Integrator(fun f, double xmin, double xmax) 58 //59 // Constructeur à partir de la fonction double->double, et des60 // bornes d'intégration.61 //--62 44 : mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL), 63 45 mNStep(50), mDX(-1), mReqPrec(-1), … … 66 48 67 49 68 //++ 50 /*! 51 Constructeur sans spécifier les bornes. Elles sont positionnées 52 à [0,1], et on pourra les modifier plus tard. 53 */ 69 54 Integrator::Integrator(FUNC f) 70 //71 // Constructeur sans spécifier les bornes. Elles sont positionnées72 // à [0,1], et on pourra les modifier plus tard.73 //--74 55 : mFunc(f), mGFF(NULL), mGFFParm(NULL), 75 56 mNStep(50), mDX(-1), mReqPrec(-1), … … 77 58 {} 78 59 79 //++ 60 /*! 61 Constructeur sans spécifier les bornes. Elles sont positionnées 62 à [0,1], et on pourra les modifier plus tard. 63 */ 80 64 Integrator::Integrator(fun f) 81 //82 // Constructeur sans spécifier les bornes. Elles sont positionnées83 // à [0,1], et on pourra les modifier plus tard.84 //--85 65 : mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL), 86 66 mNStep(50), mDX(-1), mReqPrec(-1), … … 88 68 {} 89 69 90 //++ 70 /*! 71 Constructeur à partir d'une GeneralFunction. La fonction doit être une 72 fonction de une variable, et on fournit les valeurs des paramètres ainsi 73 que les bornes d'intégration. 74 */ 91 75 Integrator::Integrator(GeneralFunction* gff, double* par, double xmin, double xmax) 92 //93 // Constructeur à partir d'une GeneralFunction. La fonction doit être une94 // fonction de une variable, et on fournit les valeurs des paramètres ainsi95 // que les bornes d'intégration.96 //--97 76 : mFunc(NULL), mGFF(gff), mGFFParm(par), 98 77 mNStep(50), mDX(-1), mReqPrec(-1), … … 102 81 } 103 82 104 //++ 83 /*! 84 Constructeur à partir d'une GeneralFunction. La fonction doit être une 85 fonction de une variable, et on fournit les valeurs des paramètres. 86 On ne spécifie pas les bornes. Elles sont positionnées 87 à [0,1], et on pourra les modifier plus tard. 88 */ 105 89 Integrator::Integrator(GeneralFunction* gff, double* par) 106 //107 // Constructeur à partir d'une GeneralFunction. La fonction doit être une108 // fonction de une variable, et on fournit les valeurs des paramètres.109 // On ne spécifie pas les bornes. Elles sont positionnées110 // à [0,1], et on pourra les modifier plus tard.111 //--112 90 : mFunc(NULL), mGFF(gff), mGFFParm(par), 113 91 mNStep(50), mDX(-1), mReqPrec(-1), … … 120 98 {if(mFunc) delete mFunc;} 121 99 122 / /++123 // Titre Méthodes 124 //-- 125 126 //++ 100 /*! 101 \brief Spécifie le nombre de pas pour l'intégration numérique. 102 103 La signification peut dépendre de la méthode d'intégration. 104 */ 127 105 Integrator& 128 106 Integrator::NStep(int n) 129 //130 // Spécifie le nombre de pas pour l'intégration numérique.131 // La signification peut dépendre de la méthode d'intégration.132 //--133 107 { 134 108 mNStep = n; … … 138 112 } 139 113 140 //++ 114 /*! 115 \brief Spécifie le nombre de pas pour l'intégration numérique. 116 117 La signification peut dépendre de la méthode d'intégration. 118 */ 141 119 Integrator& 142 120 Integrator::DX(double d) 143 //144 // Spécifie le pas d'intégration.145 // La signification peut dépendre de la méthode d'intégration.146 //--147 121 { 148 122 mDX = d; … … 152 126 } 153 127 154 //++ 128 /*! 129 \brief Spécifie la précision souhaitée. 130 131 La signification peut dépendre de la méthode d'intégration. 132 Non disponible dans toutes les méthodes d'intégration. 133 */ 155 134 Integrator& 156 135 Integrator::ReqPrec(double p) 157 //158 // Spécifie la précision souhaitée.159 // La signification peut dépendre de la méthode d'intégration.160 // Non disponible dans toutes les méthodes d'intégration.161 //--162 136 { 163 137 DBASSERT( !"Pas encore implemente !"); … … 168 142 } 169 143 170 // ++144 //! Spécifie les bornes de l'intégrale. 171 145 Integrator& 172 146 Integrator::Limits(double xmin, double xmax) 173 //174 // Spécifie les bornes de l'intégrale.175 //--176 147 { 177 148 mXMin = xmin; … … 181 152 } 182 153 183 // ++154 //! Spécifie la fonction à intégrer, sous forme double f(double). 184 155 Integrator& 185 156 Integrator::Func(FUNC f) 186 //187 // Spécifie la fonction à intégrer, sous forme double f(double).188 //--189 157 { 190 158 mFunc = f; … … 195 163 } 196 164 197 //++ 165 /*! 166 \brief Spécifie la fonction à intégrer, sous forme de GeneralFunction 167 à une variable, et les paramètres sont fournis. 168 */ 198 169 Integrator& 199 170 Integrator::Func(GeneralFunction* gff, double* par) 200 //201 // Spécifie la fonction à intégrer, sous forme de GeneralFunction202 // à une variable, et les paramètres sont fournis.203 //--204 171 { 205 172 mGFF = gff; … … 234 201 } 235 202 236 //++ 237 // Class TrpzInteg 238 // Lib Outils++ 239 // include integ.h 240 // 241 // Classe d'intégration par la méthode des trapèzes. 242 // Voir Integrator pour les méthodes. Le nombre de pas 243 // est le nombre de trapèze, le pas d'intégration est 244 // la largeur des trapèzez. Impossible de demander une 245 // précision. 246 // 247 //-- 248 //++ 249 // Links Parents 250 // Integrator 251 //-- 252 253 //++ 254 // Titre Constructeurs 255 // Voir Integrator pour les détails. 256 //-- 257 258 //++ 203 /*! 204 \ingroup NTools 205 \class SOPHYA::TrpzInteg 206 207 \brief Implementation de Integrator par la methode des trapezes. 208 209 Classe d'intégration par la méthode des trapèzes. 210 Voir Integrator pour les méthodes. Le nombre de pas 211 est le nombre de trapèze, le pas d'intégration est 212 la largeur des trapèzez. Impossible de demander une 213 précision. 214 215 \sa SOPHYA::Integrator 216 */ 217 218 259 219 TrpzInteg::TrpzInteg() 260 // 261 //-- 262 {} 263 264 //++ 220 {} 221 265 222 TrpzInteg::TrpzInteg(FUNC f, double xmin, double xmax) 266 //267 //--268 223 : Integrator(f, xmin, xmax) 269 224 {} 270 //++ 225 271 226 TrpzInteg::TrpzInteg(fun f, double xmin, double xmax) 272 //273 //--274 227 : Integrator(f, xmin, xmax) 275 228 {} 276 229 277 //++278 230 TrpzInteg::TrpzInteg(FUNC f) 279 //280 //--281 231 : Integrator(f) 282 232 {} 283 233 284 234 TrpzInteg::TrpzInteg(fun f) 285 //286 //--287 235 : Integrator(f) 288 236 {} 289 237 290 //++291 238 TrpzInteg::TrpzInteg(GeneralFunction* gff, double* par, double xmin, double xmax) 292 //293 //--294 239 : Integrator(gff, par, xmin, xmax) 295 240 {} 296 241 297 //++298 242 TrpzInteg::TrpzInteg(GeneralFunction* gff, double* par) 299 //300 //--301 243 : Integrator(gff, par) 302 244 {} … … 305 247 {} 306 248 249 //! Return the value of the integral. 307 250 double 308 251 TrpzInteg::Value() … … 329 272 330 273 331 //++ 332 // Class GLInteg 333 // Lib Outils++ 334 // include integ.h 335 // 336 // Classe d'intégration par la méthode de Gauss-Legendre. 337 // Voir Integrator pour les méthodes. 338 // Pour le moment, nstep est l'ordre de la méthode. 339 // Il est prévu un jour de spécifier l'ordre, et que NStep 340 // découpe en intervalles sur chacun desquels on applique GL. 341 // Le principe de la méthode est de calculer les valeurs de la 342 // fonction aux zéros des polynomes de Legendre. Avec les poids 343 // qui vont bien, GL d'ordre n est exacte pour des polynomes de 344 // degré <= 2n+1 (monome le + haut x^(2*n-1). 345 // Impossible de demander une précision donnée. 346 // 347 //-- 348 //++ 349 // Links Parents 350 // Integrator 351 //-- 352 353 //++ 354 // Titre Constructeurs 355 // Voir Integrator pour les détails. 356 //-- 357 358 359 360 361 //++ 274 /*! 275 \ingroup NTools 276 \class SOPHYA::GLInteg 277 278 \brief Implementation de Integrator par la methode de Gauss-Legendre. 279 280 Classe d'intégration par la méthode de Gauss-Legendre. 281 Voir Integrator pour les méthodes. 282 Pour le moment, nstep est l'ordre de la méthode. 283 Il est prévu un jour de spécifier l'ordre, et que NStep 284 découpe en intervalles sur chacun desquels on applique GL. 285 Le principe de la méthode est de calculer les valeurs de la 286 fonction aux zéros des polynomes de Legendre. Avec les poids 287 qui vont bien, GL d'ordre n est exacte pour des polynomes de 288 degré <= 2n+1 (monome le + haut x^(2*n-1). 289 Impossible de demander une précision donnée. 290 291 \sa SOPHYA::Integrator 292 293 \warning statut EXPERIMENTAL , NON TESTE 294 */ 295 296 297 362 298 GLInteg::GLInteg() 363 //364 //--365 299 : mXPos(NULL), mWeights(NULL) 366 300 {} 367 301 368 302 369 //++370 303 GLInteg::GLInteg(FUNC f, double xmin, double xmax) 371 //372 //--373 304 : Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8) 374 305 { 375 306 NStep(1); 376 307 } 308 377 309 GLInteg::GLInteg(fun f, double xmin, double xmax) 378 //379 //--380 310 : Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8) 381 311 { 382 312 NStep(1); 383 313 } 384 //++ 314 385 315 GLInteg::GLInteg(FUNC f) 386 //387 //--388 316 : Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8) 389 317 { 390 318 NStep(1); 391 319 } 320 392 321 GLInteg::GLInteg(fun f) 393 //394 //--395 322 : Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8) 396 323 { … … 398 325 } 399 326 400 //++401 327 GLInteg::GLInteg(GeneralFunction* gff, double* par, double xmin, double xmax) 402 //403 //--404 328 : Integrator(gff, par, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8) 405 329 { … … 407 331 } 408 332 409 //++410 333 GLInteg::GLInteg(GeneralFunction* gff, double* par) 411 //412 //--413 334 : Integrator(gff, par), mXPos(NULL), mWeights(NULL), mOrder(8) 414 335 { … … 453 374 454 375 376 //! Definit l'ordre de la methode d'integration Gauus-Legendre 455 377 GLInteg& 456 378 GLInteg::SetOrder(int order) … … 462 384 463 385 464 386 //! Retourne la valeur de l'integrale 465 387 double 466 388 GLInteg::Value() … … 527 449 } 528 450 451 //! Imprime l'ordre et la valeur des poids sur cout 529 452 void 530 453 GLInteg::Print(int lp) -
trunk/SophyaLib/NTools/ntoolsinit.cc
r2615 r2808 15 15 /*! 16 16 \defgroup NTools NTools module 17 This module contains various tools for Sophya.18 17 */ 19 18 … … 23 22 \class SOPHYA::NToolsInitiator 24 23 \ingroup NTools 25 Tools initiator 24 \brief NTools module initializer. 25 26 This module contains various tools for Sophya, in particular numerical algorithms 27 such as : 28 - Non linear fitting (parameter determination) : GeneralFit , MinZSimplex 29 - FFT (FFTServerInterface, FFTPackServer) 30 - Spline interpolation 31 - Numerical integration and differential equations 32 - Date/time manipulation and some usual astronomical quantities (datime.c .h) 26 33 */ 27 34 NToolsInitiator::NToolsInitiator() -
trunk/SophyaLib/NTools/poly.cc
r2615 r2808 14 14 \ingroup NTools 15 15 One dimensional polynomials class. 16 \warning status EXPERIMENTAL - not fully tested. 16 17 */ 17 18 … … 350 351 \ingroup NTools 351 352 Two dimensional polynomials class. 353 \warning status EXPERIMENTAL - not fully tested. 352 354 */ 353 355 -
trunk/SophyaLib/NTools/simplex.cc
r2650 r2808 10 10 //--------------------------------------------------------------- 11 11 // Interface de classe de function multivariable pour le SimplexMinmizer 12 /*! 13 \class SOPHYA::MinZFunction 14 \ingroup NTools 15 Interface definition for a function object f(x[]) for which MinZSimplex can 16 search the minimum. 17 The pure virtual method Value() should be implemented by the derived classes. 18 */ 12 19 13 20 MinZFunction::MinZFunction(unsigned int nvar) … … 23 30 //------------------- Classe MinZFuncXi2 -------------------- 24 31 //--------------------------------------------------------------- 32 /*! 33 \class SOPHYA::MinZXi2 34 \ingroup NTools 35 Implements the MinZFunction interface using a xi2 calculator 36 \sa GeneralXi2 GeneralFitData 37 */ 25 38 MinZFuncXi2::MinZFuncXi2(GeneralXi2* gxi2, GeneralFitData* gd) 26 39 : mGXi2(gxi2) , mGData(gd), MinZFunction(gxi2->NPar()) … … 174 187 } 175 188 189 /*! 190 \class SOPHYA::MinZSimplex 191 \ingroup NTools 192 This class implements non linear minimization (optimization) 193 in a multidimensional space following the \b Simplex method. 194 A \b Simplex is a geometrical figure made of N+1 points in a 195 N-dimensional space. (triangle in a plane, tetrahedron in 3-d space). 196 The minimization method implemented in this class is based on the 197 algorithm described in "Numerical Recipes, Chapter X". 198 199 The algorithm has been slightly enhanced : 200 - More complex convergence / stop test 201 - A new transformation of the simplex has been included (ExpandHigh) 202 203 For each step, on of the following geometrical transform is performed 204 on the Simplex figure: 205 - Reflection : reflection away from the high point (expansion by factor Alpha) 206 - ReflecExpand : reflection way from the high point and expansion by factor Beta2 207 - ContractHigh : Contraction along the high point (factor Beta) 208 - ContractLow : Contraction toward the low point (factor Beta2) 209 - ExpandHigh : Expansion along the high point 210 211 \sa GeneralFit 212 213 The following sample code shows a usage example: 214 \code 215 include "simplex.h" 216 ... 217 // Define our function to be minimized: 218 class MySFunc : public MinZFunction { 219 public: 220 MySFunc() : MinZFunction(2) {} 221 virtual double Value(double const xp[]) 222 { return (xp[0]*xp[0]+2*xp[1]*xp[1]); } 223 }; 224 225 ... 226 227 MySFunc mysf; 228 MinZSimplex simplex(&mysf); 229 // Guess the center and step for constructing the initial simplex 230 Vector x0(2); x0 = 1.; 231 Vector step(2); step = 2.; 232 simplex.SetInitialPoint(x0); 233 simplex.SetInitialStep(step); 234 Vector oparm(2); 235 int rc = simplex.Minimize(oparm); 236 if (rc != 0) { 237 string srt; 238 int sr = simplex.StopReason(srt); 239 cout << " Convergence Pb, StopReason= " << sr << " : " << srt << endl; 240 } 241 else { 242 cout << " Converged: NStep= " << simplex.NbIter() 243 << " OParm= " << oparm << endl; 244 } 245 \endcode 246 */ 247 248 /*! 249 \brief Auto test function 250 \param tsel : select autotest (0,1,2,3,4) , tsel<0 -> all 251 \param prtlev : printlevel 252 */ 176 253 int MinZSimplex::AutoTest(int tsel, int prtlev) 177 254 { … … 214 291 } 215 292 293 //! Constructor from pointer to MinZFunction object 216 294 MinZSimplex::MinZSimplex(MinZFunction *mzf) 217 295 : mZF(mzf) , mPoint0(mZF->NVar()) , mStep0(mZF->NVar()) … … 234 312 } 235 313 314 //! Perform the minimization 315 /*! 316 Return 0 if success 317 \param fpoint : vector containing the optimal point 318 319 Convergence test : 320 \verbatim 321 On minimise f(x) f=mZF->Value() , 322 f_max = max(f) sur simplex , f_min = min(f) sur simplex 323 fm = (abs(f_max)+abs(f_min)) 324 [Delta f] = abs(f_max-f_min) 325 [Delta f/f]simplex = 2.*Delta f / fm 326 fm2 = (abs(f_max)+abs(f_max(iter-1))) 327 [Delta f_max/f_max]iter = [f_max(iter-1)-f_max]/fm2 328 Test d'arret : 329 fm < mTol0 OU 330 [Delta f/f]simplex < mTol1 mRep1 fois de suite OU 331 [Delta f_max/f_max]iter < mTol2 mRep2 fois de suite 332 */ 236 333 int MinZSimplex::Minimize(Vector& fpoint) 237 334 { … … 411 508 } 412 509 510 //! Return the stop reason and fills the corresponding string description 413 511 int MinZSimplex::StopReason(string& s) 414 512 { -
trunk/SophyaLib/NTools/simplex.h
r2650 r2808 28 28 namespace SOPHYA { 29 29 30 //! Interface definition for multivar uable function (used by SimplexMinmizer)30 //! Interface definition for multivariable function (used by SimplexMinmizer) 31 31 class MinZFunction { 32 32 public: … … 42 42 }; 43 43 44 //! Classeimplementing MinZFunction for a GeneralXi2 associated with a GeneralFitData44 //! Wrapper class implementing MinZFunction for a GeneralXi2 associated with a GeneralFitData 45 45 class MinZFuncXi2 : public MinZFunction { 46 46 public: … … 61 61 virtual ~MinZSimplex(); 62 62 63 //! Return the parameter space dimension 63 64 inline int NDim() { return mZF->NVar(); } 64 65 // Simplex initial 66 //! Defines the initial point (center of simplex figure) 65 67 inline void SetInitialPoint(Vector& point) { mPoint0 = point; } 68 //! Defines the step along each dimension to construct the simplex from initial point 66 69 inline void SetInitialStep(Vector& step) { mStep0 = step; } 67 70 71 //! Set the info/debug print level 68 72 inline void SetPrtLevel(int lev=0) { mPrt = lev; } 73 //! Return the current print level 69 74 inline int PrtLevel() { return mPrt; } 70 75 76 //! Set the maximum number of iteration 71 77 inline void SetMaxIter(int max = 100000) { mMaxIter = max; } 78 //! Return the current max iter 72 79 inline int MaxIter() { return mMaxIter; } 80 //! Return the number of iterations performed 73 81 inline int NbIter() { return mIter; } 82 //! Return the stop reason 74 83 inline int StopReason() { return mStop; } 84 //! Return the stop reason and a description string (\b s) 75 85 int StopReason(string& s); 76 86 … … 86 96 // [Delta f/f]simplex < mTol1 mRep1 fois de suite OU 87 97 // [Delta f_max/f_max]iter < mTol2 mRep2 fois de suite 88 // 98 99 //! Define the tolerances for the various convergence tests 89 100 inline void SetStopTolerance(double tol0=1.e-39, double tol1 = 1.e-3, int rep1=5, 90 101 double tol2=1.e-4, int rep2=5) … … 97 108 // Beta2 = Facteur d'homothetie pour la contraction vers le sommet bas f_min (ContractLow) 98 109 // Gamma2 = Facteur d'homothetie pour la l'extension pour le sommet haut ExpandHigh 110 111 //! Define the similarity (homothetic) factors for the different simplex transformations 99 112 inline void SetControls(double alpha=1., double beta=0.5, double beta2=0.5, 100 113 double gamma=2.0, double gamma2=2.0) 101 114 { mAlpha = alpha; mBeta = beta; mBeta2 = beta2; mGamma = gamma; mGamma2 = gamma2;} 102 115 116 //! Return the the homothetic factor for Reflection 103 117 inline double Alpha() { return mAlpha; } 118 //! Return the the homothetic factor for ContractHigh (contraction away from high point) 104 119 inline double Beta() { return mBeta; } 120 //! Return the the homothetic factor for ContractLow (contraction toward the low point) 105 121 inline double Beta2() { return mBeta2; } 122 //! Return the the homothetic factor for ReflecExpand (reflection+expansion) 106 123 inline double Gamma() { return mGamma; } 124 //! Return the the homothetic factor for ExpandHigh (expansion along high point) 107 125 inline double Gamma2() { return mGamma2; } 108 126
Note:
See TracChangeset
for help on using the changeset viewer.