# How to change specific parameter in DifferentialEquations CallbackSet?

**URL:** <https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378>\
**Category:** Modelling & Simulations\
**Created:** [January 5, 2024, 10:16am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378 "2024-01-05T10:16:26Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [January 5, 2024, 10:16am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/1 "2024-01-05T10:16:26Z")

</div>

Hello,  
I am trying to run a simulation of a bacterial population with Julia. I set a function that takes one parameter (growth rate, mu) that should change at a specific time point (t\_in). I set the CallbackSet for the DifferentialEquations package, but I don’t think the condition is implemented because nothing happens to the simulation – the growth does not show any difference. This might be due to the data themselves, but I think I got the syntax wrong.  
The CallbackSet was designed to change the amounts of the bacteria, thus, the u parameter. Now I need to change p parameter and I am not sure if I got it right. I am pasting a snippet of the code for syntax checking. Is it correct?  
Thank you

```julia
function dual_logist!(du, u, p, t)
    # parameters
    μ = p[:μ] # bacterial growth rate
    ...
    # ODE
    du[1] = (μ[1]*u[1]*ł) - (δ[1]*u[1]*u[5]) - (ω*u[1])
    du[2] = (μ[2]*u[2]*ł) - (δ[2]*u[2]*u[6]) - (ω*u[2])
    ...
end

using DifferentialEquations
mu = [mu_0, nu_0]
u0 = ...
tspan = (0, 500)
t_in = 100
...
condition_1(u, t, integrator) = t_in # time
affect_1!(integrator) = μ[1] = mu_1 # amount
cb1 = ContinuousCallback(condition_1, affect_1!)
condition_2(u, t, integrator) = t_in # time
affect_2!(integrator) = μ[2] = nu_1 # amount
cb2 = ContinuousCallback(condition_2, affect_2!)
parms = (μ=mu...)
conditions = CallbackSet(cb1, cb2)
prob = ODEProblem(dual_logist!, u0, tspan, parms)
soln = solve(prob, Rosenbrock23(), callback=conditions, tstops=[t_in])

```

---

<div class="post-metadata">

**Author:** ![Wen-Wei\_Tseng](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wen-wei_tseng/32/28839_2.png) [@Wen-Wei\_Tseng](https://discourse.julialang.org/u/Wen-Wei_Tseng)\
**Post date:** [January 5, 2024, 10:25am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/2 "2024-01-05T10:25:56Z")

</div>

Try integrator.p

> **[Integrator Interface · DifferentialEquations.jl](https://docs.sciml.ai/DiffEqDocs/stable/basics/integrator/#Handling-Integrators)**
>
> Documentation for DifferentialEquations.jl.

---

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [January 5, 2024, 11:07am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/3 "2024-01-05T11:07:21Z")

</div>

Thank you, I tried with:

```julia
condition_1(u, t, integrator) = t_in     
affect_1!(integrator.p) = μ[1] = mu_1  
cb1 = ContinuousCallback(condition_1, affect_1!)
...
soln = solve(prob, Rosenbrock23(), callback=conditions)

```

but I got the error:  
`syntax: "integrator.p" is not a valid function argument`  
So I tried with:

```julia
affect_1!(p) = μ[1] = mu_1 # amount

```

and it worked. But I still do not see any difference. To check if a modification is introduced, I set mu\_1 to zero. Is the syntax correct?

---

<div class="post-metadata">

**Author:** ![Wen-Wei\_Tseng](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wen-wei_tseng/32/28839_2.png) [@Wen-Wei\_Tseng](https://discourse.julialang.org/u/Wen-Wei_Tseng)\
**Post date:** [January 5, 2024, 11:18am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/4 "2024-01-05T11:18:20Z")

</div>

Oops, sorry, I mean:

`affect_1!(integrator) = integrator.p[:μ] = mu_1` (If the `p` is mutable)

or

`affect_1!(integrator) = integrator.p = a_new_p_with_mu_1_updated ` (If the `p` is immutable)

I’m not sure about the structure of `p`. Could it be a `NamedTuple` or a `LabelledArray`?

---

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [January 5, 2024, 1:14pm UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/5 "2024-01-05T13:14:32Z")

</div>

> [@Wen-Wei\_Tseng](#):
>
> I’m not sure about the structure of `p`.

Thank you, it is a named tuple:

```julia
julia> typeof(parms)
NamedTuple{(:μ, :κ, :ω, :δ, :η, :β, :λ), Tuple{Vector{Float64}, Float64, Int64, Vararg{Vector{Float64}, 4}}}

```

---

<div class="post-metadata">

**Author:** ![Wen-Wei\_Tseng](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wen-wei_tseng/32/28839_2.png) [@Wen-Wei\_Tseng](https://discourse.julialang.org/u/Wen-Wei_Tseng)\
**Post date:** [January 5, 2024, 2:03pm UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/6 "2024-01-05T14:03:54Z")

</div>

How to create a new NamedTuple based on the old one

```julia
nt = (a=1, b=2, c=3)

newnt = merge(nt, (; b=10)) #(a=1,b=10,c=3)

```

EDIT: I noticed `p.μ` is an array, so this might work

```julia
function affect_1!(integrator)
    integrator.p.μ[1] = mu_1
end

```

Or, if you don’t want side effects of mutating the array:

```julia
function affect_1!(integrator)
    # Copy the array and assign a new value at the 1st element
    newμ = replace(integrator.p.μ, 1 => mu_1) 
    # Replace the old params with the new ones
    integrator.p = merge(integrator.p, (; μ=newμ ))
end

```

Since your parameter set has two tiers, I would like to recommend the package ComponentArrays.jl, which handles nested named components better.

---

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [January 11, 2024, 6:22am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/7 "2024-01-11T06:22:39Z")

</div>

> [@Wen-Wei\_Tseng](#):
>
> a\_new\_p\_with\_mu\_1\_updated

I tried with this approach, but again there was no difference in the data…

---

<div class="post-metadata">

**Author:** ![Luigi\_Marongiu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/luigi_marongiu/32/7909_2.png) [@Luigi\_Marongiu](https://discourse.julialang.org/u/Luigi_Marongiu)\
**Post date:** [January 11, 2024, 11:02am UTC](https://discourse.julialang.org/t/how-to-change-specific-parameter-in-differentialequations-callbackset/108378/8 "2024-01-11T11:02:05Z")

</div>

> [@Luigi\_Marongiu](#):
>
> `condition_1(u, t, integrator) = t_in `

Thanks to a tip from Steffen P. it turned out the problem was in the time condition: it should be

```julia
condition_1(u, t, integrator) = t - t_in 

```

Now it works as you indicated.  
Thank you for the support.
