I am solving an IVP with the DifferentialEquations
package and I am looking to find n
events with a specific condition
. The issue rises from the fact that my events require 2 conditions to be satisfied. I am using ContinuousCallback
since I want to find the exact moment when the event occurs.
Previously, if I needed to terminate at the conditions, x=0 and \dot{x}>0 I would use
# Stopping conditions:
condition(u, t, integrator) = u[1] # when x=0
function affect!(integrator)
# if xdot > 0, terminate the integration
integrator.u[4] > 0 ? terminate!(integrator) : nothing
end
However, in my new case, I want to find the first n
events which satisfy these conditions. My current solution is to keep condition(u,t,integrator)
the same and have affect!(integrator)
be
function affect!(integrator)
# extract counter from the "cache"
event_num = integrator.p[2]
# if xdot > 0, add a crossing, else keep the same
integrator.u[4] > 0 ? event_num += 1 : event_num
# if crossings > n_crossings, terminate, else nothing
event_num == n_cross ? terminate!(integrator) : nothing
# update the "cache" value
integrator.p[2] = event_num
end
Here, as suggested in another post (also here), I use one of my user-defined variables as a “cache” which counts the amount of desired events, and then I set the termination!
once I reach the desired amount of events.
However, when I set the options save_everystep=false
, save_start=false
, and save_end=false
in solve
, I can see that the returned states show x-axis crossings when \dot{x} is both positive AND negative. It seems to return the states when only the condition()
is satisfied. Would there be a way to have condition()
only consider an event when \dot{x} > 0? I know the difficulty rises from this having to be a function which is zero at the event.
Yes, I know that there is a post-processing approach which I could use to filter out the undesired states. But I would like to keep this contained if possible.
Thank you all for your time.