Hi! I’m trying to use Julia for optimizing parameters for an ODE system, but I’m running into the issue that the value C1 that should be constant is changed during the optimization. I currently have the following code (for a toy problem):
using Zygote, DifferentialEquations, SciMLSensitivity
N=10
# included state variables (dummy)
const C1 = vec(float.(rand(N,1).>0.2))
# activation function
act(x) = x./(1 .+ x)
# ODE definition
function ode_fun(du,u,p,t)
K = zeros(N,N)
K[1:end] .= p
du.= C1.*act(K*u)-u
end
# loss function
function loss(x)
prob = ODEProblem(ode_fun,x0,(0.0f0,1.0f0),abs.(x))
sol = solve(prob)
u = reduce(hcat,sol.u)
return sum(abs2,u[:,end]-y) + sum(abs.(x))
end
# number of iterations for optimisation
iters = 100
# set initial condition, initial guess and desired output after simulation
global x0 = rand(10)
global x = rand(100)
y = rand(N,1)
loss_vec =[]
# gradient descent
for _ in 1:iters
grd = Zygote.withgradient(x) do x
loss(x)
end
push!(loss_vec,grd.val)
global x = x - 0.01*grd.grad[1]
end
When running the code and printing C1 in ode_fun, I find that C1 is changed to a new value after the first call of ode_fun. Does anybody know why this is happening? I just cannot seem to find how C1 is changed at all in the code.