1
1
module SemiclassicalOrthogonalPolynomials
2
- using ClassicalOrthogonalPolynomials, FillArrays, LazyArrays, ArrayLayouts, QuasiArrays, InfiniteArrays, ContinuumArrays, LinearAlgebra, BandedMatrices,
2
+ using ClassicalOrthogonalPolynomials, FillArrays, LazyArrays, ArrayLayouts, QuasiArrays, InfiniteArrays, ContinuumArrays, LinearAlgebra, BandedMatrices,
3
3
SpecialFunctions, HypergeometricFunctions
4
4
5
5
import Base: getindex, axes, size, \ , / , * , + , - , summary, == , copy, sum, unsafe_getindex
6
6
7
7
import ArrayLayouts: MemoryLayout, ldiv, diagonaldata, subdiagonaldata, supdiagonaldata
8
8
import BandedMatrices: bandwidths, AbstractBandedMatrix, BandedLayout, _BandedMatrix
9
- import LazyArrays: resizedata!, paddeddata, CachedVector, CachedMatrix, CachedAbstractVector, LazyMatrix, LazyVector, arguments, ApplyLayout, colsupport, AbstractCachedVector, AccumulateAbstractVector
9
+ import LazyArrays: resizedata!, paddeddata, CachedVector, CachedMatrix, CachedAbstractVector, LazyMatrix, LazyVector, arguments, ApplyLayout, colsupport, AbstractCachedVector, AccumulateAbstractVector, LazyVector
10
10
import ClassicalOrthogonalPolynomials: OrthogonalPolynomial, recurrencecoefficients, jacobimatrix, normalize, _p0, UnitInterval, orthogonalityweight, NormalizedBasisLayout,
11
- Bidiagonal, Tridiagonal, SymTridiagonal, symtridiagonalize, normalizationconstant,
12
- OrthogonalPolynomialRatio, normalized_recurrencecoefficients, Weighted
11
+ Bidiagonal, Tridiagonal, SymTridiagonal, symtridiagonalize, normalizationconstant, LanczosPolynomial,
12
+ OrthogonalPolynomialRatio, Weighted, Expansion, UnionDomain, oneto
13
13
import InfiniteArrays: OneToInf, InfUnitRange
14
14
import ContinuumArrays: basis, Weight, @simplify , AbstractBasisLayout, BasisLayout, MappedBasisLayout
15
15
import FillArrays: SquareEye
16
16
17
- export LanczosPolynomial, Legendre, Normalized, normalize, SemiclassicalJacobi, SemiclassicalJacobiWeight, WeightedSemiclassicalJacobi, OrthogonalPolynomialRatio
17
+ export LanczosPolynomial, Legendre, Normalized, normalize, SemiclassicalJacobi, SemiclassicalJacobiWeight, WeightedSemiclassicalJacobi, OrthogonalPolynomialRatio, TwoBandJacobi, TwoBandWeight
18
18
19
19
20
20
""" "
@@ -53,6 +53,91 @@ function summary(io::IO, P::SemiclassicalJacobiWeight)
53
53
print (io, " x^$a * (1-x)^$b * ($t -x)^$c " )
54
54
end
55
55
56
+ function == (A:: SemiclassicalJacobiWeight , B:: SemiclassicalJacobiWeight )
57
+ A. a == B. a && A. b == B. b &&
58
+ ((iszero (A. c) && iszero (B. c)) ||
59
+ (A. t == B. t && A. c == B. c))
60
+ end
61
+
62
+ function Expansion (w:: SemiclassicalJacobiWeight{T} ) where T
63
+ t,a,b,c = w. t,w. a,w. b,w. c
64
+ P = jacobi (b, a, UnitInterval {T} ())
65
+ x = axes (P,1 )
66
+ # TODO : simplify
67
+ LanczosPolynomial (@. (x^ a * (1 - x)^ b * (t- x)^ c), P). w
68
+ end
69
+
70
+ == (A:: SemiclassicalJacobiWeight , B:: Expansion ) = Expansion (A) == B
71
+ == (A:: Expansion , B:: SemiclassicalJacobiWeight ) = A == Expansion (B)
72
+
73
+
74
+ """
75
+ RaisedOP(P, y)
76
+
77
+ gives the OPs w.r.t. (y - x) .* w based on lowering to Q.
78
+ """
79
+
80
+ struct RaisedOP{T, QQ, LL<: OrthogonalPolynomialRatio } <: OrthogonalPolynomial{T}
81
+ Q:: QQ
82
+ ℓ:: LL
83
+ end
84
+
85
+ RaisedOP (Q, ℓ:: OrthogonalPolynomialRatio ) = RaisedOP {eltype(Q),typeof(Q),typeof(ℓ)} (Q, ℓ)
86
+ RaisedOP (Q, y:: Number ) = RaisedOP (Q, OrthogonalPolynomialRatio (Q,y))
87
+
88
+
89
+ function jacobimatrix (P:: RaisedOP{T} ) where T
90
+ ℓ = P. ℓ
91
+ X = jacobimatrix (P. Q)
92
+ a,b = diagonaldata (X), supdiagonaldata (X)
93
+ # non-normalized lower diag of Jacobi
94
+ v = Vcat (zero (T),b .* ℓ)
95
+ c = BroadcastVector ((ℓ,a,b,sa,v) -> ℓ* a + b - b* ℓ^ 2 - sa* ℓ + ℓ* v, ℓ, a, b, a[2 : ∞], v)
96
+ Tridiagonal (c, BroadcastVector ((ℓ,a,b,v) -> a - b * ℓ + v, ℓ,a,b,v), b)
97
+ end
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+ """
107
+ the bands of the Jacobi matrix
108
+ """
109
+ mutable struct SemiclassicalJacobiBand{dv,T} <: AbstractCachedVector{T}
110
+ data:: Vector{T}
111
+ a:: AbstractVector{T}
112
+ b:: AbstractVector{T}
113
+ ℓ:: AbstractVector{T}
114
+ datasize:: Tuple{Int}
115
+ end
116
+
117
+ function LazyArrays. cache_filldata! (r:: SemiclassicalJacobiBand{:dv} , inds:: AbstractUnitRange )
118
+ rℓ = r. ℓ[inds[1 ]- 1 : inds[end ]]; ℓ,sℓ = rℓ[2 : end ], rℓ[1 : end - 1 ]
119
+ ra = r. a[inds[1 ]: (inds[end ]+ 1 )]; a = ra[1 : end - 1 ]; sa = ra[2 : end ]
120
+ rb = r. b[inds[1 ]- 1 : inds[end ]]; b = rb[2 : end ]; sb = rb[1 : end - 1 ]
121
+ r. data[inds] .= @. (a - b * ℓ + sb* sℓ)
122
+ end
123
+
124
+ function LazyArrays. cache_filldata! (r:: SemiclassicalJacobiBand{:ev} , inds:: AbstractUnitRange )
125
+ rℓ = r. ℓ[inds[1 ]- 1 : inds[end ]]; ℓ,sℓ = rℓ[2 : end ], rℓ[1 : end - 1 ]
126
+ ra = r. a[inds[1 ]: (inds[end ]+ 1 )]; a = ra[1 : end - 1 ]; sa = ra[2 : end ]
127
+ rb = r. b[inds[1 ]- 1 : inds[end ]]; b = rb[2 : end ]; sb = rb[1 : end - 1 ]
128
+ r. data[inds] .= @. (sqrt ((ℓ* a + b - b* ℓ^ 2 - sa* ℓ + ℓ* sb* sℓ)* b))
129
+ end
130
+
131
+ size (:: SemiclassicalJacobiBand ) = (ℵ₀,)
132
+
133
+ SemiclassicalJacobiBand {:dv,T} (a,b,ℓ) where T = SemiclassicalJacobiBand {:dv,T} (T[a[1 ] - b[1 ]ℓ[1 ]], a, b, ℓ, (1 ,))
134
+ SemiclassicalJacobiBand {:ev,T} (a,b,ℓ) where T = SemiclassicalJacobiBand {:ev,T} (T[sqrt ((ℓ[1 ]* a[1 ] + b[1 ] - b[1 ]* ℓ[1 ]^ 2 - a[2 ]* ℓ[1 ])b[1 ])], a, b, ℓ, (1 ,))
135
+ SemiclassicalJacobiBand {dv} (a,b,ℓ) where dv = SemiclassicalJacobiBand {dv,promote_type(eltype(a),eltype(b),eltype(ℓ))} (a,b,ℓ)
136
+
137
+ copy (r:: SemiclassicalJacobiBand ) = r # immutable
138
+
139
+
140
+
56
141
"""
57
142
SemiclassicalJacobi(t, a, b, c)
58
143
@@ -63,41 +148,69 @@ struct SemiclassicalJacobi{T} <: OrthogonalPolynomial{T}
63
148
a:: T
64
149
b:: T
65
150
c:: T
66
- P # We need to store the basic case where ã,b̃,c̃ = mod(a,-1),mod(b,-1),mod(c,-1)
67
- # in order to compute lowering operators, etc.
68
- SemiclassicalJacobi {T} (t:: T ,a:: T ,b:: T ,c:: T ,P) where T = new {T} (t,a,b,c,P)
151
+ X:: AbstractMatrix{T}
152
+ SemiclassicalJacobi {T} (t:: T ,a:: T ,b:: T ,c:: T ,X:: AbstractMatrix{T} ) where T = new {T} (t,a,b,c,X)
69
153
end
70
154
71
155
const WeightedSemiclassicalJacobi{T} = WeightedBasis{T,<: SemiclassicalJacobiWeight ,<: SemiclassicalJacobi }
72
156
73
- function SemiclassicalJacobi (t, a, b, c, P :: OrthogonalPolynomial )
74
- T = float (promote_type (typeof (t), typeof (a), typeof (b), typeof (c), eltype (P )))
75
- SemiclassicalJacobi {T} (T (t), T (a), T (b), T (c), P )
157
+ function SemiclassicalJacobi (t, a, b, c, X :: AbstractMatrix )
158
+ T = float (promote_type (typeof (t), typeof (a), typeof (b), typeof (c), eltype (X )))
159
+ SemiclassicalJacobi {T} (T (t), T (a), T (b), T (c), convert (AbstractMatrix{T},X) )
76
160
end
77
161
78
- SemiclassicalJacobi (t, a, b, c, P:: SemiclassicalJacobi ) = SemiclassicalJacobi (t, a, b, c, P. P)
162
+ SemiclassicalJacobi (t, a, b, c, P:: SemiclassicalJacobi ) = SemiclassicalJacobi (t, a, b, c, semiclassical_jacobimatrix (P, a, b, c))
163
+ SemiclassicalJacobi (t, a, b, c) = SemiclassicalJacobi (t, a, b, c, semiclassical_jacobimatrix (t, a, b, c))
79
164
80
165
WeightedSemiclassicalJacobi (t, a, b, c, P... ) = SemiclassicalJacobiWeight (t, a, b, c) .* SemiclassicalJacobi (t, a, b, c, P... )
81
166
82
167
83
- function SemiclassicalJacobi (t, a, b, c)
84
- ã,b̃,c̃ = mod (a,- 1 ),mod (b,- 1 ),min (c, mod (c,- 1 ))
168
+ function semiclassical_jacobimatrix (t, a, b, c)
85
169
T = promote_type (typeof (t), typeof (a), typeof (b), typeof (c))
86
- P = jacobi (b̃, ã, UnitInterval {T} ())
170
+ P = jacobi (b, a, UnitInterval {T} ())
171
+ iszero (c) && return symtridiagonalize (jacobimatrix (P))
87
172
x = axes (P,1 )
88
- SemiclassicalJacobi (t, a, b, c, LanczosPolynomial (@. (x^ ã * (1 - x)^ b̃ * (t- x)^ c̃ ), P))
173
+ jacobimatrix ( LanczosPolynomial (@. (x^ a * (1 - x)^ b * (t- x)^ c ), P))
89
174
end
90
175
91
176
92
- function SemiclassicalJacobi (t, a :: Int , b :: Int , c :: Int )
93
- T = promote_type ( typeof (t), typeof (a), typeof (b), typeof (c) )
94
- P = Normalized ( legendre ( UnitInterval {T} ()) )
95
- x = axes (P, 1 )
96
- SemiclassicalJacobi (t, a, b, c, P )
177
+ function symraised_jacobimatrix (Q, y )
178
+ ℓ = OrthogonalPolynomialRatio (Q,y )
179
+ X = jacobimatrix (Q )
180
+ a,b = diagonaldata (X), supdiagonaldata (X )
181
+ SymTridiagonal ( SemiclassicalJacobiBand {:dv} (a,b,ℓ), SemiclassicalJacobiBand {:ev} (a,b,ℓ) )
97
182
end
98
183
184
+ function semiclassical_jacobimatrix (Q:: SemiclassicalJacobi , a, b, c)
185
+ if a == Q. a+ 1 && b == Q. b && c == Q. c
186
+ symraised_jacobimatrix (Q, 0 )
187
+ elseif a == Q. a && b == Q. b+ 1 && c == Q. c
188
+ symraised_jacobimatrix (Q, 1 )
189
+ elseif a == Q. a && b == Q. b && c == Q. c+ 1
190
+ symraised_jacobimatrix (Q, Q. t)
191
+ elseif a > Q. a
192
+ semiclassical_jacobimatrix (SemiclassicalJacobi (Q. t, Q. a+ 1 , Q. b, Q. c, Q), a, b,c)
193
+ elseif b > Q. b
194
+ semiclassical_jacobimatrix (SemiclassicalJacobi (Q. t, Q. a, Q. b+ 1 , Q. c, Q), a, b,c)
195
+ elseif c > Q. c
196
+ semiclassical_jacobimatrix (SemiclassicalJacobi (Q. t, Q. a, Q. b, Q. c+ 1 , Q), a, b,c)
197
+ else
198
+ error (" Not Implement" )
199
+ end
200
+ end
201
+
202
+ LanczosPolynomial (P:: SemiclassicalJacobi{T} ) where T =
203
+ LanczosPolynomial (orthogonalityweight (P), Normalized (jacobi (P. b, P. a, UnitInterval {T} ())), P. X. dv. data)
204
+
205
+ """
206
+ toclassical(P::SemiclassicalJacobi)
207
+
208
+ gives either a mapped `Jacobi` or `LanczosPolynomial` version of `P`.
209
+ """
210
+ toclassical (P:: SemiclassicalJacobi{T} ) where T = iszero (P. c) ? Normalized (jacobi (P. b, P. a, UnitInterval {T} ())) : LanczosPolynomial (P)
211
+
99
212
copy (P:: SemiclassicalJacobi ) = P
100
- axes (P:: SemiclassicalJacobi ) = axes (P . P )
213
+ axes (P:: SemiclassicalJacobi{T} ) where T = ( Inclusion ( UnitInterval {T} ()), OneToInf () )
101
214
102
215
== (A:: SemiclassicalJacobi , B:: SemiclassicalJacobi ) = A. t == B. t && A. a == B. a && A. b == B. b && A. c == B. c
103
216
== (:: AbstractQuasiMatrix , :: SemiclassicalJacobi ) = false
@@ -110,57 +223,9 @@ function summary(io::IO, P::SemiclassicalJacobi)
110
223
print (io, " SemiclassicalJacobi with weight x^$a * (1-x)^$b * ($t -x)^$c " )
111
224
end
112
225
113
- """
114
- RaisedOP(P, y)
115
-
116
- gives the OPs w.r.t. (y - x) .* w based on lowering to Q.
117
- """
118
226
119
- struct RaisedOP{T, QQ, LL<: OrthogonalPolynomialRatio } <: OrthogonalPolynomial{T}
120
- Q:: QQ
121
- ℓ:: LL
122
- end
123
227
124
- RaisedOP (Q, ℓ:: OrthogonalPolynomialRatio ) = RaisedOP {eltype(Q),typeof(Q),typeof(ℓ)} (Q, ℓ)
125
- RaisedOP (Q, y:: Number ) = RaisedOP (Q, OrthogonalPolynomialRatio (Q,y))
126
-
127
- function jacobimatrix (P:: RaisedOP{T} ) where T
128
- ℓ = P. ℓ
129
- X = jacobimatrix (P. Q)
130
- a,b = diagonaldata (X), supdiagonaldata (X)
131
- # non-normalized lower diag of Jacobi
132
- v = Vcat (zero (T),b .* ℓ)
133
- c = BroadcastVector ((ℓ,a,b,sa,v) -> ℓ* a + b - b* ℓ^ 2 - sa* ℓ + ℓ* v, ℓ, a, b, a[2 : ∞], v)
134
- Tridiagonal (c, BroadcastVector ((ℓ,a,b,v) -> a - b * ℓ + v, ℓ,a,b,v), b)
135
- end
136
-
137
- """
138
- cache_abstract(A)
139
-
140
- caches a `A` without storing the type of `A` as a template.
141
- This prevents exceessive compilation.
142
- """
143
- cache_abstract (v:: AbstractVector{T} ) where T = CachedAbstractVector (v)
144
- cache_abstract (S:: SymTridiagonal ) = SymTridiagonal (cache_abstract (S. dv), cache_abstract (S. ev))
145
-
146
- function jacobimatrix (P:: SemiclassicalJacobi{T} ) where T
147
- if P. a ≤ 0 && P. b ≤ 0 && P. c ≤ 0
148
- jacobimatrix (P. P)
149
- elseif P. a > 0
150
- Q = SemiclassicalJacobi (P. t, P. a- 1 , P. b, P. c, P. P)
151
- cache_abstract (symtridiagonalize (jacobimatrix (RaisedOP (Q, 0 ))))
152
- elseif P. b > 0
153
- Q = SemiclassicalJacobi (P. t, P. a, P. b- 1 , P. c, P. P)
154
- cache_abstract (symtridiagonalize (jacobimatrix (RaisedOP (Q, 1 ))))
155
- elseif P. c > 0
156
- Q = SemiclassicalJacobi (P. t, P. a, P. b, P. c- 1 , P. P)
157
- cache_abstract (symtridiagonalize (jacobimatrix (RaisedOP (Q, P. t))))
158
- else
159
- error (" Implement" )
160
- end
161
- end
162
-
163
- recurrencecoefficients (P:: SemiclassicalJacobi ) = normalized_recurrencecoefficients (P)
228
+ jacobimatrix (P:: SemiclassicalJacobi ) = P. X
164
229
165
230
"""
166
231
op_lowering(Q, y)
@@ -181,15 +246,17 @@ end
181
246
182
247
function semijacobi_ldiv (Q, P:: SemiclassicalJacobi )
183
248
if P. a ≤ 0 && P. b ≤ 0 && P. c ≤ 0
184
- (Q \ P. P)/ _p0 (P. P)
249
+ P̃ = toclassical (P)
250
+ (Q \ P̃)/ _p0 (P̃)
185
251
else
186
252
error (" Implement" )
187
253
end
188
254
end
189
255
190
256
function semijacobi_ldiv (P:: SemiclassicalJacobi , Q)
191
- R = SemiclassicalJacobi (P. t, mod (P. a,- 1 ), mod (P. b,- 1 ), mod (P. c,- 1 ), P)
192
- (P \ R) * _p0 (P. P) * (P. P \ Q)
257
+ R = SemiclassicalJacobi (P. t, mod (P. a,- 1 ), mod (P. b,- 1 ), mod (P. c,- 1 ))
258
+ R̃ = toclassical (R)
259
+ (P \ R) * _p0 (R̃) * (R̃ \ Q)
193
260
end
194
261
195
262
struct SemiclassicalJacobiLayout <: AbstractBasisLayout end
@@ -237,16 +304,16 @@ function \(w_A::WeightedSemiclassicalJacobi, w_B::WeightedSemiclassicalJacobi)
237
304
@assert A. a == B. a && A. b == B. b && A. c+ 1 == B. c
238
305
- op_lowering (A,A. t)
239
306
elseif wA. a+ 1 ≤ wB. a
240
- C = SemiclassicalJacobi (B . t, B . a - 1 , B . b, B . c, B )
241
- w_C = SemiclassicalJacobiWeight (B . t, wB . a - 1 , wB . b, wB . c) .* C
242
- L_2 = Base . inferencebarrier ( w_C) \ Base . inferencebarrier ( w_B)
243
- L_1 = Base . inferencebarrier ( w_A) \ Base . inferencebarrier ( w_C)
307
+ C = SemiclassicalJacobi (A . t, A . a + 1 , A . b, A . c, A )
308
+ w_C = SemiclassicalJacobiWeight (wA . t, wA . a + 1 , wA . b, wA . c) .* C
309
+ L_2 = w_C \ w_B
310
+ L_1 = w_A \ w_C
244
311
L_1 * L_2
245
312
elseif wA. b+ 1 ≤ wB. b
246
- C = SemiclassicalJacobi (B . t, B . a, B . b - 1 , B . c, B )
247
- w_C = SemiclassicalJacobiWeight (B . t, wB . a, wB . b - 1 , wB . c) .* C
248
- L_2 = Base . inferencebarrier ( w_C) \ Base . inferencebarrier ( w_B)
249
- L_1 = Base . inferencebarrier ( w_A) \ Base . inferencebarrier ( w_C)
313
+ C = SemiclassicalJacobi (A . t, A . a, A . b + 1 , A . c, A )
314
+ w_C = SemiclassicalJacobiWeight (wA . t, wA . a, wA . b + 1 , wA . c) .* C
315
+ L_2 = w_C \ w_B
316
+ L_1 = w_A \ w_C
250
317
L_1 * L_2
251
318
else
252
319
error (" Implement" )
@@ -261,16 +328,22 @@ massmatrix(P::SemiclassicalJacobi) = Diagonal(Fill(sum(orthogonalityweight(P)),
261
328
@simplify function * (Ac:: QuasiAdjoint{<:Any,<:SemiclassicalJacobi} , wB:: WeightedBasis{<:Any,<:SemiclassicalJacobiWeight,<:SemiclassicalJacobi} )
262
329
A = parent (Ac)
263
330
w,B = arguments (wB)
264
- P = SemiclassicalJacobi (w. t, w. a, w. b, w. c, B . P )
331
+ P = SemiclassicalJacobi (w. t, w. a, w. b, w. c)
265
332
(P\ A)' * massmatrix (P) * (P \ B)
266
333
end
267
334
268
335
269
- ldiv (Q:: SemiclassicalJacobi , f:: AbstractQuasiVector ) = (Q \ Q. P) * (Q. P \ f)
336
+ function ldiv (Q:: SemiclassicalJacobi , f:: AbstractQuasiVector )
337
+ R = SemiclassicalJacobi (Q. t, mod (Q. a,- 1 ), mod (Q. b,- 1 ), mod (Q. c,- 1 ))
338
+ R̃ = toclassical (R)
339
+ (Q \ R̃) * (R̃ \ f)
340
+ end
270
341
function ldiv (Qn:: SubQuasiArray{<:Any,2,<:SemiclassicalJacobi,<:Tuple{<:Inclusion,<:Any}} , C:: AbstractQuasiArray )
271
342
_,jr = parentindices (Qn)
272
343
Q = parent (Qn)
273
- (Q \ Q. P)[jr,jr] * (Q. P[:,jr] \ C)
344
+ R = SemiclassicalJacobi (Q. t, mod (Q. a,- 1 ), mod (Q. b,- 1 ), mod (Q. c,- 1 ))
345
+ R̃ = toclassical (R)
346
+ (Q \ R̃)[jr,jr] * (R̃[:,jr] \ C)
274
347
end
275
348
276
349
# sqrt(1-(1-x)^2) == sqrt(2x-x^2) == sqrt(x)*sqrt(2-x)
279
352
include (" derivatives.jl" )
280
353
281
354
355
+ # ##
356
+ # Hierarchy
357
+ # ##
358
+
359
+ function Base. broadcasted (:: Type{SemiclassicalJacobi} , t:: Number , ar:: AbstractUnitRange , b:: Number , c:: Number )
360
+ Ps = [SemiclassicalJacobi (t, first (ar), b, c)]
361
+ for a in ar[2 : end ]
362
+ push! (Ps, SemiclassicalJacobi (t, a, b, c, Ps[end ]))
363
+ end
364
+ Ps
365
+ end
366
+
367
+ function Base. broadcasted (:: Type{SemiclassicalJacobi} , t:: Number , a:: Number , br:: AbstractUnitRange , c:: Number )
368
+ Ps = [SemiclassicalJacobi (t, a, first (br), c)]
369
+ for b in br[2 : end ]
370
+ push! (Ps, SemiclassicalJacobi (t, a, b, c, Ps[end ]))
371
+ end
372
+ Ps
373
+ end
374
+
375
+
376
+ function Base. broadcasted (:: Type{SemiclassicalJacobi} , t:: Number , a:: Number , b:: Number , cr:: AbstractUnitRange )
377
+ Ps = [SemiclassicalJacobi (t, a, b, first (cr))]
378
+ for c in cr[2 : end ]
379
+ push! (Ps, SemiclassicalJacobi (t, a, b, c, Ps[end ]))
380
+ end
381
+ Ps
382
+ end
383
+
384
+
385
+ include (" twoband.jl" )
386
+
282
387
end
0 commit comments