Time varying force with ode23
    3 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    Christo van Rensburg
 il 25 Apr 2020
  
    
    
    
    
    Commentato: Christo van Rensburg
 il 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?
Thanks in advance!
0 Commenti
Risposta accettata
  darova
      
      
 il 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 Commenti
Più risposte (1)
  Walter Roberson
      
      
 il 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,:)];
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!