diff --git a/ISC_421_Controle_4_Saroukhanian_Iliya.py b/ISC_421_Controle_4_Saroukhanian_Iliya.py index ded5ac46edecc324d271fb75ae25126fcfd0097a..0f56bf868b39cb2e9abe41bb55c6474b43738448 100644 --- a/ISC_421_Controle_4_Saroukhanian_Iliya.py +++ b/ISC_421_Controle_4_Saroukhanian_Iliya.py @@ -1,7 +1,7 @@ import numpy as np import math from matplotlib import pyplot as plt -from scipy.interpolate import lagrange +from scipy.interpolate import lagrange, barycentric_interpolate from numpy.polynomial.polynomial import Polynomial @@ -204,7 +204,7 @@ def ex2_taylor_poly(): plt.show() -def ex3_interpolation_poly(): +def ex3_lagrange_interpolation_poly(): nb_points = np.linspace(3, 19, 6, dtype=np.uint64) fig, axes = plt.subplots(2, 3, figsize=(20, 12)) @@ -244,7 +244,75 @@ def ex3_interpolation_poly(): plt.show() -ex3_interpolation_poly() +def ex3_newton_interpolation_poly(): + # merce l'ami + def divided_differences(x, y): + n = len(y) + coef = np.zeros([n, n]) + coef[:, 0] = y + + for j in range(1, n): + for i in range(n - j): + coef[i, j] = (coef[i + 1, j - 1] - coef[i, j - 1]) / \ + (x[i + j] - x[i]) + + return coef[0, :] + + def newton_polynomial(x, x_points, coef): + n = len(coef) + p = coef[n - 1] + for k in range(1, n): + p = coef[n - k - 1] + (x - x_points[n - k - 1]) * p + + return p + + nb_points = np.linspace(3, 19, 6, dtype=np.uint64) + fig, axes = plt.subplots(2, 3, figsize=(20, 12)) + + t = np.linspace(SD.a, SD.b, Nmbre_pts) + + for i, ax in enumerate(axes.flat): + chebyshev_points = np.cos( + (2 * np.arange(nb_points[i]) + 1) / (2 * nb_points[i]) * np.pi) + + chebyshev_points_mapped = 0.5 * \ + (SD.b - SD.a) * (chebyshev_points + 1) + SD.a + + interpolate_pts = np.linspace(SD.a, SD.b, nb_points[i]) + + y_points_uni = SD.f(interpolate_pts) + + coef_uni = divided_differences(interpolate_pts, y_points_uni) + y_plot_uni = newton_polynomial(t, interpolate_pts, coef_uni) + + y_points_cheb = SD.f(chebyshev_points_mapped) + + coef_cheb = divided_differences(chebyshev_points_mapped, y_points_cheb) + y_plot_cheb = newton_polynomial(t, chebyshev_points_mapped, coef_cheb) + + ax.plot(t, SD.f(t), color='black', label='f') + ax.plot(t, y_plot_uni, color='red', + label='$N_{f}$, intervalle équidistants') + ax.plot(t, y_plot_cheb, color='blue', + label='$N_{f}$, points de Chebyshev') + ax.plot(interpolate_pts, SD.f(interpolate_pts), 'o', color='red', + label='Points équidistants') + ax.plot(chebyshev_points_mapped[::-1], + SD.f(chebyshev_points_mapped[::-1]), 'o', color='blue', + label='Points de Chebyshev') + ax.set_title(f'n = {nb_points[i]}') + ax.set_ylim([-1.2, 1.2]) + + ax.legend() + + fig.suptitle(f'Polynôme d\'interpolation de Newton de $f$ avec 2 subdivisions différentes d\'intervalle: Équidistantes (rouge) / Points de Chebyshev (bleu)') + + fig.tight_layout() + plt.show() + + +ex3_newton_interpolation_poly() + # Graphique des polynômes de Taylor # fig, axes = plt.subplots(1, 3) diff --git a/figs/newton_interpolate.png b/figs/newton_interpolate.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0ea9352bf3777484a00f0154c0ac4e74b09c8b Binary files /dev/null and b/figs/newton_interpolate.png differ diff --git a/report.qmd b/report.qmd index 332512e3bf3eb81551bae7af73856cbf9f1d9d08..978d9aba2ca63da7e16ade051748bb561289cebb 100644 --- a/report.qmd +++ b/report.qmd @@ -37,11 +37,26 @@ $$ # Polynômes d'interpolation +Dans cette partie, nous allons présenter les graphiques de divers polynômes +d'interpolation. Il était aussi demandé d'effectuer ces interpolations en +subdivisant l'intervalle $I = [a, b]$ (où $a = 1$ et $b = 4$ dans mon cas) de +deux manières différentes. Les points rouges réprensentent donc le découpage +uniforme / équidistant. Quant au bleus, ceux-ci sont les points de Chebyshev +(comme vous avez pu le deviner, ceux-ci ne sont pas équidistants). + ## Lagrange -![Polynôme de Lagrange avec subdivision uniforme de l'intervalle $I = [a, b]$](./figs/lagrange_interpolate.png) +Le graphique ci-dessous met en avant l'interpolation par le polynôme de +Lagrange. + + + +## Newton + +Le graphique ci-dessous met en avant l'interpolation par le polynôme de +Newton. -## Hermite + # Exercice 3