1-
2- function jacobianA! (A, jb:: JacobianBuffer , model:: SimModel , x, u, d)
3- jb. x .= x; jb. u .= u; jb. d .= d
4- return ForwardDiff. jacobian! (A, jb. f_x!, jb. xnext, jb. x, jb. f_x_cfg)
5- end
6- jacobianA! ( _ , _ , model:: LinModel , _ , _ , _ ) = model. A
7- function jacobianBu! (Bu, jb:: JacobianBuffer , model:: SimModel , x, u, d)
8- jb. x .= x; jb. u .= u; jb. d .= d
9- return ForwardDiff. jacobian! (Bu, jb. f_u!, jb. xnext, jb. u, jb. f_u_cfg)
10- end
11- jacobianBu! ( _ , _ , model:: LinModel , _ , _ , _ ) = model. Bu
12- function jacobianBd! (Bd, jb:: JacobianBuffer , model:: SimModel , x, u, d)
13- jb. x .= x; jb. u .= u; jb. d .= d
14- return ForwardDiff. jacobian! (Bd, jb. f_d!, jb. xnext, jb. d, jb. f_d_cfg)
15- end
16- jacobianBd! ( _ , _ , model:: LinModel , _ , _ , _ ) = model. Bd
17- function jacobianC! (C, jb:: JacobianBuffer , model:: SimModel , x, d)
18- jb. x .= x; jb. d .= d
19- return ForwardDiff. jacobian! (C, jb. h_x!, jb. y, jb. x, jb. h_x_cfg)
20- end
21- jacobianC! ( _ , _ , model:: LinModel , _ , _ ) = model. C
22- function jacobianDd! (Dd, jb:: JacobianBuffer , model:: SimModel , x, d)
23- jb. x .= x; jb. d .= d
24- return ForwardDiff. jacobian! (Dd, jb. h_d!, jb. y, jb. d, jb. h_d_cfg)
25- end
26- jacobianDd! ( _ , _ , model:: LinModel , _ , _ ) = model. Dd
27-
28-
291"""
302 LinModel(model::NonLinModel; x=model.x0+model.xop, u=model.uop, d=model.dop)
313
12092
12193Linearize `model` and store the result in `linmodel` (in-place).
12294
123- The keyword arguments are identical to [`linearize`](@ref). The code is allocation-free if
124- `model` simulations does not allocate .
95+ The keyword arguments are identical to [`linearize`](@ref). The code allocates a small
96+ amount of memory to compute the Jacobians .
12597
12698# Examples
12799```jldoctest
@@ -137,8 +109,8 @@ julia> linearize!(linmodel, model, x=[20.0], u=[0.0]); linmodel.A
137109```
138110"""
139111function linearize! (
140- linmodel:: LinModel , model:: SimModel ; x= model. x0+ model. xop, u= model. uop, d= model. dop
141- )
112+ linmodel:: LinModel{NT} , model:: SimModel ; x= model. x0+ model. xop, u= model. uop, d= model. dop
113+ ) where NT <: Real
142114 nonlinmodel = model
143115 buffer = nonlinmodel. buffer
144116 # --- remove the operating points of the nonlinear model (typically zeros) ---
@@ -147,12 +119,19 @@ function linearize!(
147119 d0 .= d .- nonlinmodel. dop
148120 x0 .= x .- nonlinmodel. xop
149121 # --- compute the Jacobians at linearization points ---
150- jb = nonlinmodel. buffer. jacobian
151- jacobianA! (linmodel. A, jb, nonlinmodel, x0, u0, d0)
152- jacobianBu! (linmodel. Bu, jb, nonlinmodel, x0, u0, d0)
153- jacobianBd! (linmodel. Bd, jb, nonlinmodel, x0, u0, d0)
154- jacobianC! (linmodel. C, jb, nonlinmodel, x0, d0)
155- jacobianDd! (linmodel. Dd, jb, nonlinmodel, x0, d0)
122+ A:: Matrix{NT} , Bu:: Matrix{NT} , Bd:: Matrix{NT} = linmodel. A, linmodel. Bu, linmodel. Bd
123+ C:: Matrix{NT} , Dd:: Matrix{NT} = linmodel. C, linmodel. Dd
124+ xnext0:: Vector{NT} , y0:: Vector{NT} = linmodel. buffer. x, linmodel. buffer. y
125+ myf_x0! (xnext0, x0) = f! (xnext0, nonlinmodel, x0, u0, d0, model. p)
126+ myf_u0! (xnext0, u0) = f! (xnext0, nonlinmodel, x0, u0, d0, model. p)
127+ myf_d0! (xnext0, d0) = f! (xnext0, nonlinmodel, x0, u0, d0, model. p)
128+ myh_x0! (y0, x0) = h! (y0, nonlinmodel, x0, d0, model. p)
129+ myh_d0! (y0, d0) = h! (y0, nonlinmodel, x0, d0, model. p)
130+ ForwardDiff. jacobian! (A, myf_x0!, xnext0, x0)
131+ ForwardDiff. jacobian! (Bu, myf_u0!, xnext0, u0)
132+ ForwardDiff. jacobian! (Bd, myf_d0!, xnext0, d0)
133+ ForwardDiff. jacobian! (C, myh_x0!, y0, x0)
134+ ForwardDiff. jacobian! (Dd, myh_d0!, y0, d0)
156135 # --- compute the nonlinear model output at operating points ---
157136 xnext0, y0 = linmodel. buffer. x, linmodel. buffer. y
158137 h! (y0, nonlinmodel, x0, d0, model. p)
0 commit comments