using ode45 using while loop

1 Ansicht (letzte 30 Tage)
Muhammad Sarmad Zahid
Muhammad Sarmad Zahid am 17 Mär. 2021
Kommentiert: Jan am 19 Mär. 2021
Hi,
I am trying to solve a dynamics problem using ode45 and while loop. The code is below. It has two case. First a carriage is dropping by free fall and second it is dropping on a damper. The problem is I am getting the value of [at,ay] but when the second case starts the [at,ay] values overwrite the previous at and ay values. Is ther any way to avoid over writing?
clc;
clear;
g=9.81;
tspan = [0 1];
tstart = tspan(1);
tend = tspan(end);
y0=[-0.75 0];
c=6850;
m=450;
s=[];
f=2650;
e=535;
w=4410;
t = tstart;
y = y0;
fcn = @pra;
at=[];
ay=[];
options = odeset('Events', @freefall);
while t(end) < tend
[at,ay] = ode45(fcn, [t(end) tend], y(end,:), options);
t = cat(1, t, at(2:end));
y = cat(1, y, ay(2:end,:));
if y(end,1)<=0
fcn = @pra;
options = odeset('Events', @freefall);
a = g * ones(1, length(s));
elseif y(end,1)>0
fcn=@simulation;
options = odeset('Events', @event);
a=((c*(ay(:,2))+f+e-w)/m)/9.81;
end
end
figure(1);
plot(t,y(:,1))
hold on
figure(2);
plot(t,y(:,2))
hold on
figure
plot (at,a)
%%%%% functions%%%%%%
function fval = simulation( t,y )
x=y(1);
v=y(2);
c=6850;
m=450;
k=0;
f=2650;
e=535;
w=4410;
fval(1,1)=v;
%fval(2,1)= -(c*v+k*x)/m
fval(2,1)=(-c*v-f-e+w+k*x)/m;
end
function val = pra( t,y )
g=9.8;
y(1);
y(2);
% c=6850;
val = [y(2); g];
end
%%event function%%%%
function [position,isterminal,direction] = freefall(t,y)
position = y(1); % The value that we want to be zero
isterminal = 1; % Halt integration
direction = 0; % The zero can be approached from either direction

Akzeptierte Antwort

Jan
Jan am 17 Mär. 2021
Bearbeitet: Jan am 17 Mär. 2021
I am getting the value of [at,ay] but when the second case starts the [at,ay] values overwrite the previous at and ay values.
Why does this matter? You insert the values of at and ay to the arrays and y. So why do you want to access at and ay later? Use t and y instead.
  7 Kommentare
Muhammad Sarmad Zahid
Muhammad Sarmad Zahid am 19 Mär. 2021
The reason why I wanted to get t and y seperately beacause i wanted to draw a graph of second derivative. but it does not seems to work. If I ry to explain my goal in one sentence that is " i want to get acceleration plot over the whole time that is second derivative" . Your guidance will be valueable if you guide me how can I get seconf derivation for each event.
Jan
Jan am 19 Mär. 2021
dy = []; % insert these lines to your code
tC = {};
yC = {};
dyC = {};
while t(end) < tend
[at, ay] = ode45(fcn, [t(end) tend], y(end,:), options);
dy = simulation(tsol, ysol.').';
ady = dy(:, 2);
% Collect the output
t = cat(1, t, at(2:end));
y = cat(1, y, ay(2:end,:));
dy = cat(1, dy, ady(2:end,:));
% Store the output another time:
tC{end + 1} = at;
yC{end + 1} = ay;
dyC{end + 1} = ady;
...
end
function fval = simulation(t, y)
x = y(1, :);
v = y(2, :);
c = 6850;
m = 450;
k = 0;
f = 2650;
e = 535;
w = 4410;
fval(1, :) = v;
fval(2, :) = (-c * v - f - e + w + k * x) / m;
end

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Muhammad Sarmad Zahid
Muhammad Sarmad Zahid am 19 Mär. 2021
Bearbeitet: Muhammad Sarmad Zahid am 19 Mär. 2021
The dimensions of dy and ady were not same but i corrected it. the answer i getting is as follow. but dont you think that fot the first event it should be simply 9.8 m/s or 1 g? from 0s ro 0.3912s it should be constant but here we are getting a slope. I actually did it my self as well but i could not solve this problem. you can check the attached file for acceleration graph.
  1 Kommentar
Jan
Jan am 19 Mär. 2021
the answer i getting is as follow.
Your diagram does not contain a title or labels. Without seeing the code I can only guess, what was plotted. I do iknow know the final code you are using. So I cannot find out, if it contains a problem.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Programming finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by