From 3f392a8aca06ac382476a2352dbf861628076233 Mon Sep 17 00:00:00 2001
From: Orestis Malaspinas <orestis.malaspinas@hesge.ch>
Date: Mon, 24 Sep 2018 19:03:13 +0200
Subject: [PATCH] jout listing

---
 cours.md | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 104 insertions(+), 2 deletions(-)

diff --git a/cours.md b/cours.md
index f7906b0..54c4afc 100644
--- a/cours.md
+++ b/cours.md
@@ -625,7 +625,7 @@ On a donc que la formule des différences finies centrées est d'ordre 2, notée
 ![L'erreur moyenne et totale sur le calcul de la dérivée de $f(x)=\sin(x)$ ($f'(x)=\cos(x)$) en fonction de $h$ pour les différences finies en avant 
 et celle centrées.](figs/err_deriv_avant_centree.svg){#fig:err_deriv_avant_centree width=70%}
 
-On peut voir ce comportement sur la @fig: que l'erreur est beaucoup plus faible à résolution équivalente pour 
+On peut voir ce comportement sur la @fig:err_deriv_avant_centree que l'erreur est beaucoup plus faible à résolution équivalente pour 
 les différences finies centrées par rapport aux différences finies en avant. De plus la pente de l'erreur est plus faible
 pour les différences finies centrées. Elle est en fait de pente $2$ en échelle log-log, contrairement aux différences finies centrées en avant
 qui est de pente un.  
@@ -633,10 +633,112 @@ qui est de pente un.
 ![L'erreur sur chaque point $x_i$ pour un $h$ fixé sur le calcul de la dérivée de $f(x)=\sin(x)$ ($f'(x)=\cos(x)$) en fonction de $h$ pour les différences finies en avant 
 et celle centrées (droite), ainsi que la valeur de $f'(x)$ pour chacune des deux méthodes. On constate que dans ce cas on ne peut pas distinguer $f'(x)$ de sa valeur approximée.](figs/err_cos_ac.svg){#fig:err_cos_ac width=70%}
 
-On constate également sur la @fig: que l'erreur sur chaque point est beaucoup plus faible poru les différences finies centrées, par rapport à celle en avant.
+On constate également sur la @fig:err_cos_ac que l'erreur sur chaque point est beaucoup plus faible poru les différences finies centrées, par rapport à celle en avant.
 On doit en effet utiliser l'échelle logarithmique pour voir l'erreur des différences finies centrées, sinon on ne les verrait simplement pas sur le graphique (elle est de deux ordres
 de grandeur plus faible).
 
+Les @fig:err_deriv_avant_centree et @fig:err_cos_ac sont obtenues avec le listing suivant
+
+```python
+import numpy as np
+import matplotlib.pyplot as plt
+import math
+
+def f(x): 
+	return np.sin(x)
+
+def df(x): 
+	return np.cos(x)
+
+def app(x, h): 
+	return (f(x+h)-f(x)) / h
+
+def app_c(x, h): 
+	return (f(x+h/2)-f(x-h/2)) / h
+
+def comp_error_sqr(xmin, xmax, h):
+	x = np.arange(xmin, xmax, h)
+	approx = app(x,h)
+	exact = df(x)
+
+	error = (approx - exact)**2
+	return x, error
+
+def comp_error_sqr_c(xmin, xmax, h):
+	x = np.arange(xmin, xmax, h)
+	approx = app_c(x,h)
+	exact = df(x)
+
+	error = (approx - exact)**2
+	return x, error
+
+def comp_error_moy(error):
+	q = error.size
+	return np.sum(np.sqrt(error) / q)
+
+def comp_error_tot(error):
+	return np.sum(np.sqrt(error))
+
+
+
+h = 0.2
+xmin = 0.0
+xmax = math.pi
+
+x, error = comp_error_sqr(xmin, xmax, h)
+x, error_c = comp_error_sqr_c(xmin, xmax, h)
+
+plt.figure(1)
+
+plt.subplot(121)
+plt.plot(x, df(x), 'b-', label="$f'(x)=\cos(x)$")
+plt.plot(x, app(x, h), 'rx-', label="avant")
+plt.plot(x, app_c(x, h), 'gx-', label="centr.")
+plt.xlabel('$x$')
+plt.legend(loc=0)
+plt.grid(True)
+
+plt.subplot(122)
+plt.loglog(x, error, 'b-', label="Erreur en avant")
+plt.loglog(x, error_c, 'g-', label="Erreur centrée")
+plt.ylabel('Erreur')
+plt.xlabel('$x$')
+plt.legend(loc=0)
+plt.grid(True)
+plt.show()
+
+h = [0.025, 0.05, 0.1, 0.2, 0.4]
+xmin = 0.0
+xmax = math.pi
+
+e_tot = np.array([])
+e_tot_c = np.array([])
+e_moy = np.array([])
+e_moy_c = np.array([])
+
+for dx in h:
+	x, error = comp_error_sqr(xmin, xmax, dx)
+	e_tot = np.append(e_tot, comp_error_tot(error))
+	e_moy = np.append(e_moy, comp_error_moy(error))
+
+	x, error = comp_error_sqr_c(xmin, xmax, dx)
+	e_tot_c = np.append(e_tot_c, comp_error_tot(error))
+	e_moy_c = np.append(e_moy_c, comp_error_moy(error))
+
+
+plt.figure(2)
+
+plt.loglog(h, e_tot, 'b-', label="$E_\mathrm{tot,avant}$")
+plt.loglog(h, e_moy, 'rx-', label="$E_\mathrm{moy,avant.}$")
+plt.loglog(h, e_tot_c, 'k-', label="$E_\mathrm{tot,centr.}$")
+plt.loglog(h, e_moy_c, 'gx-', label="$E_\mathrm{moy,centr.}$")
+plt.legend(loc=0)
+plt.ylabel('Erreur')
+plt.xlabel('$h$')
+plt.grid(True)
+plt.show()
+```
+
 ---
 
 Exercice (Ordre 3) +.#
-- 
GitLab