3.1. Introduction au calcul scientifique avec Python#

Marc BUFFAT, dpt mécanique, Université Lyon 1

(**) voir aussi le cours « Scientific Python Lectures » by Robert Johansson

Licence Creative Commons
Mise à disposition selon les termes de la Licence Creative Commons
Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France
.

%matplotlib inline
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
# option de mise en page
from IPython.core.display import HTML,display
/tmp/ipykernel_3679072/3841631963.py:6: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display
  from IPython.core.display import HTML,display

3.1.1. Objectifs#

3.1.1.1. Apprendre:#

  • concept fondamentaux en programmation

  • différentes techniques de base

  • démarche de programmation scientifique

  • syntaxe du langage Python

3.1.1.2. À la fin du cours, vous pourrez:#

  • résoudre des problèmes scientifiques (à l’aide de Python)

  • appliquer la démarche de programmation scientifique avec d’autres langages (matlab, scilab, ..)

3.1.2. Fonctionnement d’un ordinateur#

ordinateur = matériel (CPU, mémoire, disque,..) + logiciel (OS, programmes,..)

3.1.2.1. composants d’un ordinateur#

OS

Système d’exploitation (OS) = gestion d’un ordinateur + environement

Linux/Unix = vue abstraite et générique indépendante du matériel

programmes + données

  • programme = processus

  • données = fichiers (files, devices, streams)

  • gestion des droits: notion d’utilisateur (user), groupes (group), autres (other)

  • super-utilisateur: root

Principes

  • small is beautiful

  • generality is better than specificity

  • communication is important (format ouvert pour les données)

3.1.2.2. programmes / processus#

