-
-
Notifications
You must be signed in to change notification settings - Fork 210
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Solve does not solve initialization problem of remade problems #2842
Labels
bug
Something isn't working
Comments
Is a fix to this already underway with the PRs linked in #2747? |
I believe that PR is for another feature. I'm also finding this bug, I added some color to your MWE and provided a proof... @variables x(t)
@parameters P
@mtkbuild sys = ODESystem([D(x) ~ 0], t, [x], [P]; initialization_eqs = [x^2 ~ P], guesses = [x => +1.0])
prob1 = ODEProblem(sys, [], (0.0, 1.0), [P => 1.0])
prob2 = remake(prob1, p = [P => 4.0])
sol1 = solve(prob1)
sol2 = solve(prob2)
sol1(0; idxs=x) #1.0 OK
sol2(0; idxs=x) #1.0 <-- ERROR, should be 2.0
# Building and solving the initialization system explicitly gives the correct result
initsys = ModelingToolkit.generate_initializesystem(sys)
initsys = structural_simplify(initsys)
initprob = NonlinearProblem(initsys, [t=>0],[P => 1.0])
initsol = solve(initprob)
initsol[x] #1.0 OK
initprob = remake(initprob; p = [P => 4.0])
initsol = solve(initprob)
initsol[x] #2.0 OK |
New PR that hopefully fixes this is #2928 |
using ModelingToolkit, OrdinaryDiffEq
using ModelingToolkit: t_nounits as t, D_nounits as D
@variables x(t)
@parameters P
@mtkbuild sys = ODESystem([D(x) ~ 0], t, [x], [P]; initialization_eqs = [x^2 ~ P], guesses = [x => +1.0])
prob1 = ODEProblem(sys, [], (0.0, 1.0), [P => 1.0])
prob2 = remake(prob1, p = [P => 4.0])
sol1 = solve(prob1)
sol2 = solve(prob2)
sol1(0; idxs=x) #1.0 OK
sol2(0; idxs=x) #2.0
# Building and solving the initialization system explicitly gives the correct result
initsys = ModelingToolkit.generate_initializesystem(sys)
initsys = structural_simplify(initsys)
initprob = NonlinearProblem(initsys, [t=>0],[P => 1.0])
initsol = solve(initprob)
initsol[x] #1.0
initprob = remake(initprob; p = [P => 4.0])
initsol = solve(initprob)
initsol[x] #2.0 OK fixed on the latest version by that PR. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I want to solve an
ODESystem
for many values of a parameterP
, where the initial value for an unknownx
depends onP
(here I write a nonlinear initialization equation to emphasize the general case wheredefaults
do not suffice):This fails because
remake
(or the followingsolve
) does not resolve the initialization problem. Currently, I am resorting to reconstructing theODEProblem
with new parameters every time, which is very slow.I think there should be an efficient and well-supported way to
remake
and then (re)solve
anODEProblem
, where the full initialization system is also solved before the ODE is integrated.The text was updated successfully, but these errors were encountered: