Skip to content

Commit 21a9002

Browse files
authored
isdiag for known derivatives (#183)
* isdiag for known derivatives * isdiag for NormalizedPolynomialSpace * Concreteint Jacobi and Concreteconv Ultrasp * Version bump to v0.6.7 * Integral tests
1 parent 6a99d12 commit 21a9002

File tree

10 files changed

+53
-3
lines changed

10 files changed

+53
-3
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
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.6"
3+
version = "0.6.7"
44

55
[deps]
66
ApproxFunBase = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"
@@ -20,7 +20,7 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
2020
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
2121

2222
[compat]
23-
ApproxFunBase = "0.7.65"
23+
ApproxFunBase = "0.7.67"
2424
ApproxFunBaseTest = "0.1"
2525
Aqua = "0.5"
2626
BandedMatrices = "0.16, 0.17"

src/ApproxFunOrthogonalPolynomials.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ import SpecialFunctions: erfcx, dawson,
7979

8080
using StaticArrays: SVector
8181

82+
import LinearAlgebra: isdiag
83+
8284
points(d::IntervalOrSegmentDomain{T},n::Integer) where {T} =
8385
fromcanonical.(Ref(d), chebyshevpoints(float(real(eltype(T))), n)) # eltype to handle point
8486
bary(v::AbstractVector{Float64},d::IntervalOrSegmentDomain,x::Float64) = bary(v,tocanonical(d,x))

src/Spaces/Chebyshev/ChebyshevOperators.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ rangespace(D::ConcreteDerivative{Chebyshev{DD,RR}}) where {DD<:IntervalOrSegment
226226
bandwidths(D::ConcreteDerivative{Chebyshev{DD,RR}}) where {DD<:IntervalOrSegment,RR} = -D.order,D.order
227227
Base.stride(D::ConcreteDerivative{Chebyshev{DD,RR}}) where {DD<:IntervalOrSegment,RR} = D.order
228228

229+
isdiag(D::ConcreteDerivative{<:Chebyshev{<:IntervalOrSegment}}) = false
230+
229231
function getindex(D::ConcreteDerivative{Chebyshev{DD,RR},K,T},k::Integer,j::Integer) where {DD<:IntervalOrSegment,RR,K,T}
230232
m=D.order
231233
d=domain(D)

src/Spaces/Hermite/Hermite.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ rangespace(D::ConcreteDerivative{H}) where {H<:Hermite} = domainspace(D)
4545
getindex(D::ConcreteDerivative{H},k::Integer,j::Integer) where {H<:Hermite} =
4646
j==k+D.order ? one(eltype(D))*2^D.order*pochhammer(k,D.order) : zero(eltype(D))
4747

48+
isdiag(D::ConcreteDerivative{<:Hermite}) = false
49+
4850
function hermitep(r::AbstractRange,x::Number)
4951
n = r[end] + 1
5052

src/Spaces/Jacobi/JacobiOperators.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ end
2020

2121
rangespace(D::ConcreteDerivative{<:Jacobi}) = Jacobi(D.space.b+D.order,D.space.a+D.order,domain(D))
2222
bandwidths(D::ConcreteDerivative{<:Jacobi}) = -D.order,D.order
23+
isdiag(D::ConcreteDerivative{<:Jacobi}) = false
2324

2425
getindex(T::ConcreteDerivative{<:Jacobi}, k::Integer, j::Integer) =
2526
j==k+1 ? eltype(T)((k+1+T.space.a+T.space.b)/complexlength(domain(T))) : zero(eltype(T))
@@ -43,6 +44,7 @@ Evaluation(S::NormalizedPolynomialSpace{<:Jacobi},x::Number,o::Integer) = Concre
4344

4445
function Integral(J::Jacobi,k::Number)
4546
assert_integer(k)
47+
@assert k > 0 "order of integral must be > 0"
4648
if k > 1
4749
Q=Integral(J,1)
4850
IntegralWrapper(TimesOperator(Integral(rangespace(Q),k-1),Q),J,k)
@@ -58,7 +60,8 @@ end
5860

5961

6062
rangespace(D::ConcreteIntegral{<:Jacobi}) = Jacobi(D.space.b-D.order,D.space.a-D.order,domain(D))
61-
bandwidths(D::ConcreteIntegral{<:Jacobi}) = D.order,0
63+
bandwidths(D::ConcreteIntegral{<:Jacobi}) = D.order,-D.order
64+
isdiag(D::ConcreteIntegral{<:Jacobi}) = false
6265

6366
function getindex(T::ConcreteIntegral{<:Jacobi}, k::Integer, j::Integer)
6467
@assert T.order==1

src/Spaces/PolynomialSpace.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,12 @@ hasconversion(a::PolynomialSpace,b::NormalizedPolynomialSpace) = hasconversion(a
456456
hasconversion(a::NormalizedPolynomialSpace,b::PolynomialSpace) = hasconversion(a.space,b)
457457
hasconversion(a::NormalizedPolynomialSpace,b::NormalizedPolynomialSpace) = hasconversion(a.space,b)
458458

459+
function isdiag(D::DerivativeWrapper{<:Operator, <:NormalizedPolynomialSpace})
460+
sp = D.space
461+
csp = _stripnorm(sp)
462+
isdiag(Derivative(csp, D.order))
463+
end
464+
459465
# Tensor products of normalized and unnormalized spaces may have banded conversions defined
460466
# A banded conversion exists in special cases, where both conversion operators are diagonal
461467
_stripnorm(N::NormalizedPolynomialSpace) = canonicalspace(N)

src/Spaces/Ultraspherical/UltrasphericalOperators.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ bandwidths(D::ConcreteDerivative{Ultraspherical{LT,DD,RR}}) where {LT,DD<:Interv
7777
bandwidths(D::ConcreteIntegral{Ultraspherical{LT,DD,RR}}) where {LT,DD<:IntervalOrSegment,RR} = D.order,-D.order
7878
Base.stride(D::ConcreteDerivative{Ultraspherical{LT,DD,RR}}) where {LT,DD<:IntervalOrSegment,RR} = D.order
7979

80+
isdiag(D::ConcreteDerivative{<:Ultraspherical{<:Any,<:IntervalOrSegment}}) = false
81+
isdiag(D::ConcreteIntegral{<:Ultraspherical{<:Any,<:IntervalOrSegment}}) = false
8082

8183
function getindex(D::ConcreteDerivative{Ultraspherical{TT,DD,RR},K,T},
8284
k::Integer,j::Integer) where {TT,DD<:IntervalOrSegment,RR,K,T}
@@ -230,6 +232,9 @@ bandwidths(C::ConcreteConversion{<:Ultraspherical,<:Ultraspherical}) =
230232
Base.stride(C::ConcreteConversion{<:Chebyshev,<:Ultraspherical{Int}}) = 2
231233
Base.stride(C::ConcreteConversion{<:Ultraspherical,<:Ultraspherical}) = 2
232234

235+
isdiag(::ConcreteConversion{<:Chebyshev,<:Ultraspherical}) = false
236+
isdiag(::ConcreteConversion{<:Ultraspherical,<:Chebyshev}) = false
237+
isdiag(::ConcreteConversion{<:Ultraspherical,<:Ultraspherical}) = false
233238

234239
## coefficients
235240

test/HermiteTest.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ using ApproxFunBaseTest: testbandedoperator
6868
@testset "Derivative" begin
6969
D = Derivative(Hermite())
7070
testbandedoperator(D)
71+
@test !isdiag(D)
7172

7273
f = Fun( x-> x + x^2, Hermite())
7374
g = D * f

test/JacobiTest.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ using Static
180180
# only one band should be populated
181181
@test bandwidths(D, 1) == -bandwidths(D, 2)
182182

183+
@test !isdiag(Derivative(Legendre()))
184+
@test !isdiag(Derivative(NormalizedLegendre()))
185+
183186
@testset for d in [-1..1, 0..1]
184187
f = Fun(x->x^2, Chebyshev(d))
185188
C = space(f)
@@ -535,6 +538,20 @@ using Static
535538
end
536539
end
537540

541+
@testset "Integral" begin
542+
@testset for sp in (Legendre(), Jacobi(1,1))
543+
Ij = Integral(sp, 1)
544+
@test !isdiag(Ij)
545+
f = Fun(sp)
546+
g = Ij * f
547+
g = Fun(g, sp)
548+
g = g - coefficients(g)[1]
549+
gexp = Fun(x->x^2/2, sp)
550+
gexp = gexp - coefficients(gexp)[1]
551+
@test g gexp
552+
end
553+
end
554+
538555
@testset "type inference" begin
539556
x = @inferred ApproxFunBase.maxspace(Jacobi(1,1), Jacobi(2,2))
540557
@test x == Jacobi(2,2)

test/UltrasphericalTest.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,5 +179,17 @@ using LinearAlgebra
179179
A = @inferred Integral(d)
180180
x = Derivative() * A * Fun(d)
181181
@test x(0.2) 0.2
182+
183+
@testset for sp in (Ultraspherical(1), Ultraspherical(2), Ultraspherical(0.5))
184+
Ij = Integral(sp, 1)
185+
@test !isdiag(Ij)
186+
f = Fun(sp)
187+
g = Ij * f
188+
g = Fun(g, sp)
189+
g = g - coefficients(g)[1]
190+
gexp = Fun(x->x^2/2, sp)
191+
gexp = gexp - coefficients(gexp)[1]
192+
@test g gexp
193+
end
182194
end
183195
end

0 commit comments

Comments
 (0)