Skip to content

Commit a47710b

Browse files
authored
Merge pull request #2003 from SciML/fb/lind_dummy_der
option to set all dummy derivatives to zero in `linearize`
2 parents 00f98e1 + dcaa0c4 commit a47710b

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-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
@@ -1362,8 +1362,13 @@ end
13621362

13631363
function linearize(sys, inputs, outputs; op = Dict(), t = 0.0,
13641364
allow_input_derivatives = false,
1365+
zero_dummy_der = false,
13651366
kwargs...)
13661367
lin_fun, ssys = linearization_function(sys, inputs, outputs; kwargs...)
1368+
if zero_dummy_der
1369+
dummyder = setdiff(states(ssys), states(sys))
1370+
op = merge(op, Dict(x => 0.0 for x in dummyder))
1371+
end
13671372
linearize(ssys, lin_fun; op, t, allow_input_derivatives), ssys
13681373
end
13691374

test/linearize.jl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,53 @@ 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+
if VERSION >= v"1.8"
163+
# The call to Link(; m = 0.2, l = 10, I = 1, g = -9.807) hangs forever on Julia v1.6
164+
using LinearAlgebra
165+
using ModelingToolkit
166+
using ModelingToolkitStandardLibrary
167+
using ModelingToolkitStandardLibrary.Blocks
168+
using ModelingToolkitStandardLibrary.Mechanical.MultiBody2D
169+
using ModelingToolkitStandardLibrary.Mechanical.Translational
170+
171+
using ControlSystemsMTK
172+
using ControlSystemsMTK.ControlSystemsBase: sminreal, minreal, poles
173+
connect = ModelingToolkit.connect
174+
175+
@parameters t
176+
D = Differential(t)
177+
178+
@named link1 = Link(; m = 0.2, l = 10, I = 1, g = -9.807)
179+
@named cart = Translational.Mass(; m = 1, s_0 = 0)
180+
@named fixed = Fixed()
181+
@named force = Force()
182+
183+
eqs = [connect(link1.TX1, cart.flange)
184+
connect(cart.flange, force.flange)
185+
connect(link1.TY1, fixed.flange)]
186+
187+
@show @named model = ODESystem(eqs, t, [], []; systems = [link1, cart, force, fixed])
188+
def = ModelingToolkit.defaults(model)
189+
def[link1.y1] = 0
190+
def[link1.x1] = 10
191+
def[link1.A] = -pi / 2
192+
def[link1.dA] = 0
193+
def[cart.s] = 0
194+
def[force.flange.v] = 0
195+
lin_outputs = [cart.s, cart.v, link1.A, link1.dA]
196+
lin_inputs = [force.f.u]
197+
198+
@info "named_ss"
199+
G = named_ss(model, lin_inputs, lin_outputs, allow_symbolic = true, op = def,
200+
allow_input_derivatives = true, zero_dummy_der = true)
201+
G = sminreal(G)
202+
@info "minreal"
203+
G = minreal(G)
204+
@info "poles"
205+
ps = poles(G)
206+
207+
@test minimum(abs, ps) < 1e-6
208+
@test minimum(abs, complex(0, 1.3777260367206716) .- ps) < 1e-10
209+
end

0 commit comments

Comments
 (0)