Zulip Chat Archive

Stream: Is there code for X?

Topic: Continuous linear maps with closed range


Michael Rothgang (Mar 20 2025 at 12:51):

It seems we really don't have this - or am I missing something?

Michael Rothgang (Mar 20 2025 at 12:51):

@loogle ContinuousLinearMap, IsClosedMap

loogle (Mar 20 2025 at 12:52):

:shrug: nothing found

Michael Rothgang (Mar 20 2025 at 12:52):

@loogle ContinuousLinearMap, "IsClosed" also yields nothing relevant

loogle (Mar 20 2025 at 12:52):

:exclamation:

function expected at
  "IsClosed"
term has type
  String

Yury G. Kudryashov (Mar 20 2025 at 12:53):

What assumptions on the spaces do you have in mind?

Michael Rothgang (Mar 20 2025 at 12:53):

General normed spaces - assuming Banach is fine for my setting.

SΓ©bastien GouΓ«zel (Mar 20 2025 at 12:56):

That's just not true. Consider the inclusion of C1C^1 functions in C0C^0 functions. It is a continuous linear maps, but the range is not closed.

Michael Rothgang (Mar 20 2025 at 12:56):

Never mind: I need further conditions, see https://math.stackexchange.com/questions/26071/when-is-the-image-of-a-linear-operator-closed?noredirect=1.

Michael Rothgang (Mar 20 2025 at 12:56):

Indeed - thanks.

Notification Bot (Mar 20 2025 at 12:56):

Michael Rothgang has marked this topic as resolved.

Jireh Loreaux (Mar 20 2025 at 20:11):

Note, we have docs#AntilipschitzWith.isClosed_range, and docs#ContinuousLinearMap.antilipschitz_of_bound, and docs#ContinuousLinearMap.antilipschitz_of_forall_le_inner_map which may help you out.

Michael Rothgang (Mar 21 2025 at 12:52):

I have now opened #23175 with the result I need: there is one open sorry that eludes me, though. MWE is the following:

import Mathlib.Analysis.Normed.Operator.Banach

variable {π•œ π•œ' : Type*} [NontriviallyNormedField π•œ] [NontriviallyNormedField π•œ']
  {E : Type*} [NormedAddCommGroup E] [NormedSpace π•œ E]
  {F : Type*} [NormedAddCommGroup F] [NormedSpace π•œ' F]
  [CompleteSpace E] [CompleteSpace F]

variable  {Οƒ : π•œ β†’+* π•œ'} {Οƒ' : π•œ' β†’+* π•œ} [RingHomInvPair Οƒ Οƒ'] [RingHomIsometric Οƒ] [RingHomIsometric Οƒ'] [RingHomInvPair Οƒ' Οƒ]

@[simp]
lemma ContinuousLinearMap.equivRange_symm (f : E β†’SL[Οƒ] F) (hinj : Function.Injective f) (hclo : IsClosed (Set.range f)) :
    (f.equivRange hinj hclo).symm.toLinearEquiv =
      (LinearEquiv.ofInjective f.toLinearMap hinj).symm := by
  rfl

@[simp]
lemma ContinuousLinearMap.equivRange_symm_apply (f : E β†’SL[Οƒ] F) (hinj : Function.Injective f) (hclo : IsClosed (Set.range f))
    (x : E) : (f.equivRange hinj hclo).symm ⟨f x, by simp⟩ = x := by
  suffices f ((f.equivRange hinj hclo).symm ⟨f x, by simp⟩) = f x from hinj this
  trans f ((f.equivRange hinj hclo).symm.toLinearEquiv ⟨f x, by simp⟩)
  Β· rfl -- is there an API lemma for this already?
  dsimp only [equivRange_symm]
  --apply LinearEquiv.ofInjective_symm_apply hinj
  set x' : LinearMap.range f := ⟨f x, by simp⟩
  -- rw [LinearEquiv.ofInjective_symm_apply f (h := hinj) x']
  -- #check LinearEquiv.ofInjective_symm_apply f (h := hinj) x'
  -- goal state: f ((LinearEquiv.ofInjective (↑f) hinj).symm x') = f x
  sorry

Michael Rothgang (Mar 21 2025 at 12:53):

LinearEquiv.ofInjective_symm_apply looks like it should help, but trying to apply it makes the kernel think for a long time, and produce an error I don't the reason of. It's probably something relatively simple...

Notification Bot (Mar 21 2025 at 12:54):

Michael Rothgang has marked this topic as unresolved.

Ruben Van de Velde (Mar 21 2025 at 13:02):

Nasty, but works:

import Mathlib.Analysis.Normed.Operator.Banach

variable {π•œ π•œ' : Type*} [NontriviallyNormedField π•œ] [NontriviallyNormedField π•œ']
  {E : Type*} [NormedAddCommGroup E] [NormedSpace π•œ E]
  {F : Type*} [NormedAddCommGroup F] [NormedSpace π•œ' F]
  [CompleteSpace E] [CompleteSpace F]

variable  {Οƒ : π•œ β†’+* π•œ'} {Οƒ' : π•œ' β†’+* π•œ} [RingHomInvPair Οƒ Οƒ'] [RingHomIsometric Οƒ] [RingHomIsometric Οƒ'] [RingHomInvPair Οƒ' Οƒ]

@[simp]
lemma ContinuousLinearMap.equivRange_symm (f : E β†’SL[Οƒ] F) (hinj : Function.Injective f) (hclo : IsClosed (Set.range f)) :
    (f.equivRange hinj hclo).symm.toLinearEquiv =
      (LinearEquiv.ofInjective f.toLinearMap hinj).symm := by
  rfl

@[simp]
lemma ContinuousLinearMap.equivRange_symm_apply (f : E β†’SL[Οƒ] F) (hinj : Function.Injective f) (hclo : IsClosed (Set.range f))
    (x : E) : (f.equivRange hinj hclo).symm ⟨f x, by simp⟩ = x := by
  suffices f ((f.equivRange hinj hclo).symm ⟨f x, by simp⟩) = f x from hinj this
  trans f ((f.equivRange hinj hclo).symm.toLinearEquiv ⟨f x, by simp⟩)
  Β· rfl -- is there an API lemma for this already?
  dsimp only [equivRange_symm]
  --apply LinearEquiv.ofInjective_symm_apply hinj
  set x' : LinearMap.range f := ⟨f x, by simp⟩
  set f' : E β†’β‚›β‚—[Οƒ] F := ↑f
  replace hinj : Function.Injective f' := hinj
  change f' ((LinearEquiv.ofInjective (f') hinj).symm x') = _
  rw [LinearEquiv.ofInjective_symm_apply (f := f') (h := hinj) x']

Michael Rothgang (Mar 21 2025 at 13:21):

Thanks a lot! I've pushed your fix, slightly edited to the PR - which is now ready for review.


Last updated: May 02 2025 at 03:31 UTC