Linear Time Continuous System with Controls
Now we will extend the previous example by adding some exogenous control signals. As always, we will generate some data via OrdinaryDiffEq.jl
using DataDrivenDiffEq
using LinearAlgebra
using OrdinaryDiffEq
using DataDrivenDMD
using Plots
A = [-0.9 0.2; 0.0 -0.2]
B = [0.0; 1.0]
u0 = [10.0; -10.0]
tspan = (0.0, 10.0)
f(u, p, t) = A * u .+ B .* sin(0.5 * t)
sys = ODEProblem(f, u0, tspan)
sol = solve(sys, Tsit5(), saveat = 0.05);We will use the data provided by our problem, but add the control signal U = sin(0.5*t) to it.
X = Array(sol)
t = sol.t
control(u, p, t) = [sin(0.5 * t)]
prob = ContinuousDataDrivenProblem(X, t, U = control)Continuous DataDrivenProblem{Float64} ##DDProblem#290 in 2 dimensions and 201 samples with controlsAnd plot the problems data.
plot(prob)Again, we will use gDMD to estimate the system dynamics. Since we have a control signal defined in the problem, the algorithm will detect it automatically and use gDMDc:
res = solve(prob, DMDSVD(), digits = 1)"DataDrivenSolution{Float64}"We see that the system has been recovered correctly, indicated by the small error and high AIC score of the result. We can confirm this by looking at the resulting Basis And also plot the prediction of the recovered dynamics
plot(res)Copy-Pasteable Code
using DataDrivenDiffEq
using LinearAlgebra
using OrdinaryDiffEq
using DataDrivenDMD
A = [-0.9 0.2; 0.0 -0.2]
B = [0.0; 1.0]
u0 = [10.0; -10.0]
tspan = (0.0, 10.0)
f(u, p, t) = A * u .+ B .* sin(0.5 * t)
sys = ODEProblem(f, u0, tspan)
sol = solve(sys, Tsit5(), saveat = 0.05);
X = Array(sol)
t = sol.t
control(u, p, t) = [sin(0.5 * t)]
prob = ContinuousDataDrivenProblem(X, t, U = control)
res = solve(prob, DMDSVD(), digits = 1)
# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jlThis page was generated using Literate.jl.