ModelingToolkit with DataInterpolation in time-varying external force

Hi there, I’m trying to get to work the simple example of an ODE with the external varying force with a DataInterpolation function, but I get an error building the ODESystem. The example is as follow:

using ModelingToolkit
using DifferentialEquations: solve
using DataInterpolations: LinearInterpolation

@variables t v(t) f(t) 
@parameters C      
D = Differential(t) 

a = float.(collect(0:10))
b = 2.0 .* a .+ randn() 
f_fun(t) = LinearInterpolation(b, a)(t)

@named im = ODESystem([f ~ f_fun(t), D(v) ~ f/C])

The last line errors with:

MethodError: isless(::Float64, ::Num) is ambiguous. Candidates:
  isless(a::Real, b::Num) in Symbolics at C:\Users\flvisa\.julia\packages\Symbolics\h8kPL\src\num.jl:156
  isless(x::AbstractFloat, y::Real) in Base at operators.jl:169
Possible fix, define
  isless(::AbstractFloat, ::Num)
lt(o::Base.Order.ForwardOrdering, a::Float64, b::Num) at ordering.jl:109
searchsortedfirst at sort.jl:184 [inlined]
searchsortedfirst at sort.jl:295 [inlined]
#searchsortedfirst#4 at sort.jl:297 [inlined]
searchsortedfirst at sort.jl:297 [inlined]
_interpolate(A::LinearInterpolation{Vector{Float64}, Vector{Float64}, true, Float64}, t::Num) at interpolation_methods.jl:3
(::LinearInterpolation{Vector{Float64}, Vector{Float64}, true, Float64})(t::Num) at DataInterpolations.jl:32
f_fun(t::Num) at untitled-35d453aeb3d55920c72726264c4c44d7:23
top-level scope at untitled-35d453aeb3d55920c72726264c4c44d7:25
eval at boot.jl:360 [inlined]

I made the interpolation to work for this example.


Did you try @register f_fun(t)?

Oh dear, yeah, now the example does work.

I still don’t get a good solution for the piecewise f_fun(t) I have, as shown below:


When I run the solver inside a for loop I get a fair solution, not good enough for the model, but closer than that from ModelingToolkit. Below the data y2 I am trying to reproduce, and in blue the solution with the example above.


Not sure if I am approaching correctly with the MTK though.

Thanks for your help Chris. Cheers!

Lower the tolerance and use tstops?

1 Like

The tstops did the trick.
Thanks for the help again and for the great tool you guys developed.