I understand the difference between the DiscreteCallback and the ContinuousCallback. My question is, how could I use the continuous one while being active only on a specified interval of the independent variable?
For example, let’s say I’m interested in finding value x, such that the solution y(x) to the differential equation y'' + y = 0 hits the value 0.5 on the interval x\geq 4.
At first, I tried cheesing my way around by including the interval requirement in the condition and returning some nonzero value, if I’m outside of the interval of interest.
using Plots, DifferentialEquations
function f!(du, u, p, t)
du[1] = u[2]
du[2] = -u[1]
end
x0 = [1.0, 0.0]
span = (0.0, 10.0)
condition(u, t, int) = (t < 4 ? -1.0 : u[1] - 0.5)
affect!(int) = terminate!(int)
cb = ContinuousCallback(condition, affect!)
prob = ODEProblem(f, x0, span; callback = cb)
sol = solve(prob)
plot(sol, idxs = (1))
This seems to work, but if I change the initial condition to x0 = [-1.0, 0.0]
, this ‘solution’ fails miserably:
The problem is, the condition switches sign at the interval boundary and the integration is stopped at x=4. What is the intended way to do this? I would like to solve similar problem, but with a more complicated system.