Writing /var/www/tireur.org/wiki/data/meta/verification/technique/integration_rk4.meta failed
Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.
Vous êtes ici : start » verification » technique » integration_rk4

**Ceci est une ancienne révision du document !**

Vérification — L'intégration numérique et la méthode RK4

Fiche de traçabilité de l'article L'intégration numérique par la méthode de Runge-Kutta d'ordre 4. Voir la méthode.

Page neuve, contrôlée le jour de sa mise en ligne puis à nouveau après son développement du 2026-08-12. Sa particularité : elle parle de nos propres outils. La source à confronter n'est donc pas une publication, c'est le code qui tourne sur le site — et il a le bon goût de ne pas se souvenir de travers.

Ce qui a été fait

  • Les quatre fichiers concernés relus : BallisticsGuide/src/CompetitionBallistics.js (solveur 3-DOF), reloading/tireur_reloaded/legacy/grt_solver.js (simulateur 0D), energy_model.js et velocity_model.js (estimateur servi en production).
  • Le solveur 3-DOF du site ré-exécuté sous Node à six pas de temps différents, pour mesurer si le pas retenu est assez court — la page l'affirmait sans l'avoir vérifié.
  • Tous les chiffres publiés recalculés sur un modèle à solution exacte connue, et le schéma engendré par ce même calcul.
  • La page servie ouverte dans un navigateur et mesurée, pas seulement relue au source.
  • Les cinq références bibliographiques confrontées aux notices des éditeurs et des dépôts numérisés — contrôle ajouté le 2026-08-12, après que la première version de cette fiche les eut déclarées non vérifiées.

La correction de fond : l'article attribuait RK4 à un outil qui n'intègre rien

La première version affirmait que la balistique intérieure du site était résolue en RK4. C'est faux pour l'outil réellement servi.

La page de l'estimateur ne charge que energy_model.js et velocity_model.js. Ni l'un ni l'autre ne contient de boucle en temps — aucune occurrence de pas de temps, de $k_1$, de Runge ou d'intégration dans les deux fichiers réunis. L'estimateur repose sur un modèle algébrique énergie-efficacité, qui relie directement charge, énergie de bouche et pression sans jamais parcourir le temps.

RK4 existe bien du côté intérieur, mais dans legacy/grt_solver.js — le simulateur thermodynamique 0D, avec son pas de 1 µs — et ce solveur-là n'est pas celui qu'on sert.

L'enjeu n'est pas cosmétique : un lecteur aurait porté au crédit de l'intégrateur une précision qui n'en relève pas, et cherché les limites de l'estimateur du mauvais côté. Elles tiennent à son modèle physique. L'article porte désormais un encadré qui dit lequel des outils intègre quoi.

Ressorti intact : tout ce qui décrit l'algorithme

Affirmation de la page Ce que dit le code
Pas extérieur $\Delta t = 0{,}0005$ s dt: 0.0005
Pas intérieur de 1 µs const dt = 1.0e-6
Vecteur d'état à six composantes [x, y, z, vx, vy, vz]
Pondération $\frac{\Delta t}{6}(k_1 + 2k_2 + 2k_3 + k_4)$ identique, dans les deux solveurs
$k_2$ et $k_3$ au même instant s2 et s3 construits tous deux avec 0.5 * dt
Traînée calculée sur la vitesse relative à l'air vrx = _vx - wx, etc.
Gravité projetée selon l'angle de site gAlong / gPerp
Coriolis intégré à chaque pas, en option dans derivs(), sous enableCoriolis
Dérive gyroscopique ajoutée après l'intégration boucle post-résolution sur windageM

Justes également, et démontrables sans rien ouvrir : l'ordre 1 d'Euler, l'ordre 4 de RK4, l'erreur locale en $\Delta t^5$, les douze variables d'état d'un modèle 6-DOF.

Le pas de temps du solveur, cette fois mesuré

L'article soutenait qu'à pas fixe « la marge se prend en amont » : on retient un pas assez court pour la phase la plus raide et on le garde partout. Affirmation invérifiée tant qu'on ne l'a pas éprouvée. Le solveur a donc été relancé sur une .308 175 gr (G7 0,243, 2 600 fps, zéro à 100 yd, vent de 10 mph), l'état étant comparé à instant fixe — 1,2 s de vol, soit environ 720 m — pour ne pas mélanger l'erreur d'intégration à celle de l'échantillonnage.

Pas de temps Écart sur la chute Écart sur la distance Écart sur la dérive
0,002 s 2,5 mm 2,7 × 10⁻³ mm 1,4 × 10⁻⁴ mm
0,0005 s (production) 0,40 mm 4,2 × 10⁻⁴ mm 2,3 × 10⁻⁵ mm
0,000125 s 0,14 mm 1,4 × 10⁻⁴ mm 7,7 × 10⁻⁶ mm

Écarts pris sur une exécution de référence à $\Delta t = 10^{-5}$ s. Le pas de production est amplement suffisant : le quadrupler ne déplacerait le point d'impact que de deux millimètres et demi à 720 m — un centième de MOA, très en deçà de ce qu'un tireur peut constater.

Ce que la mesure a révélé en passant. Ce résidu n'est pas celui de l'intégration de la trajectoire. Distance et dérive s'accordent à $10^{-4}$ mm près pendant que la chute bouge de 0,4 mm : trois ordres de grandeur d'écart entre des grandeurs issues du même pas de temps.

La chute est la seule des trois que fixe l'angle de zéro, calculé par une recherche séparée dont la boucle s'arrête au premier pas franchissant la distance de zérotage. L'angle trouvé est rigoureusement identique pour $\Delta t$ = 0,001, 0,0005 et 0,00025 s, puis bouge aux pas plus fins — signature d'une quantification, pas d'une convergence.

Ce n'est pas un défaut : l'effet est submillimétrique à 720 m, sans portée pour un tireur. Mais c'est là que loge le résidu, et non dans RK4. Conséquence méthodologique : l'ordre 4 ne peut pas se mesurer sur ce solveur — la recherche d'angle plafonne avant qu'on n'atteigne le régime asymptotique.

Les chiffres du banc d'essai : d'où ils viennent

Les valeurs chiffrées de la page ne sortent pas du solveur du site. Elles ont été calculées pour elle sur un cas volontairement simplifié — traînée quadratique pure, coefficient de traînée figé — précisément parce que ce cas-là possède une solution exacte, $v(t) = v_0 / (1 + k v_0 t)$, à laquelle comparer chaque méthode. Sans étalon, comparer Euler à RK4 ne dit rien de leur justesse : c'est l'enseignement de la fiche du tir en pente, où deux approximations se départageaient sans jamais convoquer l'arbitre.

Le coefficient $k = 9{,}08 \times 10^{-4}$ m⁻¹ se dérive de $\rho = 1{,}225$ kg/m³, $A = 4{,}803 \times 10^{-5}$ m² et $m = 11{,}34$ g. Toutes les valeurs des deux tableaux ont été reproduites par un script indépendant, et le schéma est engendré par scripts/gen_rk4_figure.py depuis le même calcul : aucun point n'y est dessiné à la main, y compris les quatre pentes $k_1$ à $k_4$ du second panneau.

Le $C_d$ de 0,35 est une convention de l'exercice, pas une mesure de la .308 175 gr. Il n'est invoqué à aucun moment comme une donnée balistique : la seule chose qui lui est demandée est de produire une décélération de bouche plausible — 581 m/s², près de 59 g — ce qu'il fait. La page le dit, et c'est ce qui autorise le reste.

