Question

J'ai un système d'EDO (de premier ordre) avec des dérivés assez coûteux à calculer.

Cependant, les dérivés peuvent être calculés considérablement moins chers dans les limites d’erreurs données, soit parce que les dérivés sont calculés à partir d’une série convergente et que les bornes peuvent être placées sur la contribution maximale des termes supprimés, soit par le biais des informations de distance précalculées stockées dans Tables de recherche kd-tree / octree.

Malheureusement, je n’ai pas trouvé de solutionneur général d’EDO pouvant en tirer parti; ils semblent tous simplement vous donner des coordonnées et veulent un résultat exact. (Remarquez que je ne suis pas un expert en ODE; je connais bien Runge-Kutta, le contenu du livre Numerical Recipies, LSODE et le solutionneur de la bibliothèque scientifique Gnu).

C'est-à-dire que pour tous les solveurs que j'ai vus, vous fournissez une derivs fonction de rappel acceptant un t et un tableau de x, et renvoyant un tableau de dx/dt en retour; mais, idéalement, je suis à la recherche d’un qui donne le rappel dx/dt_min, dx/dt_max s, et un tableau d’erreurs acceptables , et reçoit <=> et <=> des tableaux, avec la dérivée gamme garantie d'être dans la précision requise. (Il existe probablement de nombreuses variations tout aussi utiles possibles.)

Tous les indicateurs de solution conçus dans ce but, ou toute autre approche du problème (je ne peux pas croire que je suis la première personne à vouloir quelque chose comme ça) seraient grandement appréciés.

Était-ce utile?

La solution 3

Après avoir réfléchi un peu plus à ce sujet, je me suis rendu compte que l’arithmétique des intervalles est probablement la clé. Ma fonction derivs renvoie essentiellement les intervalles. Un intégrateur utilisant l'arithmétique d'intervalles conserverait les x comme intervalles. Tout ce qui m'intéresse, c'est d'obtenir une erreur suffisamment petite liée sur le x s lors d'une finale t. Une approche évidente consisterait à réintégrer de manière itérative, en améliorant la qualité de l'échantillon en introduisant le plus d'erreurs à chaque itération jusqu'à ce que nous obtenions finalement un résultat avec des limites acceptables (bien que cela puisse sembler être un maladie " en ce qui concerne l'efficacité globale). Je soupçonne que le contrôle adaptatif de la taille de pas pourrait bien s’intégrer dans un tel schéma, la taille de pas étant choisie pour garder le & "Implicite &"; erreur de discrétisation comparable à " erreur explicite " c'est-à-dire l'intervalle).

Quoi qu'il en soit, googler & "; arithmétique d'intervalle de solutionneur d'ode &"; ou juste " intervalle ode " met en place une foule de choses nouvelles et pertinentes intéressantes ( VNODE et ses références en particulier).

Autres conseils

Grosso modo, si vous connaissez f 'jusqu'à l'erreur absolue eps et que vous intégrez de x0 à x1, l'erreur de l'intégrale provenant de l'erreur dans la dérivée va être < = eps * (x1 - x0). Il y a aussi une erreur de discrétisation, provenant de votre solutionneur ODE. Considérez l’importance de eps * (x1 - x0) pour vous et alimentez le résolveur ODE avec des valeurs f 'calculées avec l’erreur & Lt; = eps.

Je ne suis pas sûr que ce soit une question bien posée.

Dans de nombreux algorithmes, par exemple, la résolution d’équations non linéaires, f (x) = 0, une estimation d’une dérivée f '(x) est tout ce qui est nécessaire pour une utilisation similaire à la méthode de Newton seulement besoin d'aller dans la " direction générale " de la réponse.

Cependant, dans ce cas, la dérivée est une partie essentielle de l’équation (ODE) que vous résolvez. Ne vous trompez pas de dérivée et vous obtiendrez simplement la mauvaise réponse. c'est comme essayer de résoudre f (x) = 0 avec seulement une approximation de f (x).

Comme une autre réponse l’a suggéré, si vous configurez votre ODE comme appliqué f (x) + g (x) où g (x) est un terme d’erreur, vous devriez pouvoir relier les erreurs de vos dérivés aux erreurs de votre entrées.

Si vous avez un système rigide, vous utiliserez une méthode implicite, auquel cas les dérivées ne sont utilisées que dans l’itération de Newton. L'utilisation d'un jacobien approximatif vous coûtera une convergence quadratique stricte sur les itérations de Newton, mais cela est souvent acceptable. Sinon, vous pouvez utiliser une méthode de Newton-Krylov sans jacobie (principalement si le système est grand) pour résoudre les étapes. Dans ce cas, votre jacobien approximatif devient simplement un préconditionneur et vous conservez la convergence quadratique dans l'itération de Newton.

Avez-vous envisagé d'utiliser odeset ? Il vous permet de définir des options pour un résolveur ODE, puis vous transmettez la structure des options en tant que quatrième argument au résolveur que vous appelez. Les propriétés de contrôle d'erreur (RelTol, AbsTol, NormControl) peuvent vous intéresser le plus. Je ne suis pas sûr que ce soit exactement le type d’aide dont vous avez besoin, mais c’est la meilleure suggestion que je puisse proposer, après avoir utilisé les fonctions MATLAB ODE il ya plusieurs années.

De plus: pour la fonction dérivée définie par l'utilisateur, pourriez-vous simplement coder de manière rigoureuse les tolérances dans le calcul des dérivées, ou avez-vous vraiment besoin que des limites d'erreur soient passées du solveur?

Je ne suis pas sûr de contribuer beaucoup, mais dans le monde de la modélisation pharmaceutique, nous utilisons LSODE, DVERK et DGPADM. DVERK est un solutionneur simple et rapide pour l’ordre 5/6 de Runge-Kutta. DGPADM est un bon résolveur matrice-exposant. Si vos ODE sont linéaires, l’exposant matriciel est de loin le meilleur. Mais votre problème est un peu différent.

BTW, l’argument T n’est là que pour la généralité. Je n'ai jamais vu de système réel dépendant de T.

Vous pouvez pénétrer dans un nouveau territoire théorique. Bonne chance!

Ajouté: Si vous faites des simulations orbitales, il me semble que j'ai entendu parler de méthodes spéciales utilisées pour cela, basées sur des courbes à section conique.

Insérez une méthode des éléments finis avec des fonctions de base linéaires et une quadrature du point milieu. Résoudre les ODE suivants ne nécessite qu'une seule évaluation, chacun de f (x), k (x) et b (x) par élément:

-k (x) u '' (x) + b (x) u '(x) = f (x)

La réponse aura une erreur ponctuelle proportionnelle à l'erreur dans vos évaluations.

Si vous avez besoin de résultats plus lisses, vous pouvez utiliser des fonctions de base quadratiques avec deux évaluations de chacune des fonctions ci-dessus par élément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top