Python scientifique : application aux éléments finis



Documents pareils
Cours 7 : Utilisation de modules sous python

Python - introduction à la programmation et calcul scientifique

L informatique en BCPST

Calcul Scientifique avec 3

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

Initiation à la programmation en Python

Introduction à MATLAB R

Présentation du langage et premières fonctions

Licence Sciences et Technologies Examen janvier 2010

TP 1. Prise en main du langage Python

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Rappels sur les suites - Algorithme

Représentation d un entier en base b

Algorithme. Table des matières

Date M.P Libellé Catégorie S.Catégorie Crédit Débit Solde S.B

Atelier Le gestionnaire de fichier

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

STAGE IREM 0- Premiers pas en Python

Tutoriel Création d une source Cydia et compilation des packages sous Linux

Chap III : Les tableaux

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Installation Client (licence réseau) de IBM SPSS Modeler 14.2

TUTORIAL 1 ETUDE D UN MODELE SIMPLIFIE DE PORTIQUE PLAN ARTICULE

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Optimisation, traitement d image et éclipse de Soleil

Définitions. Numéro à préciser. (Durée : )

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Studio. HERITIER Emmanuelle PERSYN Elodie. SCHMUTZ Amandine SCHWEITZER Guillaume

Présentation du logiciel

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Fonctions de plusieurs variables

Introduction à l informatique en BCPST

Aide - mémoire gnuplot 4.0

CREG : versailles.fr/spip.php?article803

Les nouveautés de Femap 11.1

Calcul Formel et Numérique, Partie I

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

EXCEL TUTORIEL 2012/2013

Correction de l examen de la première session

COURS WINDEV NUMERO 3

Séance 0 : Linux + Octave : le compromis idéal

avec des nombres entiers

Créer le schéma relationnel d une base de données ACCESS

Cours Informatique Master STEP

ANALYSE STATIQUE D UNE POUTRE SOUMISE A UNE CHARGE VARIABLE

Analyse statique d une pièce

1 Recherche en table par balayage

F7n COUP DE BOURSE, NOMBRE DÉRIVÉ

TAGREROUT Seyf Allah TMRIM

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Cours d initiation à la programmation en C++ Johann Cuenin

WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/ bits, Windows 2008 R2 et Windows bits

Module 16 : Les fonctions de recherche et de référence

Utilisation d objets : String et ArrayList

Projet Matlab/Octave : segmentation d'un ballon de couleur dans une image couleur et insertion d'un logo

TP1. Outils Java Eléments de correction

3 Approximation de solutions d équations

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Cours d Analyse. Fonctions de plusieurs variables

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Initiation à LabView : Les exemples d applications :

Compter à Babylone. L écriture des nombres

Maple: premiers calculs et premières applications

Chapitre 1 Qu est-ce qu une expression régulière?

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Excel 2007 Niveau 3 Page 1


Initiation à l algorithmique

Initiation à Excel. Frédéric Gava (MCF)

Première étape : créer le fichier de données - extraire les données de PMB et les transférer dans Excel

VOS PREMIERS PAS AVEC TRACENPOCHE

Algorithmique avec Algobox

GUIDE Excel (version débutante) Version 2013

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

C f tracée ci- contre est la représentation graphique d une

Yves Debard. Université du Mans Master Modélisation Numérique et Réalité Virtuelle.

CHAPITRE 10. Jacobien, changement de coordonnées.

Découverte du tableur CellSheet

Note de cours. Introduction à Excel 2007

SSNL126 - Flambement élastoplastique d'une poutre droite. Deux modélisations permettent de tester le critère de flambement en élastoplasticité :

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

IV- Comment fonctionne un ordinateur?

Un serveur web, difficile?

Continuité et dérivabilité d une fonction

Débuter avec Excel. Excel

Projet Matlab : un logiciel de cryptage

MO-Call pour les Ordinateurs. Guide de l utilisateur

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Conversion d un entier. Méthode par soustraction

Bien lire l énoncé 2 fois avant de continuer - Méthodes et/ou Explications Réponses. Antécédents d un nombre par une fonction

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

1 Description générale de VISFIELD

Transcription:

