clear all; clc; close all;
%% === Paramètres du système ===
m = 2; % Masse (kg)
c = 25; % Amortissement (N.s/m)
k = 7000; % Raideur (N/m)
h = 0.01; % Pas de temps (s)
t_total = 2; % Durée de simulation (s)
t = 0:h:t_total;
n = length(t);
%% === Définition de la force F(t) ===
F = @(t_i) (-500*t_i + 100).*(t_i < 0.1) + ...
50.*(t_i >= 0.1 & t_i < 0.2) + ...
0.*(t_i >= 0.2);
%% === Initialisation ===
x = zeros(1, n); % Déplacement
v0 = 0.2; % Vitesse initiale (dx/dt à t=0)
% Conditions initiales
x(1) = 0;
% Utilisation de l'approximation x(2) = x(1) + h*v0 + (h^2/2)*acc(0)
acc0 = (F(t(1)) - c*v0 - k*x(1)) / m;
x(2) = x(1) + h*v0 + 0.5*h^2*acc0;
%% === Algorithme des différences finies ===
for i = 2:n-1
Fi = F(t(i));
x(i+1) = (1/(m + c*h/2)) * ...
(2*m*x(i) - (m - c*h/2)*x(i-1) - h^2*k*x(i) + h^2*Fi);
end
%% === Exportation vers Excel (Corrigé) ===
% Création d'un dossier sécurisé
output_folder = fullfile(userpath, 'Simulation_Results'); % Dossier utilisateur
if ~exist(output_folder, 'dir')
mkdir(output_folder); % Crée le dossier si nécessaire
end
% Chemin complet du fichier
filename = fullfile(output_folder, 'resultats_simulation.xlsx');
% Gestion des conflits de fichiers
if exist(filename, 'file')
try
delete(filename); % Tente de supprimer le fichier existant
catch
error('Fermez le fichier Excel avant de relancer le script.');
end
end
% Création du tableau et export
results_table = array2table([t', x'], ...
'VariableNames', {'Temps_s', 'Deplacement_m'});
writetable(results_table, filename, 'Sheet', 'Donnees');
disp(['Données exportées vers : ' filename]);
%% === Affichage de quelques résultats ===
disp('==== Résultats Différences Finies (premiers instants) ====');
disp(results_table(1:5, :));
%% === Tracé des courbes ===
figure;
% 1. Force F(t)
subplot(2,1,1);
F_vals = arrayfun(F, t);
plot(t, F_vals, 'LineWidth', 1.5);
title('Profil de la force F(t)');
xlabel('Temps (s)');
ylabel('F(t) [N]');
grid on; xlim([0 t_total]);
% 2. Déplacement x(t)
subplot(2,1,2);
plot(t, x, 'b', 'LineWidth', 1.5);
title('Déplacement x(t) par différences finies');
xlabel('Temps (s)');
ylabel('x(t) [m]');
grid on; xlim([0 t_total]);