diff --git a/TP-FEMM/src/aimant.md b/TP-FEMM/src/aimant.md
index df5658865c51f08267312252d72fa55b84427f21..ef04c1ea6c660369fcb9370b6adaeaa0558cb2a1 100644
--- a/TP-FEMM/src/aimant.md
+++ b/TP-FEMM/src/aimant.md
@@ -15,6 +15,7 @@ On prendra des dimensions similaires à celles de l'intérieur de la bobine pré
 ### Méthode « classique »
 
 Le début du programme sera donc identique au précédent. Dans un fichier `aimant.m`, on rentre :
+* *MATLAB :*
 ```Matlab
 % Fichier aimant.m simulant l'aimant du second tuto avec FEMM
 close all 
@@ -42,6 +43,33 @@ mi_addsegment(0,b/2,0,Rdom);
 mi_addarc(0,-Rdom,0,Rdom,180,5); 
 mi_zoomnatural;
 ```
+* *Python :*
+```Python
+# Fichier aimant.py simulant l'aimant du second tuto avec FEMM
+import numpy as np
+import femm
+
+
+# Donnes probleme
+R = 10 # mm
+b = 20 # mm
+Rdom = 10*np.sqrt(R**2+(b/2)**2) # on prend un domaine tres large
+
+femm.openfemm()
+femm.newdocument(0)  # nouveau pbm magnetique
+femm.mi_probdef(0,'millimeters','axi') # frequence = 0, en mm, axisymetrique
+
+# Geometrie
+femm.mi_drawrectangle(0,b/2,R,-b/2)   # aimant
+# domaine :
+femm.mi_addnode(0,-Rdom)
+femm.mi_addnode(0,Rdom)
+femm.mi_addsegment(0,-Rdom,0,-b/2)
+femm.mi_addsegment(0,b/2,0,Rdom)
+femm.mi_addarc(0,-Rdom,0,Rdom,180,5) 
+femm.mi_zoomnatural()
+```
+
 
 Dans un premier temps, nous choisissons un domaine très large : 10 fois la diagonale du bloc "aimant", pour être certain de ne pas dénaturer le problème. 
 
@@ -56,6 +84,7 @@ La courbe \\(B(H)\\) d'un aimant peut se représenter de la façon suivante :
 FEMM utilise la droite passant par \\((-H_c, 0)\\) et \\((0,B_r)\\). On voit alors directement que : \\[H_c = \frac{B_r}{\mu_0\\,\mu_r}\\]
 
 Finalement, on peut créer nos matériaux et les affecter aux régions correspondantes. Et on ajoute la condition aux limites de Dirichlet sur le bord :
+* *MATLAB :*
 ```Matlab
 Br = 1.2; % T
 mu0 = 4e-7*pi;
@@ -81,10 +110,37 @@ mi_clearselected;
 
 mi_saveas('aimant.FEM');
 ```
+* *Python :*
+```Python
+Br = 1.2 # T
+mu0 = 4e-7*np.pi
+mur = 1.05
+Hc = Br/(mu0*mur)
+
+femm.mi_addmaterial('Air',1,1) 
+femm.mi_addmaterial('Aimant',mur,mur,Hc) 
+
+femm.mi_addblocklabel(R/2,0)
+femm.mi_selectlabel(R/2,0)
+femm.mi_setblockprop('Aimant',1,0,0,90,2,0)  # automesh, 90° pour aimantion, groupe 2
+femm.mi_clearselected()
+femm.mi_addblocklabel(Rdom/2,0)
+femm.mi_selectlabel(Rdom/2,0)
+femm.mi_setblockprop('Air',1,0,0,0,1,0)  # automesh, groupe 1
+femm.mi_clearselected()
+
+femm.mi_addboundprop('a=0',0,0,0,0)  
+femm.mi_selectarcsegment(Rdom,0) 
+femm.mi_setarcsegmentprop(5,'a=0',0,1) 
+femm.mi_clearselected()
+
+femm.mi_saveas('aimant.FEM')
+```
 
 Nous avons volontairement laissé le choix de discrétisation automatique (*automesh*) pour voir. 
 
 On peut alors résoudre, visualiser les résultats et calculer l'énergie magnétique due à l'aimant :
