tf.linalg.tridiagonal_solve
| Просмотреть исходный код на GitHub |
Решает системы тридиагональных уравнений.
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]. Последняя форма позволяет одновременно решать К систем с одинаковыми левыми частями и К различными правыми частями. Если transpose_rhs установлено в True, ожидаемая форма — [..., M] или [..., K, M].
Размерности пакетов, обозначенные как ..., должны быть одинаковыми в diagonals и rhs.
Выходной тензор имеет ту же форму, что и rhs: либо [..., M], либо [..., M, K].
Операция не гарантирует выброса ошибки, если входная матрица не обратима. tf.debugging.check_numerics можно применить к выходным данным для обнаружения проблем с обратимостью.
Примечание: при больших размерах пакетов вычисления на графическом процессоре могут быть медленными, если либоpartial_pivoting=Trueили есть несколько правых частей (K > 1). Если эта проблема возникает, рассмотрите возможность отключения пивотрования и использованияK = 1, или, как альтернативу, используйте ЦП.
На ЦП решение вычисляется с помощью исключения Гаусса с или без частичного пивотрования, в зависимости от параметра partial_pivoting. На графическом процессоре используется библиотека Nvidia cuSPARSE: 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 | Имя для этой операции (необязательно). |
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 | Возникает, если выполняются следующие условия:
|
UnimplementedError | Всегда, когда partial_pivoting истинно, а бэкенд — XLA, или когда perturb_singular истинно, а бэкенд — XLA или GPU. |
[1] Nicholas J. Higham (2002). Accuracy and Stability of Numerical Algorithms: Second Edition. SIAM. p. 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/versions/r2.9/api_docs/python/tf/linalg/tridiagonal_solve