155155 @test y ≈ zeros (2 ,)
156156
157157 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 )
161161
162162 @test nonlinmodel2. nx == 4
163163 @test nonlinmodel2. nu == 2
@@ -172,18 +172,18 @@ end
172172 nonlinmodel3 = NonLinModel {Float32} (f2,h2,Ts,2 ,4 ,2 ,1 ,solver= nothing )
173173 @test isa (nonlinmodel3, NonLinModel{Float32})
174174
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 )
179179 return nothing
180180 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 )
184184 return nothing
185185 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 )
187187 xnext, y = similar (nonlinmodel4. x0), similar (nonlinmodel4. yop)
188188 nonlinmodel4. f! (xnext,[0 ,0 ,0 ,0 ],[0 ,0 ],[0 ],nonlinmodel4. p)
189189 @test xnext ≈ zeros (4 )
@@ -195,36 +195,37 @@ end
195195 Bd = reshape ([0 ; 0.5 ], 2 , 1 )
196196 C = [0.4 0 ]
197197 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
200201 solver= RungeKutta (4 )
201202 @test string (solver) ==
202203 " 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 )
204205 xnext, y = similar (nonlinmodel5. x0), similar (nonlinmodel5. yop)
205206 nonlinmodel5. f! (xnext, [0 ; 0 ], [0 ], [0 ], nonlinmodel5. p)
206207 @test xnext ≈ zeros (2 )
207208 nonlinmodel5. h! (y, [0 ; 0 ], [0 ], nonlinmodel5. p)
208209 @test y ≈ zeros (1 )
209210
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 )
214215 return nothing
215216 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 )
219220 return nothing
220221 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 )
222223 xnext, y = similar (nonlinmodel6. x0), similar (nonlinmodel6. yop)
223224 nonlinmodel6. f! (xnext, [0 ; 0 ], [0 ], [0 ], nonlinmodel6. p)
224225 @test xnext ≈ zeros (2 )
225226 nonlinmodel6. h! (y, [0 ; 0 ], [0 ], nonlinmodel6. p)
226227 @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 )
228229 xnext, y = similar (nonlinemodel7. x0), similar (nonlinemodel7. yop)
229230 nonlinemodel7. f! (xnext, [0 ; 0 ], [0 ], [0 ], nonlinemodel7. p)
230231 @test xnext ≈ zeros (2 )
269270@testitem " NonLinModel linearization" setup= [SetupMPCtests] begin
270271 using . SetupMPCtests, ControlSystemsBase, LinearAlgebra, ForwardDiff
271272 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
274275 nonlinmodel1 = NonLinModel (f1,h1,Ts,1 ,1 ,1 ,1 ,solver= nothing )
275276 x, u, d = [2.0 ], [3.0 ], [4.0 ]
276277 linmodel1 = linearize (nonlinmodel1; x, u, d)
288289 @test repr (nonlinmodel1. linbuffer) == " LinearizationBuffer object"
289290 @test repr (nonlinmodel1. linbuffer. buffer_f_at_u_d) == " DifferentiationBuffer with a JacobianConfig"
290291
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 )
293294 nonlinmodel3 = NonLinModel (f1!,h1!,Ts,1 ,1 ,1 ,1 ,solver= RungeKutta ())
294295 linmodel3 = linearize (nonlinmodel3; x, u, d)
295296 u0, d0 = u - nonlinmodel3. uop, d - nonlinmodel3. dop
@@ -306,20 +307,23 @@ end
306307 @test linmodel3. Dd ≈ Dd
307308
308309 # 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
323327 end
324328 @test all (isapprox .(Ynl, Yl, atol= 1e-6 ))
325329end
0 commit comments