Hello,
I have a question about the ModelingToolkit package, and in particular about @parameters
value maps.
@parameters t k₁₂ k₂₁ α
p = [k₁₂ => 0.0005
k₂₁ => 0.009
α => 0.09]
I have an ODE system and I want to fit some data on it.
As a test, I tried to generate fake data with the following code (from documentation of DiffEqParamEstim.jl: Parameter Estimation for Differential Equations · DiffEqParamEstim.jl) without noise.
begin
using RecursiveArrayTools # for VectorOfArray
randomized = VectorOfArray([sol(time[i]) for i in 1:length(time)])
data = convert(Array,randomized)
end
and the cost function is as follow :
cost_function = build_loss_objective(prob, Tsit5(), L2Loss(time, data[1,:]),
Optimization.AutoForwardDiff(),
maxiters=100000,verbose=false, save_idxs = [1])
Thus, normally, cost_data(p)
must be equal to 0
. However, cost_data doesn’t eat value maps directly and we have to convert p
in an Array/Vector
. We can’t just create a Vector
with the values of p
[0.09, 0.009, 0.0005]
because the symbol ordering is not guaranteed :
The function varmap_to_vars
( Frequently Asked Questions · ModelingToolkit.jl (sciml.ai)) seems to be intended for that , but how it work is obscure. Documentation give the following example :
p = @parameters x y z
idxs = ModelingToolkit.varmap_to_vars([p[1] => 1, p[2] => 2, p[3] => 3], p)
p[idxs]
but p[idxs]
is just p
and not a vector …
How to correctly manage the symbol ordering when we work with value maps of ModelingToolkit ?
Thanks !