1
1
# Simple methods
2
- export powm, invpowm, rqi
2
+ export powm, invpowm
3
3
4
4
# ###################
5
5
# API method calls #
@@ -95,54 +95,6 @@ function invpowm_method!{T}(log::ConvergenceHistory, K::KrylovSubspace{T}, σ::N
95
95
σ+ 1 / θ, y/ θ
96
96
end
97
97
98
- # ###################
99
- # API method calls #
100
- # ###################
101
-
102
- function rqi (A;
103
- x= nothing , shift:: Number = 0 , tol:: Real = eps (real (eltype (A)))* size (A,2 )^ 3 ,
104
- maxiter:: Int = size (A,2 ), plot:: Bool = false , log:: Bool = false , kwargs...
105
- )
106
- K = KrylovSubspace (A, 1 )
107
- x== nothing ? initrand! (K) : init! (K, x/ norm (x))
108
-
109
- (plot & ! log) && error (" Can't plot when log keyword is false" )
110
- history = ConvergenceHistory (partial= ! log)
111
- history[:tol ] = tol
112
- reserve! (history,:resnorm , maxiter)
113
- eig, v = rqi_method! (history, K, shift; tol= tol, maxiter= maxiter, kwargs... )
114
- (plot || log) && shrink! (history)
115
- plot && showplot (history)
116
- log ? (eig, v, history) : (eig, v)
117
- end
118
-
119
- # ########################
120
- # Method Implementation #
121
- # ########################
122
-
123
- # Rayleigh quotient iteration
124
- # XXX Doesn't work well
125
- function rqi_method! {T} (log:: ConvergenceHistory , K:: KrylovSubspace{T} , σ:: Number ;
126
- tol:: Real = eps (real (T)), maxiter:: Int = K. n, verbose:: Bool = false
127
- )
128
- verbose && @printf (" === rqi ===\n %4s\t %7s\n " ," iter" ," resnorm" )
129
- v = lastvec (K)
130
- ρ = dot (v, nextvec (K))
131
- for iter= 1 : maxiter
132
- nextiter! (log,mvps= 1 )
133
- y = (K. A- ρ* eye (K))\ v
134
- θ = norm (y)
135
- ρ += dot (y,v)/ θ^ 2
136
- v = y/ θ
137
- resnorm= 1 / θ
138
- push! (log,:resnorm ,resnorm)
139
- verbose && @printf (" %3d\t %1.2e\n " ,iter,resnorm)
140
- θ >= 1 / tol && (setconv (log, resnorm >= 0 ); break )
141
- end
142
- verbose && @printf (" \n " )
143
- ρ, v
144
- end
145
-
146
98
# ################
147
99
# Documentation #
148
100
# ################
@@ -153,31 +105,23 @@ doc1_call = """ powm(A)
153
105
"""
154
106
doc2_call = """ invpowm(A)
155
107
"""
156
- doc3_call = """ rqi(A)
157
- """
158
108
doc1_msg = """ Find biggest eigenvalue of `A` and its associated eigenvector
159
109
using the power method.
160
110
"""
161
111
doc2_msg = """ Find closest eigenvalue of `A` to `shift` and its associated eigenvector
162
112
using the inverse power iteration method.
163
113
"""
164
- doc3_msg = """ Try find closest eigenvalue of `A` to `shift` and its associated eigenvector
165
- using the rayleigh quotient iteration method. This method converges rapidly
166
- but is not guaranteed to compute the eigenvalue closes to `shift`.
167
- """
168
114
doc1_karg = " "
169
115
doc2_karg = " `shift::Number=0`: shift to be applied to matrix A."
170
- doc3_karg = " `shift::Number=0`: shift to be applied to matrix A."
171
116
172
117
doc1_version = (powm, doc1_call, doc1_msg, doc1_karg)
173
118
doc2_version = (invpowm, doc2_call, doc2_msg, doc2_karg)
174
- doc3_version = (rqi, doc3_call, doc3_msg, doc3_karg)
175
119
176
120
i= 0
177
- docstring = Vector (3 )
121
+ docstring = Vector (2 )
178
122
179
123
# Build docs
180
- for (func, call, msg, karg) in [doc1_version, doc2_version, doc3_version ]
124
+ for (func, call, msg, karg) in [doc1_version, doc2_version]
181
125
i+= 1
182
126
docstring[i] = """
183
127
$call
239
183
240
184
@doc docstring[1 ] -> powm
241
185
@doc docstring[2 ] -> invpowm
242
- @doc docstring[3 ] -> rqi
243
186
end
0 commit comments