Convex Analysis (Rockafellar, 1970) -- Chapter 03 -- Section 15 -- Part 5

section Chap03section Section15open scoped BigOperatorsopen scoped Pointwiseopen scoped RealInnerProductSpace

The bipolar of a gauge equals the epigraph-closure infimum.

lemma polarGauge_bipolar_eq_kCl {n : } {k : (Fin n ) EReal} (hk : IsGauge k) : let kCl : (Fin n ) EReal := fun x => sInf {μ : EReal | r : , μ = (r : EReal) (x, r) closure (epigraph (S := (Set.univ : Set (Fin n ))) k)} polarGauge (polarGauge k) = kCl := by classical let E₂ := EuclideanSpace (Fin n) let H₂ := WithLp 2 (E₂ × ) let eH := eH_transport_to_H2 n let σ₂ : H₂ H₂ := fun p => WithLp.toLp 2 (- (WithLp.ofLp p).1, (WithLp.ofLp p).2) let S₂ : Set H₂ := eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) k have hkPolar : IsGauge (polarGauge k) := polarGauge_isGauge (k := k) have hT : eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge k) = σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) S₂ : Set H₂) := by ext p constructor · intro hp rcases hp with q, hq, rfl rcases q with xStar, μ have hmem := (epigraph_polarGauge_eq_preimage_innerDualCone_H2 (hk := hk) (xStar := xStar) (μ := μ)).1 hq simpa [E₂, H₂, eH, σ₂, S₂] using hmem · intro hp refine eH p, ?_, by simp have hmem : σ₂ (eH.symm (eH p)) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) := by simpa [E₂, H₂, eH, σ₂, S₂] using hp simpa [E₂, H₂, eH, σ₂, S₂] using (epigraph_polarGauge_eq_preimage_innerDualCone_H2 (hk := hk) (xStar := (eH p).1) (μ := (eH p).2)).2 hmem have hT2 : eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) (eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge k)) : Set H₂) := by ext p constructor · intro hp rcases hp with q, hq, rfl rcases q with xStar, μ have hmem := (epigraph_polarGauge_eq_preimage_innerDualCone_H2 (hk := hkPolar) (xStar := xStar) (μ := μ)).1 hq simpa [E₂, H₂, eH, σ₂] using hmem · intro hp refine eH p, ?_, by simp have hmem : σ₂ (eH.symm (eH p)) (ProperCone.innerDual (E := H₂) (eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge k)) : Set H₂) := by simpa [E₂, H₂, eH, σ₂] using hp simpa [E₂, H₂, eH, σ₂] using (epigraph_polarGauge_eq_preimage_innerDualCone_H2 (hk := hkPolar) (xStar := (eH p).1) (μ := (eH p).2)).2 hmem have hT2' : eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) (σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) S₂ : Set H₂)) : Set H₂) := by simpa [hT] using hT2 have hT2'' : eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂) := by have hcomm : (ProperCone.innerDual (E := H₂) (σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) S₂ : Set H₂)) : Set H₂) = σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂) := by simpa [E₂, H₂, σ₂] using (innerDual_preimage_signflip (n := n) (A := (ProperCone.innerDual (E := H₂) S₂ : Set H₂))) have hpre : σ₂ ⁻¹' (σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂)) = (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂) := by ext p have : σ₂ (σ₂ p) = p := by simpa [E₂, H₂, σ₂] using (signflip_H2_involutive (n := n) (p := p)) simp [Set.preimage_preimage, ] calc eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = σ₂ ⁻¹' (σ₂ ⁻¹' (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂)) := by simpa [hcomm] using hT2' _ = (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂) := hpre have hH2 : eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = closure ((ConvexCone.hull (Set.insert (0 : H₂) S₂) : ConvexCone H₂) : Set H₂) := by calc eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = (ProperCone.innerDual (E := H₂) (ProperCone.innerDual (E := H₂) S₂ : Set H₂) : Set H₂) := hT2'' _ = closure ((ConvexCone.hull (Set.insert (0 : H₂) S₂) : ConvexCone H₂) : Set H₂) := by simpa using (section14_innerDualCone_innerDualCone_eq_closure_coneHull (H := H₂) (s := S₂)) -- `S₂` is already a convex cone containing `0`, so the cone hull is `S₂`. let C2 : ConvexCone H₂ := { carrier := S₂ smul_mem' := by intro c hc p hp rcases hp with q, hq, hqeq refine c q, (epigraph_isConvexCone_of_isGauge hk).smul_mem hc hq, ?_ calc eH.symm (c q) = c eH.symm q := eH.symm.map_smul c q _ = c p := by simp [hqeq] add_mem' := by intro p hp q hq rcases hp with p' : (Fin n ) × , hp', hpeq rcases hq with q' : (Fin n ) × , hq', hqeq refine p' + q', (epigraph_isConvexCone_of_isGauge hk).add_mem hp' hq', ?_ calc eH.symm (p' + q') = eH.symm p' + eH.symm q' := eH.symm.map_add p' q' _ = p + q := by simp [hpeq, hqeq] } have h0 : (0 : H₂) S₂ := by refine ((0 : Fin n ), (0 : )), ?_, ?_ · have h0le : k (0 : Fin n ) (0 : EReal) := by simp [hk.2.2.2] exact (mem_epigraph_univ_iff (f := k) (x := 0) (μ := (0 : ))).2 h0le · exact eH.symm.map_zero have hHull_eq : ((ConvexCone.hull (Set.insert (0 : H₂) S₂) : ConvexCone H₂) : Set H₂) = S₂ := by apply Set.Subset.antisymm · intro x hx have hsub : ConvexCone.hull (Set.insert (0 : H₂) S₂) C2 := (ConvexCone.hull_le_iff (C := C2) (s := Set.insert (0 : H₂) S₂)).2 (by intro y hy rcases (Set.mem_insert_iff).1 hy with rfl | hy' · simpa [C2] using h0 · simpa [C2] using hy') have hx' : x (C2 : Set H₂) := hsub hx simpa [C2] using hx' · intro x hx exact ConvexCone.subset_hull (R := ) (s := Set.insert (0 : H₂) S₂) (Set.mem_insert_of_mem (0 : H₂) hx) have hH2' : eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = closure S₂ := by simpa [hHull_eq] using hH2 have himage : eH '' closure S₂ = closure (eH '' S₂) := by simpa using (eH.toHomeomorph.image_closure (s := S₂)) have himage' : eH '' S₂ = epigraph (S := (Set.univ : Set (Fin n ))) k := by ext p constructor · intro hp rcases hp with u, hu, rfl rcases hu with q, hq, rfl simpa using hq · intro hp refine eH.symm p, ?_, by simp exact p, hp, by simp have hset : epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = closure (epigraph (S := (Set.univ : Set (Fin n ))) k) := by have hpre : epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = eH '' closure S₂ := by ext p constructor · intro hp have hx : eH.symm p eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) := p, hp, rfl have hx' : eH.symm p closure S₂ := by simpa [hH2'] using hx exact eH.symm p, hx', by simp · intro hp rcases hp with u, hu, rfl have hu' : u eH.symm '' epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) := by simpa [hH2'] using hu rcases hu' with p, hp, hpe have hp' : p = eH u := by have := congrArg eH hpe simpa using this simpa [hp'] using hp calc epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = eH '' closure S₂ := hpre _ = closure (eH '' S₂) := himage _ = closure (epigraph (S := (Set.univ : Set (Fin n ))) k) := by simp [himage'] have hclosure : closure (epigraph (S := (Set.univ : Set (Fin n ))) k) = epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by simpa using (closure_epigraph_eq_epigraph_sInf (f := k)).symm have hset' : epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) = epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by simpa [hclosure] using hset have hfun : polarGauge (polarGauge k) = epigraphClosureInf k := by funext x have hle : polarGauge (polarGauge k) x epigraphClosureInf k x := by by_cases htop : epigraphClosureInf k x = · simp [htop] by_cases hbot : epigraphClosureInf k x = · have hleall : μ : , polarGauge (polarGauge k) x (μ : EReal) := by intro μ have hxg : (x, μ) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by refine (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := μ)).2 ?_ simp [hbot] have hxf : (x, μ) epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) := by simpa [hset'] using hxg exact (mem_epigraph_univ_iff (f := polarGauge (polarGauge k)) (x := x) (μ := μ)).1 hxf have hbotf : polarGauge (polarGauge k) x = := ereal_eq_bot_of_le_all_coe hleall simp [hbotf, hbot] · have hxg : (x, (epigraphClosureInf k x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by refine (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := (epigraphClosureInf k x).toReal)).2 ?_ exact EReal.le_coe_toReal htop have hxf : (x, (epigraphClosureInf k x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) := by simpa [hset'] using hxg have hxle : polarGauge (polarGauge k) x ((epigraphClosureInf k x).toReal : EReal) := (mem_epigraph_univ_iff (f := polarGauge (polarGauge k)) (x := x) (μ := (epigraphClosureInf k x).toReal)).1 hxf have hcoe : ((epigraphClosureInf k x).toReal : EReal) = epigraphClosureInf k x := EReal.coe_toReal htop hbot simpa [hcoe] using hxle have hge : epigraphClosureInf k x polarGauge (polarGauge k) x := by by_cases htop : polarGauge (polarGauge k) x = · simp [htop] by_cases hbot : polarGauge (polarGauge k) x = · have hleall : μ : , epigraphClosureInf k x (μ : EReal) := by intro μ have hxf : (x, μ) epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) := by refine (mem_epigraph_univ_iff (f := polarGauge (polarGauge k)) (x := x) (μ := μ)).2 ?_ simp [hbot] have hxg : (x, μ) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by simpa [hset'] using hxf exact (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := μ)).1 hxg have hbotg : epigraphClosureInf k x = := ereal_eq_bot_of_le_all_coe hleall simp [hbotg, hbot] · have hxf : (x, (polarGauge (polarGauge k) x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge (polarGauge k)) := by refine (mem_epigraph_univ_iff (f := polarGauge (polarGauge k)) (x := x) (μ := (polarGauge (polarGauge k) x).toReal)).2 ?_ exact EReal.le_coe_toReal htop have hxg : (x, (polarGauge (polarGauge k) x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by simpa [hset'] using hxf have hxle : epigraphClosureInf k x ((polarGauge (polarGauge k) x).toReal : EReal) := (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := (polarGauge (polarGauge k) x).toReal)).1 hxg have hcoe : ((polarGauge (polarGauge k) x).toReal : EReal) = polarGauge (polarGauge k) x := EReal.coe_toReal htop hbot simpa [hcoe] using hxle exact le_antisymm hle hge have hkCl : (fun x => sInf {μ : EReal | r : , μ = (r : EReal) (x, r) closure (epigraph (S := (Set.univ : Set (Fin n ))) k)}) = epigraphClosureInf k := kCl_eq_epigraphClosureInf (n := n) k simpa [hkCl] using hfun

Theorem 15.1: If Unknown identifier `k`k is a gauge function, then its polar is a closed gauge function and . Moreover, if for some nonempty convex set failed to synthesize HasSubset Type Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.Unknown identifier `C`C ^Unknown identifier `n`n that is absorbing, then agrees with the support function of Unknown identifier `C`C.

In this development, is polarGauge sorry : (Fin ?m.1 ) ERealpolarGauge Unknown identifier `k`k; "closed" is expressed as IsClosed fun x => sorry : PropIsClosed (epigraph Unknown identifier `univ`univ ·); and Unknown identifier `cl`cl k is modeled as the extended-real function whose epigraph is the topological closure of epigraph sorry sorry : Set ((Fin ?m.1 ) × )epigraph Unknown identifier `univ`univ Unknown identifier `k`k.

theorem polarGauge_isGauge_isClosed_and_bipolar_eq_closure_epigraph {n : } {k : (Fin n ) EReal} (hk : IsGauge k) : let kPolar : (Fin n ) EReal := polarGauge k let kCl : (Fin n ) EReal := fun x => sInf {μ : EReal | r : , μ = (r : EReal) (x, r) closure (epigraph (S := (Set.univ : Set (Fin n ))) k)} IsGauge kPolar IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) kPolar) polarGauge kPolar = kCl C : Set (Fin n ), C.Nonempty Convex C ( x : Fin n , r : , 0 r y C, x = r y) k = (fun x => (gaugeFunction C x : EReal)) kPolar = supportFunctionEReal C := by classical dsimp refine ?hGauge, ?hClosed · simpa using (polarGauge_isGauge (k := k)) · refine ?hClosed', ?hRest · simpa using (isClosed_epigraph_polarGauge (k := k) hk) · refine ?hBipolar, ?hSupport · simpa using (polarGauge_bipolar_eq_kCl (k := k) hk) · intro C hCne hCconv hCabs hkC funext xStar have hle : supportFunctionEReal C xStar polarGauge k xStar := by simpa [hkC] using (supportFunctionEReal_le_polarGauge_of_gaugeFunction (C := C) xStar) have hge : polarGauge k xStar supportFunctionEReal C xStar := by simpa [hkC] using (polarGauge_of_gaugeFunction_le_supportFunctionEReal (C := C) hCne hCabs xStar) exact le_antisymm hge hle

A gauge with closed epigraph equals its epigraph-closure infimum.

lemma epigraphClosureInf_eq_of_isGauge_isClosed_epigraph {n : } {k : (Fin n ) EReal} (hk : IsGauge k) (hclosed : IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) k)) : epigraphClosureInf k = k := by classical have hset : epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) = epigraph (S := (Set.univ : Set (Fin n ))) k := by have hclosure : epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) = closure (epigraph (S := (Set.univ : Set (Fin n ))) k) := by simpa using (closure_epigraph_eq_epigraph_sInf (f := k)) simpa [hclosed.closure_eq] using hclosure funext x have hle : epigraphClosureInf k x k x := by by_cases htop : k x = · simp [htop] · have hk_ne_bot : k x := IsGauge.ne_bot hk x have hxk : (x, (k x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) k := by refine (mem_epigraph_univ_iff (f := k) (x := x) (μ := (k x).toReal)).2 ?_ exact EReal.le_coe_toReal htop have hxg : (x, (k x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by simpa [hset] using hxk have hle_toReal : epigraphClosureInf k x ((k x).toReal : EReal) := (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := (k x).toReal)).1 hxg have hcoe : ((k x).toReal : EReal) = k x := EReal.coe_toReal htop hk_ne_bot simpa [hcoe] using hle_toReal have hge : k x epigraphClosureInf k x := by by_cases htop : epigraphClosureInf k x = · simp [htop] · have hbot : epigraphClosureInf k x := by intro hbot have hleall : μ : , epigraphClosureInf k x (μ : EReal) := by intro μ simp [hbot] have hleall' : μ : , k x (μ : EReal) := by intro μ have hxg : (x, μ) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by refine (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := μ)).2 ?_ exact hleall μ have hxk : (x, μ) epigraph (S := (Set.univ : Set (Fin n ))) k := by simpa [hset] using hxg exact (mem_epigraph_univ_iff (f := k) (x := x) (μ := μ)).1 hxk have hkbot : k x = := ereal_eq_bot_of_le_all_coe hleall' exact (IsGauge.ne_bot hk x) hkbot have hxg : (x, (epigraphClosureInf k x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) (epigraphClosureInf k) := by refine (mem_epigraph_univ_iff (f := epigraphClosureInf k) (x := x) (μ := (epigraphClosureInf k x).toReal)).2 ?_ exact EReal.le_coe_toReal htop have hxk : (x, (epigraphClosureInf k x).toReal) epigraph (S := (Set.univ : Set (Fin n ))) k := by simpa [hset] using hxg have hle_toReal : k x ((epigraphClosureInf k x).toReal : EReal) := (mem_epigraph_univ_iff (f := k) (x := x) (μ := (epigraphClosureInf k x).toReal)).1 hxk have hcoe : ((epigraphClosureInf k x).toReal : EReal) = epigraphClosureInf k x := EReal.coe_toReal htop hbot simpa [hcoe] using hle_toReal exact le_antisymm hle hge

Closed gauges are fixed by double polarity.

lemma polarGauge_involutive_of_isGauge_isClosed_epigraph {n : } {k : (Fin n ) EReal} (hk : IsGauge k) (hclosed : IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) k)) : polarGauge (polarGauge k) = k := by have hkCl : (fun x => sInf {μ : EReal | r : , μ = (r : EReal) (x, r) closure (epigraph (S := (Set.univ : Set (Fin n ))) k)}) = epigraphClosureInf k := kCl_eq_epigraphClosureInf (n := n) k have hfun : polarGauge (polarGauge k) = epigraphClosureInf k := (polarGauge_bipolar_eq_kCl (k := k) hk).trans hkCl calc polarGauge (polarGauge k) = epigraphClosureInf k := hfun _ = k := epigraphClosureInf_eq_of_isGauge_isClosed_epigraph hk hclosed

The polar gauge of a closed gauge is again a closed gauge.

lemma polarGauge_mapsTo_closedGauges {n : } {k : (Fin n ) EReal} : (IsGauge k IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) k)) (IsGauge (polarGauge k) IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) (polarGauge k))) := by intro hk refine polarGauge_isGauge (k := k), ?_ simpa using (isClosed_epigraph_polarGauge (k := k) hk.1)

