Linear Subspaces
We provide built-in data structures to work with (affine) linear subspaces $L$ where $L$ can be represented in either extrinsic coordinates $x$ with $L = \{ x | Ax = b \}$ or in intrinsic coordinates $u$ with $L = \{ Bu+p | u \}$.
Coordinates
To specify which coordinates are given / expected the following can be used:
HomotopyContinuation.Coordinates — TypeCoordinatesA type used for encoding the used coordinates and for performing coordinate changes.
Currently supported coordinates are:
HomotopyContinuation.Intrinsic — ConstantIntrinsic <: CoordinatesIndicates the use of the intrinsic description of an (affine) linear subspace. See also IntrinsicDescription.
HomotopyContinuation.Extrinsic — ConstantExtrinsic <: CoordinatesIndicates the use of the extrinsic description of an (affine) linear subspace. See also ExtrinsicDescription.
Constructors
HomotopyContinuation.LinearSubspace — TypeLinearSubspace(A, b)An $m$-dimensional (affine) linear subspace $L$ in $n$-dimensional space given by the extrinsic description $L = \{ x | A x = b \}$.
julia> A = LinearSubspace([1 0 3; 2 1 3], [5, -2])
1-dim. (affine) linear subspace {x|Ax=b} with eltype Float64:
A:
2×3 Array{Float64,2}:
1.0 0.0 3.0
2.0 1.0 3.0
b:
2-element Array{Float64,1}:
5.0
-2.0
julia> dim(A)
1
julia> codim(A)
2
julia> ambient_dim(A)
3A LinearSubspace holds always its extrinsic description, see also ExtrinsicDescription, as well as its intrinsic description, see IntrinsicDescription.
julia> intrinsic(A)
IntrinsicDescription{Float64}:
A:
3×1 Array{Float64,2}:
-0.6882472016116853
0.6882472016116853
0.22941573387056186
b₀:
3-element Array{Float64,1}:
-3.0526315789473677
-3.947368421052632
2.684210526315789A LinearSubspace can be evaluated with either using Intrinsic or Extrinsic coordinates.
julia> u = [0.5]
1-element Array{Float64,1}:
0.5
julia> x = A(u, Intrinsic)
3-element Array{Float64,1}:
-3.3967551797532103
-3.6032448202467893
2.79891839325107
julia> A(x, Extrinsic)
2-element Array{Float64,1}:
0.0
0.0To change the used coordinates you can use coord_change.
julia> coord_change(A, Extrinsic, Intrinsic, x)
1-element Array{Float64,1}:
0.49999999999999994HomotopyContinuation.ExtrinsicDescription — TypeExtrinsicDescription(A, b)Extrinsic description of an $m$-dimensional (affine) linear subspace $L$ in $n$-dimensional space. That is $L = \{ x | A x = b \}$. Note that internally A and b will be stored such that the rows of A are orthonormal.
HomotopyContinuation.IntrinsicDescription — TypeIntrinsicDescription(A, b₀)Intrinsic description of an $m$-dimensional (affine) linear subspace $L$ in $n$-dimensional space. That is $L = \{ u | A u + b₀ \}$. Here, $A$ and $b₀$ are in orthogonal coordinates. That is, the columns of $A$ are orthonormal and $A' b₀ = 0$.
Functions
HomotopyContinuation.ambient_dim — Functionambient_dim(A::LinearSubspace)Dimension of ambient space of the (affine) linear subspace A.
HomotopyContinuation.codim — Functioncodim(A::ExtrinsicDescription)Codimension of the (affine) linear subspace A.
codim(A::IntrinsicDescription)Codimension of the (affine) linear subspace A.
codim(A::LinearSubspace)Codimension of the (affine) linear subspace A.
codim(W::WitnessSet)The dimension of the algebraic set encoded by the witness set.
HomotopyContinuation.coord_change — Functioncoord_change(A::LinearSubspace, C₁::Coordinates, C₂::Coordinates, p)Given an (affine) linear subspace A and a point p in coordinates C₁ compute the point x describing p in coordinates C₂.
Example
julia> A = LinearSubspace([1 0 3; 2 1 3], [5, -2]);
julia> u = [1.25];
julia> x = coord_change(A, Intrinsic, Extrinsic, u)
3-element Array{Float64,1}:
-3.9129405809619744
-3.087059419038025
2.9709801936539915
julia> A(x, Extrinsic)
2-element Array{Float64,1}:
0.0
0.0
julia> x - A(u, Intrinsic)
3-element Array{Float64,1}:
0.0
0.0
0.0HomotopyContinuation.dim — Functiondim(A::ExtrinsicDescription)Dimension of the (affine) linear subspace A.
dim(A::IntrinsicDescription)Dimension of the (affine) linear subspace A.
dim(A::LinearSubspace)Dimension of the (affine) linear subspace A.
dim(W::WitnessSet)The dimension of the algebraic set encoded by the witness set.
HomotopyContinuation.intrinsic — Functionintrinsic(A::LinearSubspace)Obtain the intrinsic description of A, see also IntrinsicDescription.
HomotopyContinuation.is_linear — Functionis_linear(L::LinearSubspace)Returns true if the space is proper linear subspace, i.e., described by `L = { x | Ax = 0 }.
HomotopyContinuation.extrinsic — Functionextrinsic(A::LinearSubspace)Obtain the extrinsic description of A, see also ExtrinsicDescription.
HomotopyContinuation.geodesic — Functiongeodesic(A::LinearSubspace, B::LinearSubspace)Returns the geodesic $γ(t)$ connecting A and B in the Grassmanian $Gr(k+1,n+1)$ where $k$ is the dimension of $A$ and $n$ is the ambient dimension. See also Corollary 4.3 in [LKK19].
HomotopyContinuation.geodesic_distance — Functiongeodesic_distance(A::LinearSubspace, B::LinearSubspace)Compute the geodesic distance between A and B in the affine Grassmanian Graff(k, n) where k = dim(A) and n is the amebient dimension. This follows the derivation in [LKK19].
HomotopyContinuation.rand_subspace — Functionrand_subspace(n::Integer; dim | codim, affine = true, real = false)Generate a random LinearSubspace with given dimension dim or codimension codim (one of them has to be provided) in ambient space of dimension n. If real is true, then the extrinsic description is real. If affine then an affine linear subspace is generated. The subspace is generated by drawing each entry of the extrinsic description indepdently from a normal distribuation using randn.
rand_subspace(x::AbstractVector; dim | codim, affine = true)Generate a random LinearSubspace with given dimension dim or codimension codim (one of them has to be provided) in ambient space of dimension length(x) going through the given point x.
Example
Construction of a general random subspace:
julia> rand_subspace(3; dim = 1)
1-dim. (affine) linear subspace {x|Ax=b} with eltype Complex{Float64}:
A:
2×3 Array{Complex{Float64},2}:
-1.73825+1.27987im -0.0871343+0.840408im -0.551957+0.106397im
-0.597132-0.343965im -0.122543-0.172715im -1.04949+0.370917im
b:
2-element Array{Complex{Float64},1}:
0.47083334430689394 + 0.8099804422599071im
-0.12018696822943896 + 0.11723026326952792im
julia> rand_subspace(4; codim = 1)
3-dim. (affine) linear subspace {x|Ax=b} with eltype Complex{Float64}:
A:
1×4 Array{Complex{Float64},2}:
0.345705+0.0893881im -0.430867-0.663249im 0.979969-0.569378im -0.29722-0.192493im
b:
1-element Array{Complex{Float64},1}:
0.7749708228192062 + 0.9762873764567546imHomotopyContinuation.translate — Functiontranslate(L::LinearSubspace, δb, ::Coordinates = Extrinsic)Translate the (affine) linear subspace L by δb.
Base.intersect — MethodBase.intersect(L₁::LinearSubspace, L₂::LinearSubspace)Intersect the two given linear subspaces. Throws an ErrorException if the intersection is the sum of the codimensions is larger than the ambient dimension.
- LKK19Lim, Lek-Heng, Ken Sze-Wai Wong, and Ke Ye. "Numerical algorithms on the affine Grassmannian." SIAM Journal on Matrix Analysis and Applications 40.2 (2019): 371-393
- LKK19Lim, Lek-Heng, Ken Sze-Wai Wong, and Ke Ye. "Numerical algorithms on the affine Grassmannian." SIAM Journal on Matrix Analysis and Applications 40.2 (2019): 371-393.