Skip to content

Commit 23d6085

Browse files
authored
Implement weighted conversion between b=-1 polynomials (#118)
* Implement weighted conversion for b=-1 * Fix integer case, add more tests
1 parent a1e4c3e commit 23d6085

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/SemiclassicalOrthogonalPolynomials.jl

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,10 +461,26 @@ function \(w_A::WeightedSemiclassicalJacobi{T}, w_B::WeightedSemiclassicalJacobi
461461
Δb = B.b-A.b
462462
Δc = B.c-A.c
463463

464-
if (wA.a == A.a) && (wA.b == A.b) && (wA.c == A.c) && (wB.a == B.a) && (wB.b == B.b) && (wB.c == B.c) && isinteger(A.a) && isinteger(A.b) && isinteger(A.c) && isinteger(B.a) && isinteger(B.b) && isinteger(B.c)
465-
# k = (A \ SemiclassicalJacobiWeight(A.t,Δa,Δb,Δc))[1]
466-
k = sumquotient(SemiclassicalJacobiWeight(B.t,B.a,B.b,B.c),SemiclassicalJacobiWeight(A.t,A.a,A.b,A.c))
467-
return (ApplyArray(*,Diagonal(Fill(k,∞)),(B \ A)))'
464+
# k = (A \ SemiclassicalJacobiWeight(A.t,Δa,Δb,Δc))[1]
465+
if isone(-wA.b) && isone(-wB.b)
466+
@assert A.a + 1 == B.a && A.c + 1 == B.c
467+
Q = SemiclassicalJacobi(B.t, B.a, one(B.b), B.c, B)
468+
P = SemiclassicalJacobi(A.t, A.a, one(A.b), A.c, A)
469+
wP = Weighted(P)
470+
wQ = Weighted(Q)
471+
R22 = wP \ wQ
472+
r11 = A.t - 1
473+
qw0 = SemiclassicalJacobiWeight(Q.t, Q.a, zero(Q.b), Q.c)
474+
pw0 = SemiclassicalJacobiWeight(P.t, P.a, zero(P.b), P.c)
475+
r21 = wP[:, 1:2] \ (qw0 .- r11 .* pw0)
476+
d0 = Vcat(r11, R22[band(0)])
477+
d1 = Vcat(r21[begin], R22[band(-1)])
478+
d2 = Vcat(r21[begin+1], R22[band(-2)])
479+
data = Hcat(d0, d1, d2)
480+
return _BandedMatrix(data', 1:∞, 2, 0)
481+
elseif (wA.a == A.a) && (wA.b == A.b) && (wA.c == A.c) && (wB.a == B.a) && (wB.b == B.b) && (wB.c == B.c) && isinteger(A.a) && isinteger(A.b) && isinteger(A.c) && isinteger(B.a) && isinteger(B.b) && isinteger(B.c)
482+
k = sumquotient(SemiclassicalJacobiWeight(B.t,B.a,B.b,B.c),SemiclassicalJacobiWeight(A.t,A.a,A.b,A.c))
483+
return (ApplyArray(*,Diagonal(Fill(k,∞)),(B \ A)))'
468484
elseif wA.a == wB.a && wA.b == wB.b && wA.c == wB.c # fallback to Christoffel–Darboux
469485
A \ B
470486
elseif wA.a+1 == wB.a && wA.b == wB.b && wA.c == wB.c

test/test_neg1b.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,18 @@ end
234234
@test_throws ArgumentError expand(HalfWeighted{:b}(P), g)
235235
end
236236

237+
@testset "Weighted conversion between b=-1" begin
238+
for (t, a, b, c) in ((2.0, 1 / 2, -1.0, 1 / 2), (2.5, 3 / 2, -1.0, 1 / 2), (2.5, 1.0, -1.0, 2.0))
239+
Q = SemiclassicalJacobi(t, a, b, c)
240+
P = SemiclassicalJacobi(t, a - 1, b, c - 1)
241+
L = Weighted(P) \ Weighted(Q)
242+
wP = SemiclassicalJacobiWeight(t, a - 1, b, c - 1)
243+
wQ = SemiclassicalJacobiWeight(t, a, b, c)
244+
lhs = wQ .* Q
245+
rhs = wP .* (P * L)
246+
x = LinRange(eps(), 1 - eps(), 250)
247+
lhs_vals = lhs[x, 1:20]
248+
rhs_vals = rhs[x, 1:20]
249+
@test lhs_vals rhs_vals
250+
end
251+
end

0 commit comments

Comments
 (0)