Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • isc2/maths/controle4
1 result
Select Git revision
Show changes
Commits on Source (3)
......@@ -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()
figs/lagrange_interpolate.png

293 KiB | W: | H:

figs/lagrange_interpolate.png

476 KiB | W: | H:

figs/lagrange_interpolate.png
figs/lagrange_interpolate.png
figs/lagrange_interpolate.png
figs/lagrange_interpolate.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -22,41 +22,58 @@ format:
![Graphiques de la fonction $f$ et de ses développements de Taylor en divers points](./figs/ex2_taylor.png)
::: {#thm-taylor-errmax}
## L'erreur maximale théorique
À défaut de ne pas vouloir recopier l'entièreté du polycopié de M. Baillif, je
vais me restreindre à simplement copier-coller la formule en \text{\LaTeX} parce que
ça fait toujours plaisir.
L'erreur $R_{f, n, a}$ commise en un point lors de l'évaluation du polynôme de
Taylor d'une fonction est définie de la sorte :
$$
R_{f, n, a}(x) = \max_{\xi \in I} \left| \frac{f^{(n + 1)}(\xi)(x - a)^{n + 1}}{(n + 1)!} \right|
R_{f, n, a}(x) = \lvert f(x) - T_{f, n, a}(x) \rvert
$$
:::
# 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
Le graphique ci-dessous met en avant l'interpolation par le polynôme de
Lagrange.
Par conséquent, nous savons donc que l'erreur $R_{f, n, a}$ est bornée par la
plus grande valeur du $(n + 1)$-ème terme de la série de Taylor évaluée au un
point $\xi$ de l'intervalle $I$.
![Polynôme d'interpolation de Lagrange avec 2 subdivisions d'intervalle différentes](./figs/lagrange_interpolate.png)
## Newton
$$
R_{f, n, a}(x) \leq \max_{\xi \in I} \left| \frac{f^{(n + 1)}(\xi)(x - a)^{n + 1}}{(n + 1)!} \right|
$$
Le graphique ci-dessous met en avant l'interpolation par le polynôme de
Newton.
# Polynômes d'interpolation
![Polynôme d'interpolation de Newton avec 2 subdivisions d'intervalle différentes](./figs/newton_interpolate.png)
Dans cette partie, nous allons présenter les graphiques de divers polynômes
d'interpolation. Ceux-ci ont été calculées grâce a la fonction `lagrange`
proposée dans le module `scipy.interpolate`.
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).
Les graphiques ci-dessous mettent en avant les divers polynômes d'interpolation avec
la valeur de l'erreur commise en chaque point.
![Polynôme d'interpolation avec 2 subdivisions d'intervalle différentes](./figs/lagrange_interpolate.png){#fig-interpolate}
Nous pouvons donc remarquer que plus le degré du polynôme d'interpolation
augmente, plus l'erreur commise lors de l'interpolation semble diminuer,
notamment en ce qui concerne la partie centrale de chaque graphique. Les divers
polynômes d'interpolation présentés ci-dessus ont d'ailleurs l'air de très bien
approximer la fonction $f$.
## Phénomène de Runge
Lorsqu'on calcule des polynômes d'interpolation dans un certain intervalle $I$
et avec un nombre de points croissants, on peut apercevoir un comportement
étrange au bord de cet intervalle. Plus le nombre de points augmente, plus
le polynôme a tendance à osciller fortement vers les extrémités de l'intervalle.
Sur la @fig-interpolate, il est possible de remarquer que les extrémités de
l'intervalle $I$ sont grandement affectées par le phénomène de Runge, notamment
la méthode d'interpolation avec une subdivision équidistante des points. On
remarque cela par le fait que la valeur de l'erreur commise (traitillé rouge,
pour le découpage équidistant) croît très violemment.
# Exercice 3
......