balance
固有値の計算精度を改良するための対角スケーリング
構文
[T,B] = balance(A)
[S,P,B] = balance(A)
B = balance(A)
B = balance(A,'noperm')
説明
[T,B] = balance(A)
は、B = T\A*T
で、かつ B
の行ノルムと列ノルムが可能な限り近似的に等しくなるような相似変換 T
を返します。T
は対角行列を置き換えたもので、その要素は丸め誤差が入り込まないようにするために、2 の整数べき乗になります。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
バランス化は、2 のべき乗を要素とする対角行列 T
と、行列 A
よりは対称に近いバランス化された行列 B
を生成します。
[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
3 つのベクトルはいずれも、最初の要素が最も大きくなっていることに注目してください。これは 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')
としてください。