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
-
29
1
"""
30
2
LinModel(model::NonLinModel; x=model.x0+model.xop, u=model.uop, d=model.dop)
31
3
120
92
121
93
Linearize `model` and store the result in `linmodel` (in-place).
122
94
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 .
125
97
126
98
# Examples
127
99
```jldoctest
@@ -137,8 +109,8 @@ julia> linearize!(linmodel, model, x=[20.0], u=[0.0]); linmodel.A
137
109
```
138
110
"""
139
111
function 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
142
114
nonlinmodel = model
143
115
buffer = nonlinmodel. buffer
144
116
# --- remove the operating points of the nonlinear model (typically zeros) ---
@@ -147,12 +119,19 @@ function linearize!(
147
119
d0 .= d .- nonlinmodel. dop
148
120
x0 .= x .- nonlinmodel. xop
149
121
# --- 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)
156
135
# --- compute the nonlinear model output at operating points ---
157
136
xnext0, y0 = linmodel. buffer. x, linmodel. buffer. y
158
137
h! (y0, nonlinmodel, x0, d0, model. p)
0 commit comments