processus = programme executé sur un ordinateur

  • pid = numéro du processus

  • programme (utilisateur ou commande système)

  • E/S: entrée par défaut (input stream=stdin), sortie par défaut (output stream=stdout)

  • sortie programme = entrée d’un autre programme : pipe ou |

  • pge 1 | pge 2 | pge 3

  • controle des processus: kill pid ou ctrl+C, stop (ctrl+Z) , tache de fond (bg) , ps, top

  • éxecution des commandes à travers une interface

    • un terminal avec un shell (interpérteur de commande): bash (avec auto-complétion)

    • un GUI (gnome, KDE, ..)

  • syntaxe (attention majuscule # minuscule, espace = séparateur d’arguemnts)

    cde [-options] arguments

%%bash
ps -au buffat | head
    PID TTY          TIME CMD
1885002 tty3     00:00:00 bash
3655868 ?        00:00:00 systemd
3655869 ?        00:00:00 (sd-pam)
3655877 ?        00:00:00 pipewire
3655878 ?        00:00:00 pipewire-media-
3655879 ?        00:06:41 pulseaudio
3655882 ?        00:00:00 gnome-keyring-d
3655886 ?        00:00:05 dbus-daemon
3655892 tty2     00:00:00 gdm-x-session

3.1.2.3. Système de fichiers (Unix)#

  • vu arborescente abstraite indépendante du matériel à partir de la racine (root) / ../_images/unixFile.gif

  • notation

    • fichier = nom de fichier + répertoire + droits d’accés

    • / séparateur de répertoire (directory)

    • . répértoire courant

    • .. répértoire parent

    • pwd : affiche répertoire courant

    • lien symbolique

    • fichiers cachés: commence par .

  • principales commandes

    • ls : liste des fichiers

    • mkdir : création répertoire

    • rm : éfface un fichier

    • cd : change de répertoire (directory)

    • help cde : aide

    • cat file : affiche le contenu du fichier

%%bash
ls -al | head
total 1312
drwxrwxr-x 5 buffat buffat   4096 févr. 24 18:08 .
drwxrwxr-x 4 buffat buffat   4096 févr. 10 10:34 ..
lrwxrwxrwx 1 buffat buffat     39 févr. 10 10:34 Algorithme.ipynb -> MGC1061M/04_Algorithme/Algorithme.ipynb
-rw-rw-r-- 1 buffat buffat   1854 févr. 10 10:34 alunissage.py
-rw-rw-r-- 1 buffat buffat   2136 févr. 10 10:34 anim_pendule.py
-rw-rw-r-- 1 buffat buffat  25430 févr. 10 10:34 BaseProgrammation.ipynb
lrwxrwxrwx 1 buffat buffat     39 févr. 10 10:34 BasePython.ipynb -> MGC1061M/02_BasePython/BasePython.ipynb
-rw-rw-r-- 1 buffat buffat  34861 févr. 10 10:34 BasePython.md
-rw-rw-r-- 1 buffat buffat  27355 févr. 10 10:34 BibliothequeScientifique.ipynb

3.1.3. Execution d’un programme#

3.1.3.1. Calcul de la somme d’une série:#

\[ S = x - \frac{x^2}{2} + \frac{x^3}{3} + .. = \sum_{i=1}^n (-1)^{i+1} x^i/i \]

démarche:

  1. algorithme

  2. programmation

  3. execution du code machine sur l’ordinateur

3.1.3.2. Algorithme de base#

Algorithme Serie(x,n)
   somme = 0
   pour i de 1 a n
      somme=somme + (-1)^(i+1)*x^i/i
   retour somme

Ecrire un algorithme plus efficace en notant que:

\[ (-1)^{i+1} \frac{x^i}{i} = - \frac{x}{i} (-1)^{i} x^{i-1} \]

3.1.3.3. Execution sur un ordinateur#

L’ordinateur (le CPU) n’éxécute que des instructions machines codées en binaire.

Problème: comment transformer un algorithme en langage machine ?

3.1.3.4. Langage machine (binaire)#

  • suite d’instruction binaire executer par le processeur: 01010111 (suite 0 ou 1 : bits)

  • représentation en hexadécimal (octet ou bytes):

    • f8 = 248

  • instructions et données sont stockées en mémoire (à une adresse donnée)

    • @000141 instruction f8

  • spécifiques au processeur (intel, ARM, power, AMD, ..)

  • spécifique au système d’exploitation OS

%%bash
od -x -N 100 data/a.out
./data/a.out
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000020 0002 003e 0001 0000 0870 0040 0000 0000
0000040 0040 0000 0000 0000 21b0 0000 0000 0000
0000060 0000 0000 0040 0038 0009 0040 001e 001b
0000100 0006 0000 0005 0000 0040 0000 0000 0000
0000120 0040 0040 0000 0000 0040 0040 0000 0000
0000140 01f8 0000
0000144
Calcul de la serie pour n=20 et x=0.2
Somme de la serie = 0.182322
Log(1+x)=0.182322

3.1.4. Langages de programmation#

  • conversion d’une programme en code machine

  • plusieurs centaine de langages différents

../_images/langage_difficulty.png

-langage le plus complexe: malbolge

3.1.4.1. Langage assembleur#

L’assembleur traduit le code source en code binaire

  • notation des instructions machines (move, push, load, add, mul)

  • programme + assembleur = code machine

%%bash
head -15 data/serie.s
	.file	"serie.C"
	.local	_ZStL8__ioinit
	.comm	_ZStL8__ioinit,1,1
	.text
	.globl	_Z5seriedi
	.type	_Z5seriedi, @function
_Z5seriedi:
.LFB971:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movsd	%xmm0, -40(%rbp)

3.1.4.2. Langage compilé: compilateur#

le compilateur transforme le code source en assembleur (compilation), éffectue l’édition avec des librairies pour obtenir un binaire qui dépend de l’ordinateur cible, mais qui s’exécute sans le compilateur et sans le code source.

  • C++ Fortran C

  • programme source + compilateur = programme binaire

  • programme source = portable

  • programme binaire = spécifique à l’ordinateur (non portable)

../_images/C.jpeg langage C

%%bash
head -17 data/serie.C
#include <stdlib.h>
#include <math.h>
#include <iostream>
//
// calcul de la somme de n termes de la serie x-x^2/2+x^3/3-
//
double serie(double x,int n)
{
	double coef=x;
	double somme=0.0;
	for (int i=1; i<=n; i++)
	{
		somme = somme + coef/i;
		coef = -coef*x;
	}
	return somme;
}
%%bash
g++ data/serie.C -o serie
./serie
Calcul pour n=20 et x=0.2
Somme   = 0.182322
Log(1+x)= 0.182322

3.1.4.3. Langage interprété:#

l’interpéteur exécute de façon interactive chaque ligne du fichier pour la traduire en code machine et l’execute interactivement. Pour exécuter le code, on a donc toujours besoin de l’interpréteur et du code source.

  • Python, Matlab

  • programme + interpréteur

  • portable = indépendant du système (Linux, MacOS, Windows)

3.1.4.3.1. Matlab (Matrix Laboratory)#

Matlab est un logiciel propriétaire qui est une boite à outils (toolbox) de calcul matriciel et numérique développé par Mathworks Inc. Il fonctionne sous Windows, Mac et Unix et permet d’écrire rapidement des scripts pour faire du calcul scientifique.

De nombreuses alternatives libres et de qualité existent, et notamment les logiciels : Scilab, Octave et surtout Python avec numpy.

%%bash
cat data/serie.m
% programme matlab
% ================
x=0.2; n=20;
% calcul de la serie
coef=x;
somme=0.0;
for i=1:n;
somme = somme+coef/i;
coef  = -coef*x;
end;
display(sprintf('Calcul de la serie pour x=%g et n=%d',x,n))
display(sprintf('somme    = %g',somme))
display(sprintf('log(1+x) = %g',log(1+x)))
exit

3.1.4.3.2. langage python#

Python est un language de programmation moderne de haut niveau, logiciel libre, généraliste, multi-plateformes, multi-architecture, multi-OS (linux, windows, MacOS,..). Un programme python peut s’executer sur un tout petit raspberry Pi à 30€ (ARM), sur des smartphones, des portables, des PC jusqu’aux super-calculateurs HPC avec \(10^9\) coeurs de calcul.

%%bash
cat data/serie.py
#! /usr/bin/env python
from math import log

def serie(x,n):
    """ calcul de la somme de n termes de la serie x-x^2/2+x^3/3- """
    coef=x
    somme=0.0
    for i in range(1,n+1):
        somme = somme + coef/i
        coef  = -coef*x
    return somme
#
x=0.2
n=20
print("Calcul de la serie pour x=",x," et n=",n)
print("somme    = ",serie(x,n))
print("log(1+x) = ", log(1+x))
%%bash
python data/serie.py
Calcul de la serie pour x= 0.2  et n= 20
somme    =  0.18232155679395456
log(1+x) =  0.1823215567939546

3.1.5. Historique des langages de programmation#

  • Années 1950 (approches expérimentales) :

    • FORTRAN, LISP, COBOL…

  • Années 1960 (langages universels) :

    • ALGOL, PL/1, PASCAL…

  • Années 1970 (génie logiciel) :

    • C, MODULA-2, ADA…

  • Années 1980 (programmation objet) :

    • C++, Eiffel…

  • Années 1980 (boites à outils):

    • LabView, Matlab…

  • Années 1990 (langages interprétés objet) :

    • Java, Perl, Python…

3.1.5.1. Langages les plus utilisées par les scientifiques#

Pour le calcul intensif (HPC) (Argonne Lab)

  1. C,C++

  2. Fortran

  3. Python

Matlab est très utilisé pour le traitement des données, mais peut être avantageusement remplacer par Python avec ses librairies numpy et matplotlib et pandas

3.1.6. Exigences du calcul scientifique#

« Le logiciel (software) est une des pierres angulaires de la science moderne. Sans logiciel, la science du vingt et unième siècle serait impossible. Mais sans de meilleurs logiciels, la science ne peut pas progresser » [http://sciencecodemanifesto.org/]

Réplicabilité et de reproductibilité sont des pierres angulaires de la méthode scientifique. En ce qui concerne le travail numérique, se conformer à ces concepts a des implications pratiques suivantes:

  • Réplicable: L’auteur d’un article scientifique qui implique des calculs numériques doit être en mesure de relancer les simulations et de reproduire les résultats sur demande. D’autres scientifiques devraient également être en mesure d’effectuer les mêmes calculs et d’obtenir les mêmes résultats, compte tenu des informations sur les méthodes utilisées dans une publication.

  • Reproductible: Les résultats obtenus à partir de simulations numériques doivent être reproductibles avec une mise en oeuvre indépendante du procédé, ou en utilisant un procédé tout à fait différent.

En résumé: un résultat scientifique solide doit être reproductible, et une étude scientifique solide doit être réplicable.

    • importance de la documentation

    • importance de la validation

    • importance de la maîtrise du code et des transformations de données (logiciels libres)

    3.1.6.1. Démarche du calcul scientifique#

    1. Modèle mathématique

    2. Discrétisation numérique: solution approchée

    3. Recherche solution algorithmique

    4. Programmation

    5. Validation

3.1.7. Documentation#

  • Python. The official Python web site.

  • Python tutorials. The official Python tutorials.

  • Think Python. “”How to Think Like a Computer Scientist”” by Allen B. Downey (free book).

  • COURS InProS “”Introduction à la Programmation Scientifique””

3.1.7.1. Installation (logiciel libre)#

  • Distribution pour Linux, Windows, Mac

  • Distribution Anaconda

  • accès aux serveurs Jupyter à l’UCB Lyon 1:

3.1.8. Fin de la leçon#