Corollary 15.1.1: The polarity mapping induces a one-to-one symmetric correspondence on the class of all closed gauges on . Two closed convex sets containing the origin are polar to each other if and only if their gauge functions are polar to each other.

theorem polarGauge_bijOn_closedGauges {n : } : Set.BijOn (fun k : (Fin n ) EReal => polarGauge k) {k | IsGauge k IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) k)} {k | IsGauge k IsClosed (epigraph (S := (Set.univ : Set (Fin n ))) k)} := by refine ?hmap, ?hrest · intro k hk exact polarGauge_mapsTo_closedGauges (k := k) hk · refine ?hinj, ?hsurj · intro k1 hk1 k2 hk2 hpol have h1 : polarGauge (polarGauge k1) = k1 := polarGauge_involutive_of_isGauge_isClosed_epigraph hk1.1 hk1.2 have h2 : polarGauge (polarGauge k2) = k2 := polarGauge_involutive_of_isGauge_isClosed_epigraph hk2.1 hk2.2 have hpol' := congrArg polarGauge hpol simpa [h1, h2] using hpol' · intro k hk refine polarGauge k, ?_, ?_ · exact polarGauge_mapsTo_closedGauges (k := k) hk · simpa using (polarGauge_involutive_of_isGauge_isClosed_epigraph hk.1 hk.2)