Sciences-industrielles.com Cours, exercices et corrections en SI http://sciences-industrielles.com Python scientifique : application aux éléments finis Utilisation de logiciels Master 1 Steven Masfaraud 26 décembre 2013

Table des matières 1 Installation de Python 3 1.1 Généralités sur Python................................... 3 1.2 Sous Linux......................................... 3 1.3 Sous Windows....................................... 3 2 Premiers pas sur Python, utilisation de Spyder 3 3 Résolution élément fini pour une poutre en traction 5 3.1 Problème, résolution élément finis............................. 5 3.1.1 Formulation du problème............................. 5 3.1.2 Rappels sur la résolution élément finis...................... 5 4 Implémentation en Python 7 4.1 Chargement des paquets.................................. 7 4.2 Mise en données...................................... 8 4.3 Maillage........................................... 8 4.3.1 Table de coordonnées............................... 10 4.3.2 Table de connectivité................................ 11 4.4 Assemblage......................................... 11 4.5 Prise en compte des conditions limites.......................... 13 4.6 Vérification de la construction des matrices et vecteurs................. 14 4.7 Résolution de système linéaire............................... 15 4.8 Post-traitement....................................... 15 http://sciences-industrielles.com 2/18

1 Installation de Python 1.1 Généralités sur Python Python est un langage open-source multi-plateformes. Son intérêt réside notemment dans les nombreuses bibliothèques qu il propose. Dans le domaine du calcul scientifique nous montrerons qu il remplace avantageusement matlab. Nous utiliserons Spyder,un éditeur de texte libre lui aussi, qui nous permettra d avoir une interface interractive qui ne dépaysera pas les habitués de Matlab. Il existe bien sur d autres éditeurs de texte vous pouvez utiliser si vous préférez. Les installations proposées après installent Python, numpy et scipy. Si vous voulez utiliser un autre éditeur, assurez vous d avoir ces paquets installés. 1.2 Sous Linux Pour les utilisateurs de Debian ou d Ubuntu, cette ligne de commande suffit à installer. Connectez vous en superutilisateur pour l executer. # aptitude install spyder Pour utilisateurs d autres distributions linux, se référer à votre gestionnaire de paquets qui doit proposer Spyder. 1.3 Sous Windows Pour installer Spyder, Python et les bibliothèques que nous allons utiliser, le plus simple et d installer une distribution scientifique qui comporte tous cela. Je vous propose winpython : http://sourceforge.net/projects/winpython/files/winpython_2.7/2.7.6.0/ Sur la page de téléchargements, choisir votre fichier d installation en fonction de l architecture de votre ordinateur. En général la version 64 bits convient. La procédure d installation est classique. 2 Premiers pas sur Python, utilisation de Spyder Spyder est un environnement de développement sous Python qui permet sur une même fenêtre d éditer un fichier Python et de l executer. Deux sous fenêtres sont donc absolument indispensables : l éditeur et la console. http://sciences-industrielles.com 3/18

Je vous conseille de maximiser en largeur la taille de l éditeur car c est cette fenetre dans laquelle vous passerez le plus de temps, et ensuite de maximiser la taille de la console notamment en hauteur. Les autres fenetres ne sont pas indispensables, vous pouvez les fermer pour l instant pour économiser de la place pour l éditeur et la console. L interêt de Spyder et d éditer un fichier, puis en appuyant sur F5 il est executé dans la console. On peut alors voir le résultat de nos modifications en direct. Créez un nouveau fichier. Enregistrez le où vous voulez. Spyder vous à généré un code minimaliste qui ressemble à celui-ci : 1 # coding : utf 8 2 """ 3 Created on Tue Dec 24 17:07:37 2013 4 5 @author : steven 6 """ La première ligne précise l encodage. Cela permet notamment d afficher les caractéres spéciaux proprement. Dans mon cas, sous linux c est de l utf8. Les lignes suivantes, entourées de """ sont une description de votre code, vous pouvez renseigner le but de votre script, l auteur, etc... Ajoutez la ligne suivante à la fin de votre fichier : 1 print "Ca marche! " Appuyez ensuite sur F5. Si une boîte de dialogue s ouvre pour vous demander les options d execution, cochez "Executer dans l interpréteur Python" actif puis validez. http://sciences-industrielles.com 4/18

