@@ -1397,7 +1397,7 @@ function con_nonlinprogeq!(
13971397 mpc:: PredictiveController , model:: NonLinModel , transcription:: TrapezoidalCollocation ,
13981398 U0, Z̃
13991399)
1400- nu, nx̂, nd, nx = model. nu, mpc. estim. nx̂, model. nd, model. nx
1400+ nu, nx̂, nd, nx, nh = model. nu, mpc. estim. nx̂, model. nd, model. nx, transcription . nh
14011401 Hp, Hc = mpc. Hp, mpc. Hc
14021402 nΔU, nX̂ = nu* Hc, nx̂* Hp
14031403 Ts, p = model. Ts, model. p
@@ -1407,12 +1407,12 @@ function con_nonlinprogeq!(
14071407 X̂0_Z̃ = @views Z̃[(nΔU+ 1 ): (nΔU+ nX̂)]
14081408 x̂0 = @views mpc. estim. x̂0[1 : nx̂]
14091409 d0 = @views mpc. d0[1 : nd]
1410- if ! iszero (transcription . nh)
1410+ if ! iszero (nh)
14111411 k1, u0, û0 = @views K0[1 : nx], U0[1 : nu], Û0[1 : nu]
1412- xd , xs = @views x̂0[1 : nx], x̂0[nx+ 1 : end ]
1412+ x0 , xs = @views x̂0[1 : nx], x̂0[nx+ 1 : end ]
14131413 mul! (û0, Cs_u, xs)
14141414 û0 .+ = u0
1415- model. f! (k1, xd , û0, d0, p)
1415+ model. f! (k1, x0 , û0, d0, p)
14161416 lastk2 = k1
14171417 end
14181418 # TODO : allow parallel for loop or threads?
@@ -1422,38 +1422,49 @@ function con_nonlinprogeq!(
14221422 x̂0next = @views X̂0[(1 + nx̂* (j- 1 )): (nx̂* j)]
14231423 x̂0next_Z̃ = @views X̂0_Z̃[(1 + nx̂* (j- 1 )): (nx̂* j)]
14241424 ŝnext = @views geq[(1 + nx̂* (j- 1 )): (nx̂* j)]
1425- xd , xs = @views x̂0[1 : nx], x̂0[nx+ 1 : end ]
1426- xdnext_Z̃ , xsnext_Z̃ = @views x̂0next_Z̃[1 : nx], x̂0next_Z̃[nx+ 1 : end ]
1425+ x0 , xs = @views x̂0[1 : nx], x̂0[nx+ 1 : end ]
1426+ x0next_Z̃ , xsnext_Z̃ = @views x̂0next_Z̃[1 : nx], x̂0next_Z̃[nx+ 1 : end ]
14271427 sdnext, ssnext = @views ŝnext[1 : nx], ŝnext[nx+ 1 : end ]
1428- k1, k2 = @views k0[1 : nx], k0[nx+ 1 : 2 * nx]
1429- if iszero (transcription. nh) # piecewise constant manipulated inputs u:
1428+ k1, k2 = @views k0[1 : nx], k0[nx+ 1 : 2 * nx]
1429+ # ----------------- stochastic defects -----------------------------------------
1430+ xsnext = @views x̂0next[nx+ 1 : end ]
1431+ mul! (xsnext, As, xs)
1432+ ssnext .= @. xsnext - xsnext_Z̃
1433+ # ----------------- deterministic defects --------------------------------------
1434+ if iszero (nh) # piecewise constant manipulated inputs u:
14301435 u0 = @views U0[(1 + nu* (j- 1 )): (nu* j)]
14311436 û0 = @views Û0[(1 + nu* (j- 1 )): (nu* j)]
14321437 mul! (û0, Cs_u, xs) # ys_u(k) = Cs_u*xs(k)
14331438 û0 .+ = u0 # û0(k) = u0(k) + ys_u(k)
1434- model. f! (k1, xd , û0, d0, p)
1435- model. f! (k2, xdnext_Z̃ , û0, d0next, p)
1439+ model. f! (k1, x0 , û0, d0, p)
1440+ model. f! (k2, x0next_Z̃ , û0, d0next, p)
14361441 else # piecewise linear manipulated inputs u:
1437- if j < Hp
1438- u0next = @views U0[(1 + nu* j): (nu* (j+ 1 ))]
1439- û0next = @views Û0[(1 + nu* j): (nu* (j+ 1 ))]
1440- else # u(k+Hp) = u(k+Hp-1) since Hc ≤ Hp implies that Δu(k+Hp)=0
1441- u0next = @views U0[(1 + nu* (j- 1 )): (nu* j)]
1442- û0next = @views Û0[(1 + nu* (j- 1 )): (nu* j)]
1443- end
1442+ k1 .= lastk2
1443+ j == Hp && break # special case, treated after the loop
1444+ u0next = @views U0[(1 + nu* j): (nu* (j+ 1 ))]
1445+ û0next = @views Û0[(1 + nu* j): (nu* (j+ 1 ))]
14441446 mul! (û0next, Cs_u, xsnext_Z̃) # ys_u(k+1) = Cs_u*xs(k+1)
14451447 û0next .+ = u0next # û0(k+1) = u0(k+1) + ys_u(k+1)
1446- k1 .= lastk2
1447- model. f! (k2, xdnext_Z̃, û0next, d0next, p)
1448+ model. f! (k2, x0next_Z̃, û0next, d0next, p)
14481449 lastk2 = k2
1449- end
1450- xsnext = @views x̂0next[nx+ 1 : end ]
1451- mul! (xsnext, As, xs)
1452- sdnext .= @. xd - xdnext_Z̃ + (Ts/ 2 )* (k1 + k2)
1453- ssnext .= @. xsnext - xsnext_Z̃
1450+ end
1451+ sdnext .= @. x0 - x0next_Z̃ + 0.5 * Ts* (k1 + k2)
14541452 x̂0 = x̂0next_Z̃ # using states in Z̃ for next iteration (allow parallel for)
14551453 d0 = d0next
14561454 end
1455+ if ! iszero (nh)
1456+ # j = Hp special case: u(k+Hp-1) = u(k+Hp) since Hc ≤ Hp implies Δu(k+Hp)=0
1457+ x̂0, x̂0next_Z̃ = @views X̂0_Z̃[end - 2 nx̂+ 1 : end - nx̂], X̂0_Z̃[end - nx̂+ 1 : end ]
1458+ k1, k2 = @views K0[end - 2 nx+ 1 : end - nx], K0[end - nx+ 1 : end ] # k1 already filled
1459+ d0next = @views D̂0[end - nd+ 1 : end ]
1460+ û0next, u0next = @views Û0[end - nu+ 1 : end ], U0[end - nu+ 1 : end ] # correspond to u(k+Hp-1)
1461+ x0, x0next_Z̃, xsnext_Z̃ = @views x̂0[1 : nx], x̂0next_Z̃[1 : nx], x̂0next_Z̃[nx+ 1 : end ]
1462+ sdnext = @views geq[end - nx̂+ 1 : end - nx̂+ nx] # ssnext already filled
1463+ mul! (û0next, Cs_u, xsnext_Z̃)
1464+ û0next .+ = u0next
1465+ model. f! (k2, x0next_Z̃, û0next, d0next, p)
1466+ sdnext .= @. x0 - x0next_Z̃ + (Ts/ 2 )* (k1 + k2)
1467+ end
14571468 return geq
14581469end
14591470
0 commit comments