diff --git a/Project.toml b/Project.toml index c8e0ee0..981d978 100644 --- a/Project.toml +++ b/Project.toml @@ -11,7 +11,7 @@ Reexport = "189a3867-3050-52da-a836-e630ba90ab69" [compat] DiffEqBase = "6.122" MATLAB = "0.8" -ModelingToolkit = "8" +ModelingToolkit = "8, 9, 10, 11" Reexport = "0.2, 1.0" julia = "1.6" diff --git a/src/MATLABDiffEq.jl b/src/MATLABDiffEq.jl index 0168f90..7d61448 100644 --- a/src/MATLABDiffEq.jl +++ b/src/MATLABDiffEq.jl @@ -4,6 +4,13 @@ using Reexport @reexport using DiffEqBase using MATLAB, ModelingToolkit +# Handle ModelingToolkit API changes: states -> unknowns +if isdefined(ModelingToolkit, :unknowns) + const mtk_states = ModelingToolkit.unknowns +else + const mtk_states = ModelingToolkit.states +end + abstract type MATLABAlgorithm <: DiffEqBase.AbstractODEAlgorithm end struct ode23 <: MATLABAlgorithm end struct ode45 <: MATLABAlgorithm end @@ -57,7 +64,7 @@ function DiffEqBase.__solve( matstr = ModelingToolkit.build_function( map(x -> x.rhs, equations(sys)), - states(sys), + mtk_states(sys), parameters(sys), independent_variables(sys)[1], target = ModelingToolkit.MATLABTarget() @@ -70,6 +77,11 @@ function DiffEqBase.__solve( put_variable(get_default_msession(), :reltol, reltol) put_variable(get_default_msession(), :abstol, abstol) + # Define the ifelse helper function in MATLAB + # MATLAB doesn't have a built-in ifelse, so we need to define one + # This allows symbolic ifelse expressions to be evaluated properly + eval_string("ifelse = @(cond, a, b) cond .* a + ~cond .* b;") + # Send the function over eval_string(matstr)