1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| clear all;
% Initialisation of alpha and beta
alpha =-1.0;
beta = 0.0;
% set up the initial velocity, mass, position and time step
Nstep = 601;
% Initialisationde la variable x à 1 pour caller l'échelle des x avec les valeurs de la question 1 du TP
x = 1;
v = 0; % Initial velocity in meters/s.
mass = 1.0; % Mass of particle
step = 0.02; %time step in seconds
for istep = 1 : Nstep % make the number of steps necessary
t = temps (istep) = (istep -1) * step; % time
Force = alpha * x - 4 * beta * x^3; % compute the force on the particle
accel = Force / mass; % compute the accel. on the particle
% compute the velocity and position using Euler algo.
x = position (istep) = x + v * step;
v = vitesse (istep) = v + accel * step;
% La vitesse étant une fonction dérivée de la position, alors si celle-ci s'annule nous obtenons la valeur maximum ou minimum de la position
% en recherchant les deux extréma les plus proches, on obtient par la différence de temps correspondante la période d'oscillation du système.
% Ici on prend la partie entière puisque la fonction que nous utilisons pour tracer la courbe représentative de la vitesse est une
% approximation donc on n'a peu de chance de tomber sur une valeur de v égale à 0
if (floor (vitesse (istep)) == 0)
I1 = istep; % On récupère la valeur de istep pour laquelle la vitesse s'annule
% On l'intègre dans une autre variable qui va nous servir à initialiser le pas de recherche de l'autre valeur de X; la multiplication par deux
% est nécessaire sinon les valeurs pour lesquelles v=0 sont trop proches les unes des autres dans le temps pour que les valeurs de X
% correspondantes soient distantes d'une période
global S3 = 2 * I1;
global X1 = position (I1); % On recherche la position correspondante à I1
T1 = temps (I1); % Et également le temps correspondant
% Affichage des éléments de réponse
str = [" A la position X1 = ", num2str(X1), " la vitesse s'annule ce qui permet d'affirmer que la trajectoire du point admet un maximum ou un minimu à T1 = ", num2str(T1)]
break % On arrète les calculs
endif
endfor
% On remplace 1 par S3 afin de ne pas refaire le même calcul que précédemment
for jstep = S3 : Nstep % make the number of steps necessary
temps (jstep) = (jstep -1) * step; % time
Force = alpha * x - 4 * beta * x^3; % compute the force on the particle
accel = Force / mass; % compute the accel. on the particle
% compute the velocity and position using Euler algo.
position (jstep) = x = x + v * step;
vitesse (jstep) = v = v + accel * step;
% Même condition que dans le 1er cas sauf que l'on ajoute également que la nouvelle valeur de x doit avoir le même signe que X1 dans le cas contraire on aurait % une demi-période seulement
if (floor (vitesse (jstep)) == 0)
I2 = jstep;
X2 = position (I2);
elseif (sign (X2) == sign (X1))
T2 = temps (I2);
str = [" A la position X2 = ", num2str(X2), " la vitesse s'annule ce qui permet d'affirmer que la trajectoire du point admet un maximum ou un minimum à T2 = ", num2str(T2)]
% Calcul de la période totale
Periode = T2 - T1;
str = [" La période totale est de ", num2str(Periode), " secondes"]
break
endif
endfor
warning off;
clf;
% Tracé des graphes en échelle semi-logarithmique
Ostep = floor (Periode) + 2;
for kstep = 1 : Ostep % make the number of steps necessary
t = temps (kstep) = (kstep -1) * step; % time
Force = alpha * x - 4 * beta * x^3; % compute the force on the particle
accel = Force / mass; % compute the accel. on the particle
% compute the velocity and position using Euler algo.
position (kstep) = x = x + v * step;
vitesse (kstep) = v = v + accel * step;
% Tracé de la position
XlimitM =max(position) + 0.1;
Xlimitm =min(position) - 0.1;
axis([0, Nstep * step, Xlimitm, XlimitM]); % Set axis limits
semilogy (temps, position, 'b+', temps, vitesse, 'r-'); % plot the position and the velocity
xlabel('Time (s)'); % x-axis label
ylabel('Position (m), Velocity (m.s¯¹)'); % y-axis label
title('X=f(t) sur une période')
legend( 'Position (m)' , 'Velocity (m.s¯¹)')
endfor |
Partager