Skip to content

Commit 03f3281

Browse files
authored
Use Bidiagonal instead of BandedMatrix with bandwidth (0,1)/(1, 0) (#144)
* Bidiagonal * Avoid [2:end]
1 parent b803435 commit 03f3281

File tree

3 files changed

+34
-35
lines changed

3 files changed

+34
-35
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "SemiclassicalOrthogonalPolynomials"
22
uuid = "291c01f3-23f6-4eb6-aeb0-063a639b53f2"
3+
version = "0.7.2"
34
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.7.1"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -13,6 +13,7 @@ HypergeometricFunctions = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
1313
InfiniteArrays = "4858937d-0d70-526a-a4dd-2d5cb5dd786c"
1414
InfiniteLinearAlgebra = "cde9dba0-b1de-11e9-2c62-0bab9446c55c"
1515
LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02"
16+
LazyBandedMatrices = "d7e5e226-e90b-4449-9968-0f923699bf6f"
1617
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1718
QuasiArrays = "c4ea9172-b204-11e9-377d-29865faadc5c"
1819
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
@@ -27,6 +28,7 @@ HypergeometricFunctions = "0.3.4"
2728
InfiniteArrays = "0.15"
2829
InfiniteLinearAlgebra = "0.10"
2930
LazyArrays = "2.4"
31+
LazyBandedMatrices = "0.11.6"
3032
QuasiArrays = "0.12, 0.13"
3133
SpecialFunctions = "1.0, 2"
3234
julia = "1.10"

src/SemiclassicalOrthogonalPolynomials.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import ContinuumArrays: basis, Weight, @simplify, AbstractBasisLayout, BasisLayo
1919
import FillArrays: SquareEye
2020
import HypergeometricFunctions: _₂F₁general2, _₂F₁
2121
import SpecialFunctions: beta
22+
import LazyBandedMatrices
2223

2324
export Legendre, Normalized, normalize, SemiclassicalJacobi, SemiclassicalJacobiWeight, WeightedSemiclassicalJacobi, OrthogonalPolynomialRatio
2425

src/derivatives.jl

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -80,53 +80,46 @@ end
8080
function divdiff(HQ::HalfWeighted{:a,<:Any,<:SemiclassicalJacobi}, HP::HalfWeighted{:a,<:Any,<:SemiclassicalJacobi})
8181
Q = HQ.P
8282
P = HP.P
83-
t = P.t
8483
a = Q.a
85-
A,B,C = recurrencecoefficients(P)
86-
α,β,γ = recurrencecoefficients(Q)
84+
A,B,_ = recurrencecoefficients(P)
85+
α,β,_ = recurrencecoefficients(Q)
8786
d = AccumulateAbstractVector(*, A ./ α)
88-
v1 = MulAddAccumulate(Vcat(0,0,α[2:∞] ./ α), Vcat(0,β))
89-
v2 = MulAddAccumulate(Vcat(0,0,A[2:∞] ./ α), Vcat(0,B[1], B[2:end] .* d))
90-
91-
_BandedMatrix(
92-
Vcat(
93-
((a:∞) .* v2 .- ((a+1):∞) .* Vcat(1,v1[2:end] .* d))',
94-
(((a+1):∞) .* Vcat(1,d))'), ℵ₀, 0,1)
87+
v1 = MulAddAccumulate(Vcat(0,α[2:∞] ./ α), β)
88+
v2 = MulAddAccumulate(Vcat(0,A[2:∞] ./ α), Vcat(B[1], B[2:end] .* d))
89+
p = ((a+1):∞) .* v2 .- ((a+2):∞) .* v1 .* d
90+
q = ((a+1):∞) .* Vcat(1,d)
91+
return LazyBandedMatrices.Bidiagonal(q, p, :U)
9592
end
9693

9794
function divdiff(HQ::HalfWeighted{:b,<:Any,<:SemiclassicalJacobi}, HP::HalfWeighted{:b,<:Any,<:SemiclassicalJacobi})
9895
Q = HQ.P
9996
P = HP.P
100-
t = P.t
10197
b = Q.b
102-
A,B,C = recurrencecoefficients(P)
103-
α,β,γ = recurrencecoefficients(Q)
98+
A,B,_ = recurrencecoefficients(P)
99+
α,β,_ = recurrencecoefficients(Q)
104100
d = AccumulateAbstractVector(*, A ./ α)
105101
d2 = AccumulateAbstractVector(*, A ./ Vcat(1,α))
106-
v1 = MulAddAccumulate(Vcat(0,0,α[2:∞] ./ α), Vcat(0,β))
107-
v2 = MulAddAccumulate(Vcat(0,0,A[2:∞] ./ α), Vcat(0,B[1], B[2:end] .* d))
108-
109-
_BandedMatrix(
110-
Vcat(
111-
(-(b:∞) .* v2 .+ ((b+1):∞) .* Vcat(1,v1[2:end] .* d) .+ Vcat(0,(1:∞) .* d2))',
112-
(-((b+1):∞) .* Vcat(1,d))'), ℵ₀, 0,1)
102+
v1 = MulAddAccumulate(Vcat(0,α[2:∞] ./ α), β)
103+
v2 = MulAddAccumulate(Vcat(0,A[2:∞] ./ α), Vcat(B[1], B[2:end] .* d))
104+
p = -((b+1):∞) .* v2 .+ ((b+2):∞) .* v1 .* d .+ (1:∞) .* d2
105+
q = -((b+1):∞) .* Vcat(1,d)
106+
return LazyBandedMatrices.Bidiagonal(q, p, :U)
113107
end
114108

115109
function divdiff(HQ::HalfWeighted{:c,<:Any,<:SemiclassicalJacobi}, HP::HalfWeighted{:c,<:Any,<:SemiclassicalJacobi})
116110
Q = HQ.P
117111
P = HP.P
118112
t = P.t
119113
c = Q.c
120-
A,B,C = recurrencecoefficients(P)
121-
α,β,γ = recurrencecoefficients(Q)
114+
A,B,_ = recurrencecoefficients(P)
115+
α,β,_ = recurrencecoefficients(Q)
122116
d = AccumulateAbstractVector(*, A ./ α)
123117
d2 = AccumulateAbstractVector(*, A ./ Vcat(1,α))
124-
v1 = MulAddAccumulate(Vcat(0,0,α[2:∞] ./ α), Vcat(0,β))
125-
v2 = MulAddAccumulate(Vcat(0,0,A[2:∞] ./ α), Vcat(0,B[1], B[2:end] .* d))
126-
_BandedMatrix(
127-
Vcat(
128-
(-(c:∞) .* v2 .+ ((c+1):∞) .* Vcat(1,v1[2:end] .* d) .+ Vcat(0,(t:t:∞) .* d2))',
129-
(-((c+1):∞) .* Vcat(1,d))'), ℵ₀, 0,1)
118+
v1 = MulAddAccumulate(Vcat(0,α[2:∞] ./ α), β)
119+
v2 = MulAddAccumulate(Vcat(0,A[2:∞] ./ α), Vcat(B[1], B[2:end] .* d))
120+
p = -((c+1):∞) .* v2 .+ ((c+2):∞) .* v1 .* d .+ (t:t:∞) .* d2
121+
q = -((c+1):∞) .* Vcat(1,d)
122+
return LazyBandedMatrices.Bidiagonal(q, p, :U)
130123
end
131124

132125
function diff(HP::HalfWeighted{:a,<:Any,<:SemiclassicalJacobi}; dims=1)
@@ -165,8 +158,9 @@ function divdiff(HQ::HalfWeighted{:ab}, HP::HalfWeighted{:ab})
165158
e = AccumulateAbstractVector(*, Vcat(1,A ./ α))
166159
f = MulAddAccumulate(Vcat(0,0,A[2:end] ./ α[2:end]), Vcat(0, (B./ α) .* e))
167160
g = cumsum./ α)
168-
_BandedMatrix(Vcat((((a+1):∞) .* e .- ((b+a+1):∞).*f .+ ((a+b+2):∞) .* e .* g )',
169-
(-((a+b+2):∞) .* d)'),ℵ₀,1,0)
161+
p = ((a+1):∞) .* e .- ((b+a+1):∞).*f .+ ((a+b+2):∞) .* e .* g
162+
q = -((a+b+2):∞) .* d
163+
return LazyBandedMatrices.Bidiagonal(p, q, :L)
170164
end
171165

172166

@@ -182,8 +176,9 @@ function divdiff(HQ::HalfWeighted{:bc}, HP::HalfWeighted{:bc})
182176
e = AccumulateAbstractVector(*, Vcat(1,A ./ α))
183177
f = MulAddAccumulate(Vcat(0,0,A[2:end] ./ α[2:end]), Vcat(0, (B./ α) .* e))
184178
g = cumsum./ α)
185-
_BandedMatrix(Vcat((-((t+1)* (0:∞) .+ (t*(b+1) + c+1)) .* e .+ ((c+b+1):∞).*f .- ((b+c+2):∞) .* e .* g )',
186-
(((b+c+2):∞) .* d)'),ℵ₀,1,0)
179+
p = -((t+1)* (0:∞) .+ (t*(b+1) + c+1)) .* e .+ ((c+b+1):∞).*f .- ((b+c+2):∞) .* e .* g
180+
q = ((b+c+2):∞) .* d
181+
return LazyBandedMatrices.Bidiagonal(p, q, :L)
187182
end
188183

189184
function divdiff(HQ::HalfWeighted{:ac}, HP::HalfWeighted{:ac})
@@ -198,8 +193,9 @@ function divdiff(HQ::HalfWeighted{:ac}, HP::HalfWeighted{:ac})
198193
e = AccumulateAbstractVector(*, Vcat(1,A ./ α))
199194
f = MulAddAccumulate(Vcat(0,0,A[2:end] ./ α[2:end]), Vcat(0, (B./ α) .* e))
200195
g = cumsum./ α)
201-
_BandedMatrix(Vcat((t* ((a+1):∞) .* e .- ((c+a+1):∞).*f .+ ((a+c+2):∞) .* e .* g )',
202-
(-((a+c+2):∞) .* d)'),ℵ₀,1,0)
196+
p = t* ((a+1):∞) .* e .- ((c+a+1):∞).*f .+ ((a+c+2):∞) .* e .* g
197+
q = -((a+c+2):∞) .* d
198+
return LazyBandedMatrices.Bidiagonal(p, q, :L)
203199
end
204200

205201

0 commit comments

Comments
 (0)