/* -*- MaTX -*- * * 【名前】 * balance() - 非対称行列のバランス化 * * 【形式】 * {D,B} = balance(A) * Matrix D,B; * Matrix A; * * 【機能説明】 * {D,B} = balance(A) は,対角成分が 2 のべき乗である対角行列 D * と,次式のバランス化された行列 B を求める。 * * B = D \ A * D * * 行列 B は,行列 A より対称行列に近く,各行のノルムが対応する * 列のノルムに近い。 * 固有値を求める関数 eig(A) は,A の固有値を計算する前に,自動 * 的に A をバランス化する。 * * 【アルゴリズム】 * balance は Eispack の Fortran サブルーチン balanc と balbak * を C の関数に変換したものを利用する。 * * 【例題】 * 右上の成分に大きな値,左下に小さな値がある行列 * * >> A = [[ 1 100 10000] * [ 0.01 1 100] * [0.0001 0.01 1] * * に対して,balance()を適用すると, * * >> {D,B} = balance(A); * >> print D, B; * === [D] : ( 3, 3) === * ( 1) ( 2) ( 3) * ( 1) 2.0480000E+03 0.0000000E+00 0.0000000E+00 * ( 2) 0.0000000E+00 3.2000000E+01 0.0000000E+00 * ( 3) 0.0000000E+00 0.0000000E+00 2.5000000E-01 * === [B] : ( 3, 3) === * ( 1) ( 2) ( 3) * ( 1) 1.0000000E+00 1.5625000E+00 1.2207031E+00 * ( 2) 6.4000000E-01 1.0000000E+00 7.8125000E-01 * ( 3) 8.1920000E-01 1.2800000E+00 1.0000000E+00 * * となり,行列 B が 行列 A より対称行列に近くなる。 * * 【関連項目】 * eig(), schur(), hess() */