TensorFlow. Решение систем линейных уравнений

Библиотека TensorFlow широко известна, в основном, в контексте машинного обучения и нейронных сетей. Однако, TensorFlow изначально не является библиотекой машинного обучения в чистом виде, а позиционируется разработчиками, как библиотека для высокопроизводительных вычислений (high perfomance computing), а это значит, что область ее применения значительно шире. Итак, выступая на конференции с докладом о том, как мы применяли TensorFlow для задачи оценки показателей надежности, я получил вполне закономерный вопрос: «А можно ли использовать TF для решения систем уравнений?». Ответ, естественно, положительный, и в этой статье рассмотрим, как решать системы линейных алгебраических уравнений.

Для систем линейных алгебраических уравнений TensorFLow содержит уже готовые методы в пакете tf.linalg. Непосредственно для решения систем линейных уравнений используется метод tf.linalg.solve.

Метод имеет следующую сигнатуру:

tf.linalg.solve(
    matrix,
    rhs,
    adjoint=False,
    name=None
)

Где matrix — матрица коэффициентов левой части системы в формате тензора [..., M, M] (квадратная матрица), rhs — правая часть системы уравнений в формате тензора [..., M, K]adjoint — указывает на то, что матрица левой части является блочным сопряжением, Name — имя оператора в графе.

Пример решения

В качестве примера возьмем следующую систему линейных уравнений

\[
\begin{cases}
2x + 3y + z = 2 \\
3x + y + 2z = 7 \\
x + 2y + 3z = 3
\end{cases}
\]

Тогда матрица левой части системы уравнений (\(A\)) принимает вид:

\[
A = \begin{bmatrix}
2&3&1\\
3&1&2\\
1&2&3
\end{bmatrix}
\]

Правой части, соответственно:

\[B = \begin{bmatrix}
2\\
7\\
3
\end{bmatrix}
\]

Первым делом импортируем TensorFlow:

import tensorflow as tf

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

A = tf.constant([[2.0, 3.0, 1.0], [3.0, 1.0, 2.0], [1.0, 2.0, 3.0]])
B = tf.constant([[2.0, ], [7.0, ], [3.0, ]])

После создания тензоров с исходными данными применим функцию, предварительно создав сессию tensorflow.

Q = tf.linalg.solve(A, B)
sess = tf.Session()
print(sess.run(Q))

получим следующий вывод:

[[ 2.       ]
 [-1.0000001]
 [ 1.0000001]]

Как видим, результаты соответствуют аналитическому решению.

Полный текст в формате jupyter notebook.

TensorFlow. Решение систем линейных уравнений: 1 комментарий

  1. Уведомление: TensorFlow. Решение систем нелинейных уравнений — Digiratory

Обсуждение закрыто.