Документация Engee

Обратный степенной метод

Приближенно решает задачу на нахождение собственных значений , где  — это общее линейное отображение. По умолчанию сходится к доминирующей собственной паре , при которой является наибольшим. Для определения конкретного собственного значения вблизи shift в комплексной плоскости могут быть применены сдвиг и инвертирование.

Использование

powm(B; kwargs...) -> λ, x, [history]

См. описание powm!. Вызывает powm!(B, x0; kwargs...) с x0, инициализированным в виде случайного комплексного единичного вектора.

powm!(B, x; shift = zero(eltype(B)), inverse::Bool = false, kwargs...) -> λ, x, [history]

По умолчанию находит приближенную собственную пару (λ, x) для B, где |λ| является наибольшим.

Аргументы

  • B: линейное отображение. См. примечание ниже.

  • x: нормализованное начальное предположение. При необходимости используйте арифметику комплексных чисел.

Ключевые слова

  • tol::Real = eps(real(eltype(B))) * size(B, 2) ^ 3: допуск остановки для нормы невязки;

  • maxiter::Integer = size(B,2): максимальное количество итераций;

  • log::Bool: отслеживание нормы невязки в каждой итерации;

  • verbose::Bool: вывод информации о сходимости во время итераций.

Применяя сдвиг и инвертирование к с invert = true и shift = ..., обратите внимание на то, что роль B * b будет заключаться в вычислении inv(A - shift I) * b. Поэтому вместо передачи самого линейного отображения передайте линейное отображение B, которое позволяет выполнять сдвиг и инвертирование. Собственное значение преобразуется обратно в собственное значение фактической матрицы .

Возвращаемые значения

если log имеет значение false

  • λ::Number приближенное собственное значение, вычисляемое как отношение Релея;

  • x::Vector приближенный собственный вектор;

если log имеет значение true

  • λ::Number: приближенное собственное значение, вычисляемое как отношение Релея;

  • x::Vector: приближенный собственный вектор;

  • history: история сходимости.

Ключи ConvergenceHistory

  • :tol => ::Real: допуск остановки;

  • :resnom => ::Vector: норма невязки в каждой итерации.

Примеры

using LinearMaps
σ = 1.0 + 1.3im
A = rand(ComplexF64, 50, 50)
F = lu(A - σ * I)
Fmap = LinearMap{ComplexF64}((y, x) -> ldiv!(y, F, x), 50, ismutating = true)
λ, x = powm(Fmap, inverse = true, shift = σ, tol = 1e-4, maxiter = 200)
invpowm(B; shift = σ, kwargs...) -> λ, x, [history]

Находит приближенную собственную пару (λ, x) для вблизи shift, где B является линейным отображением с эффектом B * v = inv(A - σI) * v.

Метод вызывает powm!(B, x0; inverse = true, shift = σ) с x0 в виде случайного комплексного единичного вектора. См. описание powm!.

Примеры

using LinearMaps
σ = 1.0 + 1.3im
A = rand(ComplexF64, 50, 50)
F = lu(A - σ * I)
Fmap = LinearMap{ComplexF64}((y, x) -> ldiv!(y, F, x), 50, ismutating = true)
λ, x = invpowm(Fmap, shift = σ, tol = 1e-4, maxiter = 200)
invpowm!(B, x0; shift = σ, kwargs...) -> λ, x, [history]

Находит приближенную собственную пару (λ, x) для вблизи shift, где B является линейным отображением с эффектом B * v = inv(A - σI) * v.

Метод вызывает powm!(B, x0; inverse = true, shift = σ). См. описание powm!.

Сведения о реализации

Для хранения требуется 3 вектора: приближенный собственный вектор x, вектор невязки r и временный. Норма невязки запаздывает на одну итерацию, так как вычисляется при выполнении . Поэтому конечная норма невязки еще меньше.