Диагональ, масштабирующаяся, чтобы улучшить точность собственного значения
[T, B] = баланс (A)
[S, P, B] = баланс (A)
B = балансируйтесь (A)
B = баланс (A, 'noperm')
[T,B] = balance(A)
возвращает преобразование подобия T
, таким образом, что B = T\A*T
и B
имеют, почти, приблизительно равные нормы строки и столбца. T
является перестановкой диагональной матрицы, элементы которой являются целочисленными степенями двойки, чтобы предотвратить введение ошибки округления. Если A
симметричен, то B == A
и T
являются единичной матрицей.
[S,P,B] = balance(A)
возвращает масштабирующийся векторный S
и вектор перестановки P
отдельно. Преобразование T
и сбалансированный матричный B
получено из A
, S
и P
T(:,P) = diag(S)
и B(P,P) = diag(1./S)*A*diag(S)
.
B = balance(A)
возвращает просто сбалансированный матричный B
.
B = balance(A,'noperm')
масштабирует A
, не переставляя его строки и столбцы.
Этот пример показывает основную идею. Матричный A
имеет большие элементы в верхних правых и маленьких элементах в нижнем левом углу. Это далеко от того, чтобы быть симметричным.
A = [1 100 10000; .01 1 100; .0001 .01 1] A = 1.0e+04 * 0.0001 0.0100 1.0000 0.0000 0.0001 0.0100 0.0000 0.0000 0.0001
Балансировка производит диагональный матричный T
с элементами, которые являются степенями двойки и сбалансированным матричным B
, который ближе к симметричному, чем A
.
[T,B] = balance(A) T = 1.0e+03 * 2.0480 0 0 0 0.0320 0 0 0 0.0003 B = 1.0000 1.5625 1.2207 0.6400 1.0000 0.7813 0.8192 1.2800 1.0000
Чтобы видеть эффект на собственные вектора, сначала вычислите собственные вектора A
, показанного здесь как столбцы V
.
[V,E] = eig(A); V V = 0.9999 -0.9999 -0.9999 0.0100 0.0059 + 0.0085i 0.0059 - 0.0085i 0.0001 0.0000 - 0.0001i 0.0000 + 0.0001i
Обратите внимание на то, что все три вектора имеют первый компонент самое большое. Это указывает, что V
плохо обусловливается; на самом деле cond(V)
является 8.7766e+003
. Затем, посмотрите на собственные вектора B
.
[V,E] = eig(B); V V = 0.6933 -0.6993 -0.6993 0.4437 0.2619 + 0.3825i 0.2619 - 0.3825i 0.5679 0.2376 - 0.4896i 0.2376 + 0.4896i
Теперь собственные вектора хорошего поведения, и cond(V)
является 1.4421
. Плохое создание условий сконцентрировано в масштабирующейся матрице; cond(T)
является 8192
.
Этот пример является небольшим и не действительно плохо масштабируемый, таким образом, вычисленные собственные значения A
и B
соглашаются в ошибке округления; балансировка имеет мало эффекта на вычисленные результаты.
Балансировка может уничтожить свойства определенных матриц; используйте его с некоторой осторожностью. Если матрица содержит маленькие элементы, которые происходят из-за ошибки округления, балансировка может увеличить их, чтобы сделать их столь же значительными как другие элементы исходной матрицы.
Несимметричные матрицы могли плохо обусловить собственные значения. Небольшие возмущения в матрице, такие как ошибки округления, могут привести к большим возмущениям в собственных значениях. Количество условия матрицы собственного вектора,
cond(V) = norm(V)*norm(inv(V))
где
[V,T] = eig(A)
связывает размер матричного возмущения к размеру возмущения собственного значения. Обратите внимание на то, что количество условия самого A
не важно задаче о собственных значениях.
Балансировка является попыткой сконцентрировать любое плохое создание условий матрицы собственного вектора в диагональное масштабирование. Балансировка обычно не может превращать несимметричную матрицу в симметрическую матрицу; это только пытается сделать норму каждой строки равной норме соответствующего столбца.
Функция собственного значения MATLAB®, eig(A)
, автоматически балансирует A
прежде, чем вычислить его собственные значения. Выключите балансировку с eig(A,'nobalance')
.