The polar set is the sublevel set of the support function.

lemma supportFunctionEReal_sublevel_one_eq_polarSet {n : } {C : Set (Fin n )} : {xStar | supportFunctionEReal C xStar (1 : EReal)} = {xStar | x C, (x ⬝ᵥ xStar : ) 1} := by ext xStar; constructor · intro hx exact (section13_supportFunctionEReal_le_coe_iff (C := C) (y := xStar) (μ := (1 : ))).1 hx · intro hx exact (section13_supportFunctionEReal_le_coe_iff (C := C) (y := xStar) (μ := (1 : ))).2 (by simpa using hx)

The polar gauge of a gauge-function equals the support function under absorbing.

lemma polarGauge_gaugeFunction_eq_supportFunctionEReal {n : } {C : Set (Fin n )} (hCne : C.Nonempty) (hCabs : x : Fin n , lam : , 0 lam x (fun y => lam y) '' C) : polarGauge (fun x => (gaugeFunction C x : EReal)) = supportFunctionEReal C := by have hCabs' : x : Fin n , r : , 0 r y C, x = r y := by intro x rcases hCabs x with r, hr0, hxmem rcases hxmem with y, hyC, hxy exact r, hr0, y, hyC, hxy.symm funext xStar apply le_antisymm · exact polarGauge_of_gaugeFunction_le_supportFunctionEReal (C := C) hCne hCabs' xStar · exact supportFunctionEReal_le_polarGauge_of_gaugeFunction (C := C) xStar

