clear all; clc; close all;
%% Paramètres communs
h = 0.01; % Pas de temps
t_total = 2; % Durée totale étendue à 2s
t = (0:h:t_total)'; % Vecteur temps
n = length(t);
F = @(t_i) (t_i < 0.1).*(-500*t_i + 100) + ...
(t_i >= 0.1 & t_i < 0.2)*50 + ...
(t_i >= 0.2)*0; % Force nulle après 0.2s
F_vals = F(t); % Évaluation de la force pour tous les temps
%% ========== Méthode des Différences Finies ==========
x_df = zeros(n,1);
v_df = zeros(n,1); % Vitesse par différences finies
x_df(1) = 0; % Condition initiale x(0)
x_df(2) = x_df(1) + h*0.2; % Condition vitesse initiale
v_df(1) = 0.2;
for i = 2:n-1
if t(i) < 0.1
F_i = -500*t(i) + 100;
elseif t(i) < 0.2
F_i = 50;
else
F_i = 0;
end
x_df(i+1) = 2*x_df(i) - x_df(i-1) + h^2*(F_i/4 - 10*x_df(i) - 2000*x_df(i));
end
% Calcul de la vitesse (schéma centré)
for i = 2:n-1
v_df(i) = (x_df(i+1) - x_df(i-1)) / (2*h);
end
v_df(end) = (x_df(end) - x_df(end-1)) / h;
%% ========== Méthode Runge-Kutta d'ordre 4 ==========
x_rk = zeros(n,1);
y_rk = zeros(n,1); % y = dx/dt (vitesse)
x_rk(1) = 0;
y_rk(1) = 0.2;
for i = 1:n-1
[K1, L1] = rk_helper(x_rk(i), y_rk(i), t(i), F, h);
[K2, L2] = rk_helper(x_rk(i)+K1/2, y_rk(i)+L1/2, t(i)+h/2, F, h);
[K3, L3] = rk_helper(x_rk(i)+K2/2, y_rk(i)+L2/2, t(i)+h/2, F, h);
[K4, L4] = rk_helper(x_rk(i)+K3, y_rk(i)+L3, t(i)+h, F, h);
x_rk(i+1) = x_rk(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
y_rk(i+1) = y_rk(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
end
%% Export des données vers Excel
data_table = table(t, F_vals, x_df, v_df, x_rk, y_rk, ...
'VariableNames', {'Temps_s', 'Force_N', ...
'Deplacement_DF_m', 'Vitesse_DF_mps', ...
'Deplacement_RK4_m', 'Vitesse_RK4_mps'});
filename = 'resultats_jusqu_a_t2s.xlsx';
writetable(data_table, filename);
disp(['Fichier Excel "' filename '" généré.']);
%% Tracé combiné MATLAB
figure;
% Courbe de force
yyaxis left;
plot(t, F_vals, 'k--', 'LineWidth', 1.5);
ylabel('Force [N]');
ylim([-10 110]);
% Courbes de déplacement
yyaxis right;
plot(t, x_df, 'b-', 'LineWidth', 1.2); hold on;
plot(t, x_rk, 'r:', 'LineWidth', 1.5);
ylabel('Déplacement [m]');
% Mise en forme
title('Force et Déplacements jusqu''à t=2s');
xlabel('Temps [s]');
legend('Force F(t)', 'Différences Finies', 'Runge-Kutta 4', 'Location', 'northeast');
grid on;
set(gca, 'YColor', 'k');
xlim([0 t_total]);
%% Fonction helper pour Runge-Kutta
function [K, L] = rk_helper(x, y, t, F, h)
FT = F(t);
K = h * y;
L = h * (FT - 25*y - 7000*x)/2; % m = 2, c = 25, k = 7000
end