Skip to content

Commit e6d4d9d

Browse files
committed
Separate type of parameters in Jacobi
1 parent 8cdb3e3 commit e6d4d9d

File tree

2 files changed

+31
-28
lines changed

2 files changed

+31
-28
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ClassicalOrthogonalPolynomials"
22
uuid = "b30e2e7b-c4ee-47da-9d5f-2c5c27239acd"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.13.9"
4+
version = "0.14"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -39,7 +39,7 @@ BlockArrays = "1"
3939
BlockBandedMatrices = "0.13"
4040
ContinuumArrays = "0.18.3"
4141
DomainSets = "0.6, 0.7"
42-
DynamicPolynomials = "0.6.2"
42+
DynamicPolynomials = "0.6"
4343
FFTW = "1.1"
4444
FastGaussQuadrature = "1"
4545
FastTransforms = "0.16.6"

src/classical/jacobi.jl

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,14 @@ julia> J0[0],J0[0.5]
162162
(1.0, 1.0)
163163
```
164164
"""
165-
struct Jacobi{T} <: AbstractJacobi{T}
166-
a::T
167-
b::T
168-
Jacobi{T}(a, b) where T = new{T}(convert(T,a), convert(T,b))
165+
struct Jacobi{T,V} <: AbstractJacobi{T}
166+
a::V
167+
b::V
168+
Jacobi{T,V}(a, b) where {T,V} = new{T,V}(convert(V,a), convert(V,b))
169169
end
170170

171+
Jacobi{T}(a::V, b::V) where {T,V} = Jacobi{T,V}(a, b)
172+
Jacobi{T}(a, b) where T = Jacobi{T}(promote(a,b)...)
171173
Jacobi(a::V, b::T) where {T,V} = Jacobi{float(promote_type(T,V))}(a, b)
172174

173175
AbstractQuasiArray{T}(w::Jacobi) where T = Jacobi{T}(w.a, w.b)
@@ -273,15 +275,16 @@ axes(::AbstractJacobi{T}) where T = (Inclusion{T}(ChebyshevInterval{real(T)}()),
273275
==(P::Legendre, Q::Jacobi) = Jacobi(P) == Q
274276
==(P::Jacobi, Q::Legendre) = P == Jacobi(Q)
275277
==(A::WeightedJacobi, B::WeightedJacobi) = A.args == B.args
276-
==(A::WeightedJacobi, B::Jacobi{T}) where T = A == JacobiWeight(zero(T),zero(T)).*B
278+
==(A::WeightedJacobi, B::Jacobi{T,V}) where {T,V} = A == JacobiWeight(zero(V),zero(V)).*B
277279
==(A::WeightedJacobi, B::Legendre) = A == Jacobi(B)
278280
==(A::Legendre, B::WeightedJacobi) = Jacobi(A) == B
279-
==(A::Jacobi{T}, B::WeightedJacobi) where T = JacobiWeight(zero(T),zero(T)).*A == B
281+
==(A::Jacobi{T,V}, B::WeightedJacobi) where {T,V} = JacobiWeight(zero(V),zero(V)).*A == B
280282
==(A::Legendre, B::Weighted{<:Any,<:AbstractJacobi}) = A == B.P
281283
==(A::Weighted{<:Any,<:AbstractJacobi}, B::Legendre) = A.P == B
282284

283285
show(io::IO, P::Jacobi) = summary(io, P)
284-
summary(io::IO, P::Jacobi) = print(io, "Jacobi($(P.a), $(P.b))")
286+
summary(io::IO, P::Jacobi{Float64}) = print(io, "Jacobi($(P.a), $(P.b))")
287+
summary(io::IO, P::Jacobi{T}) where T = print(io, "Jacobi{$T}($(P.a), $(P.b))")
285288

286289
###
287290
# transforms
@@ -523,22 +526,22 @@ diff(S::Jacobi; dims=1) = ApplyQuasiMatrix(*, Jacobi(S.a+1,S.b+1), _BandedMatrix
523526

524527
function diff(S::Jacobi{T}, m::Integer; dims=1) where T
525528
D = _BandedMatrix((pochhammer.((S.a + S.b+1):∞, m)/convert(T, 2)^m)', ℵ₀, -m, m)
526-
ApplyQuasiMatrix(*, Jacobi(S.a+m,S.b+m), D)
529+
ApplyQuasiMatrix(*, Jacobi{T}(S.a+m,S.b+m), D)
527530
end
528531

529532

530533
#L_6^t
531-
function diff(WS::HalfWeighted{:a,<:Any,<:Jacobi}; dims=1)
534+
function diff(WS::HalfWeighted{:a,T,<:Jacobi}; dims=1) where T
532535
S = WS.P
533536
a,b = S.a, S.b
534-
ApplyQuasiMatrix(*, HalfWeighted{:a}(Jacobi(a-1,b+1)), Diagonal(-(a:∞)))
537+
ApplyQuasiMatrix(*, HalfWeighted{:a}(Jacobi{T}(a-1,b+1)), Diagonal(-(a:∞)))
535538
end
536539

537540
#L_6
538-
function diff(WS::HalfWeighted{:b,<:Any,<:Jacobi}; dims=1)
541+
function diff(WS::HalfWeighted{:b,T,<:Jacobi}; dims=1) where T
539542
S = WS.P
540543
a,b = S.a, S.b
541-
ApplyQuasiMatrix(*, HalfWeighted{:b}(Jacobi(a+1,b-1)), Diagonal(b:∞))
544+
ApplyQuasiMatrix(*, HalfWeighted{:b}(Jacobi{T}(a+1,b-1)), Diagonal(b:∞))
542545
end
543546

544547
for ab in (:(:a), :(:b))
@@ -549,7 +552,7 @@ for ab in (:(:a), :(:b))
549552
end
550553

551554

552-
function diff(WS::Weighted{<:Any,<:Jacobi}; dims=1)
555+
function diff(WS::Weighted{T,<:Jacobi}; dims=1) where T
553556
# L_1^t
554557
S = WS.P
555558
a,b = S.a, S.b
@@ -560,13 +563,13 @@ function diff(WS::Weighted{<:Any,<:Jacobi}; dims=1)
560563
elseif iszero(b)
561564
diff(HalfWeighted{:a}(S))
562565
else
563-
ApplyQuasiMatrix(*, Weighted(Jacobi(a-1, b-1)), _BandedMatrix((-2*(1:∞))', ℵ₀, 1,-1))
566+
ApplyQuasiMatrix(*, Weighted(Jacobi{T}(a-1, b-1)), _BandedMatrix((-2*(1:∞))', ℵ₀, 1,-1))
564567
end
565568
end
566569

567570

568571
# Jacobi(a-1,b-1)\ (D*w*Jacobi(a,b))
569-
function diff(WS::WeightedJacobi; dims=1)
572+
function diff(WS::WeightedJacobi{T}; dims=1) where T
570573
w,S = WS.args
571574
a,b = S.a, S.b
572575
if isorthogonalityweighted(WS) # L_1^t
@@ -582,22 +585,22 @@ function diff(WS::WeightedJacobi; dims=1)
582585
# D * ((1+x)^w.b * P^(a,b)) == D * ((1+x)^(w.b-b) * (1+x)^b * P^(a,b))
583586
# == (1+x)^(w.b-1) * (w.b-b) * P^(a,b) + (1+x)^(w.b-b) * D*((1+x)^b*P^(a,b))
584587
# == (1+x)^(w.b-1) * P^(a+1,b) ((w.b-b) * C2 + C1 * W)
585-
W = HalfWeighted{:b}(Jacobi(a+1, b-1)) \ diff(HalfWeighted{:b}(S))
586-
J = Jacobi(a+1,b) # range Jacobi
587-
C1 = J \ Jacobi(a+1, b-1)
588-
C2 = J \ Jacobi(a,b)
588+
W = HalfWeighted{:b}(Jacobi{T}(a+1, b-1)) \ diff(HalfWeighted{:b}(S))
589+
J = Jacobi{T}(a+1,b) # range Jacobi
590+
C1 = J \ Jacobi{T}(a+1, b-1)
591+
C2 = J \ Jacobi{T}(a,b)
589592
ApplyQuasiMatrix(*, JacobiWeight(w.a,w.b-1) .* J, (w.b-b) * C2 + C1 * W)
590593
elseif iszero(w.b)
591-
W = HalfWeighted{:a}(Jacobi(a-1, b+1)) \ diff(HalfWeighted{:a}(S))
592-
J = Jacobi(a,b+1) # range Jacobi
593-
C1 = J \ Jacobi(a-1, b+1)
594-
C2 = J \ Jacobi(a,b)
594+
W = HalfWeighted{:a}(Jacobi{T}(a-1, b+1)) \ diff(HalfWeighted{:a}(S))
595+
J = Jacobi{T}(a,b+1) # range Jacobi
596+
C1 = J \ Jacobi{T}(a-1, b+1)
597+
C2 = J \ Jacobi{T}(a,b)
595598
ApplyQuasiMatrix(*, JacobiWeight(w.a-1,w.b) .* J, -(w.a-a) * C2 + C1 * W)
596599
elseif iszero(a) && iszero(b) # Legendre
597600
# D * ((1+x)^w.b * (1-x)^w.a * P))
598601
# == (1+x)^(w.b-1) * (1-x)^(w.a-1) * ((1-x) * (w.b) * P - (1+x) * w.a * P + (1-x^2) * D * P)
599602
# == (1+x)^(w.b-1) * (1-x)^(w.a-1) * ((1-x) * (w.b) * P - (1+x) * w.a * P + P * L * W)
600-
J = Jacobi(a+1,b+1) # range space
603+
J = Jacobi{T}(a+1,b+1) # range space
601604
W = J \ diff(S)
602605
X = jacobimatrix(S)
603606
L = S \ Weighted(J)
@@ -608,9 +611,9 @@ function diff(WS::WeightedJacobi; dims=1)
608611
# == (1+x)^(w.b-1) * (1-x)^(w.a-1) * ((1-x) * (w.b-b) * P^(a,b) + (1+x) * (a-w.a) * P^(a,b))
609612
# + (1+x)^(w.b-b) * (1-x)^(w.a-a) * D * ((1+x)^b * (1-x)^a * P^(a,b)))
610613

611-
W = Weighted(Jacobi(a-1,b-1)) \ diff(Weighted(S))
614+
W = Weighted(Jacobi{T}(a-1,b-1)) \ diff(Weighted(S))
612615
X = jacobimatrix(S)
613-
C = S \ Jacobi(a-1,b-1)
616+
C = S \ Jacobi{T}(a-1,b-1)
614617
(JacobiWeight(w.a-1,w.b-1) .* S) * (((w.b-b+a-w.a)*I+(a-w.a-w.b+b) * X) + C*W)
615618
end
616619
end

0 commit comments

Comments
 (0)