The Smallest Singular Value as a Nonsingularity Criterion

At a glance

A square real matrix is nonsingular exactly when its smallest singular value is positive. This page proves that fact outright for the matrices the controller cares about, and uses it to close the one remaining assumption of the coordinated-transform invertibility result. That earlier module characterized the singularity-free region given the singular-value criterion as an explicit named hypothesis (hsvd), because Mathlib’s singular-value theory lives on linear maps between inner-product spaces, not on matrices, and no single library lemma packages ”.” Here that hypothesis becomes a theorem: with a genuine smallest singular value in hand, the region result gamma_isUnit_iff_sigmaMinEuclid_pos needs no assumption at all. Lean’s kernel has checked both results end-to-end on the three standard axioms [propext, Classical.choice, Quot.sound], with no sorry and no open assumption.
Links: module index · assumptions ledger · discharges the singular-value assumption of the invertibility result · source giordano2019coordinated · pin tasks/streams/ctrllib/scratch/pin_sigma_min_det.py

Motivation

The controller of the coordinated architecture protects a singularity-free region, the set of configurations where its change of coordinates — the coordinated transform — stays invertible. The invertibility result pinned that region exactly: is invertible precisely when its lower-right block, the circumcentroidal Jacobian , is invertible. But the region the controller actually watches is written with a singular value, not a determinant,

and to connect that set to invertibility the earlier module needed one bridge: that a square real matrix is nonsingular exactly when its smallest singular value is positive. Rather than prove this on the spot, it took the criterion as an explicit hypothesis called hsvd and carried it in plain sight. The reason was pragmatic. Mathlib’s pin (v4.31.0) does carry singular values, but only for linear maps between inner-product spaces — LinearMap.singularValues, defined through the range and rank of the map — and there is no packaged lemma of the shape ” of a matrix is positive iff its determinant is nonzero.” Discharging the criterion means building that bridge by hand.

This page builds it. The idea is not deep — over a field, “smallest singular value positive,” “injective,” and “determinant nonzero” are three names for the same condition on a square matrix — but the formalization has to cross from matrices into the inner-product-space world where singular values are defined, do the antitone bookkeeping that isolates the smallest value, and cross back to the determinant. The payoff is that the region result loses its last assumption: with a genuine smallest singular value substituted for the bare parameter, the characterization of is proved in full.

The objects

Throughout, is a real matrix (J : Matrix (Fin 6) (Fin 6) ℝ). Its singular values are the descending, nonnegative numbers obtained as the square roots of the eigenvalues of . Mathlib supplies these not for the matrix directly but for the associated linear map on Euclidean space, reached through Matrix.toEuclideanLin — the same matrix read as an operator carrying the standard inner product, which is the setting in which “singular value” is even defined. On that operator, LinearMap.singularValues returns an -indexed, nonincreasing, zero-indexed sequence: the six genuine values sit at indices through , and every index beyond holds a junk zero (there are only dimensions to fill).

The smallest of the six genuine values therefore sits at index . This is the object the module defines (sigmaMinEuclid):

where denotes the smallest eigenvalue of the symmetric positive-semidefinite matrix . This is a genuine smallest singular value, not a weaker stand-in: it is exactly what a numerical linear-algebra library returns as the last entry of a singular-value decomposition.

A word on what is concrete and what is generic. The earlier module’s corollary (gamma_isUnit_iff_sigmaMin_pos) took its smallest-singular-value map as a bare, unconstrained function sigmaMin : Matrix (Fin 6) (Fin 6) ℝ → ℝ, so that whatever "" a caller supplies, the conclusion holds provided that caller also proves the criterion. That generic version stays on the shelf for any consumer with its own notion of . What this page adds is one concrete choice, sigmaMinEuclid, for which the criterion is discharged once and for all — the pattern already used to discharge the concrete symmetric-positive-definite operator hypotheses elsewhere in the library: define the concrete object, prove the borrowed fact for it as a theorem, and feed it in.

The two results are:

Theorem (the singular-value criterion). For every real matrix , the smallest singular value is positive if and only if the determinant is nonzero: .

Corollary (the region, with nothing assumed). With that criterion in hand at , the region is exactly the set of configurations at which is invertible — and this now rests on no named hypothesis.

The Singular-Value Criterion (sigmaMinEuclid_pos_iff_det_ne_zero)