Vous devriez voir dans la console le message "Ca marche!" être affiché. Vous avez exécuté votre premier script Python! 3 Résolution élément fini pour une poutre en traction 3.1 Problème, résolution élément finis On s intéresse au comportement d une poutre console (encastrée à une extrémitée) en traction de longueur L, de section S, de module de Young E soumise à une force F en bout de poutre et à une force linéique sur l ensemble de la poutre de valeur f. 3.1.1 Formulation du problème L F f La théorie de la résistance des matériaux nous fournit les deux équations suivantes : dn dx avec : N l effort normal dans la poutre u le déplacement longitudinal dû à la traction. En combinant ces deux équations on obtient : = f (1) E S du dx = N (2) E S d2 u = f (4) dx2 Cette équation différentiell peut être facilement résolue analytiquement (à la main). Dans le cadre général des problèmes d élasticité 2D ou 3D se n est pas possible. D oû la méthode d approximation que sont les éléments finis. 3.1.2 Rappels sur la résolution élément finis En multipliant l équation 4 par un champ test v et en l intégrant sur la longeur de la poutre, on obtient : L En intégrant par partie on obtient : 0 E S d2 u dx 2 v = L 0 (3) f v (5) http://sciences-industrielles.com 5/18

[E S du dx v]l 0 L 0 E S du dx dv dx = On impose à v d être nul en L et 0, c est à dire sur les bords du domaine. D où : L 0 E S du dx dv dx = C est alors que l on injecte l approximation élément fini : ϕ 1 nn ϕ 2 ( ) u = ϕ i u i u =. u1 u 2... u nn. i=1 ϕ nn L 0 L 0 f v (6) f v (7) avec nn le nombre de noeuds. On choisit pour v : ϕ 1 nn ϕ 2 v = ϕ i v =.. i=1 ϕ nn 1 ϕ i 1 ϕ i ϕ i+1 noeud i-1 noeud i noeud i+1 Ce qui conduit à : L 0 ES dϕ 1 dx dϕ 2 dx. dϕ nn dx ( dϕ 1 dx dϕ 2 dx. dϕ nn dx } {{ } K ) u 1 u 2. u nn = L 0 ϕ 1 ϕ 2 f. ϕ nn } {{ } F On peut montrer que la construction de ces opérateurs peut se décomposer en l addition de contribution des élément à la rigidité du système et au vecteur force. On a donc affaire à la résolution d un système matriciel : Voilà pour la théorie, voyons comment coder cela en pratique! (8) Ku = F (9) http://sciences-industrielles.com 6/18

4 Implémentation en Python Dans la suite, nous écrirons notre programme dans un fichier Python. Pour cela, ouvrez un nouveau fichier et enregistrez le où vous le souhaitez. 4.1 Chargement des paquets Comme nous l avons vu, Python fonctionne avec des bibliothèques d outils regroupés en paquets (packages). Le langage en lui meme définit des éléments de base comme les boucles, les conditions, la gestion des variables et certaines structures de données comme les listes. Pour résoudre un problème élément fini, nous aurons besoin de manipuler des vecteurs et des matrices, et de tracer des graphiques pour visualiser les résultats. Pour cela nous utiliserons des paquets qui sont fournis avec les distributions qui ont été présentées précédemment. Nous allons utiliser : numpy : un paquet définissant les matrices et vecteurs et permettant de les manipuler linalg, sous-paquet de numpy pyplot, sous-paquet de matplotlib, comme son nom l indique une bibliothèque de tracé pour les maths. Certains paquets peuvent en contenir d autres, ce qui permet dans le cas de paquets volumineux de ne pas charger trop de fonctions dont on ne va pas se servir. Pour importer un paquet on utilise le mot-clé import. Pour importer la paquet numpy on doit écrire : 1 import numpy Tout simplement. Nous pouvons alors utiliser les outils de numpy par exemple la fonction identity en tapant : 1 numpy. identity (3) Ecrivez ces lignes à la fin de votre script et executez le. La console vous affiche le résultat : array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) La fonction numpy.identity crée une matrice identitée (1 sur la diagonale, zéros ailleurs) de la taille passée en paramètre. Pour appeller la fonction identity inclue dans le paquet numpy il faut taper numpy.identity Comme nous risquons d appeler plusieurs fonctions de ce paquet, il faudra à chaque fois les préfixer par "numpy.". Pour ne pas avoir à faire cela, une solution consiste à modifier l import du paquet en tapant : 1 from numpy impo r t http://sciences-industrielles.com 7/18

