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 {#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. {#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