@@ -1405,6 +1405,14 @@ function con_nonlinprogeq!(
14051405 X̂0_Z̃ = @views Z̃[(nΔU+ 1 ): (nΔU+ nX̂)]
14061406 x̂0 = @views mpc. estim. x̂0[1 : nx̂]
14071407 d0 = @views mpc. d0[1 : nd]
1408+ if ! iszero (transcription. nh)
1409+ k1, u0, û0 = @views K0[1 : nx], U0[1 : nu], Û0[1 : nu]
1410+ xd, xs = @views x̂0[1 : nx], x̂0[nx+ 1 : end ]
1411+ mul! (û0, Cs_u, xs)
1412+ û0 .+ = u0
1413+ model. f! (k1, xd, û0, d0, p)
1414+ lastk2 = k1
1415+ end
14081416 # TODO : allow parallel for loop or threads?
14091417 for j= 1 : Hp
14101418 k0 = @views K0[(1 + nk* (j- 1 )): (nk* j)]
@@ -1424,12 +1432,17 @@ function con_nonlinprogeq!(
14241432 model. f! (k1, xd, û0, d0, p)
14251433 model. f! (k2, xdnext_Z̃, û0, d0next, p)
14261434 else # piecewise linear manipulated inputs u:
1427- u0next = @views U0[(1 + nu* j): (nu* (j+ 1 ))]
1428- û0next = @views U0[(1 + nu* j): (nu* (j+ 1 ))]
1435+ if j < Hp
1436+ u0next = @views U0[(1 + nu* j): (nu* (j+ 1 ))]
1437+ û0next = @views Û0[(1 + nu* j): (nu* (j+ 1 ))]
1438+ else # u(k+Hp) = u(k+Hp-1) since Hc ≤ Hp implies that Δu(k+Hp)=0
1439+ u0next = @views U0[(1 + nu* (j- 1 )): (nu* j)]
1440+ û0next = @views Û0[(1 + nu* (j- 1 )): (nu* j)]
1441+ end
14291442 mul! (û0next, Cs_u, xsnext_Z̃) # ys_u(k+1) = Cs_u*xs(k+1)
14301443 û0next .+ = u0next # û0(k+1) = u0(k+1) + ys_u(k+1)
1431- model. f! (k2, xdnext_Z̃, û0next, d0next, p)
14321444 k1 .= lastk2
1445+ model. f! (k2, xdnext_Z̃, û0next, d0next, p)
14331446 lastk2 = k2
14341447 end
14351448 xsnext = @views x̂0next[nx+ 1 : end ]
0 commit comments