Skip to content

Commit 4b0c849

Browse files
committed
debug: last sdnext after loop for nh=1 (special case)
1 parent 632b909 commit 4b0c849

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

src/controller/transcription.jl

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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-2nx̂+1:end-nx̂], X̂0_Z̃[end-nx̂+1:end]
1458+
k1, k2 = @views K0[end-2nx+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
14581469
end
14591470

0 commit comments

Comments
 (0)