Skip to content

Commit 553a2b8

Browse files
committed
option to set all dummy derivatives to zero in linearize
1 parent 79933ea commit 553a2b8

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ julia = "1.6"
8787
[extras]
8888
AmplNLWriter = "7c4d4715-977e-5154-bfe0-e096adeac482"
8989
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
90+
ControlSystemsMTK = "687d7614-c7e5-45fc-bfc3-9ee385575c88"
9091
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
9192
Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9"
9293
Ipopt_jll = "9cc047cb-c261-5740-88fc-0cf96f7bdcc7"
@@ -107,4 +108,4 @@ Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4"
107108
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
108109

109110
[targets]
110-
test = ["AmplNLWriter", "BenchmarkTools", "NonlinearSolve", "ForwardDiff", "Ipopt", "Ipopt_jll", "ModelingToolkitStandardLibrary", "Optimization", "OptimizationOptimJL", "OptimizationMOI", "OrdinaryDiffEq", "Random", "ReferenceTests", "SafeTestsets", "StableRNGs", "Statistics", "SteadyStateDiffEq", "Test", "StochasticDiffEq", "Sundials"]
111+
test = ["AmplNLWriter", "BenchmarkTools", "ControlSystemsMTK", "NonlinearSolve", "ForwardDiff", "Ipopt", "Ipopt_jll", "ModelingToolkitStandardLibrary", "Optimization", "OptimizationOptimJL", "OptimizationMOI", "OrdinaryDiffEq", "Random", "ReferenceTests", "SafeTestsets", "StableRNGs", "Statistics", "SteadyStateDiffEq", "Test", "StochasticDiffEq", "Sundials"]

src/systems/abstractsystem.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,8 +1348,13 @@ end
13481348

13491349
function linearize(sys, inputs, outputs; op = Dict(), t = 0.0,
13501350
allow_input_derivatives = false,
1351+
zero_dummy_der = false,
13511352
kwargs...)
13521353
lin_fun, ssys = linearization_function(sys, inputs, outputs; kwargs...)
1354+
if zero_dummy_der
1355+
dummyder = setdiff(states(ssys), states(sys))
1356+
op = merge(op, Dict(x => 0.0 for x in dummyder))
1357+
end
13531358
linearize(ssys, lin_fun; op, t, allow_input_derivatives), ssys
13541359
end
13551360

test/linearize.jl

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,46 @@ lsys, ssys = linearize(sat, [u], [y]; op = Dict(u => 2))
157157
@test isempty(lsys.B)
158158
@test isempty(lsys.C)
159159
@test lsys.D[] == 0
160+
161+
## Test that dummy_derivatives can be set to zero
162+
using LinearAlgebra
163+
using ModelingToolkit
164+
using ModelingToolkitStandardLibrary
165+
using ModelingToolkitStandardLibrary.Blocks
166+
using ModelingToolkitStandardLibrary.Mechanical.MultiBody2D
167+
using ModelingToolkitStandardLibrary.Mechanical.Translational
168+
using ControlSystemsMTK
169+
using ControlSystemsMTK.ControlSystemsBase
170+
connect = ModelingToolkit.connect
171+
172+
@parameters t
173+
D = Differential(t)
174+
175+
@named link1 = Link(; m = 0.2, l = 10, I = 1, g = -9.807)
176+
@named cart = Translational.Mass(; m = 1, s_0 = 0)
177+
@named fixed = Fixed()
178+
@named force = Force()
179+
180+
eqs = [connect(link1.TX1, cart.flange)
181+
connect(cart.flange, force.flange)
182+
connect(link1.TY1, fixed.flange)]
183+
184+
@named model = ODESystem(eqs, t, [], []; systems = [link1, cart, force, fixed])
185+
def = ModelingToolkit.defaults(model)
186+
def[link1.y1] = 0
187+
def[link1.x1] = 10
188+
def[link1.A] = -pi / 2
189+
def[link1.dA] = 0
190+
def[cart.s] = 0
191+
def[force.flange.v] = 0
192+
lin_outputs = [cart.s, cart.v, link1.A, link1.dA]
193+
lin_inputs = [force.f.u]
194+
195+
G = named_ss(model, lin_inputs, lin_outputs, allow_symbolic = true, op = def,
196+
allow_input_derivatives = true, zero_dummy_der = true)
197+
G = sminreal(G)
198+
G = minreal(G)
199+
ps = poles(G)
200+
201+
@test minimum(abs, ps) < 1e-6
202+
@test minimum(abs, complex(0, 1.3777260367206716) .- ps) < 1e-10

0 commit comments

Comments
 (0)