Documentation

TdafSurface.Common.Euclidean

The Euclidean instantiation shared by every ℝⁿ surface #

Rn n is EuclideanSpace ℝ (Fin n) and pairing n is its own inner product read as a bilinear map. Together they instantiate the backbone's duality theory at a stroke, which is why a textbook written in ℝⁿ can state everything without qualification. Nothing here is tied to one book.

Main definitions #

Main results #

Implementation notes #

A textbook in ℝⁿ identifies a space with its dual, writing x* for a vector of the same space. Both sides of pairing n are Rn n, so the book's * is a naming convention here and not a type distinction. The backbone keeps its two spaces apart precisely so that the general theory cannot use self-duality silently.

References #

@[reducible, inline]
abbrev TdafSurface.Rn (n : ℕ) :

The ambient space of a finite-dimensional real surface: ℝⁿ with its Euclidean structure.

Equations
Instances For
    @[reducible, inline]
    noncomputable abbrev TdafSurface.pairing (n : ℕ) :

    The standard inner product on Rn n, as a bilinear map, which is the form the backbone's duality theory takes. A book that writes ⟨x, x*⟩ for vectors of one space means this. An abbrev, not a def: instance search does not unfold a plain def, and every pairing class the surface needs is stated about innerₗ.

    Equations
    Instances For
      @[simp]
      theorem TdafSurface.pairing_apply {n : ℕ} (x y : Rn n) :
      ((pairing n) x) y = inner ℝ x y
      @[simp]

      The pairing is symmetric, hence its own flip: every backbone statement that asks for B.flip is asking for pairing n again.

      theorem TdafSurface.pairing_comm {n : ℕ} (x y : Rn n) :
      ((pairing n) x) y = ((pairing n) y) x

      The pairing is symmetric. Rockafellar writes a linear system as ⟨aᵢ, x⟩ ≤ αᵢ, with the data on the left; the backbone's B x y puts the variable there.

      theorem TdafSurface.forall_pairing_le_comm {n : ℕ} {ι : Sort u_1} (a : ι → Rn n) (α : ι → ℝ) (x : Rn n) :
      (∀ (i : ι), ((pairing n) (a i)) x ≤ α i) ↔ ∀ (i : ι), ((pairing n) x) (a i) ≤ α i

      A system of weak inequalities read in the book's orientation and in the backbone's.

      theorem TdafSurface.forall_pairing_lt_comm {n : ℕ} {ι : Sort u_1} (a : ι → Rn n) (α : ι → ℝ) (x : Rn n) :
      (∀ (i : ι), ((pairing n) (a i)) x < α i) ↔ ∀ (i : ι), ((pairing n) x) (a i) < α i

      A system of strict inequalities read in the book's orientation and in the backbone's.

      theorem TdafSurface.pairing_eq_sum {n : ℕ} (u v : Rn n) :
      ((pairing n) u) v = ∑ i : Fin n, u.ofLp i * v.ofLp i

      The pairing in coordinates: ⟨u, v⟩ = ∑ᵢ uᵢ vᵢ.

      theorem TdafSurface.pairing_two (u v : Rn 2) :
      ((pairing 2) u) v = u.ofLp 0 * v.ofLp 0 + u.ofLp 1 * v.ofLp 1

      The pairing on ℝ² in coordinates: ⟨u, v⟩ = u₀v₀ + u₁v₁. Rockafellar's counterexamples are two-dimensional almost without exception, and this is the first line of every one of them.

      theorem TdafSurface.continuous_coord {n : ℕ} (i : Fin n) :
      Continuous fun (x : Rn n) => x.ofLp i

      Each coordinate of Rn n is continuous, Rn n being a PiLp 2. A counterexample that cuts a region out of Rn n with coordinate inequalities needs this to see the region is open.

      pairing n separates on the right, which is the hypothesis the backbone's level-set and recession duality asks for in place of a book's y ≠ 0.

      @[reducible, inline]
      noncomputable abbrev TdafSurface.pairingProd (m n : ℕ) :

      The product pairing on Rn m × Rn n, which is what a bifunction from ℝᵐ to ℝⁿ is conjugated against.

      Equations
      Instances For
        @[reducible, inline]
        noncomputable abbrev TdafSurface.pairingAdjoint (m n : ℕ) :

        The sign-flipped product pairing of §30: the one Rockafellar's adjoint F* of a convex bifunction is stated against.

        Equations
        Instances For

          The product pairing is the pairing of Rn (m + n), read through the concatenation of coordinates (euclideanProdEquiv). This is the identification a text in ℝⁿ makes silently whenever it writes a point of ℝᵐ × ℝⁿ as a point of ℝᵐ⁺ⁿ.

          Dimension #

          Module.finrank ℝ (Rn n) = n is finrank_euclideanSpace_fin, which Mathlib does not mark simp; every dimension count the surface states needs it.

          Instance discharge #

          Each example asserts that a class the surface needs is found by instance search with no hypothesis. They are the regression test for the instantiation.

          Rewriting .flip away #

          flip_pairing is a simp lemma, but a .flip inside a conj or a subgradient sits under a binder simp will not always reach.

          The vector picture of a linear function #

          A book writes a linear function on ℝⁿ as ⟨·, b⟩ and quantifies over the vector b; the backbone quantifies over a continuous linear functional, which is what separation produces.

          noncomputable def TdafSurface.linFn {n : ℕ} (b : Rn n) :

          The vector b read as the linear function ⟨·, b⟩.

          Equations
          Instances For
            @[simp]
            theorem TdafSurface.linFn_apply {n : ℕ} (b x : Rn n) :
            (linFn b) x = ((pairing n) x) b
            theorem TdafSurface.linFn_eq_zero_iff {n : ℕ} {b : Rn n} :
            linFn b = 0 ↔ b = 0

            ⟨·, b⟩ is the zero function exactly when b is the zero vector: this is what makes b ≠ 0 and "{x | ⟨x, b⟩ = β} is a hyperplane" the same condition.

            theorem TdafSurface.exists_linFn {n : ℕ} (f : Rn n →L[ℝ] ℝ) :
            ∃ (b : Rn n), linFn b = f

            Every continuous linear function on ℝⁿ is ⟨·, b⟩. This Fréchet–Riesz identification is what lets a surface statement quantify over vectors while its proof quantifies over functionals.

            linFn is the Fréchet–Riesz map, so the surface's vector-to-functional translation and the one the backbone's gradient results are stated against are the same map.

            theorem TdafSurface.toDual_apply_eq_pairing {n : ℕ} (v x : Rn n) :
            ((InnerProductSpace.toDual ℝ (Rn n)) v) x = ((pairing n) x) v

            The Riesz representative of v evaluated at x is the book's ⟨x, v⟩. Every backbone result about HasGradientAt produces the left-hand side, and every surface statement wants the right.

            The canonical adjoint #

            Between arbitrarily paired spaces a transpose need not exist, so the backbone keeps the adjoint as data. On ℝⁿ it is canonical, and isAdjointPair_adjoint already covers innerₗ (Rn n): a surface section writes A* as LinearMap.adjoint A and discharges the hypothesis with it.