Notes sur les méthodes (analyses) numériques - 1° partie, Notes de Logique mathématique
Caroline_lez
Caroline_lez14 January 2014

Notes sur les méthodes (analyses) numériques - 1° partie, Notes de Logique mathématique

PDF (130.9 KB)
14 pages
389Numéro de visites
Description
Notes de mathématique sur les méthodes (analyses) numériques - 1° partie. Les principaux thèmes abordés sont les suivants: L'analyse numérique, les méthodes directes, les définitions, la complexité, les exemples, np-comp...
20points
Points de téléchargement necessaire pour télécharger
ce document
Télécharger le document
Aperçu3 pages / 14
Ceci c'est un aperçu avant impression
Chercher dans l'extrait du document
Ceci c'est un aperçu avant impression
Chercher dans l'extrait du document
Aperçu avant impression terminé
Chercher dans l'extrait du document
Ceci c'est un aperçu avant impression
Chercher dans l'extrait du document
Ceci c'est un aperçu avant impression
Chercher dans l'extrait du document
Aperçu avant impression terminé
Chercher dans l'extrait du document

LES MÉTHODES (ANALYSES) NUMÉRIQUES

L'analyse numérique est une discipline des mathématiques. Elle s'intéresse tant aux fondements

théoriques qu'à la mise en pratique des méthodes permettant de résoudre, par des calculs

purement numériques, des problèmes d'analyse mathématique.

Définition: "L'analyse numérique" est l'étude des algorithmes permettant de résoudre les

problèmes de mathématiques continues (distinguées des mathématiques discrètes).

Cela signifie qu'elle s'occupe principalement de répondre numériquement à des questions à

variable réelle ou complexe comme l'algèbre linéaire numérique sur les champs réels ou

complexes, la recherche de solutions numériques d'équations différentielles et d'autres

problèmes liés survenant dans les sciences physiques et l'ingénierie.

Certains problèmes de mathématique continue peuvent être résolus de façon exacte par un

algorithme. Ces algorithmes sont appelés alors "méthodes directes". Des exemples sont

l'élimination de Gauss-Jordan pour la résolution d'un système d'équations linéaires et

l'algorithme du simplexe en programmation linéaire (voir plus loin).

Cependant, aucune méthode directe n'est connue pour certains problèmes (et il est même

démontré que pour une classe de problèmes dits "NP complets", il n'existe aucun algorithme

fini de calcul direct en temps polynômial). Dans de tels cas, il est parfois possible d'utiliser une

méthode itérative pour tenter de déterminer une approximation de la solution. Une telle

méthode démarre depuis une valeur devinée ou estimée grossièrement et trouve des

approximations successives qui devraient converger vers la solution sous certaines conditions.

Même quand une méthode directe existe cependant, une méthode itérative peut être préférable

car elle est souvent plus efficace et même souvent plus stable (notamment elle permet le plus

souvent de corriger des erreurs mineures dans les calculs intermédiaires).

L'utilisation de l'analyse numérique est grandement facilitée par les ordinateurs.

L'accroissement de la disponibilité et de la puissance des ordinateurs depuis la seconde moitié

du 20ème siècle a permis l'application de l'analyse numérique dans de nombreux domaines

scientifiques, techniques et économiques, avec souvent des effets révolutionnaires.

Lors de simulations numériques de systèmes physiques, les conditions initiales sont très

importantes dans la résolution d'équations différentielles (voir les différents chapitres du site

ou apparaissent des effets chaotiques). Le fait que nous ne puissions les connaître avec

exactitude fait que les résultats des calculs ne peuvent jamais êtres parfaitement exactes (nous

le savons très bien pour la météo qui en est l'exemple connu le plus flagrant). Cet effet, est une

conséquence des résultats de la physique fondamentale (basée sur des mathématiques pures)

qui démontre que l'on ne peut connaître parfaitement un système en y effectuant des mesures

puisqu'elles perturbent directement ce dernier (principe d'incertitude de Heisenberg) et elles

font l'objet de la théorie du Chaos (classique ou quantique).

Avec les nouveaux outils informatiques à disposition en ce début de 21ème siècle, il est devenu

pratique et passionnant de connaître les méthodes numériques afin de s'amuser dans certains

logiciels (OpenGL, 3D Studio Max, Maple, Matlab, Mathematica, Comsol, etc.) à simuler sous

