scipy.linalg.

matrix_balance#

scipy.linalg.matrix_balance(A, переставить=True, scale=True, отдельный=False, overwrite_a=False)[источник]#

Вычислить диагональное подобие преобразования для балансировки строк/столбцов.

Балансировка пытается уравнять 1-нормы строк и столбцов, применяя преобразование подобия, чтобы вариация величины элементов матрицы отражалась в масштабирующих матрицах.

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

Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.

Параметры:
A(n, n) array_like

Квадратная матрица данных для балансировки.

переставитьbool, необязательно

Селектор для определения, выполняется ли также перестановка A перед масштабированием.

scalebool, необязательно

Селектор для включения и выключения масштабирования. Если False, матрица не будет масштабироваться.

отдельныйbool, необязательно

Это переключает с возврата полной матрицы преобразования на кортеж из двух отдельных 1-D массивов перестановки и масштабирования.

overwrite_abool, необязательно

Это передается непосредственно в xGEBAL. По сути, перезаписывает результат в данные. Это может повысить эффективность использования памяти. Подробности см. в руководстве LAPACK. По умолчанию установлено значение False.

Возвращает:
B(n, n) ndarray

Сбалансированная матрица

T(n, n) ndarray

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

scale, perm(n,) ndarray

Если separate ключевое слово установлено в True, тогда вместо массива T выше, масштабирование и векторы перестановки заданы отдельно как кортеж без выделения полного массива T.

Примечания

Сбалансированная матрица удовлетворяет следующему равенству

\[B = T^{-1} A T\]

Коэффициенты масштабирования аппроксимируются до ближайшей степени двойки, чтобы избежать ошибок округления.

Этот алгоритм особенно полезен для разложений собственных значений и матриц, и во многих случаях он уже вызывается различными процедурами LAPACK.

Алгоритм основан на известной технике [1] и был модифицирован для учёта особых случаев. См. [2] для подробностей, которые были реализованы начиная с LAPACK v3.5.0. До этой версии существуют крайние случаи, когда балансировка может фактически ухудшить обусловленность. См. [3] для таких примеров.

Код является обёрткой вокруг семейства подпрограмм LAPACK xGEBAL для балансировки матриц.

Добавлено в версии 0.19.0.

Ссылки

[1]

B.N. Parlett и C. Reinsch, «Балансировка матрицы для вычисления собственных значений и собственных векторов», Numerische Mathematik, Т.13(4), 1969, DOI:10.1007/BF02165404

[2]

R. James, J. Langou, B.R. Lowery, "On matrix balancing and eigenvector computation", 2014, arXiv:1401.5766

[3]

D.S. Watkins. Случай, когда балансировка вредна. Electron. Trans. Numer. Anal, Vol.23, 2006.

Примеры

>>> import numpy as np
>>> from scipy import linalg
>>> x = np.array([[1,2,0], [9,1,0.01], [1,2,10*np.pi]])
>>> y, permscale = linalg.matrix_balance(x)
>>> np.abs(x).sum(axis=0) / np.abs(x).sum(axis=1)
array([ 3.66666667,  0.4995005 ,  0.91312162])
>>> np.abs(y).sum(axis=0) / np.abs(y).sum(axis=1)
array([ 1.2       ,  1.27041742,  0.92658316])  # may vary
>>> permscale  # only powers of 2 (0.5 == 2^(-1))
array([[  0.5,   0. ,  0. ],  # may vary
       [  0. ,   1. ,  0. ],
       [  0. ,   0. ,  1. ]])