I’ve been trying to get the hang of solving DEs in Julia (i.e. new user). As a simple task, I tried to set up a 1-d Schrödinger equation and perform a time evolution. Here’s my effort so far:
using ModelingToolkit
using MethodOfLines
using DomainSets
@variables t [bounds = (0.0, Inf)]
@variables x [bounds = (-5.0, 5.0)]
@variables ur(..), ui(..)
Dx = Differential(x)
Dt = Differential(t)
equationri = [
Dt(ur(t,x)) ~ -(1/2)*(Dx^2)(ui(t,x)), # real LHS
Dt(ui(t,x)) ~ (1/2)*(Dx^2)(ur(t,x)), # imag LHS
]
domains=[
t ∈ (0.0, Inf),
x ∈ (-5.0,5.0)
]
boundary_conditions=[
ur(0.0,x) ~ cos(x) * exp(-x^2/4) / (2π)^(1/4),
ui(0.0,x) ~ sin(x) * exp(-x^2/4) / (2π)^(1/4),
ur(t,-5.0) ~ 0.0,
ui(t,-5.0) ~ 0.0,
ur(t,5.0) ~ 0.0,
ui(t,5.0) ~ 0.0,
]
@named schro_system = PDESystem(
equationri,
boundary_conditions,
domains,
[t, x],
[ur(t,x), ui(t,x)]
)
dx=0.1
discretization = MOLFiniteDifference([x => dx], t; approx_order = 2)
problem = discretize(schro_system, discretization)
using OrdinaryDiffEq
st=init(problem, Tsit5()) # here we are initialized
# step with `step!(st, 0.05, true)` (don't know why kwarg doesn't work)
# Solution in st.sol
The problem I’m having is that I can not get the solution out of the st.sol ODESolution object. It seems to suggest that it is in the index u, but “u” is undefined. Doing an index of ur(t,x) just gives
ERROR: ArgumentError: ur(t, x) is neither an observed nor a state variable.
which is a somewhat confusing message.
The documentation here seems somewhat lacking. There is some warning about the “old” system for discretising. But the “new” system doesn’t actually seem to work.
So, I guess my questions are: is the above code snippet correct usage? If so, how can I get the solution read out after perfoming forwards integration step?