Corrections d'énoncé

  • « Mathématiquement impossible » pour la résolution analytique : faux tel quel. Des solutions existent pour des lois de traînée simples, et l'artillerie a longtemps vécu sur des approximations de ce type. Ce qui n'admet pas de forme close, c'est le problème avec une table de traînée mesurée. Reformulé.
  • « Quatre points différents » : RK4 fait quatre évaluations réparties sur trois instants, $k_2$ et $k_3$ tombant au même milieu d'intervalle sur deux estimations différentes de l'état. La page le dit maintenant explicitement, parce que c'est l'erreur de lecture la plus courante sur cette méthode.
  • Le vecteur d'état 6-DOF était mal décrit ; il compte douze variables.
  • « Coefficients aérodynamiques McCoy » : McDrag et McGyro ne sont pas des coefficients mais des codes de calcul.
  • Pas de temps donné à 0,001 s au lieu de 0,0005 s, et point décimal au lieu de la virgule.

Les références, confrontées

Le premier contrôle les avait déclarées non vérifiées — situation qui produit précisément des notices plausibles et fausses. Elles ont été reprises une à une le 2026-08-12.

Référence publiée Résultat
Runge, Mathematische Annalen 46, 1895 exacte ; le titre imprimé porte « Ueber », et la pagination 167-178 a été ajoutée
Kutta, 1901 titre et année exacts, mais la notice était amputée de son journal
Butcher, Wiley, 3ᵉ éd., 2016 exacte
Hairer, Nørsett, Wanner, Springer, 2ᵉ éd., 1993 exacte ; série et numéro de collection ajoutés
McCoy, Schiffer, 2ᵉ éd., 2012 exacte ; sous-titre rétabli

Le piège que ce contrôle pouvait tendre était bien là, sous sa forme la plus banale : les deux articles fondateurs paraissent l'un et l'autre dans un volume 46 — Mathematische Annalen pour Runge, Zeitschrift für Mathematik und Physik pour Kutta. Une notice qui aurait fusionné les deux n'aurait présenté aucune anomalie apparente.

L'erreur n'était pas dans la bibliographie, elle était dans le texte

En vérifiant l'attribution des codes, une affirmation du corps de l'article est tombée. La page écrivait que le jeu complet de coefficients aérodynamiques d'un modèle 6-DOF — portance, moment de tangage, amortissements en tangage et en roulis, effet Magnus — « s'estime par des codes comme McDrag et McGyro ».

C'est faux, et de loin :

  • McDrag (rapport ARBRL-TR-02293 du Ballistic Research Laboratory, février 1981) estime le seul coefficient de traînée à incidence nulle, à partir de la géométrie du projectile — erreur annoncée de 3 % en supersonique, 11 % en transsonique, 6 % en subsonique.
  • McGyro (1986) estime le facteur de stabilité gyroscopique et le pas de rayure nécessaire, sur les mêmes entrées augmentées de la densité du projectile et du pas.

Ni l'un ni l'autre ne rend la portance, les amortissements ou l'effet Magnus. L'attribution à Robert L. McCoy, elle, était juste : c'est la portée des deux codes qui était gonflée. Le glissement est facile — ce sont les deux seuls noms de codes qui circulent chez les tireurs, et on les suppose donc capables de tout. La page énonce désormais ce que chacun calcule, et rappelle que le jeu complet s'obtient par réduction de tirs en tunnel balistique ou d'essais en soufflerie.

Ce que ce contrôle enseigne. La vérification d'une note bibliographique n'a pas corrigé la note : elle a corrigé la phrase que la note cautionnait. Les cinq références étaient bonnes, l'affirmation qu'elles appuyaient ne l'était pas. Contrôler une bibliographie, ce n'est donc pas seulement vérifier qu'un ouvrage existe — c'est vérifier qu'il dit ce qu'on lui fait dire.

Le traité a été ouvert, et il a corrigé la page

Le 2026-08-12, en fin de contrôle, un exemplaire du traité de balistique extérieure cité en référence a été mis à disposition. Trois points restés en suspens se règlent, et un quatrième est tombé.

Ce qu'il confirme. La formule de RK4 publiée sur la page est exactement celle que le traité donne en (9.35) — mêmes coefficients, mêmes arguments —, et il l'attribue lui aussi à Kutta. Le chapitre consacré au 6-DOF confirme la composition à douze variables d'état, la sensibilité du résultat à la qualité des coefficients d'entrée, et jusqu'à la référence de MCDRAG, que l'auteur cite dans sa propre bibliographie sous le numéro ARBRL-TR-02293. Il rapporte au passage que la méthode d'Euler a servi à résoudre les premières trajectoires point-masse.

