Correction proposée de l’examen de Méthodes
Numériques
Proposé par : ULRICH MOMOS
March 26, 2025
Exercice 1 : Interpolation de Lagrange
1 % Interpolation de Lagrange
2 clc; clear; close all;
3 x = [0 1 2];
4 y = [1 2 5];
5 xx = linspace(-1,3,100);
6 yy = interp1(x, y, xx, 'pchip');
7
8 figure;
9 plot(x, y, 'ro', 'MarkerFaceColor', 'r'); hold on;
10 plot(xx, yy, 'b-', 'LineWidth', 1.5);
11 xlabel('x'); ylabel('P_2(x)');
12 title('Interpolation de Lagrange');
13 grid on;
Exercice 2 : Calcul numérique d’intégrale
1 % Intégration numérique avec la méthode des trapèzes
2 f = @(x) 1 + log(x);
3 a = 1; b = 3;
4 tol = 1e-3;
5 n = 1;
6 I_prev = 0;
7 err = inf;
8
9 while err > tol
10 n = n + 1;
11 x_int = linspace(a, b, n);
12 I_new = trapz(x_int, f(x_int));
13 err = abs(I_new - I_prev);
14 I_prev = I_new;
15 end
16
17 fprintf('Nombre de sous-intervalles nécessaire: %d\n', n);
1
Exercice 3 : Résolution numérique d’EDO
1 % Résolution numérique d'EDO par Euler, Heun et Runge-Kutta
2 f = @(t, y) (-y*t^2 - y^2 + 2*t) / (1 - t^3);
3 t0 = 0; y0 = 1;
4 h = 0.1;
5 t_final = 2;
6 t = t0:h:t_final;
7 n = length(t);
8
9 % Méthode d'Euler
10 y_euler = zeros(1, n);
11 y_euler(1) = y0;
12 for i = 1:n-1
13 y_euler(i+1) = y_euler(i) + h * f(t(i), y_euler(i));
14 end
15
16 % Méthode de Heun
17 y_heun = zeros(1, n);
18 y_heun(1) = y0;
19 for i = 1:n-1
20 k1 = f(t(i), y_heun(i));
21 k2 = f(t(i) + h, y_heun(i) + h*k1);
22 y_heun(i+1) = y_heun(i) + (h/2) * (k1 + k2);
23 end
24
25 % Méthode de Runge-Kutta d'ordre 4
26 y_rk4 = zeros(1, n);
27 y_rk4(1) = y0;
28 for i = 1:n-1
29 k1 = f(t(i), y_rk4(i));
30 k2 = f(t(i) + h/2, y_rk4(i) + (h/2)*k1);
31 k3 = f(t(i) + h/2, y_rk4(i) + (h/2)*k2);
32 k4 = f(t(i) + h, y_rk4(i) + h*k3);
33 y_rk4(i+1) = y_rk4(i) + (h/6)*(k1 + 2*k2 + 2*k3 + k4);
34 end
35
36 % Tracé des solutions
37 figure;
38 plot(t, y_euler, 'r--', 'LineWidth', 1.2); hold on;
39 plot(t, y_heun, 'g-.', 'LineWidth', 1.2);
40 plot(t, y_rk4, 'b-', 'LineWidth', 1.2);
41 legend('Euler', 'Heun', 'Runge-Kutta');
42 xlabel('t'); ylabel('y(t)');
43 title('Comparaison des méthodes numériques');
44 grid on;
2
1 Analyse de l’erreur pour Runge-Kutta
1 % Analyse de l'erreur en fonction du pas de discrétisation
2 h_values = [0.1, 0.05, 0.01];
3 errors = zeros(size(h_values));
4
5 for j = 1:length(h_values)
6 h = h_values(j);
7 t = t0:h:t_final;
8 n = length(t);
9 y_rk4 = zeros(1, n);
10 y_rk4(1) = y0;
11
12 for i = 1:n-1
13 k1 = f(t(i), y_rk4(i));
14 k2 = f(t(i) + h/2, y_rk4(i) + (h/2)*k1);
15 k3 = f(t(i) + h/2, y_rk4(i) + (h/2)*k2);
16 k4 = f(t(i) + h, y_rk4(i) + h*k3);
17 y_rk4(i+1) = y_rk4(i) + (h/6)*(k1 + 2*k2 + 2*k3 + k4);
18 end
19
20 errors(j) = abs(y_rk4(end) - y_rk4(end-1));
21 end
22
23 figure;
24 loglog(h_values, errors, 'o-');
25 xlabel('Pas h'); ylabel('Erreur');
26 title('Erreur en fonction du pas');
27 grid on;