# Error in parameter estimation of ODEs

**URL:** <https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611>\
**Category:** New to Julia\
**Created:** [October 12, 2022, 8:34am UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611 "2022-10-12T08:34:19Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ak47](https://avatars.discourse-cdn.com/v4/letter/a/0ea827/32.png) [@ak47](https://discourse.julialang.org/u/ak47)\
**Post date:** [October 12, 2022, 8:34am UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/1 "2022-10-12T08:34:19Z")

</div>

I have been trying out some simple parameter estimation problem for ODEs. In my code, I specify save\_idxs = 2 in calculating the loss, I get this error: MethodError: no method matching vec(::Float32 . I need your help. Thanks.  
Here is my full code.

`````julia
using Flux, DiffEqFlux, DifferentialEquations, Plots
function f(du,u,p,t)
S,I,R = u
du[1] = -p[1]*u[1]*u[2]
du[2] = p[1]*u[1]*u[2] - p[2]*u[2]
du[3] = p[2]*u[2]
end

# initialise and have arange between 0 and 1.5 for time-t

tbegin=0.0
tend=15
tstep=1
trange = tbegin:tstep:tend
u0 =Float32[738.0,1.0,0.0]
tspan = (tbegin,tend)

t_f = collect(3:14)
I_data=Float32[25.0,75.0,227.0,296.0,258.0,236.0,192.0,126.0,71.0,28.0,11.0,7.0];

p = [0.002,0.3] # set initial values of parameters
prob = ODEProblem(f, u0, tspan, p)

sol=solve(prob,Tsit5(),reltol = 1e-12 , saveat=t_f,save_idxs = 2)
plot(sol)

function loss(p)
sol = solve(prob, Tsit5(),reltol = 1e-12 , saveat=t_f, save_idxs = 2)
loss = sum(abs2, I_data .- sol)
return loss, sol
end

callback = function (p, l, pred)
display(l)

# Tell sciml_train to not halt the optimization. If return true, then

# optimization stops.

return false
end

using Optimization
adtype = Optimization.AutoZygote()
optf = Optimization.OptimizationFunction((x, p) → loss(x), adtype)
optprob = Optimization.OptimizationProblem(optf, p)
result_ode = Optimization.solve(optprob,
ADAM(0.1),
callback = callback,
maxiters = 300)
````
`````

---

<div class="post-metadata">

**Author:** ![ak47](https://avatars.discourse-cdn.com/v4/letter/a/0ea827/32.png) [@ak47](https://discourse.julialang.org/u/ak47)\
**Post date:** [October 13, 2022, 7:22am UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/2 "2022-10-13T07:22:37Z")

</div>

Fixed the problem in the loss.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [October 13, 2022, 9:21am UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/3 "2022-10-13T09:21:07Z")

</div>

Share your change and mark it as solved.

---

<div class="post-metadata">

**Author:** ![ak47](https://avatars.discourse-cdn.com/v4/letter/a/0ea827/32.png) [@ak47](https://discourse.julialang.org/u/ak47)\
**Post date:** [October 13, 2022, 3:07pm UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/4 "2022-10-13T15:07:41Z")

</div>

1. I modified the loss from one of chris’s codes to:  
function loss(p)  
sol = solve(prob, Tsit5(),reltol = 1e-12 ,p=p, saveat=t\_f)  
loss = sum(abs2, I\_data .- sol[2,:])  
return loss, sol  
end
2. I also modified adtype to adtype = Optimization.AutoForwardDiff()

---

<div class="post-metadata">

**Author:** ![ak47](https://avatars.discourse-cdn.com/v4/letter/a/0ea827/32.png) [@ak47](https://discourse.julialang.org/u/ak47)\
**Post date:** [October 15, 2022, 12:58pm UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/5 "2022-10-15T12:58:11Z")

</div>

I have a question on how you can constraint the parameters to be positive ?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [October 15, 2022, 8:18pm UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/6 "2022-10-15T20:18:25Z")

</div>

> [@ak47](#):
>
> `optprob = Optimization.OptimizationProblem(optf, p)`

add `lb = [0.0,0.0]` (or `lb = zeros(2)`) to the problem definition to add a lower bound to the parameters.

---

<div class="post-metadata">

**Author:** ![ak47](https://avatars.discourse-cdn.com/v4/letter/a/0ea827/32.png) [@ak47](https://discourse.julialang.org/u/ak47)\
**Post date:** [October 17, 2022, 5:27am UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/7 "2022-10-17T05:27:00Z")

</div>

Thank you Chris. This is how i have set it up:  
using Optimization  
lb=zeros(6)  
adtype = Optimization.AutoZygote()  
optf = Optimization.OptimizationFunction((x, p) → loss(x), adtype)  
optprob = Optimization.OptimizationProblem(optf,p,lb)  
result\_ode = Optimization.solve(optprob,  
ADAM(),  
callback = callback,  
maxiters = 100)  
My results:  
3.7818476083727264  
-0.03465652868932274  
0.1034491358747068  
0.04918238186157787  
0.09414717353193382  
0.05533427768130925  
I am still getting some negative parameters. I don’t know if I am doing it the right way ?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [October 17, 2022, 6:06am UTC](https://discourse.julialang.org/t/error-in-parameter-estimation-of-odes/88611/8 "2022-10-17T06:06:55Z")

</div>

> [@ak47](#):
>
> optprob = Optimization.OptimizationProblem(optf,p,lb)

You made it your parameters 😅

```julia
optprob = Optimization.OptimizationProblem(optf,p,lb=lb)

```