The support function is bounded above by the gauge of a polar set.

lemma supportFunctionEReal_le_gaugeFunction_of_polarSet {n : } {C D : Set (Fin n )} (hDabs : x : Fin n , lam : , 0 lam x (fun y => lam y) '' D) (hD : D = {xStar | x C, (x ⬝ᵥ xStar : ) 1}) : xStar : Fin n , supportFunctionEReal C xStar (gaugeFunction D xStar : EReal) := by intro xStar refine (section13_supportFunctionEReal_le_coe_iff (C := C) (y := xStar) (μ := gaugeFunction D xStar)).2 ?_ intro x hxC let S : Set := {r : | 0 r y D, xStar = r y} have hS_nonempty : S.Nonempty := by rcases hDabs xStar with r, hr0, hxmem rcases hxmem with y, hyD, hxy exact r, hr0, y, hyD, hxy.symm have hle : r S, dotProduct x xStar r := by intro r hr rcases hr with hr0, y, hyD, hxy have hyD' : x C, (dotProduct x y : ) 1 := by have : y {xStar | x C, (x ⬝ᵥ xStar : ) 1} := by simpa [hD] using hyD simpa using this have hxy_le : dotProduct x y 1 := hyD' x hxC have hdot : dotProduct x xStar = r * dotProduct x y := by simp [hxy, dotProduct_smul, smul_eq_mul] have hmul : r * dotProduct x y r * 1 := mul_le_mul_of_nonneg_left hxy_le hr0 have hmul' : r * dotProduct x y r := by simpa using hmul simpa [hdot] using hmul' have hxle : dotProduct x xStar sInf S := by exact le_csInf hS_nonempty (by intro r hr; exact hle r hr) simpa [gaugeFunction, S] using hxle

