Spec-Zone.ru › TensorFlow

tf.linalg.tridiagonal_solve

Решает системы уравнений с трёхдиагональной матрицей.

Просмотреть псевдонимы

Псевдонимы совместимости для миграции

Подробнее см. в руководстве по миграции.

tf.compat.v1.linalg.tridiagonal_solve

tf.linalg.tridiagonal_solve(
    diagonals,
    rhs,
    diagonals_format='compact',
    transpose_rhs=False,
    conjugate_rhs=False,
    name=None,
    partial_pivoting=True,
    perturb_singular=False
)

Входные данные можно передать в разных форматах: matrix, sequence и compact, указанных аргументом diagonals_format.

В формате matrix diagonals должен быть тензором формы [..., M, M], где две внутренние размерности представляют квадратные трёхдиагональные матрицы. Элементы за пределами трёх диагоналей игнорируются.

В формате sequence diagonals задаются кортежем или списком из трёх тензоров форм [..., N], [..., M], [..., N], представляющих соответственно наддиагонали, диагонали и поддиагонали. N может быть либо M-1, либо M; в последнем случае последний элемент наддиагонали и первый элемент поддиагонали игнорируются.

В формате compact три диагонали объединяются в один тензор формы [..., 3, M], последние две размерности которого содержат наддиагонали, диагонали и поддиагонали именно в таком порядке. Как и в формате sequence, элементы diagonals[..., 0, M-1] и diagonals[..., 2, 0] игнорируются.

Рекомендуется формат compact, обеспечивающий наилучшую производительность. Если нужно вручную преобразовать тензор в компактный формат, используйте tf.gather_nd. Пример для тензора формы [m, m]:

rhs = tf.constant([...])
matrix = tf.constant([[...]])
m = matrix.shape[0]
dummy_idx = [0, 0]  # An arbitrary element to use as a dummy
indices = [[[i, i + 1] for i in range(m - 1)] + [dummy_idx],  # Superdiagonal
         [[i, i] for i in range(m)],                          # Diagonal
         [dummy_idx] + [[i + 1, i] for i in range(m - 1)]]    # Subdiagonal
diagonals=tf.gather_nd(matrix, indices)
x = tf.linalg.tridiagonal_solve(diagonals, rhs)

Независимо от формата diagonals_format, rhs — это тензор формы [..., M] или [..., M, K]. Последний вариант позволяет одновременно решить K систем с одинаковыми левыми частями и K различными правыми частями. Если transpose_rhs задано как True, ожидаемая форма — [..., M] или [..., K, M].

Размерности пакета, обозначенные как ..., должны совпадать в diagonals и rhs.

Выходные данные — тензор той же формы, что и rhs: либо [..., M], либо [..., M, K].

Нет гарантии, что операция вызовет ошибку, если входная матрица необратима. К выходным данным можно применить tf.debugging.check_numerics, чтобы обнаружить проблемы с обратимостью.

Примечание: при больших размерах пакета вычисления на GPU могут выполняться медленно, если partial_pivoting=True или если имеется несколько правых частей (K > 1). Если возникла такая проблема, рассмотрите возможность отключить выбор главного элемента и задать K = 1 либо, в качестве альтернативы, использовать CPU.

На CPU решение вычисляется методом исключения Гаусса с частичным выбором главного элемента или без него — в зависимости от параметра partial_pivoting. На GPU используется библиотека cuSPARSE от Nvidia: https://docs.nvidia.com/cuda/cusparse/index.html#gtsv

Аргументы
diagonals Tensor или кортеж из Tensor, описывающих левые части. Форма зависит от diagonals_format; см. описание выше. Должно быть float32, float64, complex64 или complex128.
rhs Tensor формы [..., M] или [..., M, K] с тем же типом данных, что и у diagonals. Обратите внимание: если форма rhs и/или diags неизвестна статически, rhs будет рассматриваться как матрица, а не как вектор.
diagonals_format одно из значений: matrix, sequence или compact. По умолчанию — compact.
transpose_rhs Если True, перед решением rhs транспонируется (не влияет на результат, если форма rhs — [..., M]).
conjugate_rhs Если True, перед решением для rhs вычисляется комплексное сопряжение.
name Имя для этой Op (необязательный параметр).
partial_pivoting следует ли выполнять частичный выбор главного элемента. По умолчанию — True. Частичный выбор главного элемента повышает устойчивость процедуры, но замедляет её. В некоторых случаях, в том числе для диагонально доминирующих и симметричных положительно определённых матриц, частичный выбор главного элемента не требуется (см., например, теорему 9.12 в [1]).
perturb_singular следует ли возмущать вырожденные матрицы, чтобы получить конечный результат. По умолчанию — False. Если значение равно true, решения систем с вырожденной матрицей будут вычисляться путём возмущения близких к нулю главных элементов в LU-разложении с частичным выбором главного элемента. В частности, для предотвращения переполнения главные элементы с очень малыми значениями возмущаются на величину порядка eps * max_{ij} |U(i,j)|. Здесь U — верхняя треугольная часть LU-разложения, а eps — машинная точность. Это полезно для решения численно вырожденных систем при вычислении собственных векторов методом обратных итераций. Если partial_pivoting равно False, perturb_singular также должно быть равно False.
Возвращает
Tensor формы [..., M] или [..., M, K], содержащий решения. Если входная матрица вырождена, результат не определён.
Вызывает исключения
ValueError Вызывается при выполнении любого из следующих условий:
  1. В качестве входных данных указан неподдерживаемый тип,
  2. входные тензоры имеют неверные формы,
  3. perturb_singular равно True, но partial_pivoting не равно ему.
UnimplementedError Если partial_pivoting равно true и используется бэкенд XLA, либо если perturb_singular равно true и используется бэкенд XLA или GPU.

[1] Nicholas J. Higham (2002). Точность и устойчивость численных алгоритмов: второе издание. SIAM. С. 175. ISBN 978-0-89871-802-7.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/linalg/tridiagonal_solve

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API