@@ -742,6 +742,98 @@ function set_nonlincon!(
742742 return nothing
743743end
744744
745+ @doc raw """
746+ linconstraint!(mpc::PredictiveController, model::LinModel)
747+
748+ Set `b` vector for the linear model inequality constraints (``\m athbf{A Z̃ ≤ b}``).
749+
750+ Also init ``\m athbf{f_x̂} = \m athbf{g_x̂ d_0}(k) + \m athbf{j_x̂ D̂_0} + \m athbf{k_x̂ x̂_0}(k) +
751+ \m athbf{v_x̂ u_0}(k-1) + \m athbf{b_x̂}`` vector for the terminal constraints, see
752+ [`init_predmat`](@ref).
753+ """
754+ function linconstraint! (mpc:: PredictiveController , model:: LinModel , :: TranscriptionMethod )
755+ nU, nΔŨ, nY = length (mpc. con. U0min), length (mpc. con. ΔŨmin), length (mpc. con. Y0min)
756+ nx̂, fx̂ = mpc. estim. nx̂, mpc. con. fx̂
757+ fx̂ .= mpc. con. bx̂
758+ mul! (fx̂, mpc. con. kx̂, mpc. estim. x̂0, 1 , 1 )
759+ mul! (fx̂, mpc. con. vx̂, mpc. estim. lastu0, 1 , 1 )
760+ if model. nd ≠ 0
761+ mul! (fx̂, mpc. con. gx̂, mpc. d0, 1 , 1 )
762+ mul! (fx̂, mpc. con. jx̂, mpc. D̂0, 1 , 1 )
763+ end
764+ n = 0
765+ mpc. con. b[(n+ 1 ): (n+ nU)] .= @. - mpc. con. U0min + mpc. Tu_lastu0
766+ n += nU
767+ mpc. con. b[(n+ 1 ): (n+ nU)] .= @. + mpc. con. U0max - mpc. Tu_lastu0
768+ n += nU
769+ mpc. con. b[(n+ 1 ): (n+ nΔŨ)] .= @. - mpc. con. ΔŨmin
770+ n += nΔŨ
771+ mpc. con. b[(n+ 1 ): (n+ nΔŨ)] .= @. + mpc. con. ΔŨmax
772+ n += nΔŨ
773+ mpc. con. b[(n+ 1 ): (n+ nY)] .= @. - mpc. con. Y0min + mpc. F
774+ n += nY
775+ mpc. con. b[(n+ 1 ): (n+ nY)] .= @. + mpc. con. Y0max - mpc. F
776+ n += nY
777+ mpc. con. b[(n+ 1 ): (n+ nx̂)] .= @. - mpc. con. x̂0min + fx̂
778+ n += nx̂
779+ mpc. con. b[(n+ 1 ): (n+ nx̂)] .= @. + mpc. con. x̂0max - fx̂
780+ if any (mpc. con. i_b)
781+ lincon = mpc. optim[:linconstraint ]
782+ JuMP. set_normalized_rhs (lincon, mpc. con. b[mpc. con. i_b])
783+ end
784+ return nothing
785+ end
786+
787+ " Set `b` excluding predicted output constraints for `NonLinModel` and not `SingleShooting`."
788+ function linconstraint! (mpc:: PredictiveController , :: NonLinModel , :: TranscriptionMethod )
789+ nU, nΔŨ, nY = length (mpc. con. U0min), length (mpc. con. ΔŨmin), length (mpc. con. Y0min)
790+ nx̂, fx̂ = mpc. estim. nx̂, mpc. con. fx̂
791+ fx̂ .= mpc. con. bx̂
792+ mul! (fx̂, mpc. con. kx̂, mpc. estim. x̂0, 1 , 1 )
793+ mul! (fx̂, mpc. con. vx̂, mpc. estim. lastu0, 1 , 1 )
794+ if model. nd ≠ 0
795+ mul! (fx̂, mpc. con. gx̂, mpc. d0, 1 , 1 )
796+ mul! (fx̂, mpc. con. jx̂, mpc. D̂0, 1 , 1 )
797+ end
798+ n = 0
799+ mpc. con. b[(n+ 1 ): (n+ nU)] .= @. - mpc. con. U0min + mpc. Tu_lastu0
800+ n += nU
801+ mpc. con. b[(n+ 1 ): (n+ nU)] .= @. + mpc. con. U0max - mpc. Tu_lastu0
802+ n += nU
803+ mpc. con. b[(n+ 1 ): (n+ nΔŨ)] .= @. - mpc. con. ΔŨmin
804+ n += nΔŨ
805+ mpc. con. b[(n+ 1 ): (n+ nΔŨ)] .= @. + mpc. con. ΔŨmax
806+ n += nΔŨ
807+ mpc. con. b[(n+ 1 ): (n+ nx̂)] .= @. - mpc. con. x̂0min + fx̂
808+ n += nx̂
809+ mpc. con. b[(n+ 1 ): (n+ nx̂)] .= @. + mpc. con. x̂0max - fx̂
810+ if any (mpc. con. i_b)
811+ lincon = mpc. optim[:linconstraint ]
812+ JuMP. set_normalized_rhs (lincon, mpc. con. b[mpc. con. i_b])
813+ end
814+ end
815+
816+ " Also exclude terminal constraints for `NonLinModel` and `SingleShooting`."
817+ function linconstraint! (mpc:: PredictiveController , :: NonLinModel , :: SingleShooting )
818+ nU, nΔŨ = length (mpc. con. U0min), length (mpc. con. ΔŨmin)
819+ n = 0
820+ mpc. con. b[(n+ 1 ): (n+ nU)] .= @. - mpc. con. U0min + mpc. Tu_lastu0
821+ n += nU
822+ mpc. con. b[(n+ 1 ): (n+ nU)] .= @. + mpc. con. U0max - mpc. Tu_lastu0
823+ n += nU
824+ mpc. con. b[(n+ 1 ): (n+ nΔŨ)] .= @. - mpc. con. ΔŨmin
825+ n += nΔŨ
826+ mpc. con. b[(n+ 1 ): (n+ nΔŨ)] .= @. + mpc. con. ΔŨmax
827+ if any (mpc. con. i_b)
828+ lincon = mpc. optim[:linconstraint ]
829+ @views JuMP. set_normalized_rhs (lincon, mpc. con. b[mpc. con. i_b])
830+ end
831+ return nothing
832+ end
833+
834+
835+
836+
745837@doc raw """
746838 linconstrainteq!(
747839 mpc::PredictiveController, model::LinModel, transcription::MultipleShooting
0 commit comments