Strategy

Work backward from the target . The two sides speak different languages: the left is about a singular value, an analytic object living on an inner-product-space operator; the right is about a determinant, an algebraic object living on the matrix. The classical bridge between them is injectivity. For a square matrix over a field, the following are one and the same condition: the determinant is nonzero, the matrix is invertible, the associated linear map is injective, its kernel is trivial, it has full rank — and its smallest singular value is positive. So the plan is to route from each end to injectivity of the operator and meet in the middle. The technique is a chain of biconditionals; there is no single Mathlib lemma spanning the gap, which is exactly why the criterion had to be assumed before and is proved by composition now.

Two subtleties deserve advance warning, because they are where the formal work concentrates.

Isolating the smallest value. Mathlib’s injectivity criterion for a linear map speaks of all the singular values below the dimension, not just the smallest. So we need to collapse the condition ” all positive” down to the single condition ” positive.” This is where the sequence being nonincreasing (antitone) earns its keep, and we return to it in the proof.

Crossing between matrix and operator. The singular values live on toEuclideanLin J, an operator on -with-inner-product, whereas the determinant lives on the plain matrix. Passing “injective” from one side to the other is a relabeling of coordinates through the ofLp/toLp equivalence between Euclidean space and the plain function space — no mathematical content, but it must be carried out rigorously rather than waved away.

Proof

Let be a real matrix, and write for the operator it induces on Euclidean . We record at the outset that the dimension is fixed, (finrank_euclideanSpace_fin); this number governs which indices carry genuine singular values.

Step 1 — from the smallest singular value to injectivity. Axler’s characterization, formalized as injective_iff_forall_lt_finrank_singularValues_pos (Axler, Linear Algebra Done Right, 7.68(a)), states that is injective if and only if every singular value with index below the dimension is positive:

We claim this whole family of conditions is equivalent to positivity of the single value at index . One direction is immediate: if all six are positive then in particular is. For the other, suppose and let . Because the singular-value sequence is nonincreasing — this is singularValues_antitone, the fact that — and , we have . So the smallest value dominates the argument: its positivity drags every earlier value along with it. This is the antitone collapse, and it is precisely why watching index alone suffices. Combining, we obtain

that is, is injective.

Step 2 — injectivity as a kernel condition, transported to the matrix. A linear map is injective exactly when the only vector it sends to zero is zero itself (injective_iff_map_eq_zero). Reading this for and transporting the statement back across the coordinate relabeling ofLp/toLp — which identifies the operator’s action with the matrix–vector product — turns operator injectivity into a statement about the matrix:

The transport is bookkeeping — toLp sends a plain vector into Euclidean space, ofLp brings it back, and toLpLin_apply says the operator applied to toLp v is toLp (J *ᵥ v) — so a kernel vector on one side is a kernel vector on the other. No inner-product geometry is used here; only that the two spaces are the same set wearing different labels.

Step 3 — the trivial-kernel condition is nonvanishing of the determinant. This is the classical fact that a square homogeneous system has only the zero solution exactly when its coefficient matrix is nonsingular. Mathlib records the contrapositive as exists_mulVec_eq_zero_iff, valid over any integral domain and in particular over : there exists a nonzero with if and only if . Negating both sides, the kernel is trivial if and only if :

Conclusion. Chaining the three equivalences — the smallest singular value positive (Step 1), operator injective and hence trivial kernel (Step 2), determinant nonzero (Step 3) — gives

which is sigmaMinEuclid_pos_iff_det_ne_zero.

What this shows

The moral is that the smallest singular value is not a soft, approximate proxy for nonsingularity — it is an exact detector. A matrix with a positive smallest singular value is invertible; one with a vanishing smallest singular value is singular; there is no grey zone in between. The determinant and the smallest singular value cross zero at exactly the same configurations. What the antitone collapse adds is efficiency: to certify the whole matrix nonsingular one need only inspect a single number, the last singular value, because the sequence being nonincreasing lets that one number vouch for all the others.

The Region, With Nothing Assumed (gamma_isUnit_iff_sigmaMinEuclid_pos)

Strategy