forme graphique 2D ou 3D des systèmes physiques.

Remarques:

R1. Beaucoup de méthodes numériques utilisées en informatique se basent sur des raisonnements

qui ont déjà été étudiés dans d'autres sections de ce site et sur lesquelles nous ne reviendrons pas.

R2. Ce chapitre étant à la limite entre l'ingénierie et la mathématique appliquée, nous avons

décidé de donner parfois des exemples d'applications des outils développés.

Définition: Un "algorithme" est une suite finie de règles à appliquer dans un ordre déterminé à

un nombre fini de données pour arriver, en un nombre fini d'étapes (dont la quantité, ou

réciproquement le temps d'exécution est définie par le terme "coût"), à un certain résultat, et

cela indépendamment du type de données

Les algorithmes sont intégrés dans des calculateurs par l'intermédiaire de "programmes".

Définition: Un "programme" est la réalisation (l'implémentation) d'un algorithme au moyen d'un

langage donné (sur une architecture donnée). Il s'agit de la mise en oeuvre du principe.

Axiomes de la programmation (anecdotique) :

A1. Plus nous écrivons de code, plus nous produirons d'erreurs

A2. Il n'existe pas de programmes sans de possibles erreurs (du au programme lui-même, à

l'électronique sous-jacente ou le plus souvent à l'utilisateur même)

Basiquement voici la démarche minimale à suivre lors du développement d'un produit

informatique (au niveau du code):

M1. Auditer les besoins présents et anticiper les besoins futurs

M2. Définir les objectifs

M3. Calculer la faisabilité, le risque d'erreur, la durée nécessaire au développement

M4. Créer les algorithmes en langage formel (cela comprend la gestion des erreurs!)

M5. Optimiser la complexité et contrôler les algorithmes

M6. Choix d'une stratégie de développement (modulable ou autre)

M7. Traduire les algorithmes dans la technologie choisie (ce choix est un sujet assez sensible...)

Remarque: Il faudrait dans l'étape (7) respecter les normes de nommage et de représentation du

code ainsi que les conventions (traditions) de fréquence d'insertions des commentaires.

M8. Tests (maintenance préventive)

Remarque: Le débogage (la gestion des erreurs) d'un programme et les tests de fonctionnement

doivent prendre autant, voir plus, de temps que le développement du programme lui-même.

Lors du développement d'un programme scientifique, il peut être intéressant, voire même

rigoureux de s'attarder la notion de "complexité" de ce dernier. Sans aller trop loin, voyons un

peu de quoi il s'agit :

COMPLEXITÉ

La complexité d'un algorithme est la mesure du nombre d'opérations fondamentales qu'il

effectue sur un jeu de données. La complexité est donc exprimée comme une fonction de la

taille du jeu de données.

Les hypothèses permettant un calcul de cette complexité sont :

H1. (les quatre opérations fondamentales ont le même coût)

H2. Un accès mémoire une opération arithmétique

H3. Un contrôle de comparaison une opération arithmétique

H4. Un seul processeur

Nous notons l'ensemble des données de taille n et T(n) le coût (en temps) de l'algorithme

sur la donnée ou le jeu de données de taille n.

- La "complexité au meilleur" est donnée par la fonction:

(57.1)

C'est le plus petit temps qu'aura exécuté l'algorithme sur un jeu de données (de lignes de code)

de taille fixée, ici à n dont le coût (la durée) d'exécution est C(d). C'est une borne inférieure de

la complexité de l'algorithme sur un jeu de données de taille n.

- La "complexité au pire":

(57.2)

C'est le plus grand temps qu'aura à exécuté l'algorithme sur un jeu de données de taille fixée,

ici à n. Il s'agit donc d'un maximum, et l'algorithme finira toujours avant d'avoir

effectué opérations. Cependant, cette complexité peut ne pas refléter le comportement

usuel de l'algorithme, le pire cas pouvant ne se produire que très rarement, mais il n'est pas

rare que le cas moyen soit aussi mauvais que le pire cas.

- La "complexité moyenne":

(57.3)

Il s'agit de la moyenne des complexités de l'algorithme sur des jeux de données de taille n (en

toute rigueur, il faut bien évidemment tenir compte de la probabilité d'apparition de chacun des

jeux de données). Cette moyenne reflète le comportement général de l'algorithme si les cas

