diff --git a/ISC_421_Controle_4_Saroukhanian_Iliya.py b/ISC_421_Controle_4_Saroukhanian_Iliya.py index 0f56bf868b39cb2e9abe41bb55c6474b43738448..459460916b9f0f2a8632db73d925d3c882861219 100644 --- a/ISC_421_Controle_4_Saroukhanian_Iliya.py +++ b/ISC_421_Controle_4_Saroukhanian_Iliya.py @@ -139,6 +139,8 @@ print() print(f"valeur de la fonction en x = {SD.Taylor_points} : { [SD.f(x) for x in SD.Taylor_points]}") print(f"valeur de la fonction en a et b: {SD.f(SD.a), SD.f(SD.b)}") +# print("===============================") +# print(SD.Maximal_derivatives_values) # Exemple de graphe de la fonction f. # t = np.linspace(SD.a, SD.b, Nmbre_pts) @@ -205,9 +207,11 @@ def ex2_taylor_poly(): def ex3_lagrange_interpolation_poly(): - nb_points = np.linspace(3, 19, 6, dtype=np.uint64) + nb_points = np.linspace(1, 13, 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) @@ -221,13 +225,15 @@ def ex3_lagrange_interpolation_poly(): l_poly_chebyshev_pts = lagrange( chebyshev_points_mapped, SD.f(chebyshev_points_mapped)) - t = np.linspace(SD.a, SD.b, Nmbre_pts) - ax.plot(t, SD.f(t), color='black', label='f') ax.plot(t, l_poly_uniform(t), color='red', label='$L_{f}$, intervalle équidistants') + ax.plot(t, np.abs(SD.f(t) - l_poly_uniform(t)), '--', color='red', + label='$L_{f}$, intervalle équidistants, erreur') ax.plot(t, l_poly_chebyshev_pts(t), color='blue', label='$L_{f}$, points de Chebyshev') + ax.plot(t, np.abs(SD.f(t) - l_poly_chebyshev_pts(t)), '--', color='blue', + label='$L_{f}$, points de Chebyshev, erreur') ax.plot(interpolate_pts, SD.f(interpolate_pts), 'o', color='red', label='Points équidistants') ax.plot(chebyshev_points_mapped[::-1], @@ -244,85 +250,71 @@ def ex3_lagrange_interpolation_poly(): plt.show() -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) -# for i, pt in enumerate(SD.Taylor_points): -# ax = axes[i] +ex3_lagrange_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) -# ax.plot(t, SD.f(t), label="Fonction f(x)") -# taylor_poly = np.poly1d( -# SD.Taylor_derivatives_values[SD.Taylor_points[i]][::-1]) -# ax.plot(t, taylor_poly(t), label=f"Polynôme de Taylor en x={pt}") -# ax.legend() -# ax.set_title(f"Polynôme de Taylor en x={pt}") -# plt.show() +# +# 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()