diff --git a/cours.md b/cours.md index f7906b0957f0e6183bc7bd44e083d8ebdabd15f0..54c4afcf6e127e2e9e420070d84065c501f944e4 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) +.#