SciML / DifferentialEquations.jl

Multi-language suite for high-performance solvers of differential equations and scientific machine learning (SciML) components. Ordinary differential equations (ODEs), stochastic differential equations (SDEs), delay differential equations (DDEs), differential-algebraic equations (DAEs), and more in Julia.
https://docs.sciml.ai/DiffEqDocs/stable/
Other
2.8k stars 222 forks source link

`ODESolution` interpolation fails for single value times with symbolic index #1037

Closed bradcarman closed 3 weeks ago

bradcarman commented 3 weeks ago

Symbolic indexing of an ODESolution only works when supplying a time range, but it would be great to interpolate single values.

MWE:

using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D
using DifferentialEquations

vars = @variables x(t)=0

eqs = [
    D(x) ~ 0.1t
]

@mtkbuild sys = ODESystem(eqs, t, vars, [])

prob = ODEProblem(sys, [], (0, 10))
sol = solve(prob)
sol(0.0)[sys.x] # ERROR: ArgumentError: invalid index: x(t) of type SymbolicUtils.BasicSymbolic{Real}
sol(0.0:0.1:0.0)[sys.x] # OK

Stacktrace...

ERROR: ArgumentError: invalid index: x(t) of type SymbolicUtils.BasicSymbolic{Real}
Stacktrace:
 [1] to_index(i::SymbolicUtils.BasicSymbolic{Real})
   @ Base .\indices.jl:300
 [2] to_index(x::Num)
   @ Symbolics C:\Users\bradl\.julia\packages\Symbolics\aLijf\src\num.jl:162
 [3] to_index
   @ .\indices.jl:277 [inlined]
 [4] _to_indices1
   @ .\indices.jl:359 [inlined]
 [5] to_indices
   @ .\indices.jl:354 [inlined]
 [6] to_indices
   @ .\indices.jl:345 [inlined]
 [7] getindex(A::Vector{Float64}, I::Num)
   @ Base .\abstractarray.jl:1291
 [8] top-level scope
   @ c:\Work\Packages\ActiveSuspension\ActiveSuspensionModel.jl\scripts\app.jl:61 
ChrisRackauckas commented 3 weeks ago

sol(0.0, idxs = sys.x)

bradcarman commented 3 weeks ago

Ah OK, that works! Thanks