Библиотека 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. Решение систем нелинейных уравнений — Digiratory