Ce qu'il corrige. La page écrivait que la rareté des coefficients publiés « cantonne le 6-DOF à l'étude de la stabilité et de la dispersion plutôt qu'à la prévision courante de trajectoire ». Le critère réel n'est pas celui-là : c'est l'incidence. Tant qu'elle reste faible sur tout le parcours, un point-masse suffit « à toutes fins pratiques » ; le 6-DOF s'impose au vol à forte incidence — obus à 70° de site, projectile lâché en travers du vent relatif. Un tir tendu de .308 n'y entre pas, l'exemple du traité ne dépassant jamais 5° de tangage-lacet. Le jugement « un point-masse bien renseigné fait pratiquement aussi bien », que la fiche donnait pour non mesuré, est donc confirmé à la source — mais assorti d'une condition que la page n'énonçait pas.

Ce qu'il ajoute. Deux précisions d'exactitude sont entrées dans l'article :

  • le système d'équations qui définit une méthode de Runge-Kutta jusqu'à l'ordre 4 est sous-déterminé. Plusieurs formules d'ordre 4 coexistent donc ; celle de la page est la formule classique de Kutta, la variante de Gill en est une autre. Écrire « la » formule de RK4 était une simplification ;
  • le programme 6-DOF du laboratoire qui a produit ces travaux n'intègre pas à pas fixe : il emploie la variante de Gill avec un pas variable, réévalué sur la période du cycle de lacet, à raison d'une cinquantaine de pas par cycle. Son contrôle d'exactitude vaut d'être connu — l'orientation étant portée par un vecteur unitaire, on vérifie à chaque pas que son produit scalaire avec lui-même vaut 1, et un écart de plus de $10^{-5}$ signale un pas trop long. La page affirmait que « l'algorithme d'intégration, lui, ne change pas » du 3-DOF au 6-DOF : c'était faux dans le détail.

McGyro reste introuvable. Le fichier de description publié par un site de balistique répond 404, pour moi comme pour le propriétaire du site ; le dépôt de rapports de défense qui archive MCDRAG était en maintenance ; et — résultat le plus parlant — le traité de référence, dans son édition la plus récente, ne mentionne McGyro nulle part. Un dépouillement du texte intégral ne rend aucune occurrence, alors qu'il en rend trois pour MCDRAG. La page n'affirme donc plus de millésime pour McGyro, seulement ce qu'il calcule, établi sur deux relevés secondaires concordants.

Le site a bien un solveur 6-DOF — et sa notice ment

Cette fiche affirmait que « le site n'a pas de solveur 6-DOF pour l'arbitrer par le calcul ». C'est faux, et l'erreur est de ma main : j'avais relu le portage JavaScript servi aux visiteurs, où le 6-DOF est absent, et j'en avais conclu qu'il l'était partout. La bibliothèque Julia dont ce portage est tiré contient un module dédié — SixDOF, dans BallisticsGuide/src/CompetitionBallistics.jl — long de plus de trois cents lignes : jeu complet de coefficients aérodynamiques, moments d'inertie, équations d'Euler de la rotation, cinématique par quaternions.

En le relisant, un défaut est apparu, du genre exact que cette passe rencontre le plus souvent.

La notice du solveur annonce « Full 6-DOF rigid-body trajectory solver with RK4 integration ». La boucle intègre par la méthode d'Euler.

Le code ne s'en cache d'ailleurs pas — un commentaire, deux lignes au-dessus du pas d'intégration, reconnaît que « full RK4 on the 13-state would be ideal but Euler with small dt is adequate for demonstration ». La compensation choisie est un pas très court, $\Delta t = 10^{-4}$ s, dix fois plus fin que celui du solveur 3-DOF.

C'est la notice qui est fausse, pas le calcul — mais c'est la notice qu'on lit quand on décide de porter un module sur le web.

