# Order of parameters in ODEProblem

Hi,

I defined an ODE problem in ModelingToolkit.jl, as such:

``````using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D
using ModelingToolkitStandardLibrary.Blocks
using DataInterpolations
using OrdinaryDiffEq

function System(input_funcs::Dict, params::Dict; name)
@named T_a_out = TimeVaryingFunction(input_funcs[:T_a])
@named Φ_hp_out = TimeVaryingFunction(input_funcs[:Φ_hp])
@named Φ_cv_out = TimeVaryingFunction(input_funcs[:Φ_cv])
@named Φ_s_out = TimeVaryingFunction(input_funcs[:Φ_s])

vars = @variables T_i(t) T_e(t) T_h(t) T_a(t) Φ_hp(t) Φ_cv(t) Φ_s(t)
pars = @parameters lC_i=params[:lC_i] lC_e=params[:lC_e] lC_h=params[:lC_h] lR_ie=params[:lR_ie] lR_ea=params[:lR_ea] lR_ih=params[:lR_ih] lA_w=params[:lA_w] lA_e=params[:lA_e]

# order p
p = [lC_i, lC_e, lC_h, lR_ie, lR_ea, lR_ih, lA_w, lA_e]

eqs = [
# inputs
T_a ~ T_a_out.output.u
Φ_hp ~ Φ_hp_out.output.u
Φ_cv ~ Φ_cv_out.output.u
Φ_s ~ Φ_s_out.output.u

# dynamics
exp(lC_i)*D(T_i) ~ exp(lA_w)*Φ_s + exp(-lR_ih)*(T_h - T_i) + exp(-lR_ie)*(T_e - T_i)
exp(lC_e)*D(T_e) ~ exp(lA_e)*Φ_s + exp(-lR_ea)*(T_a - T_e) + exp(-lR_ie)*(T_i - T_e)
exp(lC_h)*D(T_h) ~ Φ_cv + Φ_hp + exp(-lR_ih)*(T_i - T_h)
]

ODESystem(eqs, t, vars, p; systems = [T_a_out, Φ_hp_out, Φ_cv_out, Φ_s_out], name)
end

# input functions
T_a_linf = LinearInterpolation(T_a_data, time)
Φ_hp_linf = LinearInterpolation(Φ_hp_data, time)
Φ_cv_linf = LinearInterpolation(Φ_cv_data, time)
Φ_s_linf = LinearInterpolation(Φ_s_data, time)

input_funcs = Dict(
:T_a => T_a_linf,
:Φ_hp => Φ_hp_linf,
:Φ_cv => Φ_cv_linf,
:Φ_s => Φ_s_linf
)

@named system = System(input_funcs, params_d)
sys = structural_simplify(system)
prob = ODEProblem(sys, [T_bias, T_bias, T_bias], (0, time[end]))
``````

I can solve this problem pretty easily, no issues at all:

``````sol = solve(prob, Tsit5());
``````

But when I explicitly set the exact same parameters, in the same order, as an argument to the solver like this:

``````sol = solve(prob, Tsit5(); p=[
params_d[:lC_i],
params_d[:lC_e],
params_d[:lC_h],
params_d[:lR_ie],
params_d[:lR_ea],
params_d[:lR_ih],
params_d[:lA_w],
params_d[:lA_e]
])
``````

I get a completely different solution.

What is going on here?

Okay, so I got it.

The correct syntax is given here: Modification of problem types

And so you should use:

``````prob_new = remake(prob; p=p)
``````

Now the order of parameters is consistent.