extrêmes sont rares ou si la complexité varie peu en fonction des données. Cependant, la

complexité en pratique sur un jeu de données particulier peut être nettement plus important

que la complexité moyenne, dans ce cas la complexité moyenne ne donnera pas une bonne

indication du comportement de l'algorithme.

En pratique, nous ne nous intéressons qu'à la complexité au pire, et à la complexité moyenne

Définition: Un algorithme est dit "algorithme optimal" si sa complexité est la complexité

minimale parmi les algorithmes de sa classe.

Comme nous l'avons fait sous-entendre précédemment, nous nous intéressons quasi-

exclusivement à la complexité en temps des algorithmes. Il est parfois intéressant de

s'intéresser à d'autres de leurs caractéristiques, comme la complexité en espace (taille de

l'espace mémoire utilisé), la largeur de bande passante requise, etc.

Pour que le résultat de l'analyse d'un algorithme soit pertinent, il faut avoir un modèle de la

machine sur laquelle l'algorithme sera implémenté (sous forme de programme). Nous prenons

habituellement comme référence, la machine à accès aléatoire (RAM)" et à processeur unique,

où les instructions sont exécutées l'une après l'autre, sans opérations simultanées et sans

processus stochastiques (contrairement au possibles machines quantiques futures).

Les algorithmes usuels peuvent êtres classés en un certain nombre de grandes classes de

complexité dont l'ordreO varie d'une certaine manière:

- Les algorithmes sub-linéaires dont la complexité est en général de l'ordre O(log(n))

- Les algorithmes linéaires en complexité O(n) et ceux en complexité en O(n log(n)) sont

considérés comme rapides.

- Les algorithmes polynomiaux en O(nk) pour sont considérés comme lents, sans parler

des algorithmes exponentiels (dont la complexité est supérieur à tout en n) que l'on s'accorde à

dire impraticables dès que la taille des données est supérieur à quelques dizaines d'unités.

Remarque: Une bonne complexité est de type O(n k ) pour . Une mauvaise complexité est de

type ou .

Exemples:

E1. Evaluation d'un polynôme :

(57.4)

L'évaluation directe de la valeur de P(x) conduit à une complexité

(57.5)

Nous devons à Horner un algorithme plus performant qui utilise une factorisation du polynôme

sous la forme :

(57.6)

Nous pouvons facilement montrer que cette factorisation maintient le même nombre

d'additions mais réduit le nombre de multiplication à (n). La complexité qui en découle est

donc O(n). Le gain est incontestablement important. De plus, cette factorisation évite tout calcul

de puissance.

E2. Un autre exemple connu de complexité algorithmique est la recherche d'une information

dans une colonne triée. Un algorithme simple appelé "recherche dichotomique" consiste à

prendre la cellule au milieu de la colonne et de voir si nous y trouvons la valeur recherchée.

Sinon, la recherche doit continuer dans la partie supérieure ou inférieure du tableau (cela

dépend de l'ordre lexicographique).

L'algorithme est récursif et permet de diminuer par deux, à chaque étape, la taille de l'espace

de recherche. Si cette taille, initialement, est de n cellules dans la colonne, elle est de n/2 à

l'étape 1, à l'étape 2, et plus générale à à l'étape k.

Au pire, la recherche se termine quand il n'y a plus qu'une seule cellule de la colonne à

explorer, autrement dit quand k est tel que . Nous en déduisons le nombre maximal

d'étapes: c'est le plus petit k tel que , soit , soit:

(57.7)

à comparer avec une recherche séquentielle dans une colonne de 25'000 données dont la

complexité linéaire estO(n) soit 25'000 alors qu'avec la méthode dichotomique nous avons une

complexité sub-linéaire . Le gain est donc considérable!

E3. Soit A et B deux matrices carrées de dimension n. Les principales opérations sur ces

matrices ont les complexités suivantes (nous laisserons le soin au lecteur de vérifier car c'est

vraiment trivial) :

- Lecture (itérations) : O(n2)

- Calcul de la trace :

- Addition : tel que

- Multiplication : tel que

- Déterminant (par la méthode directe de Cramer). Nous renvoyons le lecteur au chapitre

d'Algèbre Linéaire pour le détail des méthodes de calcul du déterminant d'une matrice. Nous

pouvons alors montrer que la complexité d'un déterminant d'ordre n est n multiplications, n-1

additions plus n fois la complexité d'un déterminant d'ordre n-1. Par cumul, nous arrivons à :

(57.8)

En faisant l'hypothèse que l'ordinateur utilisé effectue une opération élémentaire

en secondes (ce qui est déjà une bonne machine). Nous obtenons alors les temps de

calculs suivants pour plusieurs valeurs de n :

n 5 10 15 20 50

t

Tableau: 55.1 - Temps de calcul d'un déterminant

d'où la nécessité de faire un calcul de complexité avant de mettre l'algorithme en route (à

moins que vous ne travailliez exclusivement pour les générations futures, à condition qu'il y en

ait encore...).

Finalement, pour résumer un peu, nous distinguons quelques types de complexités classiques

: O(1) indépendant de la taille de la donnée, O(log(n)), complexité logarithmique, O(n)

complexité linéaire, O(n log(n)), complexité quasi-linéaire, O(n2), complexité quadratique, O(n3),

complexité cubique, O(kn) complexité exponentielle, O(n!), complexité factorielle.

NP-COMPLÉTUDE

Nous allons introduire pour la culture générale le concept de NP-complétude, c'est-à-dire que

nous allons tenter de définir sans trop de formalisme (comme à l'habitude) la classe des

problèmes dit "NP-complets". Ces problèmes sont ceux pour lesquels personne à l'heure

actuelle ne connaît d'algorithme efficace (i.e. seulement des algorithmes exponentiels). Ce sont

des problèmes vraiment difficiles par opposition à ceux pour lesquels nous connaissons des

algorithmes de complexité polynomiale.

Définitions:

D1. Les problèmes de "classe P" sont des bons problèmes dans le sens où le calcul de leur

solution est faisable dans un temps raisonnable avec un algorithme à complexité

polynomiale. Plus formellement, ce sont les problèmes pour lesquels nous pouvons construire

une machine déterministes (voir la remarque après les définitions) dont le temps d'exécution

est de complexité polynomiale (le sigle "P" signifiant "Polynomial Time").

D2. Les problèmes de "classe E" sont des problèmes dans le sens où le calcul de leur solution

est faisable dans un temps exponentiel par nature de type . Plus formellement, ce sont les

problèmes pour lesquels nous pouvons construire une machine déterministes dont le temps

d'exécution est de complexité exponentielle (le sigle "E" signifiant "Exponential Time").

D3. Les problèmes de la "classe NP" sont ceux pour lesquels nous pouvons construire une

machine de Turing non déterministe (voir la remarque après les définitions) dont le temps

d'exécution est de complexité polynomiale (le sigle "NP" provient de "Nondeterministic

Polynomial time" et non de "Non Polynomial").

Remarque: Contrairement aux machines déterministes qui exécutent une séquence d'instructions

bien déterminée, les machines non déterministes ont la remarquable capacité de toujours choisir

la meilleure séquence d'instructions qui mène à la bonne réponse lorsque celle-ci existe. Il va

sans dire qu'une telle machine ne peut pas exister autrement que dans l'esprit d'un théoricien (à

moins qu'avec les ordinateurs quantiques...)! Néanmoins, comme nous le verrons par la suite, ce

concept abstrait n'est pas sans intérêt et constitue en fait la base de toute la théorie de la NP-

complétude.

Il importe de remarquer à ce stade de la discussion que la classe P est incluse dans la classe NP,

nous écrivons , car si nous pouvons construire une machine déterministe pour

résoudre efficacement (en un temps au pire polynomial) un problème, nous pouvons

certainement (du moins dans notre esprit) en construire une non déterministe qui résout aussi

efficacement le même problème. Par ailleurs, il ne faut pas croire que ce concept de divination

optimale qu'est la machine déterministe permet de tout résoudre puisqu'il existe en

informatique théorique d'autres types de problèmes n'appartenant pas à la classe NP qui sont

les problèmes indécidables.

Pour savoir si un problème donné appartient ou non à la classe NP, il s'agit simplement de

l'exprimer sous la forme dont la réponse est soit OUI, soit NON. Le problème appartient alors à

la classe NP si par définition, nous arrivons à démontrer à l'aide d'un algorithme de complexité

polynomiale que n'importe quelle instance OUI du problème est bel et bien correcte. Nous

n'avons pas à nous préoccuper des instances NON du problème puisque la machine non

déterministe, par définition, prend toujours la bonne décision (lorsque celle-ci existe).

Par exemple, le problème consistant à trouver un cycle hamiltonien (cycle qui passe une et une

seule fois par tous les sommets du graphe - voir chapitre de Théorie des graphes) dans un

graphe appartient à NP puisque, étant donné un cycle, il est trivial de vérifier en temps linéaire

qu'il contient bien une et une seule fois chaque sommet.

Un autre exemple de problème difficile des mathématiques est la factorisation d'un entier en

produit de facteurs premiers. Nous ne savons pas à ce jour s'il existe un algorithme polynomial

qui réussisse cette opération. Autrement dit, nous ne savons pas si ce problème est dans P. En

revanche, étant donné des nombres premiers il est trivial de vérifier que :

ce problème est donc dans NP. Il semblerait (nous n'avons pas vérifié ce résultat et ni la

possibilité de le faire) que la complexité du meilleur algorithme de factorisation en nombre

premier soit du type :

(57.9)

il resterait donc du travail à faire (si un internaute peut nous fournir les détails qui ont amené à

ce résultat, nous sommes preneurs).

Remarque: Si un problème est dans NP, alors il existera un algorithme en temps exponentiel

pour le résoudre mais le contraire n'est pas toujours vrai (il faut donc être prudent).

Parmi l'ensemble des problèmes NP, il en existe un sous-ensemble qui contient les problèmes

les plus difficiles : nous les appelons les problèmes "NP-complet" N.P.C. Ainsi, un problème NP-

complet possède la propriété que tout problème dans NP peut être transformé en celui-ci en

temps polynomial.

La raison essentielle pour laquelle les problèmes NPC sont les plus difficiles parmi les

problèmes de NP est que ces premiers peuvent toujours servir comme des sous-routines pour

solutionner ces derniers. Cette réduction à un ou des sous-routines assez facilement faisable

puisque réalisable, si elle existe, en temps polynomial. Un problème NPC est donc complet en

ce sens qu'il contient l'essentiel de la complexité des problèmes appartenant à NP, et qu'une

solution polynomiale à ce problème implique une solution polynomiale à tous les problèmes

NP.

Autrement formulé, les problèmes NPC ont une complexité exponentielle et ils ont tous la

même classe de complexité (modulo les polynômes).

Finalement, ce qu'il importe de bien comprendre et de retenir de tout cette théorie, son idée

maîtresse, est que si nous trouvons un jour un algorithme de complexité polynomiale pour un

seul de ces problèmes vraiment difficiles que sont les problèmes NPC, alors d'un seul coup NP

devient égal à P et tous les problèmes difficiles deviennent faciles !

Pour résumer, être dans P, c'est trouver une solution en un temps polynomial, tandis qu'être

dans NP, c'est prouver en un temps polynomial qu'une proposition de réponse est une solution

du problème. Ainsi, tout problème qui est dans P se trouve dans NP. Un champ de recherche

majeur des mathématiques actuelles est l'investigation de la réciproque : a-t-on P=NP?

Autrement dit, peut-on trouver en un temps polynomial ce que l'on peut prouver en temps

polynomial?

Remarque: Ce problème est si important en informatique qu'il fait partie (arbitrairement) des 7

problèmes du millénaire, dont la résolution est primée 1 million de dollars par le Clay

Mathematic Institute.

Passons maintenant à l'étude de quelques applications types des méthodes numériques dont il

est très souvent fait usage dans l'industrie. Nous irons du plus simple au plus compliqué et

sans oublier que beaucoup de méthodes ne se trouvant pas dans ce chapitre peuvent parfois

être trouvées dans d'autres sections du site!

PARTIE ENTIÈRE

Le plus grand entier inférieur ou égal à un nombre réel x est par [x], qui se lit "partie entière

de x".

Ainsi, le nombre M est entier si et seulement si [M]=M. De même, le naturel A est divisible dans

l'ensemble des naturels par le naturel B si et seulement si:

(57.10)

Nous notons aussi {x} pour désigner la partie fraction de x; on a ainsi:

(57.11)

Soit . Alors nous avons les propriétés suivantes :

P1. , , où

P2. , lorsque

P3. , si

P4.

P5. si , si

P6. si

P7. Si , alors [x / a] représente le nombre d'entiers positifs inférieurs ou égaux à x qui

sont divisibles para.

Démonstrations:

La première partie de P1 est simplement la définition de [x] sous forme algébrique. Les deux

autres parties sont des réarrangements de la première partie. Dans ce cas, nous pouvons écrire

(57.12)

où .

Pour P2, la somme est vide pour et, dans ce cas, on adopte la convention selon laquelle la

somme vaut 0. Alors, pour , la somme compte le nombre d'entiers positifs n qui sont plus

petits ou égaux à x. Ce nombre est évidemment [x].

La démonstration de P3 sera supposée évidente.

Pour prouver P4, nous écrivons :

, (57.13)

où n et m sont des entiers et où et . Alors:

(57.14)

En écrivant , où , nous avons

(57.15)

où .

Il s'ensuit que:

0 si -1 si (57.16)

et on obtient la démonstration P5.

Pour démontrer P6, nous écrivons :

(57.17)

où , et :

(57.18)

où . Nous obtenons ainsi:

(57.19)

puisque . Par ailleurs:

(57.20)

et nous avons ainsi le résultat.

Pour la dernière partie, nous observons que, si sont tous les entiers

positifs qui sont divisibles par a, il suffit de prouver que . Puisque ,

alors:

(57.21)

c'est-à-dire :

(57.22)

soit le résultat attendu.

C.Q.F.D.

Remarque: La méthode d'arrondi de valeurs réelles est donnée dans le chapitre d'Économétrie.

ALGORITHME D'HÉRON

Soit à calculer la racine carrée:

(57.23)

Il existe un algorithme dit "algorithme d'Héron" qui permet de calculer la valeur de cette racine

carrée.

Démonstration:

(57.24)

Nous obtenons alors la relation:

(57.25)

C.Q.F.D.

Exemple:

Soit à calculer :

(57.26)

Nous prenons :

Itération xi /2 A/2xi xi+1 Ecart

1 5 0.5 5.50 ~2.3

2 2.750 0.90 3.659 090 909 ~0.49

3 1.82954 1.3664 3.196 005 083 ~0.033

4 1.59800 1.5644 3.162 455 624 ~0.0002

5 1.58122 1.5810 3.162 277 665 ~0.5 10-8

Tableau: 57.2 - Itérations pour l'algorithme d'Héron

Dans le cas de la racine cubique, la démonstration est semblable et nous obtenons:

(57.27)

Signalons encore que le lecteur pourra trouver dans le chapitre de Théorie des Nombres la

méthode utilisée pendant l'antiquité (du moins une analogie) et utilisant les fractions continues.

ALGORITHME D'ARCHIMÈDE

Le calcul de la constante universelle "pi" notée est très certainement le plus grand intérêt de

l'algorithmique puisque l'on retrouve cette constante un peu partout en physique et

mathématique (nous pouvons vous conseiller un très bon ouvrage sur le sujet).

Nous rappelons que nous n'en avons pas donné la valeur ni en géométrie, ni dans les autres

sections de ce site jusqu'à maintenant. Nous allons donc nous attacher à cette tâche.

Nous définissons définit en géométrie le nombre dit "pi", quelque soit le système métrique

utilisé (ce qui fait son universalité), comme le rapport de la moitié du périmètre d'un cercle par

son rayon tel que:

(57.28)

Nous devons le premier algorithme du calcul de cette constante à Archimède (287-212 av. J.-

C.) dont voici la démonstration.

Démonstration:

Soit un n-polygone inscrit dans un cercle:

(57.29)

Le principe de l'algorithme d'Archimède est le suivant: Soit le périmètre d'un polygone

régulier de n côtés inscrit dans un cercle de rayon 1/2. Archimède arrive par induction que:

(57.30)

Nous avons pour périmètre d'un n-polygone:

et (57.31)

Avec :

(57.32)

Donc:

(57.33)

Il suffit d'un ordinateur ensuite et de plusieurs itérations pour évaluer avec une bonne précision

la valeur de . Evidemment, on utilise l'algorithme d'Héron pour calculer la racine...

commentaires (0)
Aucun commentaire n'a été pas fait
Écrire ton premier commentaire
Ceci c'est un aperçu avant impression
Chercher dans l'extrait du document
Docsity n'est pas optimisée pour le navigateur que vous utilisez. Passez à Google Chrome, Firefox, Internet Explorer ou Safari 9+! Téléchargez Google Chrome