Python Numerical Methods PDF
Python Numerical Methods PDF
méthodes numériques »
Ces notes sont destinées aux étudiants. Elles contiennent : - Des explications détaillées des concepts
vus en cours - Des exemples de code commentés - Des conseils pratiques
Le module est organisé en deux sessions (Session 1 et Session 2). Chaque session comporte : - 1 heure
de cours magistral (notes ci-dessous) - 1 heure de laboratoire (notebooks fournis séparément)
1. Introduction et motivations
• Lisibilité et syntaxe claire : Python utilise une syntaxe indentée, proche du pseudocode, ce qui
facilite la compréhension des algorithmes.
• Écosystème scientifique riche : bibliothèques optimisées comme NumPy (calcul vectorisé),
Matplotlib (visualisation), SciPy (algorithmes numériques avancés), pandas, etc.
• Large communauté et documentation : abondance de tutoriels, forums, exemples. Les
étudiants peuvent trouver rapidement de l’aide.
• Portabilité et interopérabilité : Python s’exécute sur différents systèmes (Windows, macOS,
Linux). Il peut interfacer du code en C/C++ ou Fortran pour accélérer certaines parties.
1
- Anaconda : distribue Python avec NumPy, Matplotlib, Jupyter. Vous pouvez créer un environnement
conda :
import numpy as np
import matplotlib.pyplot as plt
print(np.__version__, plt.__version__)
IDE / éditeur - Jupyter Notebook/Lab : idéal pour démonstrations interactives, exécution cellule par
cellule, tracés intégrés. - VS Code : support Jupyter, scripts Python, débogage. - Autres : PyCharm,
Spyder, etc.
a = 3 # int
b = 2.5 # float
s = "texte" # str
flag = True # bool
if a > 0:
print("Positif")
for i in range(5):
print(i)
while condition:
...
- Fonctions de base :
def ma_fonction(x):
return x**2
- Import : import module , from module import fonction . - Types immuables vs mutables (liste
modifiable, tuple immuable). Attention aux effets de bord.
Note aux étudiants : Si vous n’êtes pas à l’aise avec ces notions, consultez le support
fourni ou un tutoriel rapide. Le cours suppose ces bases pour se concentrer sur l’aspect
numérique.
2
3. Introduction à NumPy : calcul vectorisé
import numpy as np
arr = np.array([1, 2, 3], dtype=float)
• Génération de séquences :
• np.arange(start, stop, step) : intervalle demi-ouvert [start, stop).
• np.linspace(start, stop, num) : num points uniformément répartis entre start et stop
inclus.
• Tableaux préremplis :
• np.zeros((m, n)) , np.ones((m, n)) , np.eye(n) pour matrice identité.
• np.empty((m,n)) crée un tableau non initialisé (utile quand on va remplir explicitement).
• Attributs :
• arr.shape : tuple décrivant les dimensions, ex. (100,) pour vecteur, (m,n) pour matrice.
• arr.ndim : nombre de dimensions.
• arr.size : nombre total d’éléments.
• arr.dtype : type de données (float64, int32, etc.).
• Reshape :
• Copie vs vue :
• Slicing renvoie généralement une vue (view) qui partage la mémoire : modifier la vue modifie
l’original.
• Pour forcer une copie : arr.copy() .
• Indexation simple :
arr[0], arr[-1]
• Slicing :
3
arr[1:5], arr[:], arr[::2]
• Indexation multi-dimensionnelle :
• Boolean indexing :
• Fancy indexing :
indices = [0, 2, 4]
arr_sub = arr[indices]
• Opérations élémentaires :
a + b, a * 2, a / b
import numpy as np
x = np.linspace(0, 10, 100)
f = np.sin(x) * np.exp(-x/5)
• Comparaison performancielle : mesurer temps pour grande taille (1e6) avec vectorisation vs
boucle Python (montrer la différence significative).
4
u = np.array([1,2,3])
v = np.array([4,5,6])
dot = np.dot(u, v) # ou u @ v
• Matrices :
A = np.array([[3,1,2],[1,4,0],[2,0,5]], dtype=float)
b = np.array([5,6,7], dtype=float)
x = np.linalg.solve(A, b)
• Conditionnement :
condA = np.linalg.cond(A)
• Expliquer brièvement que conditionnement élevé (>>1) signifie qu’une petite erreur en b peut
engendrer une grande variation en x.
• Broadcasting : mentionner concept (phénomène où arrays de formes différentes sont
automatiquement adaptés pour opérations). Exemple simple : addition d’un vecteur à chaque
ligne d’une matrice.
• Choisir le bon dtype : par défaut float64 ; pour économies mémoire, on peut utiliser float32 si la
précision le permet.
• Eviter les boucles Python sur des tableaux : préférer les opérations vectorisées.
• Attention aux copies involontaires : comprendre quand les vues sont renvoyées.
• Profiling simple : %timeit en Jupyter pour mesurer.
• Documentation : encourager à consulter la doc officielle https://numpy.org/doc/ .
• Importer :
• Cas d’usage : tracer des courbes, histogrammes, scatter plots, etc., pour analyser visuellement
les résultats numériques.
• Courbe simple :
plt.plot(x, f, label='f(x)')
plt.title('Titre du graphe')
plt.xlabel('x')
plt.ylabel('f(x)')
5
plt.legend()
plt.show()
• Histogramme :
data = np.random.normal(size=1000)
plt.hist(data, bins=30)
plt.title("Histogramme")
plt.show()
• Scatter :
plt.scatter(x, y)
plt.savefig('nom_figure.png', dpi=150)
4.5 Conseils
• Toujours vérifier que les graphiques sont lisibles (axes bien nommés, légende claire).
• Sauvegarder les figures pour rapport ou présentation.
• Utiliser Jupyter pour ajuster rapidement.
• Documenter le code de tracé pour faciliter modifications ultérieures.
6
• Concepts fondamentaux de NumPy : création d’array, indexation, vectorisation, algèbre linéaire
de base.
• Concepts fondamentaux de Matplotlib : tracés simples, personnalisation minimale.
• Lire un tutoriel court sur : définition de fonctions en Python, modules, argparse , notions de
portée (LEGB).
• S’assurer de comprendre comment créer et importer un module Python local ( .py ).
• Installer éventuellement des outils pour tests (pytest) et se familiariser brièvement.
2. Fonctions et modularisation
• Syntaxe :
• Paramètres :
• Positionnels obligatoires.
• Arguments par mot-clé avec valeur par défaut.
• *args capte arguments positionnels supplémentaires dans un tuple.
• **kwargs capte arguments nommés supplémentaires dans un dictionnaire.
• Docstrings :
7
• Importance de décrire clairement le rôle de la fonction, types attendus, exceptions
éventuellement levées.
• Styles recommandés (Google, NumPy style). Exemple :
Args:
coeffs (list of float): coefficients [a0, a1, ..., an]
correspondant à a0 + a1*x + ... + an*x^n.
x (float or array_like): valeur(s) de la variable.
Returns:
float or ndarray: valeur(s) du polynôme en x.
"""
...
• Bonnes pratiques :
• Fonctions courtes et cohésives (une seule responsabilité).
• Nom clair, explicite.
• Vérifier les entrées si nécessaire (par ex. s’assurer que coeffs est itérable). Sinon documenter
clairement les préconditions.
projet_numerique/
├── src/
│ ├── utils_num.py
│ └── integrale_trap.py
├── tests/
│ └── test_utils.py
├── notebooks/
│ └── laboratoire1.ipynb
├── requirements.txt
└── README.md
8
• requirements.txt listant les paquets ( numpy , matplotlib , etc.) pour recréer
l’environnement via pip install -r requirements.txt .
• Si conda : environnement environment.yml .
• Fonction eval_poly :
• Implémentation par la méthode de Horner pour efficacité et simplicité :
• Tester sur valeur scalaire : eval_poly([1, -3, 2], 5) donne 1 - 3*5 + 2*5^2 = 1 -
15 + 50 = 36 .
• Tester sur tableau NumPy : eval_poly([1, -3, 2], np.array([0,1,2])) renvoie
tableau.
• Organisation en module : créer utils_num.py , y placer eval_poly . Importer dans
notebook ou script.
• Gestion d’erreurs : vérifier si coeffs est vide (polynôme nul), ou si x type incorrect :
documenter ou lever exception.
import random
def estimate_pi(n):
count = 0
for _ in range(n):
x, y = random.random(), random.random()
if x*x + y*y <= 1:
9
count += 1
return 4 * count / n
• Avec NumPy :
import numpy as np
def estimate_pi_np(n):
pts = np.random.rand(n, 2)
dist2 = pts[:,0]**2 + pts[:,1]**2
return 4 * np.count_nonzero(dist2 <= 1) / n
import statistics
results = [estimate_pi(100000) for _ in range(10)]
m = statistics.mean(results)
s = statistics.pstdev(results)
• decimal : arithmétique décimale à précision réglable, utile pour éviter erreurs d’arrondi dans
certains calculs financiers ou très sensibles.
10
4. Portée des variables (scoping) et gestion de l’état
x = 10 # global
def f():
x = 5 # local à f
print(x) # affiche 5
f()
print(x) # affiche 10
• global : permet à une fonction de modifier une variable globale. À éviter autant que possible
pour maintenir la clarté et éviter effets de bord imprévus.
• nonlocal : dans une fonction imbriquée, permet modifier la variable de la fonction englobante.
def outer():
count = 0
def inner():
nonlocal count
count += 1
return count
return inner
f = outer()
print(f()) # 1
print(f()) # 2
• Types immuables : int, float, str, tuple. Passer à une fonction ne modifie pas l’objet original.
• Types mutables : list, dict, set, array NumPy. Attention : si on modifie l’objet à l’intérieur de la
fonction, effet visible à l’extérieur.
def modif_list(lst):
lst.append(5)
L = [1,2,3]
modif_list(L)
print(L) # [1,2,3,5]
11
• Conseil : si on veut éviter effet de bord, copier la liste à l’intérieur ou clairement documenter que
la fonction modifie l’argument.
def make_power(n):
def power(x):
return x ** n
return power
square = make_power(2)
cube = make_power(3)
print(square(4), cube(2)) # 16, 8
• Bloc principal :
def main():
# code principal
pass
if __name__ == "__main__":
main()
import argparse
import numpy as np
def f(x):
"""Fonction à intégrer"""
12
return np.sin(x) # exemple; on peut étendre pour choix dynamique
def main():
parser = argparse.ArgumentParser(description="Intégration numérique
par la méthode du trapèze")
parser.add_argument("--a", type=float, required=True, help="borne
inférieure a")
parser.add_argument("--b", type=float, required=True, help="borne
supérieure b")
parser.add_argument("--N", type=int, default=100, help="nombre de
sous-intervalles")
args = parser.parse_args()
result = trapezoid(args.a, args.b, args.N)
print(f"Intégrale approximative de {args.a} à {args.b} avec
N={args.N} : {result}")
if __name__ == '__main__':
main()
• Logging : module logging pour messages structurés : niveaux DEBUG, INFO, WARNING,
ERROR.
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Début de l’intégration")
• Debugging :
• print pour vérifications rapides.
• Debugger intégré de l’IDE ou module pdb : import pdb; pdb.set_trace() .
13
assert trapezoid(0, 1, 1) == 0.5 * (f(0) + f(1)) # cas simple
• pytest :
• Créer fichier test_module.py contenant des fonctions def test_xxx(): ... .
• Installation : pip install pytest .
• Exécution : pytest dans le dossier, détecte et exécute les tests.
• Bonnes pratiques : écrire des tests couvrant cas limites (N très petit, fonction constante, etc.).
• Hiérarchie de fichiers (comme indiqué plus haut). Séparer code de production ( src/ ), tests
( tests/ ), notebooks ( notebooks/ ).
• Gestion de versions : Git, repository hébergé (GitHub, GitLab). Encourager commits fréquents
avec messages clairs.
• Environnements : documenter comment installer les dépendances (fichier
requirements.txt ou environment.yml ).
• Documentation : README pour expliquer le projet, son objectif, comment installer et exécuter.
• Relecture de code (code review) : encourager échanges entre pairs.
Conclusion de Session 2
• Récapitulatif des notions approfondies : fonctions, modules, math standard, portée, scripts CLI,
logging, tests.
• Encouragement à pratiquer via le laboratoire proposé et projets personnels.
• Mise à disposition des notebooks et supports.
1. Documentation officielle :
2. NumPy : https://numpy.org/doc/stable/
3. Matplotlib : https://matplotlib.org/stable/contents.html
4. Python (fonctions, modules) : https://docs.python.org/3/tutorial/
5. Argparse : https://docs.python.org/3/library/argparse.html
6. Logging : https://docs.python.org/3/library/logging.html
14
7. Unittest/pytest : https://docs.pytest.org/
8. Tutoriels et articles en français :
9. Tutoriel Python de base (ex. OpenClassrooms, Grafikart).
10. Articles sur NumPy/Matplotlib sur sites francophones.
11. Vidéos : courtes présentations YouTube expliquant la vectorisation NumPy, tracés Matplotlib.
12. Livres :
13. « Python pour les mathématiques » ou ouvrages similaires traitant du calcul numérique.
14. Projets de suivi :
15. Implémenter plusieurs méthodes de résolution d’équations non linéaires, comparer leur
convergence et afficher graphiquement.
16. Écrire un mini-projet d’analyse de données scientifiques (importer un jeu de données, calculs,
tracés).
Conseil final : Partagez ces notes aux étudiants sous forme de PDF ou document
markdown, accompagné des notebooks Jupyter. Encouragez-les à lire avant la session, à
exécuter des exemples, puis à poser des questions en session. Les notes détaillées les
guideront pas à pas et serviront de référence tout au long du cours et au-delà.
15