# Time varying force with ode23

10 views (last 30 days)
Christo van Rensburg on 25 Apr 2020
Hi there
I have the following code:
tf = 1;
t = linspace(0,3);
Ft = zeros(length(t),1);
% Here I generate the force values at different time intervals.
for i = 1:length(t)
if t(i) <= tf
Ft(i) = Fo*sin(2*pi*t(i)/tf);
elseif t(i) > tf
Ft(i) = 0;
end
end
ic = [0, 0]; % Initial conditions
dXdt = @(t, x) [x(2);
Ft * 1/(m1+m2)];
[t, x] = ode23(dXdt, [0, 3], ic);
I'm struggling to incorportate this time varying force F(t) into the ode23 function.
Any help as to how I can maybe get this done?

darova on 25 Apr 2020
Use function handle
Ft = @(t) (t<=tf)*Fo*sin(2*pi*t/tf);
dXdt = @(t, x) [x(2);
Ft(t) * 1/(m1+m2)];
##### 2 CommentsShowHide 1 older comment
Christo van Rensburg on 25 Apr 2020
It seems to work though.
Walter I'll try your method now, because what you're saying makes sense.
Thanks for the help!

Walter Roberson on 25 Apr 2020
You cannot do that the way you want. The ode* routines cannot handle discontinuities in the driving functions. You need to break it up into two time periods, one with the force and one without the force.
tf = 1;
dXdt_F = @(t, x) [x(2); Fo*sin(2*pi*t/tf) / (m1+m2)];
dXdt_NF = @(t, x) [x(2); 0];
ic = [0, 0]; % Initial conditions
[t1, x1] = ode23(dXdt_F, [0, tf], ic);
ic2 = x1(end,:);
[t2, x2] = ode23(dXdt_NF, [tf, 3], ic2);
t = [t1; t2(2:end)];
x = [x1; x2(2:end,:)];
Christo van Rensburg on 25 Apr 2020
Both methods seem to work fine.
Thanks guys.

### Categories

Find more on Ordinary Differential Equations in Help Center and File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by