Deux remarques que ce module apporte à la page :

  • son vecteur d'état compte treize composantes, pas douze : trois de position, trois de vitesse, quatre de quaternion et trois de vitesse angulaire. Le compte dépend de la façon dont on porte l'orientation — trois cosinus directeurs dans le traité de référence, quatre paramètres de quaternion ici, en échange de l'absence de singularité. L'article dit « douze », ce qui vaut pour la formulation du traité ; les deux sont justes, chacune dans sa convention ;
  • les huit coefficients aérodynamiques y sont des valeurs par défaut en dur — dérivée de force normale, moment de renversement, amortissements, force et moment de Magnus. Personne ne les a mesurés pour une balle donnée. C'est l'illustration exacte du « garbage in, garbage out » que le traité oppose au 6-DOF, et la meilleure justification de ce que dit l'article : ce n'est pas l'algorithme qui manque, ce sont les données.

Le solveur n'étant pas servi aux visiteurs, l'article n'en parle pas. Il faudra y revenir si le 6-DOF passe un jour sur le site.

En revanche, l'argument du traité — le critère est l'incidence, pas la distance — a été porté là où la question se pose vraiment, hors du wiki : un encadré « Pourquoi 3-DOF et pas 6-DOF ? » dans l'aide contextuelle du calculateur balistique, une note dans le chapitre 6-DOF du manuel mathématique (PDF reconstruit) et deux encadrés dans le guide du solveur Julia, dont un sur les coefficients par défaut. La notice bibliographique du manuel donnait par ailleurs le traité pour « 2ᵉ édition, 1999 » : c'est 1999 pour la première et 2012 pour la seconde, corrigé.

Un défaut de rendu, invisible au source

Deux formules de l'encadré du banc d'essai s'affichaient avec une virgule parasite — « $-k, v^2$ », « $1 + k, v_0, t$ ». L'espace fine TeX \, y était écrite ; l'analyseur Markdown mange l'antislash avant que le moteur mathématique ne lise la ligne, et il ne reste que la ponctuation.

C'est la même famille que le % évaporé de la page du tir en pente, à ceci près que celui-ci laisse une trace visible au lieu de tronquer silencieusement. Ni le linter ni la règle de rendu tronqué ne le voient : il n'apparaît qu'en regardant la page servie. Corrigé, et vérifié à l'écran après correction.

Ce qui n'a pas été vérifié

  • La notice de McGyro n'a pas été ouverte. Le rapport de McDrag, lui, a été lu sur la fiche du dépôt de défense qui l'archive — numéro, laboratoire, date et objet du programme viennent de là. Pour McGyro, le fichier de description publié par un site de balistique répond 404 : ce qui est écrit plus haut provient de deux relevés secondaires concordants, non de la source. La conclusion ne s'en trouve pas fragilisée — elle tient déjà pour McDrag seul —, mais l'année 1986 et la liste exacte des sorties restent à confirmer.
  • L'exemplaire du traité consulté est un scan à reconnaissance de caractères dégradée. Le texte extrait est brouillé par endroits ; les quatre pages qui portent les conclusions ci-dessus ont donc été lues sur l'image, pas dans la couche texte. Le reste du chapitre n'a pas été dépouillé avec la même attention.
  • Le point-masse comparé au 6-DOF n'a toujours pas été mesuré ici. Le traité l'affirme et la page le reprend avec sa condition d'incidence faible ; la comparaison par le calcul reste à faire, et le solveur qui la permettrait porte le défaut décrit ci-dessus.
  • Le pas de 1 µs du simulateur intérieur n'a pas subi le test de convergence appliqué au solveur extérieur.
  • L'ordre 4 n'a été mesuré que sur le modèle jouet. Sur le solveur du site, la mesure bute sur la recherche d'angle de zéro (voir plus haut) avant d'atteindre le régime où l'ordre se lit.

Voir aussi

verification/technique/integration_rk4.1786543167.txt.gz · Dernière modification : de Lepigeon