solve_discrete_lyapunov#
- scipy.linalg.solve_discrete_lyapunov(a, q, метод=None)[источник]#
Решает дискретное уравнение Ляпунова \(AXA^H - X + Q = 0\).
Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.
- Параметры:
- a, q(M, M) array_like
Квадратные матрицы, соответствующие A и Q в уравнении выше соответственно. Должны иметь одинаковую форму.
- метод{'direct', 'bilinear'}, необязательно
Тип решателя.
Если не задано, выбирается как
directifMменьше 10 иbilinearв противном случае.
- Возвращает:
- xndarray
Решение дискретного уравнения Ляпунова
Смотрите также
solve_continuous_lyapunovвычисляет решение уравнения Ляпунова непрерывного времени
Примечания
Этот раздел описывает доступные решатели, которые можно выбрать с помощью параметра 'method'. Метод по умолчанию — прямой if
Mменьше 10 иbilinearв противном случае.Метод прямой использует прямое аналитическое решение дискретного уравнения Ляпунова. Алгоритм приведен, например, в [1]. Однако, он требует линейного решения системы с размерностью \(M^2\) так что производительность быстро ухудшается даже для умеренно больших матриц.
Метод билинейный использует билинейное преобразование для преобразования дискретного уравнения Ляпунова в непрерывное уравнение Ляпунова \((BX+XB'=-C)\) где \(B=(A-I)(A+I)^{-1}\) и \(C=2(A' + I)^{-1} Q (A + I)^{-1}\). Непрерывное уравнение может быть эффективно решено, так как это частный случай уравнения Сильвестра. Алгоритм преобразования взят из Попова (1964), как описано в [2].
Добавлено в версии 0.11.0.
Ссылки
[1]“Уравнение Ляпуновa”, Википедия, https://en.wikipedia.org/wiki/Lyapunov_equation#Discrete_time
[2]Gajic, Z., and M.T.J. Qureshi. 2008. Уравнение Ляпунова для матриц в устойчивости и управлении системами. Серия книг по инженерии Dover Publications.
Примеры
Учитывая a и q решить для x:
>>> import numpy as np >>> from scipy import linalg >>> a = np.array([[0.2, 0.5],[0.7, -0.9]]) >>> q = np.eye(2) >>> x = linalg.solve_discrete_lyapunov(a, q) >>> x array([[ 0.70872893, 1.43518822], [ 1.43518822, -2.4266315 ]]) >>> np.allclose(a.dot(x).dot(a.T)-x, -q) True