Page MenuHomec4science

rayleigh_quotient_iteration.py
No OneTemporary

File Metadata

Created
Tue, May 7, 04:34

rayleigh_quotient_iteration.py

# Copyright (C) 2018 by the RROMPy authors
#
# This file is part of RROMPy.
#
# RROMPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# RROMPy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
#
import numpy as np
from rrompy.utilities.base.types import Np1D, Np2D, DictAny
from .tensor_la import dot, solve
__all__ = ['rayleighQuotientIteration']
def rayleighQuotientIteration(A:Np2D, v0:Np1D, M:Np2D, solver:callable,
solverArgs:DictAny, sigma : float = 0.,
nIterP : int = 10, nIterR : int = 10) -> float:
nIterP = min(nIterP, len(v0) // 2)
nIterR = min(nIterR, (len(v0) + 1) // 2)
v0 /= dot(dot(M, v0).T, v0.conj()) ** .5
for j in range(nIterP):
v0 = solve(A - sigma * M, dot(M, v0), solver, solverArgs)
v0 /= dot(dot(M, v0).T, v0.conj()) ** .5
l0 = dot(A.dot(v0).T, v0.conj())
for j in range(nIterR):
v0 = solve(A - l0 * M, dot(M, v0), solver, solverArgs)
v0 /= dot(dot(M, v0).T, v0.conj()) ** .5
l0 = dot(A.dot(v0).T, v0.conj())
if np.isnan(l0): l0 = np.finfo(float).eps
return np.abs(l0)

Event Timeline