How can we pass two different driving noise processes for an SDEProblem? The goal is to simulate a simple system of SDE’s:
dX(t) = f(X, Y, t)dt + g(X, Y, t)dZ_1(t) + h(X, Y, t)dZ_2(t)
dY(t) = \alpha(Y,t)dt + \beta(Y,t)dZ_2(t)
To exemplify with a concrete example of a process with stochastic volatility:
dX(t) = bdt +Y(t)dZ_1(t) - \rho dZ_2(t)
dY(t) = \eta (\mu - Y(t))dt + dZ_2(t)
Where Z_2(t) is some subordinator (always positive and increasing).
Let’s assume we are using custom noise processes declared using the interface from DiffEqNoiseProcess
, so no possibility of exploring the multivariate properties of Wiener processes. I am using my own noise processes here, let’s call them MyProcess1
for Z_1 and MyProcess2
for Z_2.
Both have completely different properties so I don’t see how to do this without creating a single NoiseProcess
equivalent to Z(t) = [Z_1(t), Z_2(t)], which seems to imply a tremendous amount of juggling to define dist
and bridge
functions that act in different ways on each coordinate.
function f(du,u,p,t)
du[1] = b
du[2] = eta * (mu - u[2])
end
function g(du, u, p ,t)
du[1,1] = u[2]
du[1,2] = -rho
du[2,1] = 0
du[2,2] = 1
end
And then we would define our NoiseProcess in the way that I said above (quite troublesome in practice).
Is there any handier way of doing this? Something similar in principle to:
function g1(du, u, p ,t)
du[1] = u[2]
du[2] = 0
end
function g2(du, u, p ,t)
du[1] = -rho
du[2] = 1
end
SDEProblem(f, g1, g2, u0, tspan; noise=(MyProcess1, MyProcess2))