On peut alors taper directement identity(3). Mais cette méthode pose un problème pour les grands projets où sont utilisés beaucoup de paquets. Deux paquets peuvent avoir chacun une fonction avec le meme nom pour des utilisations radicalement différentes. On est alors plus trop sûr de quelle fonction va etre appellée. Une solution à mi-chemin est d importer le paquet sous un nom raccourci : 1 import numpy as np Il faut alors taper np.identity(3). Cette solution garde l avantage de savoir quel paquet on utilise sans pour autant alourdir trop le code. Nous garderons cette écriture pour la suite du projet. Les autres paquets à inclure sont des sous-paquets. Pour cela : 1 from numpy import l i n a l g as lg 2 from matplotlib import pyplot as plt Pour résumer, voici à quoi doit ressembler votre script. Remarquez la ligne de commentaire, précédée d un # pour commenter le code et le rendre plus sympa. 1 # coding : utf 8 2 """ 3 @author : steven 4 """ 5 6 # Import des packages 7 import numpy as np 8 from numpy import l i n a l g as lg 9 from matplotlib import pyplot as plt 4.2 Mise en données L étape précédente était purement informatique, nous nous attaquons maintenant à la mise en données du problème avant sa résolution. Dans chacune des étapes de la résolution, nous aurons besoin de connaitre certaines grandeurs comme les paramètres matériau ou les dimensions de la poutre ou encore des paramètres de discrétisation. 1 # Parametres 2 E=200e9 #Module de young 3 S=0.01 # Section de la poutre 4 L=1 # Longueur de la poutre 5 Fp=1000 # Intensite de la force ponctuelle en Newtons 6 ne=5 # Nombre d elements 7 f l =500 # Intensite de la force lineique en Newtons/metre 4.3 Maillage Un mailleur est un logiciel qui pour une géométrie en entrée crée un maillage et génère une table de connectivité et une table de coordonnées du maillage. L étape du maillage consiste donc à http://sciences-industrielles.com 8/18

Python scientifique : application aux éléments finis Master 1 générer ces deux tables. La table de coordonnées permet de connaitre les coordonnées du noeud i du maillage. coor = Noeud 1 x 1 y 1 z 1 Noeud 2 x 2 y 2 z 2.... Noeud i x i y i z i.... Noeud n x n y n z n La table de connectivité permet, pour un élément i, de savoir comment sont appelés dans le système global chacun de ces noeuds 16 3 12 5 Element i 28 connec = Element 1 1 2 3 Element 2 24 12 3.... Element i 28 6 12........ Element n 56 58 123 6 Ces deux tables suffisent à définir complètement le maillage. Dans notre cas, nous choisissons de numéroter comme suit : Elements Noeuds 1 2 3 4 5 1 2 3 4 5 6 Pour n e nombre d éléments, il y a donc n e +1 nombre de noeuds. La suite cherche donc à générer de manière automatique ces tables pour notre problème. http://sciences-industrielles.com 9/18

4.3.1 Table de coordonnées Dans notre cas, le problème est à une dimension. Une coordonnée d un noeud est donc uniquement sa distance algébrique à l origine. dans le cas où ne=5 et L=1, la table de coordonnées est : 0.0 0.2 coor = 0.4 0.6 0.8 1.0 La table est de taille (ne+1,1). Le plus simple est de partir d une table de la bonne dimension remplie de 0 puis de la remplir case par case. Pour l initialiser, on utilise la fonction np.zeros qui remplit exactement ce but. Pour lui indiquer la taille de la matrice à créer : 1 # Maillage 2 # Generation de la table coor 3 coor=np. zeros (( ne+1,1)) # I n i t i a l i s a t i o n Pour ceux qui ont l habitude de matlab, la différence est qu il faut rajouter une paire de parenthèse. En effet, np.zeros ne prend qu un seul paramètre. Il faut maintenant peupler le vecteur qui pour l instant est vide. Pour s en convaincre, exécuter le script puis taper dans la console : 1 print coor Le plus simple pour remplir le vecteur est de parcourir les noeuds, et de remplir leur coordonnée dans le vecteur. Il faut donc parcourir ne+1 éléments, il est tout indiqué d utiliser une boucle for qui aura ne+1 itérations, une pour chaque noeud. On cherche à faire prendre à une variable i les valeurs 1,2,3,...,ne+1. Nous irons insérer dans la i-ème case du vecteur la valeur i 1 ne L Pour générer une liste de valeur, on utilise la fonction range. Dans le terminal taper : 1 range (ne+1) Python répond : [0, 1, 2, 3, 4, 5] Or dans notre programme ne vaut 5 et nous voulions avoir la réponse : [1, 2, 3, 4, 5, 6] En fait, Python à le mauvais goût, comme le C++ et d autres langages, de compter à partir de 0, question de conventions. De la même manière,pour accéder à la i-ème valeur du vecteur on appellera donc coor[i,0], 0 signifiant la première colonne. La syntaxe de la boucle for en Python est la suivante : 1 for variable in p o s s i b i l i t e s : 2 action 1 3 action 2 http://sciences-industrielles.com 10/18

4... 5 action n 6 action en dehors de la boucle Notez bien les deux points " :" après avoir déclaré la condition de parcours des valeurs. Pour délimiter les actions qui vont être exécutés à chaque itération, il est obligatoire d indenter (décaler vers la droite) le code. Pour cela il suffit d appuyer sur la touche [TAB]. Nous voulions insérer dans la i-ème case la valeur i 1 ne L, si i allait de 1 à ne+1. Or pour Python, i va de 0 à ne. Il faut alors insérer la valeur i nel dans le vecteur (on a décalé de +1) La boucle for qui fait prendre à une variable i ces valeurs s écrit : 1 for i in range ( ne+1) : 2 coor [ i,0]=( f l o a t ( i ) /(ne) ) L Pour calculer la valeur à insérer dans la i-ème case,on doit se servir de la valeur de i qui est un entier pour le diviser. Le problème est que pour Python, la division d un entier donne un entier (division euclidienne). Pour le forcer à considérer i comme un réel, on lui convertit explicitement i en réel en appellant float(i). 4.3.2 Table de connectivité La table de connectivité se génère en parcourant les éléments cette fois et en listant le numéro des noeuds de l élément dans le système global. 1 # Generation de la table connec 2 connec=np. zeros (( ne,2) ) 3 for i in range ( ne) : 4 connec [ i,0]= i+1 5 connec [ i,1]= i+2 4.4 Assemblage Cette étape consiste à créer la matrice de rigidité et le vecteur force. Comme précedemment, on les initialise de la bonne taille à zéro puis on vient les remplir par les contributions de chaque élément. 1 K=np. zeros (( ne+1,ne+1)) 2 F=np. zeros (( ne+1,1)) On itère ensuite sur chaque élément grâce à une boucle for. On génère pour chaque élément sa matrice de rigidité élémentaire, dans notre cas de taille (2,2). lors de l assemblage, on "éclate" la matrice élémentaire entre n 1 et n 2, qui sont les numéros des noeuds de l élément dans le système http://sciences-industrielles.com 11/18

