Comment obtenir une annulation plus précise

Aug 21 2020

Je vais essayer d'en venir au fait, alors faites-moi savoir s'il reste quelque chose et que vous avez besoin de plus de détails.

Je résous quelques équations qui ne sont pas couplées explicitement , mais leurs variables inconnues correspondantes, disons$x$ et $y$ doit satisfaire une équation différentielle:

$\dot x = x + y,$

où les points désignent une dérivée par rapport à une variable indépendante, disons $t$.

L'équation pour $x$ est de second ordre, donc on obtient $x$ et $\dot x$de lui, et on peut vérifier si l'équation ci-dessus est toujours satisfaite. Cependant (voir l'intrigue ci-jointe), il s'avère que, quelle que soit la méthode d'intégration que j'utilise depuis SciPy (celles qui sont déjà implémentées), l'égalité ci-dessus cesse d'être satisfaite à un moment donné. Cela est dû au fait que$x$ et $y$ s'annulent jusqu'à une très grande précision, ce qui ne semble pas être atteint par aucune des méthodes fournies par SciPy (j'ai vérifié cela en prenant toutes les méthodes et en abaissant autant que possible la tolérance absolue et relative. Dans le graphique ci-joint , la méthode employée est le DOP853, qui est censé être très utile lorsque de très faibles tolérances sont requises).

Ma question est de savoir si vous connaissez un moyen d'améliorer la précision afin que l'annulation soit plus précise (j'aimerais que l'équation soit convenablement satisfaite tout au long du calcul). Les seuls paramètres que j'ai modifiés jusqu'à présent étaient les tolérances relatives et absolues (et bien sûr les différentes méthodes à notre disposition). Y a-t-il un paramètre qui me manque et qui pourrait être utile pour cela?

Réponses

5 ChrisRackauckas Aug 21 2020 at 10:51

Je ne suis pas sûr que cela soit possible avec les bibliothèques Python car elles utilisent Fortran sous le capot et cela ne peut pas être facilement recompilé, mais la compilation Julia DifferentialEquations.jl JIT spécialise les solveurs en fonction des types de nombres que vous lui donnez. Voici une démonstration de certains types étranges comme les nombres rationnels, MPFR BigFloats et ArbFloats (basé sur la bibliothèque Arb) .

Vous pouvez voir cela en action dans les graphiques de convergence de Feagin qui démontrent la précision d'une méthode du 14e ordre pour$10^{-50}$via BigFloats . Dans Julia avec BigFloats ou ArbFloats, vous pouvez setprecisionensuite modifier la précision des types de nombres pour obtenir la précision dont vous avez besoin.

Alors que les méthodes Julia sont très rapides par rapport à SciPy (ordre et demi de magnitude) , et même si elles se compilent pour se spécialiser sur les types d'entrée, un code d'optimisation spécial est généré pour le cas de haute précision, l'arithmétique de haute précision reste assez chère et vous devez garder cela à l'esprit. La spécialisation de l'intégrateur pour cette plage de haute précision sera assez importante. Notez que si vous voulez faire cela, je recommanderais probablement l' Vern9une des méthodes d'extrapolation multithread comme ExtrapolationMidpointDeuflhard(elles seront multithread entre les fappels, ce qui sera plus important lorsque la tolérance diminue), ou peut-être le nouvel intégrateur symplectique d'ordre 16IRKGL16 .

De plus, si vous avez besoin d'une arithmétique validée, vous pouvez utiliser TaylorIntegration.jl pour les méthodes de Taylor d'ordre élevé avec des limites de précision en virgule flottante sur la solution.