Adjoint identity for the cost difference of two admissible pairs
ProvedVectorSpaceOpt.adjoint_cost_difference_identityLet , let the dynamics be jointly continuous, and let be an admissible pair on with essentially bounded. Let and be operator-valued and functional-valued coefficient paths along the pair, assumed integrable on ; in the application they are the state derivatives of the dynamics and of the running cost , but only their integrability is used. Let be absolutely continuous on with and satisfy the adjoint equation
for almost every . Then for every admissible pair with the same initial state and an essentially bounded control,
where is the running cost, is the Hamiltonian, and every integrand is evaluated at the time .
This exact identity is the integration by parts behind Luenberger's equation (9). The function is absolutely continuous and vanishes at both endpoints, and the adjoint equation converts its derivative into the linearized-state term. The identity expresses the cost difference as a Hamiltonian difference plus a term of first order in , without any optimality assumption, and is the starting point of every needle-variation argument for the minimum principle.
Formalization Note. The essential bounds on the controls and the joint continuity of guarantee that the Hamiltonian paths are integrable. The coefficient paths and enter only through the adjoint equation and their integrability; no differentiability of or is assumed.
import Definitions.Def_VectorSpaceOpt_optimal_control open Set Filter MeasureTheory open scoped RealInnerProductSpace Topology open VectorSpaceOpt
theorem VectorSpaceOpt.adjoint_cost_difference_identity
{n m : ℕ} (t₀ t₁ : ℝ) (ht : t₀ < t₁)
(F : OCState n → OCControl m → OCState n)
(ell : OCState n → OCControl m → ℝ)
(Fx : OCState n → OCControl m → (OCState n →L[ℝ] OCState n))
(ellx : OCState n → OCControl m → (OCState n →L[ℝ] ℝ))
(Omega : Set (OCControl m)) (xInit : OCState n)
(u₀ : ℝ → OCControl m) (x₀ : ℝ → OCState n)
(hFCont : Continuous (Function.uncurry F))
(hFxPathInt : IntervalIntegrable (fun t => Fx (x₀ t) (u₀ t)) volume t₀ t₁)
(hellxPathInt : IntervalIntegrable (fun t => ellx (x₀ t) (u₀ t)) volume t₀ t₁)
(hu₀Bound : ∃ C : ℝ, ∀ᵐ t ∂volume.restrict (Icc t₀ t₁), ‖u₀ t‖ ≤ C)
(hadm₀ : IsAdmissibleControlPair t₀ t₁ F Omega xInit ell u₀ x₀)
(lambda : ℝ → OCState n)
(hlambdaTerm : lambda t₁ = 0)
(hlambdaAC : AbsolutelyContinuousOnInterval lambda t₀ t₁)
(hadjoint : ∀ᵐ t ∂volume.restrict (Ioo t₀ t₁),
∃ dlambda : OCState n, HasDerivAt lambda dlambda t ∧
∀ h : OCState n,
⟪-dlambda, h⟫ =
⟪lambda t, Fx (x₀ t) (u₀ t) h⟫ + ellx (x₀ t) (u₀ t) h)
(u : ℝ → OCControl m) (x : ℝ → OCState n)
(huBound : ∃ C : ℝ, ∀ᵐ t ∂volume.restrict (Icc t₀ t₁), ‖u t‖ ≤ C)
(hadm : IsAdmissibleControlPair t₀ t₁ F Omega xInit ell u x) :
controlCost t₀ t₁ ell u x - controlCost t₀ t₁ ell u₀ x₀ =
(∫ s in t₀..t₁,
(controlHamiltonian F ell (x s) (u s) (lambda s) -
controlHamiltonian F ell (x₀ s) (u₀ s) (lambda s))) -
∫ s in t₀..t₁,
(⟪lambda s, Fx (x₀ s) (u₀ s) (x s - x₀ s)⟫ +
ellx (x₀ s) (u₀ s) (x s - x₀ s)) := by
sorry