@@ -108,24 +108,37 @@ julia> linearize!(linmodel, model, x=[20.0], u=[0.0]); linmodel.A
108
108
```
109
109
"""
110
110
function linearize! (
111
- linmodel:: LinModel{NT} , model:: SimModel ; x= model. x0+ model. xop, u= model. uop, d= model. dop
112
- ) where NT<: Real
111
+ linmodel:: LinModel{NT} , model:: SM ; x= model. x0+ model. xop, u= model. uop, d= model. dop
112
+ ) where { NT<: Real , SM <: SimModel{NT} }
113
113
nonlinmodel = model
114
- u0, d0 = u - nonlinmodel. uop, d - nonlinmodel. dop
115
- xnext, y = Vector {NT} (undef, model. nx), Vector {NT} (undef, model. ny)
116
- # --- compute the nonlinear model output at operating points ---
117
- h! (y, nonlinmodel, x, d0)
118
- y .= y .+ nonlinmodel. yop
114
+ buffer = nonlinmodel. buffer
115
+ # --- remove the operating points of the nonlinear model (typically zeros) ---
116
+ x0:: Vector{NT} , u0:: Vector{NT} , d0:: Vector{NT} = buffer. x, buffer. u, buffer. d
117
+ u0 .= u .- nonlinmodel. uop
118
+ d0 .= d .- nonlinmodel. dop
119
+ x0 .= x .- nonlinmodel. xop
119
120
# --- compute the Jacobians at linearization points ---
120
- A, Bu, Bd, C, Dd = linmodel. A, linmodel. Bu, linmodel. Bd, linmodel. C, linmodel. Dd
121
- ForwardDiff. jacobian! (A, (xnext, x) -> f! (xnext, nonlinmodel, x, u0, d0), xnext, x)
122
- ForwardDiff. jacobian! (Bu, (xnext, u0) -> f! (xnext, nonlinmodel, x, u0, d0), xnext, u0)
123
- ForwardDiff. jacobian! (Bd, (xnext, d0) -> f! (xnext, nonlinmodel, x, u0, d0), xnext, d0)
124
- ForwardDiff. jacobian! (C, (y, x) -> h! (y, nonlinmodel, x, d0), y, x)
125
- ForwardDiff. jacobian! (Dd, (y, d0) -> h! (y, nonlinmodel, x, d0), y, d0)
121
+ A:: Matrix{NT} , Bu:: Matrix{NT} , Bd:: Matrix{NT} = linmodel. A, linmodel. Bu, linmodel. Bd
122
+ C:: Matrix{NT} , Dd:: Matrix{NT} = linmodel. C, linmodel. Dd
123
+ xnext0:: Vector{NT} , y0:: Vector{NT} = linmodel. buffer. x, linmodel. buffer. y
124
+ myf_x0! (xnext0, x0) = f! (xnext0, nonlinmodel, x0, u0, d0)
125
+ myf_u0! (xnext0, u0) = f! (xnext0, nonlinmodel, x0, u0, d0)
126
+ myf_d0! (xnext0, d0) = f! (xnext0, nonlinmodel, x0, u0, d0)
127
+ myh_x0! (y0, x0) = h! (y0, nonlinmodel, x0, d0)
128
+ myh_d0! (y0, d0) = h! (y0, nonlinmodel, x0, d0)
129
+ ForwardDiff. jacobian! (A, myf_x0!, xnext0, x0)
130
+ ForwardDiff. jacobian! (Bu, myf_u0!, xnext0, u0)
131
+ ForwardDiff. jacobian! (Bd, myf_d0!, xnext0, d0)
132
+ ForwardDiff. jacobian! (C, myh_x0!, y0, x0)
133
+ ForwardDiff. jacobian! (Dd, myh_d0!, y0, d0)
134
+ # --- compute the nonlinear model output at operating points ---
135
+ h! (y0, nonlinmodel, x0, d0)
136
+ y = y0
137
+ y .= y0 .+ nonlinmodel. yop
126
138
# --- compute the nonlinear model next state at operating points ---
127
- f! (xnext, nonlinmodel, x, u, d)
128
- xnext .+ = nonlinmodel. fop .- nonlinmodel. xop
139
+ f! (xnext0, nonlinmodel, x0, u0, d0)
140
+ xnext = xnext0
141
+ xnext .= xnext0 .+ nonlinmodel. fop .- nonlinmodel. xop
129
142
# --- modify the linear model operating points ---
130
143
linmodel. uop .= u
131
144
linmodel. yop .= y
0 commit comments