Solving Random Ordinary Differential Equations
In this tutorial we will solve a RODE with NNRODE. Consider the equation:
\[du = f(u,p,t,W)dt\]
where $f(u,p,t,W)=2u\sin(W)$ and $W(t)$ is a Noise process.
f = (u,p,t,W) -> 2u*sin(W)
tspan = (0.00f0, 1.00f0)
u0 = 1.0f0
dt = 1/20f0We start off by defining the NoiseProcess$W(t)$. In this case, we define a simple Gaussian Process. See Noise Processes for defining other types of processes.
W = WienerProcess(0.0,0.0,nothing)Then, we need to define our model. In order to define a model, we can use Flux.chain or DiffEqFlux.FastChain.
chain = Flux.Chain(Dense(2,5,elu),Dense(5,1)) #Model using Fluxchain = FastChain(FastDense(2,50,tanh), FastDense(50,2)) #Model using DiffEqFluxAnd let's define our optimizer function:
opt = ADAM(1e-3)Now, let's pass all the parameters to the algorithm and then call the solver. If we already have some initial parameters, we can pass them into the NNRODE as well.
alg = NNRODE(chain , W , opt , init_params)sol = solve(prob, NeuralPDE.NNRODE(chain,W,opt), dt=dt, verbose = true,
abstol=1e-10, maxiters = 15000)