global, information que l on trouve dans la table de connectivité. ( ) Ke11 Ke Ke = 12 Ke 21 Ke 22 = ES L ( ) 1 1 1 1 K = K+ n 1 n 2 Ke 11 Ke 12 n 1 Ke 21 Ke 22 n 2 La première chose à faire dans la boucle est de récupérer ces nombres n1 et n2 dans la table de connectivité, qui sont rangés à la ligne i. 1 # Assemblage 2 K=np. zeros (( ne+1,ne+1)) 3 F=np. zeros (( ne+1,1)) 4 for i in range ( ne) : 5 n1=connec [ i, 0 ] 6 n2=connec [ i, 1 ] On calcule ensuite la matrice de rigidité. Le seul paramètre qui change d une matrice à l autre est la longueur l de l élément. Il faut la calculer, en allant chercher pour cela les coordonnées des noeuds de l élément. Comme Python compte à partir de 0, on décale nos valeurs de 1. Par exemple, au lieu d assigner K[n1,n1] comme on le ferait sous matlab, on est obligés d écrire K[n1 1,n1 1]. Pour l assemblage de la force ponctuelle, chaque noeud reçoit la moitié de la force totale subie par la force surfacique. 1 # Assemblage 2 K=np. zeros (( ne+1,ne+1)) 3 F=np. zeros (( ne+1,1)) 4 for i in range ( ne) : 5 n1=connec [ i, 0 ] 6 n2=connec [ i, 1 ] 7 l=abs ( coor [ n1 1,0] coor [ n2 1,0]) 8 Ke=E S/ l np. array ([[1, 1],[ 1,1]]) 9 K[ n1 1,n1 1]+=Ke[0, 0 ] 10 K[ n2 1,n1 1]+=Ke[1, 0 ] 11 K[ n1 1,n2 1]+=Ke[0, 1 ] 12 K[ n2 1,n2 1]+=Ke[1, 1 ] 13 F[ n1 1]+=0.5 f l 14 F[ n2 1]+=0.5 f l Remarquez que la syntaxe de Python pour incrémenter une variable selon le schéma a = a+b s écrit a+ = b, ce qui permet une ecriture plus compacte. Il ne faut pas oublier d aditionner la contribution de la force ponctuelle, qui s ajoute au dernier noeud. http://sciences-industrielles.com 12/18

1 # Ajout de la force pontcuelle 2 F[ ne]+=fp 4.5 Prise en compte des conditions limites Il faut maintenant imposer le déplacement à certains noeuds. On sépare, quitte à réorganiser la matrice de rigidité les déplacements connus u c et inconnus u i. Le problème s écrit alors : ( )( ) ( ) Kii K ic ui Fi = K ci K cc u c F c Si on ne garde que la première ligne du système : D où : K ii u i +K ic u c = F i u i = K 1 ii (F i K ic u c ) Dans notre exemple, u c est réduit à un seul élément, u 1, déplacement du premier noeud et égal à 0. Dans ce cas particulier, l expression devient : u i = K 1 ii (F i ) Pour obtenir K ii, il faut supprimer la première ligne et première colonne de K et pour F i, supprimer le premier élément de F. Ceci s écrit grâce à la fonction np.delete. Elle prend respectivement comme paramètre : la matrice ou le vecteur à partir duquel la fonction va travailler la place de l élément à supprimer. Ici les premières lignes ou colonnes donc 1, donc 0 en convention Python 0 si c est une ligne à supprimer, 1 si c est une colonne Il est important de remarquer que la fonction ne modifie pas la matrice ou le vecteur passé en paramètre. Elle le copie, effectue les opération demandées et renvoie le résultat. C est pour cela qu il faut assigner ce résultat : 1 # Prise en compte des CL 2 Kii=np. delete (K,0,0) 3 Kii=np. delete ( Kii,0,1) 4 Fi=np. delete (F,0,0) Cette série d instruction réalise : copier K et supprimer dans cette copie la première ligne. Assigner le résultat dans une nouvelle variable K ii. Il faut remarquer que K n a donc pas été modifié! copier K ii, supprimer dans cette copie la première colonne. Assigner le résultat dans K ii pour le mettre à jour copier F, supprimer dans cette copie la. Assigner le résultat dans F i pour le mettre à jour http://sciences-industrielles.com 13/18

