1- using Revise, InfiniteLinearAlgebra, BlockBandedMatrices, BlockArrays, BandedMatrices, LazyArrays, FillArrays, MatrixFactorizations, Plots
2- import MatrixFactorizations: reflectorApply!, QLPackedQ
3- import InfiniteLinearAlgebra: blocktailiterate, _ql, qltail, rightasymptotics
4- import BandedMatrices: bandeddata,_BandedMatrix
1+ using InfiniteLinearAlgebra, BandedMatrices, PyPlot
2+
53
64function ℓ11 (A,λ; kwds... )
75 try
@@ -16,24 +14,23 @@ function findsecond(λ)
1614 λ[j], j
1715end
1816
19- function qlplot (A; branch= findmax, x= range (- 4 ,4 ; length= 200 ), y= range (- 4 ,4 ;length= 200 ), kwds... )
17+ qlplot (A:: AbstractMatrix ; kwds... ) = qlplot (BandedMatrix (A); kwds... )
18+ function qlplot (A:: BandedMatrix ; branch= findmax, x= range (- 4 ,4 ; length= 200 ), y= range (- 4 ,4 ;length= 200 ), kwds... )
2019 z = ℓ11 .(Ref (A), x' .+ y.* im; branch= branch)
2120 contourf (x,y,z; kwds... )
2221end
2322
24- function symbolplot! (A:: BandedMatrix ; kwds... )
23+
24+
25+ toepcoeffs (A:: BandedMatrix ) = InfiniteLinearAlgebra. rightasymptotics (A. data). args[1 ]
26+ toepcoeffs (A:: Adjoint ) = reverse (toepcoeffs (A' ))
27+
28+ function symbolplot (A:: BandedMatrix ; kwds... )
2529 l,u = bandwidths (A)
26- a = rightasymptotics (A . data) . args[ 1 ]
30+ a = toepcoeffs (A)
2731 θ = range (0 ,2 π; length= 1000 )
28- i = Vector {ComplexF64} ()
29- for t in θ
30- r = 0.0 + 0.0im
31- for k= 1 : length (a)
32- r += exp (im* (k- l- 1 )* t) * a[k]
33- end
34- push! (i,r)
35- end
36- plot! (i; kwds... )
32+ i = map (t -> dot (exp .(im.* (u: - 1 : - l). * t),a),θ)
33+ plot (real .(i), imag .(i); kwds... )
3734end
3835
3936
4239# ##
4340
4441A = BandedMatrix (1 => Fill (2im ,∞), 2 => Fill (- 1 ,∞), 3 => Fill (2 ,∞), - 2 => Fill (- 4 ,∞), - 3 => Fill (- 2im ,∞))
45- p = plot (); symbolplot! (A)
42+ clf ();qlplot (A; x= range (- 10 ,7 ; length= 100 ), y= range (- 7 ,8 ;length= 100 )); symbolplot (A; color= :black ); title (" Trefethen & Embree" )
43+ clf (); qlplot (transpose (A); x= range (- 10 ,7 ; length= 200 ), y= range (- 7 ,8 ;length= 200 )); symbolplot (A; color= :black ); title (" Trefethen & Embree, transpose" )
4644
4745# ##
48- # Non-normal
46+ # limaçon
4947# ##
5048
51- A = BandedMatrix (- 1 => Vcat (Float64[], Fill (1 / 4 ,∞)), 0 => Vcat ([1im ],Fill (0 ,∞)), 1 => Vcat (Float64[], Fill (1 ,∞)))
52- qlplot (A; title= " A" , linewidth= 0 , x= range (- 2 ,2 ; length= 100 ), y= range (- 2 ,2 ;length= 100 ))
53- symbolplot! (A; linewidth= 2.0 , linecolor= :blue , legend= false )
54- qlplot (BandedMatrix (A' ); title= " A', 1st" , linewidth= 0 , nlevels= 100 , x= range (- 2 ,2 ; length= 100 ), y= range (- 2 ,2 ;length= 100 ))
55- symbolplot! (A; linewidth= 2.0 , linecolor= :blue , legend= false )
56- qlplot (BandedMatrix (A' ); branch= findsecond, title= " A'" , linewidth= 0 , nlevels= 100 , x= range (- 2 ,2 ; length= 100 ), y= range (- 2 ,2 ;length= 100 ))
57-
58-
59- heatmap! (x,y,fill (- 100 ,length (y),length (x)); legend= false , color= :grays , fillalpha= (z -> isnan (z) ? 0.0 : 1.0 ). (z))
60-
61- Matrix ((A)[1 : 1000 ,1 : 1000 ]) |> eigvals |> scatter
62-
63- ql (A- 2 I)
64-
65-
66- θ = range (0 ,2 π; length= 1000 )
67- a = z -> z + 0.25 / z
68- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
69-
70-
71-
72-
73-
74- A = BandedMatrix (- 10 => Fill (4.0 ,∞), 1 => Fill (1 ,∞))
75- ql (A+ 0im * I)
76-
77-
78-
79-
80- θ = range (0 ,2 π- 0.5 ; length= 1000 )
81- a = z -> 4 z^ 10 + 1 / z
82- θ = range (0 ,2 π; length= 1000 )
83- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
84-
85- import InfiniteLinearAlgebra: tail_de
86- a = reverse (A. data. args[1 ]) .+ 0im
87-
88- a = randn (10 ) .+ im* randn (10 ); a[1 ] += 10 ; a[end ] = 1 ;
89- de = tail_de (a)
90-
91- @which tail_de (a)
92-
93- ql ([transpose (a); 0 transpose (de)])
94-
95- ql ([transpose (a); 0 transpose (de2)])
96-
97- de
98-
99- contourf (x,y,angle .(a .(x' .+ y.* im)))
100-
101- A'
102- Fun (a, Laurent ())
103-
104- A'
105-
106-
107- a (1.0 exp (0.5im ))
49+ A = BandedMatrix (- 2 => Fill (1.0 ,∞), - 1 => Fill (1.0 ,∞), 1 => Fill (eps (),∞))
50+ qlplot (A; x= range (- 2 ,3 ; length= 100 ), y= range (- 2.5 ,2.5 ;length= 100 )); symbolplot (A; color= :black ); title (" Limacon" )
51+ clf (); qlplot (A; branch= findsecond, x= range (- 2 ,3 ; length= 100 ), y= range (- 2.5 ,2.5 ;length= 100 )); symbolplot (A; color= :black ); title (" Limacon, second branch" )
52+ clf (); qlplot (transpose (A); x= range (- 2 ,3 ; length= 100 ), y= range (- 2.5 ,2.5 ;length= 100 )); symbolplot (A; color= :black ); title (" Limacon, transpose" )
10853
109- # ### To be cleaned
11054
55+ ql (A- (0.5 + 0.000001im )* I; branch= findsecond)
11156
112- function reduceband (A)
113- l,u = bandwidths (A)
114- H = _BandedMatrix (A. data, ∞, l+ u- 1 , 1 )
115- Q1,L1 = ql (H)
116- D = Q1[1 : l+ u+ 1 ,1 : 1 ]' A[1 : l+ u+ 1 ,1 : u- 1 ]
117- D, Q1, L1
118- end
119- _Lrightasymptotics (D:: Vcat ) = D. args[2 ]
120- _Lrightasymptotics (D:: ApplyArray ) = D. args[1 ][2 : end ] * Ones {ComplexF64} (1 ,∞)
121- Lrightasymptotics (L) = _Lrightasymptotics (rightasymptotics (parent (L). data))
122-
123- function qdL (A)
124- l,u = bandwidths (A)
125- H = _BandedMatrix (A. data, ∞, l+ u- 1 , 1 )
126- Q1,L1 = ql (H)
127- D1, Q1, L1 = reduceband (A)
128- T2 = _BandedMatrix (Lrightasymptotics (L1), ∞, l, u)
129- l1 = L1[1 ,1 ]
130- A2 = [[D1 l1 zeros (1 ,10 - size (D1,2 )- 1 )]; T2[1 : 10 - 1 ,1 : 10 ]] # TODO : remove
131- B2 = _BandedMatrix (T2. data, ∞, l+ u- 2 , 2 )
132- B2 = _BandedMatrix (T2. data, ∞, l+ u- 2 , 2 )
133- D2, Q2, L2 = reduceband (B2)
134- l2 = L2[1 ,1 ]
135- # peroidic tail
136- T3 = _BandedMatrix (Lrightasymptotics (L2), ∞, l+ 1 , u- 1 )
137- A3 = [[D2 l2 zeros (1 ,10 - size (D2,2 )- 1 )]; T3[1 : 10 - 1 ,1 : 10 ]] # TODO : remove
138-
139- Q3,L3 = ql ( [A2[1 ,1 ] A2[1 : 1 ,2 : 3 ]; [Q2[1 : 3 ,1 : 1 ]' * T2[1 : 3 ,1 ] A3[1 : 1 ,1 : 2 ] ]])
140-
141- fd_data = hcat ([0 ; L3[:,1 ]; Q2[1 : 3 ,2 : 3 ]' * T2[1 : 3 ,1 ]], [L3[:,2 ]; T3[1 : 3 ,1 ]], [L3[2 ,3 ]; T3[1 : 4 ,2 ]])
142- B3 = _BandedMatrix (Hcat (fd_data, T3. data), ∞, l+ u- 1 , 1 )
143-
144- ql (B3). L
145- end
146- # Bull's head
147- A = BandedMatrix (- 3 => Fill (7 / 10 ,10 ), - 2 => Fill (1 ,11 ), 1 => Fill (2im ,9 ))
57+ # ##
58+ # bull-head
59+ # ##
14860
14961A = BandedMatrix (- 3 => Fill (7 / 10 ,∞), - 2 => Fill (1 ,∞), 1 => Fill (2im ,∞))
150- qlplot (A; title= " largest" , linewidth= 0 )
151-
152-
153- qlplot (A; branch= findsecond, title= " second largest" , linewidth= 0 )
154-
155-
156-
157- sortp
158-
159- ql (A- (1 + 2im )* I)
160-
161- θ = range (0 ,2 π; length= 1000 )
162- a = z -> 2im / z + z^ 2 + 7 / 10 * z^ 3
163- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
164- qlplot (A; branch= 2 , title= " branch=2" , linewidth= 0 )
165-
166-
167-
62+ clf ();qlplot (A; x= range (- 10 ,7 ; length= 100 ), y= range (- 7 ,8 ;length= 100 )); symbolplot (A; color= :black ); title (" Bull-head" )
63+ clf (); qlplot (transpose (A); x= range (- 10 ,7 ; length= 100 ), y= range (- 7 ,8 ;length= 100 )); symbolplot (A; color= :black ); title (" Bull-head, transpose" )
16864
169- θ = range (0 ,2 π; length= 1000 )
170- a = z -> 2im / z + z^ 2 + 7 / 10 * z^ 3
171- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
172-
173-
174- ql (A - (5 + 2im )* I; branch= 1 )
175-
176- ℓ = λ -> try abs (ql (A- λ* I). L[1 ,1 ]) catch DomainError
177- (- 1 ) end
178- x,y = range (- 4 ,4 ; length= 200 ),range (- 4 ,4 ;length= 200 )
179- z = ℓ .(x' .+ y.* im)
180- contourf (x,y,z; nlevels= 100 , title= " A" , linewidth= 0 )
181- θ = range (0 ,2 π; length= 1000 )
182- a = z -> 2im / z + z^ 2 + 7 / 10 * z^ 3
183- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
184-
185- Ac = BandedMatrix (A' )
186-
187- ℓ = λ -> try abs (qdL (Ac- conj (λ)* I)[1 ,1 ]) catch DomainError
188- (- 1.0 ) end
189- x,y = range (- 4 ,4 ; length= 100 ),range (- 4 ,4 ;length= 100 )
190- @time z = ℓ .(x' .+ y.* im)
191- contourf (x,y,z; nlevels= 100 , title= " A'" , linewidth= 0.0 )
192- θ = range (0 ,2 π; length= 1000 )
193- a = z -> 2im / z + z^ 2 + 7 / 10 * z^ 3
194- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
19565
66+ # ##
19667# Grcar
197- A = BandedMatrix (- 3 => Fill (1 ,∞), - 2 => Fill (1 ,∞), - 1 => Fill (1 ,∞), 0 => Fill (1 ,∞), 1 => Fill (- 1 ,∞))
198- ℓ = λ -> try abs (ql (A- λ* I). L[1 ,1 ]) catch DomainError
199- - 1 end
200- x,y = range (- 4 ,4 ; length= 200 ),range (- 4 ,4 ;length= 200 )
201- z = ℓ .(x' .+ y.* im)
202-
203- θ = range (0 ,2 π; length= 1000 )
204- a = z -> - 1 / z + 1 + z + z^ 2 + z^ 3
205- contourf (x,y,z; nlevels= 50 )
206- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
207-
208-
209- # Triangle
210- A = BandedMatrix (- 2 => Fill (1 / 4 ,∞), 1 => Fill (1 ,∞))
211- ℓ = λ -> try abs (ql (A- λ* I). L[1 ,1 ]) catch DomainError
212- (- 1 ) end
213- x,y = range (- 2 ,2 ; length= 200 ),range (- 2 ,2 ;length= 200 )
214- z = ℓ .(x' .+ y.* im)
215- θ = range (0 ,2 π; length= 1000 )
216- a = z -> z^ 2 / 4 + 1 / z
217-
218- contourf (x,y,z; nlevels= 50 )
219- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
220-
221-
222- function Toep_L11 (T)
223- l,u = bandwidths (T)
224- @assert u == 2
225- # shift by one
226- H = _BandedMatrix (T. data, ∞, l+ 1 , 1 )
227- Q1,L1 = ql (H)
228-
229- d = Q1[1 : 3 ,1 ]' T[1 : 1 + l,1 ]
230- ℓ = Q1. factors. data. args[2 ]. args[1 ][2 : end ] # new L
231- T2 = _BandedMatrix (Hcat ([[zero (d); d; ℓ[3 : end ]] L1[1 : 5 ,1 ]], ℓ* Ones {eltype(T)} (1 ,∞)), ∞, 3 , 1 )
232- Q2,L2 = ql (T2)
233- D = (Q2' )[1 : 5 ,1 : 4 ] * (Q1' )[1 : 4 ,1 : 3 ] * T[3 : 5 ,1 : 3 ]
234- X = [Matrix (T[3 : 4 ,1 : 6 ]); [zeros (2 ,2 ) [- 1 0 ; 0 1 ]* D[1 : 2 ,:] [- 1 0 ; 0 1 ]* L2[1 : 2 ,2 ]]]
235- ql (X). L[1 ,3 ]
236- end
237-
238-
239-
240- A = BandedMatrix (2 => Fill (1 / 4 ,∞), - 1 => Fill (1 ,∞), - 2 => Fill (0.0 , ∞))
241- @time Toep_L11 (A- (0.1 + 0im )I)
242-
243- T = A- (0.1 + 0im )I
244-
245-
246- ℓ = λ -> abs (Toep_L11 (A- λ* I))
247- x,y = range (- 2 ,2 ; length= 51 ),range (- 2 ,2 ;length= 50 )
248- z = ℓ .(x' .+ y.* im)
249- θ = range (0 ,2 π; length= 1000 )
250- a = z -> z^ 2 / 4 + 1 / z
251-
252- contour (x,y,z; nlevels= 50 )
253- plot! (a .(exp .(im.* θ)); linewidth= 2.0 , linecolor= :blue , legend= false )
68+ # ##
0 commit comments