1- using PiecewiseOrthogonalPolynomials, Plots, BlockArrays
1+ using PiecewiseOrthogonalPolynomials, Plots, BlockArrays, Test
22using MatrixFactorizations, LinearAlgebra, BlockBandedMatrices
33# ##
44# QL
@@ -9,9 +9,9 @@ function my_ql(A::BBBArrowheadMatrix{T}) where T
99 m2, n2 = size (A. D[1 ])
1010 @assert m == n == l+ 1
1111 @assert m2 == n2
12- # results stored in F and tau
12+ # results stored in F and τ
1313 F = BlockedArray (Matrix (A), axes (A))
14- tau = zeros (m+ l* m2)
14+ τ = zeros (m+ l* m2)
1515 for j in m2: - 1 : 3
1616 for i in l: - 1 : 1
1717 upper_entry = F[Block (j- 1 , j+ 1 )][i, i] # A.D[i][j-2,j]
@@ -28,7 +28,7 @@ function my_ql(A::BBBArrowheadMatrix{T}) where T
2828 print (dia_entry_new)
2929 F[m+ (j- 1 )* l+ i, m+ (j- 1 )* l+ i] = dia_entry_new # update F[Block(j+1, j+1)][i, i]
3030 F[m+ (j- 3 )* l+ i, m+ (j- 1 )* l+ i] = v[1 ]/ v[2 ] # update F[Block(j-1, j+1)][i, i]
31- tau [m+ (j- 1 )* l+ i] = coef* v[2 ]^ 2
31+ τ [m+ (j- 1 )* l+ i] = coef* v[2 ]^ 2
3232 # row recombination(householder transformation) for other columns
3333 current_upper_entry = F[Block (j- 1 , j- 1 )][i, i] # A.D[i][j-2,j-2]
3434 current_lower_entry = F[Block (j+ 1 , j- 1 )][i, i] # A.D[i][j,j-2]
@@ -53,41 +53,41 @@ function my_ql(A::BBBArrowheadMatrix{T}) where T
5353 end
5454
5555 # Deal with Block(1,3)
56- # vectors x and Lambda denote a rank 1 semiseperable matrix
57- lambda = 1.0
58- Lambda = []
56+ # vectors x and Λ denote a rank 1 semiseperable matrix
57+ λ = 1.0
58+ Λ = []
5959 x = [F[Block (1 ,3 )][l+ 1 ,l]]
6060 x_len = abs (x[1 ])
6161 for i in l: - 1 : 2 # consider i=1 later
6262 a = F[Block (1 ,3 )][i,i]
6363 b = F[Block (1 ,3 )][i,i- 1 ]
6464 c = F[Block (3 ,3 )][i,i]
65- v_last = c + sign (c) * sqrt (a^ 2 + lambda ^ 2 * x_len^ 2 + c^ 2 )
66- v_len = sqrt (a^ 2 + lambda ^ 2 * x_len^ 2 + v_last^ 2 )
67- F[m+ l+ i,m+ l+ i] = - sign (c) * sqrt (a^ 2 + lambda ^ 2 * x_len^ 2 + c^ 2 )
68- pushfirst! (Lambda, lambda / v_last)
69- lambda = - 2 / v_len^ 2 * a * b * lambda
65+ v_last = c + sign (c) * sqrt (a^ 2 + λ ^ 2 * x_len^ 2 + c^ 2 )
66+ v_len = sqrt (a^ 2 + λ ^ 2 * x_len^ 2 + v_last^ 2 )
67+ F[m+ l+ i,m+ l+ i] = - sign (c) * sqrt (a^ 2 + λ ^ 2 * x_len^ 2 + c^ 2 )
68+ pushfirst! (Λ, λ / v_last)
69+ λ = - 2 / v_len^ 2 * a * b * λ
7070 F[m+ l+ i, m+ l+ i- 1 ] = - 2 / v_len^ 2 * v_last * a * b
71- x_first = (1 - 2 / v_len^ 2 * a^ 2 ) * b / lambda
71+ x_first = (1 - 2 / v_len^ 2 * a^ 2 ) * b / λ
7272 pushfirst! (x, x_first)
7373 x_len = sqrt (x_len^ 2 + x_first^ 2 )
7474 # record information of V
7575 F[i+ 1 , m+ l+ i] = 0
7676 F[i, m+ l+ i] = a / v_last
77- tau [m+ l+ i] = 2 * v_last^ 2 / v_len^ 2
77+ τ [m+ l+ i] = 2 * v_last^ 2 / v_len^ 2
7878 end
7979 # deal with the last column in Block(1,3)
8080 a = F[Block (1 ,3 )][1 ,1 ]
8181 c = F[Block (3 ,3 )][1 ,1 ]
82- v_last = c + sign (c) * sqrt (a^ 2 + lambda ^ 2 * x_len^ 2 + c^ 2 )
83- v_len = sqrt (a^ 2 + lambda ^ 2 * x_len^ 2 + v_last^ 2 )
84- pushfirst! (Lambda, lambda / v_last)
85- F[m+ l+ 1 ,m+ l+ 1 ] = - sign (c) * sqrt (a^ 2 + lambda ^ 2 * x_len^ 2 + c^ 2 )
82+ v_last = c + sign (c) * sqrt (a^ 2 + λ ^ 2 * x_len^ 2 + c^ 2 )
83+ v_len = sqrt (a^ 2 + λ ^ 2 * x_len^ 2 + v_last^ 2 )
84+ pushfirst! (Λ, λ / v_last)
85+ F[m+ l+ 1 ,m+ l+ 1 ] = - sign (c) * sqrt (a^ 2 + λ ^ 2 * x_len^ 2 + c^ 2 )
8686 F[2 , m+ l+ 1 ] = 0
8787 F[1 , m+ l+ 1 ] = a / v_last
88- tau [m+ l+ 1 ] = 2 * v_last^ 2 / v_len^ 2
88+ τ [m+ l+ 1 ] = 2 * v_last^ 2 / v_len^ 2
8989
90- F, tau , x, Lambda
90+ F, τ , x, Λ
9191end
9292
9393
@@ -104,6 +104,11 @@ KR = Block.(Base.OneTo(N))
104104Mₙ = M[KR,KR]
105105Δₙ = Δ[KR,KR]
106106A = Δₙ + 100 ^ 2 * Mₙ
107- FF,ttau, xx, LLambda = my_ql (A)
108- # tau = ql(A).τ
109- # f = ql(A).factors
107+ FF,tτ, xx, LΛ = my_ql (A)
108+ τ = ql (A). τ
109+ f = ql (A). factors
110+
111+ @test BlockedArray (tτ, (axes (A,2 ),))[Block .(3 : 6 )] ≈ BlockedArray (τ, (axes (A,2 ),))[Block .(3 : 6 )]
112+ @test f[:,Block .(4 : 6 )] ≈ FF[:,Block .(4 : 6 )]
113+
114+ @test tril (xx * LΛ' ) + FF[Block (1 ,3 )][2 : end ,:] ≈ f[Block (1 ,3 )][2 : end ,:]
0 commit comments