Skip to content

Commit d169c6a

Browse files
authored
eigs for EigenSystem (#247)
* eigs for EigenSystem * don't import iterate
1 parent fcfe37c commit d169c6a

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunOrthogonalPolynomials"
22
uuid = "b70543e2-c0d9-56b8-a290-0d4d6d4de211"
3-
version = "0.6.27"
3+
version = "0.6.28"
44

55
[deps]
66
ApproxFunBase = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"

src/ApproxFunOrthogonalPolynomials.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import ApproxFunBase: Fun, SubSpace, WeightSpace, NoSpace, HeavisideSpace,
4444
ℓ⁰, recα, recβ, recγ, ℵ₀, ∞, RectDomain,
4545
assert_integer, supportsinplacetransform, ContinuousSpace, SpecialEvalPtType,
4646
isleftendpoint, isrightendpoint, evaluation_point, boundaryfn, ldiffbc, rdiffbc,
47-
LeftEndPoint, RightEndPoint, normalizedspace, promotedomainspace
47+
LeftEndPoint, RightEndPoint, normalizedspace, promotedomainspace, eigs
4848

4949
import DomainSets: Domain, indomain, UnionDomain, FullSpace, Point,
5050
Interval, ChebyshevInterval, boundary, rightendpoint, leftendpoint,
@@ -82,7 +82,7 @@ import SpecialFunctions: erfcx, dawson,
8282

8383
using StaticArrays: SVector
8484

85-
import LinearAlgebra: isdiag, eigvals
85+
import LinearAlgebra: isdiag, eigvals, eigen
8686

8787
points(d::IntervalOrSegmentDomain{T},n::Integer) where {T} =
8888
_maybefromcanonical(d, chebyshevpoints(float(real(eltype(T))), n)) # eltype to handle point

src/symeigen.jl

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ SkewSymmetricEigensystem
4646

4747
for SET in (:SymmetricEigensystem, :SkewSymmetricEigensystem)
4848
@eval begin
49-
struct $SET{LT,QT} <: EigenSystem
49+
struct $SET{LT,QST} <: EigenSystem
5050
L :: LT
51-
Q :: QT
51+
QS :: QST
5252

5353
function $SET(L, B, ::Type{QST} = QuotientSpace) where {QST}
5454
L2, B2 = promotedomainspace((L, B))
@@ -57,19 +57,18 @@ for SET in (:SymmetricEigensystem, :SkewSymmetricEigensystem)
5757
end
5858

5959
QS = QST(B2)
60-
S = domainspace(L2)
61-
Q = Conversion(QS, S)
62-
new{typeof(L2),typeof(Q)}(L2, Q)
60+
new{typeof(L2),typeof(QS)}(L2, QS)
6361
end
6462
end
6563
end
6664
end
6765

6866
function basis_recombination(SE::EigenSystem)
69-
L, Q = SE.L, SE.Q
67+
L, QS = SE.L, SE.QS
7068
S = domainspace(L)
7169
D1 = Conversion_normalizedspace(S)
7270
D2 = Conversion_normalizedspace(S, Val(:backward))
71+
Q = Conversion(QS, S)
7372
R = D1*Q;
7473
C = Conversion(S, rangespace(L))
7574
P = cache(PartialInverseOperator(C, (0, bandwidth(L, 1) + bandwidth(R, 1) + bandwidth(C, 2))));
@@ -116,3 +115,15 @@ function eigvals(S::EigenSystem, n::Integer)
116115
SA, SB = bandmatrices_eigen(S, n)
117116
eigvals(SA, SB)
118117
end
118+
119+
function eigs(Seig::EigenSystem, n::Integer; tolerance::Float64=100eps())
120+
SA, SB = bandmatrices_eigen(Seig, n)
121+
λ, v = eigen(SA, SB)
122+
vm = Matrix(v)
123+
L, QS = Seig.L, Seig.QS
124+
S = domainspace(L)
125+
Q = Conversion(QS, S)
126+
QM = Q[ApproxFunBase.FiniteRange, axes(vm, 1)]
127+
V = QM * vm
128+
ApproxFunBase.pruneeigs(λ,V,S,tolerance)
129+
end

test/EigTest.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ using Test
109109
@test u2'(0.25) - u1'(0.25) 100*u(0.25)
110110
@test -u1'' + component(V, 1)*u1 λ[k]*u1
111111
@test -u2'' + component(V, 2)*u2 λ[k]*u2
112+
113+
λ2, f = eigs(Seig, n, tolerance=1e-8);
114+
@test λ2[1:10] λ[1:10]
115+
@test f[k] u || f[k] -u
112116
end
113117

114118
@testset "BigFloat negative Laplacian with Dirichlet boundary conditions" begin

0 commit comments

Comments
 (0)