+* *MATLAB :*
 ```Matlab
 mi_analyze();
 mi_loadsolution;
@@ -93,6 +149,16 @@ mo_groupselectblock();
 Wmag = mo_blockintegral(2);
 mo_clearblock;
 ```
+* *Python :*
+```Python
+femm.mi_analyze()
+femm.mi_loadsolution()
+
+femm.mo_groupselectblock()
+Wmag = femm.mo_blockintegral(2)
+femm.mo_clearblock()
+```
+
 
 **➤ Observez l'inversion de la direction de \\({\bf h}\\) dans l'aimant (avec le tracé de vecteurs) ainsi que l'ordre de grandeur de l'énergie par rapport à celle de la bobine précédente.**
 
@@ -122,6 +188,8 @@ Cependant, pour de gros problèmes basés sur des géométries complexes nécess
 ### Transformation de Kelvin
 
 Reprenons le problème précédent en le modifiant légèrement. Le rayon du domaine Rdom est réduit et nous ajoutons au dessus de celui-ci une petite sphère de rayon Rext. 
+
+* *MATLAB :*
 ```Matlab
 % Fichier aimant_TK.m simulant l'aimant du second tuto avec FEMM 
 % Version avec transfo de Kelvin (region exterieure)
@@ -155,9 +223,43 @@ mi_addsegment(0,Rdom,0,Rdom+2*Rext);
 mi_addarc(0,Rdom,0,Rdom+2*Rext,180,5); 
 mi_zoomnatural;
 ```
