Changeset 2808 in Sophya for trunk/SophyaLib/NTools/difeq.cc
- Timestamp:
- Jun 14, 2005, 1:25:05 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 {}
Note:
See TracChangeset
for help on using the changeset viewer.