The support function of a polar set agrees with the corresponding gauge function.

lemma supportFunctionEReal_eq_gaugeFunction_of_polarSet {n : } {C D : Set (Fin n )} (hC0 : (0 : Fin n ) C) (hCabs : x : Fin n , lam : , 0 lam x (fun y => lam y) '' C) (hDabs : x : Fin n , lam : , 0 lam x (fun y => lam y) '' D) (hD : D = {xStar | x C, (x ⬝ᵥ xStar : ) 1}) : supportFunctionEReal C = fun xStar => (gaugeFunction D xStar : EReal) := by have hD_sublevel : D = {xStar | supportFunctionEReal C xStar (1 : EReal)} := by calc D = {xStar | x C, (x ⬝ᵥ xStar : ) 1} := hD _ = {xStar | supportFunctionEReal C xStar (1 : EReal)} := by symm exact supportFunctionEReal_sublevel_one_eq_polarSet (C := C) have hCne : C.Nonempty := 0, hC0 have hpol : polarGauge (fun x => (gaugeFunction C x : EReal)) = supportFunctionEReal C := polarGauge_gaugeFunction_eq_supportFunctionEReal (C := C) hCne hCabs have hk : IsGauge (supportFunctionEReal C) := by have hk' : IsGauge (polarGauge (fun x => (gaugeFunction C x : EReal))) := polarGauge_isGauge (k := fun x => (gaugeFunction C x : EReal)) simpa [hpol] using hk' have hk_finite : xStar, supportFunctionEReal C xStar := by intro xStar have hle : supportFunctionEReal C xStar (gaugeFunction D xStar : EReal) := supportFunctionEReal_le_gaugeFunction_of_polarSet (C := C) (D := D) hDabs hD xStar intro htop have hle' : ( : EReal) (gaugeFunction D xStar : EReal) := by calc ( : EReal) = supportFunctionEReal C xStar := htop.symm _ (gaugeFunction D xStar : EReal) := hle have htop' : (gaugeFunction D xStar : EReal) = := (top_le_iff).1 hle' exact (EReal.coe_ne_top (gaugeFunction D xStar)) htop' have hEq : (fun xStar => (gaugeFunction D xStar : EReal)) = supportFunctionEReal C := gaugeFunction_eq_of_convex_nonempty_eq_sublevel (n := n) (k := supportFunctionEReal C) (C := D) hD_sublevel hk hk_finite exact hEq.symm

