How to insert an if conditional in ode45?
11 views (last 30 days)
Show older comments
Hi, I'm trying to simulate a leaky integrate-and-fire model. I'm using Ode45, it all works well but I want to insert an If conditional so that when the y value is less than a specific value (-50), y must reset to the value -65. I have no idea about how to implement this. Any suggestions? Thanks a lot.
x0=-70;
t0=0;
dt=0.1;
tmax=2;
tvec=t0:dt:tmax;
[t,x]=ode45(@test_ode, tvec, x0)
plot (t,x)
function [dydt]=test_ode(t,y)
dydt=-1/10*y+13
end
0 Comments
Accepted Answer
Star Strider
on 1 Feb 2021
Try this:
x0=-70;
t0=0;
dt=0.1;
tmax=20;
% tvec=t0:dt:tmax;
tvec = [t0 tmax];
opts = odeset('Events',@depolEvents);
for k = 1:10
[t{k},x{k}]=ode45(@test_ode, tvec, x0, opts);
x0 = -65;
tvec = [t{k}(end) t{k}(end)+tmax]
% tvec = t{k}(end) : dt : t{k}(end)+tmax;
end
tv = cat(1,t{:});
xv = cat(1,x{:});
figure
plot (tv,xv)
grid
function [dydt]=test_ode(t,y)
dydt=-1/10*y+13;
end
function [position,isterminal,direction] = depolEvents(t,y)
position = y(1) + 50; % The value that we want to be zero
isterminal = 1; % Halt integration
direction = 1; % The zero can be approached from either direction
end
This uses the techniques in ODE Event Location to stop the integration that is restartted in the next increment of the loop.
If it does not do what you want as written (since I may not have understood exactly what you want to do), experiment with it to get the result you want.
4 Comments
More Answers (1)
Steven Lord
on 1 Feb 2021
Don't use a conditional. Use an events function to detect when the condition occurs, stop the ODE solver, use the result from the time of the event to create initial conditions for a new call to the solver, and call the ODE solver from the time of the event.
You should be able to use the ballode example as a model for your function, though instead of bouncing a ball off the floor at ground level you're "bouncing it off the floor" at -50.
2 Comments
Simon Mwakitabu
on 6 Dec 2022
Now imagine you have got a condition which depends on the variable itself. For example you have got a check valve equation, where it opens when P1(t)*Area-P2(t)*Area>k*x_o While solving lets say dP1dt=Q_check.... dP2dt=-Q_check....
Steven Lord
on 6 Dec 2022
The events function in the ballode example detects when the height of the ball above the ground (which is the variable for which we're solving) crosses 0 (representing the ball hitting the ground.)
If you're having difficulty writing up an events function for your problem you could ask a new question (linking back here for reference) showing the code you've written to try to solve the problem as well as the mathematical form of the differential equations you're trying to solve and the posters on Answers may be able to give you some advice.
See Also
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!