Skip to content

Commit be9eb0d

Browse files
committed
added: linearize NonLinModel with ForwardDiff
1 parent fa48d81 commit be9eb0d

File tree

5 files changed

+44
-8
lines changed

5 files changed

+44
-8
lines changed

docs/src/public/sim_model.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,9 @@ NonLinModel
3434
```@docs
3535
setop!
3636
```
37+
38+
## Linearize
39+
40+
```@docs
41+
linearize
42+
```

src/ModelPredictiveControl.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ using PreallocationTools
1111
import OSQP, Ipopt
1212

1313

14-
export SimModel, LinModel, NonLinModel, setop!, setstate!, updatestate!, evaloutput
14+
export SimModel, LinModel, NonLinModel
15+
export setop!, setstate!, updatestate!, evaloutput, linearize
1516
export StateEstimator, InternalModel, Luenberger
1617
export SteadyKalmanFilter, KalmanFilter, UnscentedKalmanFilter, ExtendedKalmanFilter
1718
export default_nint, initstate!

src/model/conversion.jl renamed to src/model/linearization.jl

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11

2-
@doc raw"""
2+
"""
33
LinModel(model::NonLinModel; x=model.x, u=model.uop, d=model.dop)
44
5+
Call [`linearize(model; x, u, d)`](@ref) and return the resulting linear model.
6+
```
7+
"""
8+
LinModel(model::NonLinModel; kwargs...) = linearize(model; kwargs...)
9+
10+
@doc raw"""
11+
linearize(model::NonLinModel; x=model.x, u=model.uop, d=model.dop)
12+
513
Linearize `model` around the operating points `x`, `u` and `d`.
614
715
The arguments `x`, `u` and `d` are the linearization points for the state ``\mathbf{x}``,
@@ -11,14 +19,16 @@ Jacobians of ``\mathbf{f}`` and ``\mathbf{h}`` functions are automatically compu
1119
1220
## Examples
1321
```jldoctest
14-
julia> model = NonLinModel((x,u,_)->x.^3+u, (x,_)->x, 0.1, 1, 1, 1);
22+
julia> model = NonLinModel((x,u,_)->x.^3 + u, (x,_)->x, 0.1, 1, 1, 1);
23+
24+
julia> linmodel = linearize(model, x=[10.0], u=[0.0]);
1525
16-
julia> linmodel = LinModel(model, x=[1.0]); linmodel.A
26+
julia> linmodel.A
1727
1×1 Matrix{Float64}:
18-
3.0
28+
300.0
1929
```
2030
"""
21-
function LinModel(model::NonLinModel; x=model.x, u=model.uop, d=model.dop)
31+
function linearize(model::NonLinModel; x=model.x, u=model.uop, d=model.dop)
2232
nu, nx, ny, nd = model.nu, model.nx, model.ny, model.nd
2333
u0, d0 = u - model.uop, d - model.dop
2434
y = model.h(x, d0) + model.yop

src/sim_model.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,4 @@ evaloutput(model::SimModel, d=empty(model.x)) = h(model, model.x, d - model.dop)
169169

170170
include("model/linmodel.jl")
171171
include("model/nonlinmodel.jl")
172-
include("model/conversion.jl")
172+
include("model/linearization.jl")

test/test_sim_model.jl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ end
9797
@test_throws DimensionMismatch evaloutput(linmodel1, zeros(1))
9898
end
9999

100-
101100
@testset "NonLinModel construction" begin
102101
linmodel1 = LinModel(sys,Ts,i_u=[1,2])
103102
f1(x,u,_) = linmodel1.A*x + linmodel1.Bu*u
@@ -147,4 +146,24 @@ end
147146

148147
@test_throws DimensionMismatch updatestate!(nonlinmodel, zeros(2), zeros(1))
149148
@test_throws DimensionMismatch evaloutput(nonlinmodel, zeros(1))
149+
end
150+
151+
@testset "NonLinModel linearization" begin
152+
Ts = 0.1
153+
f1(x,u,d) = x.^5 + u.^4 + d.^3
154+
h1(x,d) = x.^2 + d
155+
nonlinmodel1 = NonLinModel(f1,h1,0.1,1,1,1,1)
156+
x, u, d = [2.0], [3.0], [4.0]
157+
linmodel1 = linearize(nonlinmodel1; x, u, d)
158+
@test linmodel1.A 5*x.^4
159+
@test linmodel1.Bu 4*u.^3
160+
@test linmodel1.Bd 3*d.^2
161+
@test linmodel1.C 2*x.^1
162+
@test linmodel1.Dd 1*d.^0
163+
linmodel2 = LinModel(nonlinmodel1; x, u, d)
164+
@test linmodel1.A linmodel2.A
165+
@test linmodel1.Bu linmodel2.Bu
166+
@test linmodel1.Bd linmodel2.Bd
167+
@test linmodel1.C linmodel2.C
168+
@test linmodel1.Dd linmodel2.Dd
150169
end

0 commit comments

Comments
 (0)