4.6 Vérification de la construction des matrices et vecteurs Nous avons effectué des opérations relativement complexes sur des matrices et vecteurs, et on peut rapidement se tromper surtout quand on débute dans un nouveau langage. Pour vérifier les opérations effectuées, on peut vouloir afficher une matrice ou un vecteur par exemple K ii. La manière simple est de taper dans la console ou d écrire à la fin du script : 1 print Kii La réponse en console est du genre : [[ 2.00000000e+10-1.00000000e+10 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ -1.00000000e+10 2.00000000e+10-1.00000000e+10 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00-1.00000000e+10 2.00000000e+10-1.00000000e+10 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00-1.00000000e+10 2.00000000e+10-1.00000000e+10] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00-1.00000000e+10 1.00000000e+10]] Ce qui n est pas très visuel. Si vous changez en haut du script ne=20 par exemple, le résulat sera une bouillie de nombres... C est pourquoi je vous propose de taper ces lignes après les opérations sur Kii notamment : 1 plt. figure () 2 plt. pcolor ( Kii ) 3 plt. gca (). invert_yaxis () 4 plt. colorbar () Vous avez alors une visualisation de la matrice, les nombres étant transformés en couleurs. http://sciences-industrielles.com 14/18

4.7 Résolution de système linéaire Finalement, la résolution du système linéaire tient en une seule ligne : 1 ui=lg. solve ( Kii, Fi ) 4.8 Post-traitement Nous avons obtenu les u i par calcul. Il faut maintenant réintégrer les u c pour former u : 1 u=np. i n s e r t ( ui,0,0) 2 plt. plot ( coor, u) L instruction plot permet de tracer la courbe, en prenant le premier vecteur comme valeurs sur x, le deuxième sur y. http://sciences-industrielles.com 15/18

Nous obtenons alors le déplacement on fonction de la coordonnée des noeuds. Maintenant que l on a un code élément finis qui donne des résultats qui semblent cohérents, on cherche à comparer le déplacement obtenu avec le déplacement analytique. En effet, en programmation, il est obligatoire de vérifier le bon fonctionnement du code en essayant sur un cas test dont on connait à l avance le résultat. L équation 1 permet la résolution de l effort normal : Or en bout de poutre, N(L) = F, d où N(x) = fx+c 1 N(x) = F(l x) La relation de comportement (eq. 2) nous donne le déplacement : Or u(0)=0, d où : u(x) = 1 f(l x)2 (Fx +c 2 ) ES 2 u(x) = 1 ES (Fx+fLx fx2 2 ) http://sciences-industrielles.com 16/18

Nous voulons donc tracer sur un même graphique le déplacement élément fini et le déplacement analytique. Nous n allons pas tracer cette fonction de manière exacte, nous allons l évaluer en un certain nombre de points. Pour cela on se donne pour x un nombre fini de valeurs grâce à la fonction linspace, qui retourne un vecteur de valeurs régulièrement espacées en donnant la valeur de début, de fin et le nombre de valeurs. 1 x=np. linspace (0,L,num=100) Nous pouvons alors écrire la formule de uth en utilisant le x ainsi défini. On le trace en superposition avec la solution élément fini avec une légende pour distinguer les deux courbes avec le code suivant : 1 uth=1/(e S) ((Fp+f l L) x f l np. square (x) /2) 2 3 plt. figure () 4 plt. plot ( coor, u, x, uth ) 5 legend (( Deplacement EF, Deplacement analytique ), loc =2) Il n est pas possible de mettre tous les éléments d un vecteur au carré en tappant xˆ2 comme cela se fait pour les réels. On utilise alors la fonction np.square Les deux courbes se superposent, on valide ainsi le calcul élément fini. On peut remarquer que le résultat est exact à l endroit ou sont positionnés les noeuds. Entre ceux-ci, on a postulé avec l approximation élément fini que le déplacement était linéaire, or la résolution analytique nous montre qu elle est quadratique. On ne peut donc pas représenter convenablement entre les noeuds la solution. http://sciences-industrielles.com 17/18

Le code ainsi créé est une suite d instructions simples qui travaillent directement sur les variables pour arriver au résultat. Cette technique de programmation est intuitive mais devient rapidement complexe lorsque l on veut empiler les fonctionnalités. Nous pourrions par exemple vouloir que l utilisateur puisse définir de manière plus complexe le chargement ou les conditions aux limites. Nous présenterons dans un autre cours une manière différente d envisager la manière de coder pour permettre d avoir un code bien plus maintenable et modulaire. http://sciences-industrielles.com 18/18