Skip to content

Commit 728b178

Browse files
authored
Merge pull request #39 from baggepinnen/CSBase
Use ControlSystemsBase for faster load times
2 parents 1da12d0 + a0d0b51 commit 728b178

File tree

5 files changed

+21
-18
lines changed

5 files changed

+21
-18
lines changed

Project.toml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,32 @@ version = "0.1.0"
55

66
[deps]
77
ControlSystemIdentification = "3abffc1c-5106-53b7-b354-a47bfc086282"
8-
ControlSystems = "a6e380b2-a6ca-5380-bf3e-84a91bcd477e"
8+
ControlSystemsBase = "aaaaaaaa-a6ca-5380-bf3e-84a91bcd477e"
99
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1010
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
1111
ModelingToolkitStandardLibrary = "16a59e39-deab-5bd0-87e4-056b12336739"
1212
Optim = "429524aa-4258-5aef-a3af-852621145aeb"
13-
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
1413
RobustAndOptimalControl = "21fd56a4-db03-40ee-82ee-a87907bee541"
1514
SymbolicControlSystems = "886cb795-8fd3-4b11-92f6-8071e46f71c5"
1615
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
1716
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
1817

1918
[compat]
2019
ControlSystemIdentification = "2"
21-
ControlSystems = "1"
2220
ModelingToolkit = "8.18"
2321
ModelingToolkitStandardLibrary = "1.5"
2422
Optim = "1"
2523
OrdinaryDiffEq = "6"
26-
RobustAndOptimalControl = "0.4.12"
27-
SymbolicControlSystems = "0.1.2"
24+
RobustAndOptimalControl = "0.4.13"
25+
SymbolicControlSystems = "0.1.3"
2826
Symbolics = "4.10"
2927
UnPack = "1"
3028
julia = "1.6"
3129

32-
3330
[extras]
31+
ControlSystems = "a6e380b2-a6ca-5380-bf3e-84a91bcd477e"
32+
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
3433
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
3534

3635
[targets]
37-
test = ["Test"]
36+
test = ["Test", "ControlSystems", "OrdinaryDiffEq"]

src/ControlSystemsMTK.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ A third idea: just use named systems with named indexing to obtain any system yo
1616
1717
=#
1818
using LinearAlgebra
19-
using ModelingToolkit, ControlSystems
20-
using ControlSystems: ssdata, AbstractStateSpace, Continuous, nstates, noutputs, ninputs
19+
using ModelingToolkit, ControlSystemsBase
20+
using ControlSystemsBase: ssdata, AbstractStateSpace, Continuous, nstates, noutputs, ninputs
2121
using ControlSystemIdentification
2222
using RobustAndOptimalControl
2323
import ModelingToolkit: ODESystem, FnType, Symbolics
2424
using ModelingToolkit: states, observed, isdifferential
25-
using OrdinaryDiffEq
2625
using ModelingToolkit.Symbolics
2726
using ModelingToolkit.Symbolics: jacobian, solve_for
2827
using UnPack

src/ode_system.jl

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function ModelingToolkit.ODESystem(
2525
u_names = sys.nu == 1 ? [:u] : [Symbol("u$i") for i = 1:sys.nu],
2626
y_names = sys.ny == 1 ? [:y] : [Symbol("y$i") for i = 1:sys.ny],
2727
)
28-
ControlSystems.isdiscrete(sys) && error(
28+
ControlSystemsBase.isdiscrete(sys) && error(
2929
"Discrete systems not yet supported due to https://github.com/SciML/ModelingToolkit.jl/issues?q=is%3Aopen+is%3Aissue+label%3Adiscrete-time",
3030
)
3131
A, B, C, D = ssdata(sys)
@@ -107,14 +107,14 @@ function sconnect(
107107
end
108108

109109
"""
110-
G = ControlSystems.feedback(loopgain::T; name)
110+
G = ControlSystemsBase.feedback(loopgain::T; name)
111111
112112
Form the feedback-interconnection
113113
\$G = L/(1+L)\$
114114
115115
The system `G` will be a new system with `input` and `output` connectors.
116116
"""
117-
function ControlSystems.feedback(
117+
function ControlSystemsBase.feedback(
118118
loopgain::T;
119119
name = Symbol("feedback $(loopgain.name)"),
120120
) where {T<:ModelingToolkit.AbstractTimeDependentSystem}
@@ -154,7 +154,7 @@ end
154154
numeric(x::Num) = x.val
155155

156156

157-
function ControlSystems.ss(
157+
function ControlSystemsBase.ss(
158158
sys::ModelingToolkit.AbstractTimeDependentSystem,
159159
inputs,
160160
outputs,
@@ -205,10 +205,15 @@ function RobustAndOptimalControl.named_ss(
205205
end
206206
matrices, ssys = ModelingToolkit.linearize(sys, inputs, outputs; kwargs...)
207207
symstr(x) = Symbol(string(x))
208+
unames = symstr.(inputs)
209+
if size(matrices.B, 2) == 2length(inputs)
210+
# This indicates that input derivatives are present
211+
unames = [unames; Symbol.("der_" .* string.(unames))]
212+
end
208213
named_ss(
209214
ss(matrices...);
210215
x = symstr.(states(ssys)),
211-
u = symstr.(inputs),
216+
u = unames,
212217
y = symstr.(outputs),
213218
)
214219
end

src/symbolic_optimization.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ end
125125

126126
function enforce_zero_noD!(P, ω)
127127
A, B, C, D = ssdata(P)
128-
Y = ControlSystems.isdiscrete(P) ? (cis* P.Ts) * I - A) \ B :* I - A) \ B
128+
Y = ControlSystemsBase.isdiscrete(P) ? (cis* P.Ts) * I - A) \ B :* I - A) \ B
129129
X = C # dcgain = X*Y
130130
# find smalles dX such that (X + dX)*Y = 0
131131
# dX*Y = -X*Y

test/test_ODESystem.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using ControlSystemsMTK,
2-
ControlSystems, ModelingToolkit, OrdinaryDiffEq, RobustAndOptimalControl
2+
ControlSystemsBase, ModelingToolkit, OrdinaryDiffEq, RobustAndOptimalControl
33
import ModelingToolkitStandardLibrary.Blocks as Blocks
44
conn = ModelingToolkit.connect
55
## Test SISO (single input, single output) system
@@ -137,7 +137,7 @@ x0 = Pair[
137137
p = Pair[]
138138

139139
prob = ODEProblem(simplified_sys, x0, (0.0, 20.0), p, jac = true)
140-
sol = solve(prob, OrdinaryDiffEq.Rodas5(), rtol = 1e-8, atol = 1e-8, saveat = 0:0.01:20)
140+
sol = solve(prob, OrdinaryDiffEq.Rodas5(), saveat = 0:0.01:20)
141141
if isinteractive()
142142
@show sol.retcode
143143
plot(sol, layout = length(states(simplified_sys)) + 1)

0 commit comments

Comments
 (0)