+* *Python :*
+```Python
+# Fichier aimant_TK.py simulant l'aimant du second tuto avec FEMM 
+# Version avec transfo de Kelvin (region exterieure)
+
+import numpy as np
+import femm
+
+
+# Donnes probleme
+R = 10 # mm
+b = 20 # mm
+Rdom = 2*np.sqrt(R**2+(b/2)**2) # on prend un domaine reduit
+Rext = Rdom/4                   # rayon region exterieure
+
+femm.openfemm()
+femm.newdocument(0)  # nouveau pbm magnetique
+femm.mi_probdef(0,'millimeters','axi') # frequence = 0, en mm, axisymetrique
+
+# Geometrie
+femm.mi_drawrectangle(0,b/2,R,-b/2)   # aimant
+# domaine :
+femm.mi_addnode(0,-Rdom)
+femm.mi_addnode(0,Rdom)
+femm.mi_addsegment(0,-Rdom,0,-b/2)
+femm.mi_addsegment(0,b/2,0,Rdom)
+femm.mi_addarc(0,-Rdom,0,Rdom,180,5) 
+# region exterireure :
+femm.mi_addnode(0,Rdom+2*Rext)
+femm.mi_addsegment(0,Rdom,0,Rdom+2*Rext)
+femm.mi_addarc(0,Rdom,0,Rdom+2*Rext,180,5) 
+femm.mi_zoomnatural()
+```
 
 Nous créons ensuite nos matériaux comme précédemment, mais en plus nous ajoutons ce que FEMM appelle une « région extérieure » associée à notre problème et que nous lions à notre petite sphère (définie comme de l'air environnant). 
 
+* *MATLAB :*
 ```Matlab
 Br = 1.2; % T
 mu0 = 4e-7*pi;
@@ -183,9 +285,37 @@ mi_setblockprop('Air',1,0,0,0,1,0);  % automesh, groupe 1
 mi_attachouterspace;                 % dans region exterieure
 mi_clearselected;
 ```
+* *Python :*
+```Python
+Br = 1.2 # T
+mu0 = 4e-7*np.pi
+mur = 1.05
+Hc = Br/(mu0*mur)
+
+femm.mi_addmaterial('Air',1,1) 
+femm.mi_addmaterial('Aimant',mur,mur,Hc) 
+femm.mi_defineouterspace(Rdom+Rext/2,Rext,Rdom)     # region exterieure 
+
+femm.mi_addblocklabel(R/2,0)
+femm.mi_selectlabel(R/2,0)
+femm.mi_setblockprop('Aimant',1,0,0,90,2,0)  # automesh, 90° pour aimantion, groupe 2
+femm.mi_clearselected()
+femm.mi_addblocklabel(Rdom/2,0)
+femm.mi_selectlabel(Rdom/2,0)
+femm.mi_setblockprop('Air',1,0,0,0,1,0)  # automesh, groupe 1
+femm.mi_clearselected()
+
+femm.mi_addblocklabel(Rext,Rdom+Rext)
+femm.mi_selectlabel(Rext/2,Rdom+Rext)
+femm.mi_setblockprop('Air',1,0,0,0,1,0)  # automesh, groupe 1
+femm.mi_attachouterspace()               # dans region exterieure
+femm.mi_clearselected()
+```
+
 
 Il ne reste plus qu'à créer une condition de périodicité liant le bord du domaine à celui de la région extérieure. 
 
+* *MATLAB :*
 ```Matlab
 % condition de periodicite :
 mi_addboundprop('Periodique',0,0,0,0,0,0,0,0,4); 
@@ -196,12 +326,26 @@ mi_clearselected;
 
 mi_saveas('aimant.FEM');
 ```
+* *Python :*
+```Python
+# condition de periodicite :
+femm.mi_addboundprop('Periodique',0,0,0,0,0,0,0,0,4) 
+femm.mi_selectarcsegment(Rdom,0)         # bord domaine
+femm.mi_selectarcsegment(Rext,Rdom+Rext) # bord region exterieure
+femm.mi_setarcsegmentprop(5,'Periodique',0,1) 
+femm.mi_clearselected()
+
+femm.mi_saveas('aimant.FEM')
+```
+
+
 
 #### Comment ça marche ?
 
 Dans la région extérieure, la formulation a été modifiée par un changement de variable \\(r \mapsto R\\) tel que \\(\frac{1}{R} \to 0\\) lorsqu'on s'approche du centre de la petite sphère. Ainsi, le centre de la région est équivalent à l'\\(\infty\\). Le lien avec le domaine d'étude est assuré par une condition de périodicité égalisant les valeurs de \\(a_\theta\\) sur leurs frontières respectives. **Pour simplifier : tout se passe comme si on avait « replié » la partie de l'espace située en dehors du domaine d'étude dans la petite sphère du dessus.** 
 
 On peut ensuite résoudre notre problème et calculer l'énergie :
+* *MATLAB :*
 ```Matlab
 mi_analyze();
 mi_loadsolution;
@@ -210,6 +354,16 @@ mo_groupselectblock();
 Wmag = mo_blockintegral(2);
 mo_clearblock;
 ```
+* *Python :*
+```Python
+femm.mi_analyze()
+femm.mi_loadsolution()
+
+femm.mo_groupselectblock()
+Wmag = femm.mo_blockintegral(2)
+femm.mo_clearblock()
+```
+
 
 Calculons l'énergie pour les deux dernières valeurs de Rdom du paragraphe précédent : 
 
@@ -239,6 +393,7 @@ Même si cette technique est moins rigoureuse, mathématiquement parlant, que la
 * une seule instruction : `mi_makeABC();` (les options par défaut sont, la plupart du temps, très bien choisies).
 
 Le script pour résoudre complètement notre problème devient ainsi plus concis :
+* *MATLAB :*
 ```Matlab
 % Fichier aimant_OB.m simulant l'aimant du second tuto avec FEMM 
 % Version avec condition « open boundary »
@@ -289,6 +444,58 @@ Wmag = mo_blockintegral(2);
 mo_clearblock;
 ```
 
+* *Python :*
+```Python
+# Fichier aimant_OB.py simulant l'aimant du second tuto avec FEMM 
+# Version avec condition « open boundary »
+
+import numpy as np
+import femm
+
+
+# Donnes probleme
+R = 10 # mm
+b = 20 # mm
+
+femm.openfemm()
+femm.newdocument(0)  # nouveau pbm magnetique
+femm.mi_probdef(0,'millimeters','axi') # frequence = 0, en mm, axisymetrique
+
+# Geometrie
+femm.mi_drawrectangle(0,b/2,R,-b/2) # aimant
+femm.mi_makeABC()                   # domaine (open boudary)
+femm.mi_zoomnatural()
+
+# Physique
+Br = 1.2 # T
+mu0 = 4e-7*np.pi
+mur = 1.05
+Hc = Br/(mu0*mur)
+
+femm.mi_addmaterial('Air',1,1) 
+femm.mi_addmaterial('Aimant',mur,mur,Hc) 
+
+femm.mi_addblocklabel(R/2,0)
+femm.mi_selectlabel(R/2,0)
+femm.mi_setblockprop('Aimant',1,0,0,90,2,0) 
+femm.mi_clearselected()
+femm.mi_addblocklabel(1.2*R,0)
+femm.mi_selectlabel(1.2*R,0)
+femm.mi_setblockprop('Air',1,0,0,0,1,0) 
+femm.mi_clearselected()
+
+femm.mi_saveas('aimant.FEM')
+
+femm.mi_analyze()
+femm.mi_loadsolution()
+
+femm.mo_groupselectblock()
+Wmag = femm.mo_blockintegral(2)
+femm.mo_clearblock()
+```
+
+
+
 On obtient alors les résultats décrits par la figure et la table ci-dessous :
 
 ![Aimant](./figures/aimant.png "Aimant avec open boundary")
diff --git a/TP-FEMM/src/bonnes_pratiques.md b/TP-FEMM/src/bonnes_pratiques.md
index aa364ea8f30c4e50bf686b3c37df5b5cc5cdf36b..6b96494ec8bbbb3910976d65257349aec3a8bb10 100644
--- a/TP-FEMM/src/bonnes_pratiques.md
+++ b/TP-FEMM/src/bonnes_pratiques.md
@@ -1,7 +1,7 @@
 # Bonnes pratiques avant de partir tête baissée
 
 
-## MATLAB
+## Scripts MATLAB ou Python
 
 1. Pensez à créer dans votre compte un **dossier de travail** (du genre `TP_FEMM`) et différents sous-dossiers pour chaque sujet. Depuis les salles infos, le mieux est d'utiliser un répertoire local dans `C:\Temp\` et de **penser à récupérer ce qu'il contient à la fin de la séance**.   
 
diff --git a/TP-FEMM/src/intro.md b/TP-FEMM/src/intro.md
index 1a5c1729141ab7b97d6d0ab6ff6c8771246d9e05..e9c33a65e27f613bc1a5aad05ee1eea16eef2dc5 100644
--- a/TP-FEMM/src/intro.md
+++ b/TP-FEMM/src/intro.md
@@ -36,9 +36,9 @@ L'objectif des séances de TP est de vous apprendre à définir proprement des p
 
 Les sujets ne sont pas calibrés pour correspondre à une séance particulière. **Il faut voir l'ensemble des 12 heures prévues comme un unique micro-projet** dans lequel seront traités les différents énoncés. 
 
-Les séances se dérouleront en salle informatique à l'ENSEM  où tout ce qui faut est installé par défaut sur les postes de travail (FEMM, MATLAB, Python).
+**Les séances se dérouleront en salle informatique à l'ENSEM  où tout ce qui faut est installé par défaut sur les postes de travail (FEMM, MATLAB, Python, GNU Octave).**
 
-**Si, malheureusement, nous étions obligés d'effectuer les séances en mode « distanciel » via visioconférence : FEMM et MATLAB sont accessibles depuis le portail [Virt'UL](https://virtul.univ-lorraine.fr)**. 
+Si, malheureusement, nous étions obligés d'effectuer les séances en mode « distanciel » via visioconférence : **FEMM et MATLAB sont accessibles depuis le portail [Virt'UL](https://virtul.univ-lorraine.fr)**. 
 
 > **Remarque :** Vous pouvez également installer sur votre PC personnel :
 > * MATLAB avec la license campus de l'UL en suivant les [instructions du WikiDocs](https://wikidocs.univ-lorraine.fr/display/dnsudocoffsoft/La+licence+Matlab+pour+les+Etudiants)