• Aucun résultat trouvé

Encapsulation complète des variables originales et des variables différentielles

Chapitre 1. Des collaborations entre calcul formel et calcul numérique

1.3. Calcul formel à l’intérieur d’un environnement de calcul numérique ?

1.3.2. Différentiation automatique

1.3.2.3. Encapsulation complète des variables originales et des variables différentielles

Figure 28 – Différentiation automatique par encapsulation complète des variables.

A l’opposé de la séparation complète, l’encapsulation complète des variables originales et des variables différentielles associe chaque variable différentielle introduite avec la variable originale correspondante. Les variables appariées sont déclarées à l’aide d’un nouveau type qui encapsule les deux données. En ce qui concerne les traitements, chaque instruction doit porter non seulement sur la variable originale mais aussi sur la variable différentielle. Selon (Fagan, Hascoet, & Utke 2006), « le choix technique évident est d’encapsuler les opérations augmentées

subroutine af(x,y,ax,ay)

real au common/aS/ au real u,p common/S/ u,p real ax,ay,at real x,y,t at=2*x*ax t=x**2 au=au+at u=u+t ay=2*(ax*u+x*au) y=2*x*u+p end subroutine #include <math.h> class C { private: struct S { aFloat u; float p;} s; public:

void f(aFloat x, aFloat y){

aFloat t;

t = pow(x,2);

s.u = s.u+t;

y=2*x*s.u+s.p;} };

Calcul formel à l’intérieur d’un environnement de calcul numérique ?

et originales dans de nouvelles opérations (surchargées) ». Cette approche a été rendue possible

par FORTRAN 90 et C++ principalement, offrant à la fois des types de données structurées et la

surcharge des opérateurs du langage. La Figure 28 présente le texte C++ correspondant au calcul de la fonction f précédente. Les opérateurs et la fonction surchargés apparaissent en rouge, le type de données encapsulé en vert.

L’élégance de cette approche de la différentiation automatique qui requiert uniquement l’utilisation d’une bibliothèque définissant les types encapsulés et les opérations surchargées, et apporte des modifications restreintes au code initial, a fait le succès d’Adol-C (Griewank, Juedes, & Utke 1996), différentiateur automatique de codes C et C++. Par ailleurs, des bibliothèques de différentiation efficaces à intégrer manuellement à des programmes de calcul voient le jour. (Straka 2005) fournit à des codes FORTRAN 90 des dérivées numériques d’ordre un, à la précision machine. Sur le même principe, (von Hippel 2006) calcule des dérivées numériques pour des ordres de dérivation éventuellement supérieurs à deux. La bibliothèque

C++FastDer++ (Tijskens et al. 2004) combine des techniques de différentiation automatique et

de vectorisation pour calculer efficacement des dérivées numériques précises lors de la résolution d’équations aux dérivées partielles.

1.4. Synthèse: calcul formel, calcul numérique, calcul symbolico-

numérique

Au fil des chapitres précédents, émerge une classification des démarches adoptées pour traiter la modélisation et la simulation de systèmes régis par des équations mathématiques. Comme le résume le tableau ci-dessous, chaque démarche représente, transforme et évalue les modèles différemment.

Calcul formel Différentiation automatique Calcul numérique Modèles représentés Expressions symbolico- numériques Expressions numériques augmentées d’une information numérique sur leurs

dérivées

Expressions numériques Transformation des modèles en cours

d’exécution Oui Non

Evaluation symbolico- numérique Oui Non Arithmétique réelle en précison machine Oui Oui Arithmétique réelle

à précison multiple Oui

Oui (bibliothèques mathématiques) Arithmétique réelle à intervalles en précision multiple Oui (boîtes à outils) Oui (bibliothèques mathématiques) Modes d’évaluation des modèles « Arithmétique

réelle exacte » Non

Oui

(bibliothèques mathématiques)

Tableau 1 – Représentation, transformation et évaluation des modèles en calcul formel et en calcul numérique.

Le calcul formel représente des modèles où figurent des symboles et des nombres, en précision machine ou en précision arbitraire. Les modèles du calcul numérique ne comportent que des nombres, de même que les modèles issus de la différentiation automatique. Ces derniers sont enrichis de données complémentaires, mais qui restent des quantités numériques.

Dans un système de calcul formel, les expressions mathématiques sont systématiquement représentées par des structures de données dynamiques. Lors de l’exécution d’un programme

Synthèse: calcul formel, calcul numérique, calcul symbolico-numérique

écrit dans le langage de ce système, ces expressions subissent des transformations formelles et des approximations numériques. Ce paradigme est poussé à l’extrême dans les systèmes de calcul formel proposant un langage de programmation fonctionnel car, dans ce cas, l’exécution d’une instruction quelconque, ou du programme complet, consiste à appliquer une fonction à des arguments, et donc à produire une nouvelle expression. A l’opposé, les expressions mathématiques du calcul numérique, représentées par des séquences d’instructions d’évaluation numérique, constituent des modèles statiques. Les codes issus de la différentiation automatique en sont un cas particulier : même s’ils comportent plus d’expressions que le code initial, ces expressions ne sont pas transformées en cours d’exécution, mais seulement évaluées numériquement.

L’évaluation d’une expression dans un système de calcul formel produit soit une expression mêlant symboles et nombres, soit un nombre réel ou complexe issu d’un calcul à précision multiple (cf. 1.1.2), soit un nombre réel ou complexe en précision machine. Des boîtes à outils complémentaires rajoutent l’arithmétique réelle à intervalles en précision multiple (cf. 1.1.2.4) aux systèmes de calcul formel. La plupart du temps, l’évaluation d’une expression dans un logiciel de calcul numérique produit un nombre réel ou complexe en précision machine. Des bibliothèques spécifiques permettent cependant de disposer d’une arithmétique réelle à précision multiple, d’une arithmétique réelle à intervalles en précision multiple, voire d’une arithmétique réelle exacte (cf. 1.1.2.4).

Faire du calcul formel exige de représenter les expressions mathématiques sous la forme de structures de données auxquelles des transformations puissent être appliquées en cours d’exécution du programme. Faire du calcul formel à partir d’un environnement de simulation numérique exige donc la définition, dans le langage compilé utilisé, des types de données et des opérations élémentaires qui permettent ensuite l’écriture d’algorithmes de transformation formelle. Aujourd’hui, les systèmes de calcul formel ne mettent pas directement à disposition du développeur logiciel FORTRAN ou C++ les types de données et les opérations élémentaires qu’ils définissent pour leurs besoins. L’interface proposée est généralement un protocole de communication acceptant une expression mathématique et retournant le résultat de son évaluation.

L’interaction entre calcul numérique et calcul formel telle qu’elle est aujourd’hui dictée par les systèmes de calcul formel est-elle satisfaisante ? La simulation numérique au sein d’un système de calcul formel prend la forme d’une succession d’étapes de calcul formel et de calcul numérique. Sur ce principe, ne doit-on pas désormais envisager TOUTE simulation comme l’alternance d’étapes de calcul formel et d’étapes de calcul numérique ?

Dans ce but, le Chapitre 2 établit un modèle structurel et comportemental pour la coopération entre des systèmes de calcul formel et des systèmes de calcul numérique.

Chapitre 2.

Un modèle de coopération entre calcul