155
155
@test y ≈ zeros (2 ,)
156
156
157
157
linmodel2 = LinModel (sys,Ts,i_d= [3 ])
158
- f2 (x,u,d,_ ) = linmodel2 . A* x + linmodel2 . Bu* u + linmodel2 . Bd* d
159
- h2 (x,d,_ ) = linmodel2 . C* x + linmodel2 . Dd* d
160
- nonlinmodel2 = NonLinModel (f2,h2,Ts,2 ,4 ,2 ,1 ,solver= nothing )
158
+ f2 (x,u,d,model ) = model . A* x + model . Bu* u + model . Bd* d
159
+ h2 (x,d,model ) = model . C* x + model . Dd* d
160
+ nonlinmodel2 = NonLinModel (f2,h2,Ts,2 ,4 ,2 ,1 ,solver= nothing ,p = linmodel2 )
161
161
162
162
@test nonlinmodel2. nx == 4
163
163
@test nonlinmodel2. nu == 2
@@ -172,18 +172,18 @@ end
172
172
nonlinmodel3 = NonLinModel {Float32} (f2,h2,Ts,2 ,4 ,2 ,1 ,solver= nothing )
173
173
@test isa (nonlinmodel3, NonLinModel{Float32})
174
174
175
- function f1! (xnext, x, u, d,_ )
176
- mul! (xnext, linmodel2 . A, x)
177
- mul! (xnext, linmodel2 . Bu, u, 1 , 1 )
178
- mul! (xnext, linmodel2 . Bd, d, 1 , 1 )
175
+ function f1! (xnext, x, u, d, model )
176
+ mul! (xnext, model . A, x)
177
+ mul! (xnext, model . Bu, u, 1 , 1 )
178
+ mul! (xnext, model . Bd, d, 1 , 1 )
179
179
return nothing
180
180
end
181
- function h1! (y, x, d,_ )
182
- mul! (y, linmodel2 . C, x)
183
- mul! (y, linmodel2 . Dd, d, 1 , 1 )
181
+ function h1! (y, x, d, model )
182
+ mul! (y, model . C, x)
183
+ mul! (y, model . Dd, d, 1 , 1 )
184
184
return nothing
185
185
end
186
- nonlinmodel4 = NonLinModel (f1!, h1!, Ts, 2 , 4 , 2 , 1 , solver= nothing )
186
+ nonlinmodel4 = NonLinModel (f1!, h1!, Ts, 2 , 4 , 2 , 1 , solver= nothing , p = linmodel2 )
187
187
xnext, y = similar (nonlinmodel4. x0), similar (nonlinmodel4. yop)
188
188
nonlinmodel4. f! (xnext,[0 ,0 ,0 ,0 ],[0 ,0 ],[0 ],nonlinmodel4. p)
189
189
@test xnext ≈ zeros (4 )
@@ -195,36 +195,37 @@ end
195
195
Bd = reshape ([0 ; 0.5 ], 2 , 1 )
196
196
C = [0.4 0 ]
197
197
Dd = reshape ([0 ], 1 , 1 )
198
- f3 (x, u, d, _) = A* x + Bu* u+ Bd* d
199
- h3 (x, d, _) = C* x + Dd* d
198
+ p= (; A, Bu, Bd, C, Dd)
199
+ f3 (x, u, d, p) = p. A* x + p. Bu* u+ p. Bd* d
200
+ h3 (x, d, p) = p. C* x + p. Dd* d
200
201
solver= RungeKutta (4 )
201
202
@test string (solver) ==
202
203
" 4th order Runge-Kutta differential equation solver with 1 supersamples."
203
- nonlinmodel5 = NonLinModel (f3, h3, 1.0 , 1 , 2 , 1 , 1 , solver= solver)
204
+ nonlinmodel5 = NonLinModel (f3, h3, 1.0 , 1 , 2 , 1 , 1 , solver= solver, p = p )
204
205
xnext, y = similar (nonlinmodel5. x0), similar (nonlinmodel5. yop)
205
206
nonlinmodel5. f! (xnext, [0 ; 0 ], [0 ], [0 ], nonlinmodel5. p)
206
207
@test xnext ≈ zeros (2 )
207
208
nonlinmodel5. h! (y, [0 ; 0 ], [0 ], nonlinmodel5. p)
208
209
@test y ≈ zeros (1 )
209
210
210
- function f2! (ẋ, x, u , d, _ )
211
- mul! (ẋ, A, x)
212
- mul! (ẋ, Bu, u, 1 , 1 )
213
- mul! (ẋ, Bd, d, 1 , 1 )
211
+ function f2! (ẋ, x, u , d, p )
212
+ mul! (ẋ, p . A, x)
213
+ mul! (ẋ, p . Bu, u, 1 , 1 )
214
+ mul! (ẋ, p . Bd, d, 1 , 1 )
214
215
return nothing
215
216
end
216
- function h2! (y, x, d, _ )
217
- mul! (y, C, x)
218
- mul! (y, Dd, d, 1 , 1 )
217
+ function h2! (y, x, d, p )
218
+ mul! (y, p . C, x)
219
+ mul! (y, p . Dd, d, 1 , 1 )
219
220
return nothing
220
221
end
221
- nonlinmodel6 = NonLinModel (f2!, h2!, 1.0 , 1 , 2 , 1 , 1 , solver= RungeKutta ())
222
+ nonlinmodel6 = NonLinModel (f2!, h2!, 1.0 , 1 , 2 , 1 , 1 , solver= RungeKutta (), p = p )
222
223
xnext, y = similar (nonlinmodel6. x0), similar (nonlinmodel6. yop)
223
224
nonlinmodel6. f! (xnext, [0 ; 0 ], [0 ], [0 ], nonlinmodel6. p)
224
225
@test xnext ≈ zeros (2 )
225
226
nonlinmodel6. h! (y, [0 ; 0 ], [0 ], nonlinmodel6. p)
226
227
@test y ≈ zeros (1 )
227
- nonlinemodel7 = NonLinModel (f2!, h2!, 1.0 , 1 , 2 , 1 , 1 , solver= ForwardEuler ())
228
+ nonlinemodel7 = NonLinModel (f2!, h2!, 1.0 , 1 , 2 , 1 , 1 , solver= ForwardEuler (), p = p )
228
229
xnext, y = similar (nonlinemodel7. x0), similar (nonlinemodel7. yop)
229
230
nonlinemodel7. f! (xnext, [0 ; 0 ], [0 ], [0 ], nonlinemodel7. p)
230
231
@test xnext ≈ zeros (2 )
269
270
@testitem " NonLinModel linearization" setup= [SetupMPCtests] begin
270
271
using . SetupMPCtests, ControlSystemsBase, LinearAlgebra, ForwardDiff
271
272
Ts = 1.0
272
- f1 (x,u,d,_) = x.^ 5 + u.^ 4 + d.^ 3
273
- h1 (x,d,_) = x.^ 2 + d
273
+ f1 (x,u,d,_) = x.^ 5 . + u.^ 4 . + d.^ 3
274
+ h1 (x,d,_) = x.^ 2 . + d
274
275
nonlinmodel1 = NonLinModel (f1,h1,Ts,1 ,1 ,1 ,1 ,solver= nothing )
275
276
x, u, d = [2.0 ], [3.0 ], [4.0 ]
276
277
linmodel1 = linearize (nonlinmodel1; x, u, d)
288
289
@test repr (nonlinmodel1. linbuffer) == " LinearizationBuffer object"
289
290
@test repr (nonlinmodel1. linbuffer. buffer_f_at_u_d) == " DifferentiationBuffer with a JacobianConfig"
290
291
291
- f1! (ẋ, x, u, d, _) = (ẋ .= x.^ 5 + u.^ 4 + d.^ 3 ; nothing )
292
- h1! (y, x, d, _) = (y .= x.^ 2 + d; nothing )
292
+ f1! (ẋ, x, u, d, _) = (ẋ .= x.^ 5 . + u.^ 4 . + d.^ 3 ; nothing )
293
+ h1! (y, x, d, _) = (y .= x.^ 2 . + d; nothing )
293
294
nonlinmodel3 = NonLinModel (f1!,h1!,Ts,1 ,1 ,1 ,1 ,solver= RungeKutta ())
294
295
linmodel3 = linearize (nonlinmodel3; x, u, d)
295
296
u0, d0 = u - nonlinmodel3. uop, d - nonlinmodel3. dop
@@ -306,20 +307,23 @@ end
306
307
@test linmodel3. Dd ≈ Dd
307
308
308
309
# test `linearize` at a non-equilibrium point:
309
- N = 5
310
- x, u, d = [0.2 ], [0.0 ], [0.0 ]
311
- Ynl = zeros (N)
312
- Yl = zeros (N)
313
- setstate! (nonlinmodel3, x)
314
- linmodel3 = linearize (nonlinmodel3; x, u, d)
315
- for i= 1 : N
316
- ynl = nonlinmodel3 (d)
317
- global yl = linmodel3 (d)
318
- Ynl[i] = ynl[1 ]
319
- Yl[i] = yl[1 ]
320
- global linmodel3 = linearize (nonlinmodel3; u, d)
321
- updatestate! (nonlinmodel3, u, d)
322
- updatestate! (linmodel3, u, d)
310
+ Ynl, Yl = let nonlinmodel3= nonlinmodel3
311
+ N = 5
312
+ Ynl = zeros (N)
313
+ Yl = zeros (N)
314
+ x, u, d = [0.2 ], [0.0 ], [0.0 ]
315
+ setstate! (nonlinmodel3, x)
316
+ linmodel3 = linearize (nonlinmodel3; x, u, d)
317
+ for i= 1 : N
318
+ ynl = nonlinmodel3 (d)
319
+ yl = linmodel3 (d)
320
+ Ynl[i] = ynl[1 ]
321
+ Yl[i] = yl[1 ]
322
+ linmodel3 = linearize (nonlinmodel3; u, d)
323
+ updatestate! (nonlinmodel3, u, d)
324
+ updatestate! (linmodel3, u, d)
325
+ end
326
+ Ynl, Yl
323
327
end
324
328
@test all (isapprox .(Ynl, Yl, atol= 1e-6 ))
325
329
end
0 commit comments