Corollary 15.1.1 (sets version): Two closed convex absorbing sets containing the origin are polar to each other if and only if their gauge functions are polar to each other.

theorem closed_convex_sets_polar_iff_gaugeFunctions_polar {n : } {C D : Set (Fin n )} (hC_closed : IsClosed C) (hC_conv : Convex C) (hC0 : (0 : Fin n ) C) (hCabs : x : Fin n , lam : , 0 lam x (fun y => lam y) '' C) (hD_closed : IsClosed D) (hD_conv : Convex D) (hD0 : (0 : Fin n ) D) (hDabs : x : Fin n , lam : , 0 lam x (fun y => lam y) '' D) : (D = {xStar | x C, (x ⬝ᵥ xStar : ) 1} C = {x | xStar D, (x ⬝ᵥ xStar : ) 1}) (polarGauge (fun x => (gaugeFunction C x : EReal)) = (fun xStar => (gaugeFunction D xStar : EReal)) polarGauge (fun xStar => (gaugeFunction D xStar : EReal)) = (fun x => (gaugeFunction C x : EReal))) := by constructor · intro hpol rcases hpol with hD, hC have hCne : C.Nonempty := 0, hC0 have hDne : D.Nonempty := 0, hD0 have hCpol : polarGauge (fun x => (gaugeFunction C x : EReal)) = supportFunctionEReal C := polarGauge_gaugeFunction_eq_supportFunctionEReal (C := C) hCne hCabs have hDpol : polarGauge (fun x => (gaugeFunction D x : EReal)) = supportFunctionEReal D := polarGauge_gaugeFunction_eq_supportFunctionEReal (C := D) hDne hDabs have hCD : supportFunctionEReal C = fun xStar => (gaugeFunction D xStar : EReal) := supportFunctionEReal_eq_gaugeFunction_of_polarSet (C := C) (D := D) hC0 hCabs hDabs hD have hC' : C = {xStar | x D, (x ⬝ᵥ xStar : ) 1} := by simpa [dotProduct_comm] using hC have hDC : supportFunctionEReal D = fun x => (gaugeFunction C x : EReal) := supportFunctionEReal_eq_gaugeFunction_of_polarSet (C := D) (D := C) hD0 hDabs hCabs hC' refine ?_, ?_ · calc polarGauge (fun x => (gaugeFunction C x : EReal)) = supportFunctionEReal C := hCpol _ = (fun xStar => (gaugeFunction D xStar : EReal)) := hCD · calc polarGauge (fun xStar => (gaugeFunction D xStar : EReal)) = supportFunctionEReal D := hDpol _ = (fun x => (gaugeFunction C x : EReal)) := hDC · intro hpol rcases hpol with hCD, hDC have hCne : C.Nonempty := 0, hC0 have hDne : D.Nonempty := 0, hD0 have hCpol : polarGauge (fun x => (gaugeFunction C x : EReal)) = supportFunctionEReal C := polarGauge_gaugeFunction_eq_supportFunctionEReal (C := C) hCne hCabs have hDpol : polarGauge (fun x => (gaugeFunction D x : EReal)) = supportFunctionEReal D := polarGauge_gaugeFunction_eq_supportFunctionEReal (C := D) hDne hDabs have hCD' : supportFunctionEReal C = fun xStar => (gaugeFunction D xStar : EReal) := by simpa [hCpol] using hCD have hDC' : supportFunctionEReal D = fun x => (gaugeFunction C x : EReal) := by simpa [hDpol] using hDC have hDset : D = {xStar | supportFunctionEReal C xStar (1 : EReal)} := by have hDsub : D = {xStar | (gaugeFunction D xStar : EReal) (1 : EReal)} := set_eq_gaugeFunction_sublevel_one (n := n) (D := D) hD_closed hD_conv hD0 hDabs simpa [hCD'] using hDsub have hCset : C = {x | supportFunctionEReal D x (1 : EReal)} := by have hCsub : C = {x | (gaugeFunction C x : EReal) (1 : EReal)} := set_eq_gaugeFunction_sublevel_one (n := n) (D := C) hC_closed hC_conv hC0 hCabs simpa [hDC'] using hCsub have hDpolar : D = {xStar | x C, (x ⬝ᵥ xStar : ) 1} := by calc D = {xStar | supportFunctionEReal C xStar (1 : EReal)} := hDset _ = {xStar | x C, (x ⬝ᵥ xStar : ) 1} := by exact supportFunctionEReal_sublevel_one_eq_polarSet (C := C) have hCpolar : C = {x | xStar D, (x ⬝ᵥ xStar : ) 1} := by calc C = {x | supportFunctionEReal D x (1 : EReal)} := hCset _ = {x | xStar D, (x ⬝ᵥ xStar : ) 1} := by simpa [dotProduct_comm] using (supportFunctionEReal_sublevel_one_eq_polarSet (C := D)) exact hDpolar, hCpolar
end Section15end Chap03