The earlier module already proved, given the singular-value criterion, that positivity of is equivalent to invertibility of . That proof took the criterion as the hypothesis hsvd attached to a bare parameter. We now have the criterion as a theorem for the concrete map sigmaMinEuclid. So there is nothing left to discover: instantiate the earlier corollary at this concrete map and hand it the freshly proved criterion in place of the assumption.

Proof

Apply gamma_isUnit_iff_sigmaMin_pos — the earlier corollary — with the bare parameter chosen to be the concrete map sigmaMinEuclid, and supply for its hypothesis the theorem sigmaMinEuclid_pos_iff_det_ne_zero proved above. The corollary then reads, with no hypothesis remaining,

which is gamma_isUnit_iff_sigmaMinEuclid_pos.

What this shows

The set the controller monitors, , is now known — with no fact taken on trust — to be exactly the region where the coordinated transform is invertible. Every link in the chain has been checked by the kernel: from the smallest singular value of the circumcentroidal block, through the determinant of that block, through the determinant identity to the determinant of the full transform, and out to invertibility of . The singularity detector the controller relies on is, end to end, a theorem.

Scope and limitations

  • This module assumes nothing. It carries no open named hypothesis; both results are proved in full. What it discharges is the hsvd assumption of the invertibility result, moving that fact from the assumed inputs into the checked interior.
  • Concrete, not generic. The discharge is for one specific smallest-singular-value map, sigmaMinEuclid. The earlier bare-parameter corollary (gamma_isUnit_iff_sigmaMin_pos) is deliberately left in place for any consumer that arrives with a different notion of and its own proof of the criterion; this page does not remove it, it complements it. The generic statement stays maximally reusable; the concrete statement is the one the controller uses.
  • Same singular set, not same conditioning. The criterion is about the sign of the smallest singular value, not its size. Nothing here claims that equals ; in general the two matrices are conditioned differently, and the strong empirical rank correlation between them is a separate, weaker statement. This page pins the singular set exactly and says nothing new about how close to singular either matrix is at a given configuration.

Provenance

  • The region and the coordinated transform : the house equation sheet (~/Code/Inspection/GNC/equations/current_sota.md), eq 2.4 and §4.6, transcribing Giordano, Ott & Albu-Schäffer, “Coordinated Control of Spacecraft’s Attitude and End-Effector for Space Robots,” IEEE RA-L 2019 (bibkey giordano2019coordinated), eq 19 / eq 36. The invertibility biconditional this page consumes is the coordinated-transform invertibility result.
  • Singular values of a linear map, and the injectivity criterion: Mathlib’s LinearMap.singularValues and injective_iff_forall_lt_finrank_singularValues_pos (Analysis/InnerProductSpace/SingularValues.lean), formalizing Axler, Linear Algebra Done Right, 7.68(a); the nonincreasing ordering is singularValues_antitone.
  • Matrix read as a Euclidean operator: Matrix.toEuclideanLin (Analysis/InnerProductSpace/PiL2.lean).
  • Nontrivial kernel iff vanishing determinant: Matrix.exists_mulVec_eq_zero_iff over an integral domain (LinearAlgebra/Matrix/ToLinearEquiv.lean).
  • Numerical pre-check of the criterion: (~/Code/tasks/streams/ctrllib/scratch/pin_sigma_min_det.py), 200 random trials, both directions.

Machine verification (#print axioms)

The criterion was pre-checked numerically before formalization. The pin (~/Code/tasks/streams/ctrllib/scratch/pin_sigma_min_det.py) draws 200 random real matrices and exhibits the biconditional with teeth on both sides: a full-rank draw has determinant well away from zero and smallest singular value well away from zero, while a rank-deficient construction — its last row an exact integer combination of the others — has both the determinant and the smallest singular value at zero. The smallest singular value in the pin is exactly NumPy’s last SVD entry, matching the index- definition proved here. All 200 trials pass.

The Lean module SigmaMinDet.lean then proves the two results. Each #print axioms query at the foot of the module reports the same three standard axioms and nothing more — no sorryAx:

Ctrllib.sigmaMinEuclid_pos_iff_det_ne_zero   depends on axioms: [propext, Classical.choice, Quot.sound]
Ctrllib.gamma_isUnit_iff_sigmaMinEuclid_pos  depends on axioms: [propext, Classical.choice, Quot.sound]

The module builds against the Mathlib v4.31.0 pin. Source: (~/Code/vault/lean/SigmaMinDet.lean).