ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

eig

固有値と固有ベクトル

構文

  • lambda = eig(A)
  • lambda = eig(A,balanceOption)
  • lambda = eig(A,B)
  • lambda = eig(A,B,algorithm)
  • [V,D] = eig(___)
  • [V,D,W] = eig(___)
  • [___] = eig(___,eigvalOption)

説明

lambda = eig(A) は、多重度をもつ固有値を含む列ベクトルを返します。これは、式 Av = λv を満たします。ここで、A は n 行 n 列の行列、v は長さ n の列ベクトル、λ はスカラーです。この方程式を満たす λ の値は固有値です。この方程式を満たす v に相当する値が右固有ベクトルになります。

lambda = eig(A,balanceOption) は、バランス化オプションを次の 2 つの文字列、事前のバランス化手順を有効にする 'balance'、または無効にする 'nobalance' のどちらかを指定します。

lambda = eig(A,B) は、ペア (A,B) の一般化固有値を含むベクトルを返します。これは式 Av = λBv を満たします。ここで、A および B は n 行 n 列の行列、v は長さ n の列ベクトル、λ はスカラーです。この方程式を満たす λ の値は一般化固有値です。v に相当する値が、一般化右固有ベクトルになります。

lambda = eig(A,B,algorithm) は、一般化固有値のアルゴリズムを次の 2 つの文字列、QZ アルゴリズムを使用する 'qz' または B のコレスキー分解を使用する 'chol' で指定します。

[V,D] = eig(___) は、前述の入力構文に対して 2 つのオプション出力を返します。D は固有値を含む対角行列です。V は対応する右固有ベクトルを列にもつ行列です。

[V,D,W] = eig(___) は、前述の入力構文のいずれかを使用して、対応する左固有ベクトルを列にもつ行列 W も返します。左固有ベクトル w は式 wA = λw を満たします。

[___] = eig(___,eigvalOption) は、前の構文または出力のいずれかを使用して、eigvalOption で指定された形式で固有値を返します。eigvalOption'vector' として指定すると、固有値の列ベクトル lambda を返し、'matrix' として指定すると、固有値の対角行列 D を返します。

すべて折りたたむ

実数対称行列の固有値

関数 gallery を使用して対称正定行列を作成します。

A = gallery('lehmer',4)
A =

    1.0000    0.5000    0.3333    0.2500
    0.5000    1.0000    0.6667    0.5000
    0.3333    0.6667    1.0000    0.7500
    0.2500    0.5000    0.7500    1.0000

A の固有値を計算します。結果は列ベクトルになります。

lambda = eig(A)
lambda =

    0.2078
    0.4078
    0.8482
    2.5362

または、eigvalOption を使用して、固有値を対角行列で返します。

D = eig(A,'matrix')
D =

    0.2078         0         0         0
         0    0.4078         0         0
         0         0    0.8482         0
         0         0         0    2.5362

非対称行列の固有値と固有ベクトル

関数 gallery を使用して、循環行列を作成します。

A = gallery('circul',3)
A =

     1     2     3
     3     1     2
     2     3     1

A の固有値と右固有ベクトルを計算します。

[V,D] = eig(A)
V =

  -0.5774 + 0.0000i   0.2887 - 0.5000i   0.2887 + 0.5000i
  -0.5774 + 0.0000i  -0.5774 + 0.0000i  -0.5774 + 0.0000i
  -0.5774 + 0.0000i   0.2887 + 0.5000i   0.2887 - 0.5000i

D =

   6.0000 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -1.5000 + 0.8660i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i  -1.5000 - 0.8660i

固有値はすべて異なり、固有ベクトルは独立しているため、行列 VA を対角化していることを確認します。

V\A*V
ans =

   6.0000 + 0.0000i   0.0000 - 0.0000i  -0.0000 + 0.0000i
  -0.0000 - 0.0000i  -1.5000 + 0.8660i  -0.0000 - 0.0000i
  -0.0000 + 0.0000i  -0.0000 + 0.0000i  -1.5000 - 0.8660i

スケールが大きく異なる要素をもつ行列の固有値および固有ベクトル

A = [ 3.0     -2.0      -0.9     2*eps;
     -2.0      4.0       1.0    -eps;
     -eps/4    eps/2    -1.0     0;
     -0.5     -0.5       0.1     1.0];

既定の (バランス化) 動作を使用して、固有値と右固有ベクトルを計算します。

[VB,DB] = eig(A)
VB =

    0.6153   -0.4176   -0.0000   -0.1437
   -0.7881   -0.3261   -0.0000    0.1264
   -0.0000   -0.0000   -0.0000   -0.9196
    0.0189    0.8481    1.0000    0.3432


DB =

    5.5616         0         0         0
         0    1.4384         0         0
         0         0    1.0000         0
         0         0         0   -1.0000

結果が A*VB = VB*DB を満たすかどうかを確認します。

A*VB - VB*DB
ans =

    0.0000    0.0000   -0.0000    0.0000
         0   -0.0000    0.0000   -0.0000
    0.0000   -0.0000    0.0000    0.0000
         0    0.0000    0.0000    0.6031

この結果は A*VB = VB*DB を満たしていません。理論上は、固有値分解はこの関係を満たします。eig は浮動小数点計算を使用して分解を行うため、A*VV*D にほぼ等しい程度にしかなりません。言い換えると、A*V - V*D0 に近づきますが、そのものにはなりません。

ここで、バランス化手順なしで固有値と右固有ベクトルを計算してみます。

[VN,DN] = eig(A,'nobalance')
VN =

    0.6153   -0.4176   -0.0000   -0.1528
   -0.7881   -0.3261         0    0.1345
   -0.0000   -0.0000   -0.0000   -0.9781
    0.0189    0.8481   -1.0000    0.0443


DN =

    5.5616         0         0         0
         0    1.4384         0         0
         0         0    1.0000         0
         0         0         0   -1.0000

結果が A*VN = VN*DN を満たすことを確認します。

A*VN - VN*DN
ans =

   1.0e-14 *

   -0.1776   -0.0111   -0.0559   -0.0167
    0.3553    0.1055    0.0336   -0.0194
    0.0017    0.0002    0.0007         0
    0.0264   -0.0222    0.0222    0.0097

A*VN - VN*DN が限りなく 0 に近いため、この場合は、'nobalance' オプションでより正確な結果が得られます。

左固有ベクトル

3 行 3 列の行列を作成します。

 A = [1 7 3; 2 9 12; 5 22 7];

右固有ベクトル V、固有値 D および左固有ベクトル W を計算します。

[V,D,W] = eig(A)
V =

   -0.2610   -0.9734    0.1891
   -0.5870    0.2281   -0.5816
   -0.7663   -0.0198    0.7912


D =

   25.5548         0         0
         0   -0.5789         0
         0         0   -7.9759


W =

   -0.1791   -0.9587   -0.1881
   -0.8127    0.0649   -0.7477
   -0.5545    0.2768    0.6368

結果が W'*A = D*W' を満たすことを確認します。

W'*A - D*W'
ans =

   1.0e-13 *

   -0.0444   -0.1066   -0.0888
   -0.0011    0.0442    0.0333
         0    0.0266    0.0178

理論上は、固有値分解はこの関係を満たします。eig は浮動小数点計算を使用して分解を行うため、W'*AD*W' にほぼ等しい程度にしかなりません。言い換えると、W'*A - D*W'0 に近づきますが、完全に等しくはなりません。

対角化できない (不完全) 行列の固有値と固有ベクトル

3 行 3 列の行列を作成します。

A = [3 1 0; 0 3 1; 0 0 3];

A の固有値と右固有ベクトルを計算します。

[V,D] = eig(A)
V =

    1.0000   -1.0000    1.0000
         0    0.0000   -0.0000
         0         0    0.0000

D =

     3     0     0
     0     3     0
     0     0     3

A は反復固有値をもち、固有ベクトルは独立していません。つまり、A は対角化できないため、不完全であるということです。

A が不完全であるとしても、VD が方程式 A*V = V*D を満たすことを確認します。

A*V - V*D
ans =

   1.0e-15 *

         0    0.8882   -0.8882
         0         0    0.0000
         0         0         0

理論上は、固有値分解はこの関係を満たします。eig は浮動小数点計算を使用して分解を行うため、A*VV*D にほぼ等しい程度にしかなりません。言い換えると、A*V - V*D0 に近づきますが、そのものにはなりません。

一般化固有値と固有ベクトル

2 つの行列 AB を作成して、ペア (A,B) の固有値と右固有ベクトルの一般化固有値問題を解きます。

A = [1/sqrt(2) 0; 0 1];
B = [0 1; -1/sqrt(2) 0];
[V,D]=eig(A,B)
V =

   1.0000 + 0.0000i   1.0000 + 0.0000i
   0.0000 - 0.7071i   0.0000 + 0.7071i

D =

   0.0000 + 1.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 - 1.0000i

結果が A*V = B*V*D を満たすことを確認します。

A*V - B*V*D
ans =

     0     0
     0     0

残差誤差 A*V - B*V*D は厳密に 0 になります。

悪条件の行列対応の QZ アルゴリズムを使用する一般化固有値

マシンの精度に近い値を含む、悪条件の対称行列を作成します。

format long e
A = diag([10^-16, 10^-15])
A =

     1.000000000000000e-16                         0
                         0     1.000000000000000e-15

既定のアルゴリズムを使用して、一般化固有値と一連の右固有ベクトルを計算します。この場合、既定アルゴリズムは 'chol' です。

[V1,D1] = eig(A,A)
V1 =

     1.000000000000000e+08                         0
                         0     3.162277660168380e+07


D1 =

     9.999999999999999e-01                         0
                         0     1.000000000000000e+00

ここで、'qz' アルゴリズムを使用して、一般化固有値と一連の右固有ベクトルを計算します。

[V2,D2] = eig(A,A,'qz')
V2 =

     1     0
     0     1


D2 =

     1     0
     0     1

'chol' の結果が A*V1 = A*V1*D1 をどのくらい満たすか確認します。

format
A*V1 - A*V1*D1
ans =

   1.0e-23 *

    0.1654         0
         0   -0.6617

次に 'qz' の結果が A*V2 = A*V2*D2 をどのくらい満たすか確認します。

A*V2 - A*V2*D2
ans =

     0     0
     0     0

どちらの行列もエルミートである場合、eig は既定で 'chol' アルゴリズムを使用します。この場合、QZ アルゴリズムがより正確な結果を返します。

一方が特異行列のペアの一般化固有値と固有ベクトル

22 列の単位行列 A と、特異行列 B を作成します。

A = eye(2);
B = [3 6; 4 8];

行列 B-1A の一般化固有値を計算してみます。

[V,D] = eig(B\A)
Warning: Matrix is singular to working precision. 
Error using eig
Input to EIG must not contain NaN or Inf.

ここで、関数 eig に両方の行列を渡して、一般化固有値と右固有ベクトルを計算します。

[V,D] = eig(A,B)
V =

   -0.7500   -1.0000
   -1.0000    0.5000

D =

    0.0909         0
         0       Inf

両方の行列を別々に渡し、eig に問題の解決に最適なアルゴリズムを選択させるようにします。この場合、eig(A,B) は、B が可逆でなくても、一連の固有ベクトルと少なくとも 1 つの実数固有値を返しました。

最初の固有値と最初の固有ベクトルに対して Av = λBv であることを確認します。

eigval = D(1,1);
eigvec = V(:,1);
A*eigvec - eigval*B*eigvec
ans =

   1.0e-15 *

    0.1110
    0.2220

理論上は、固有値分解はこの関係を満たします。浮動小数点計算を使用して分解が行われるため、A*eigvec は、このケースで計算されたとおり、eigval*B*eigvec にほぼ等しい程度にしかなりません。

入力引数

すべて折りたたむ

A — 入力行列正方行列

入力行列。実数正方行列または複素正方行列として指定します。

データ型: double | single
複素数のサポート: はい

B — 一般化固有値問題の入力行列。正方行列

一般化固有値問題の入力行列。実数または複素数の値からなる正方行列として指定します。BA と同じサイズでなければなりません。

データ型: double | single
複素数のサポート: はい

balanceOption — バランス オプション'balance' (既定値) | 'nobalance'

バランス オプション。次の 2 つの文字列、事前のバランス化手順を有効にする 'balance'、または無効にする 'nobalance' のどちらかを指定します。ほとんどの場合、バランス化手順によって A の条件付けは改善され、より正確な結果が得られるようになります。ただし、バランス化によって不正確な結果が生じる場合があります。A にスケールが著しく異なる値が含まれる場合は 'nobalance' を指定します。たとえば、A に非ゼロの整数の他に、ごく小さい (ゼロに近い) 値も含む場合、バランス化手順では、小さい値をスケーリングして整数と同じ意味をもたせる場合があり、不正確な結果が生じることがあります。

'balance' は既定の動作です。関数 eig は、A が対称である場合、balanceOption を無視します。

データ型: char

algorithm — 一般化固有値アルゴリズム'chol' | 'qz'

一般化固有値アルゴリズム。'chol' または 'qz' を指定して、ペアの一般化固有値の計算に使用するアルゴリズムを選択します。

アルゴリズム説明
'chol'B のコレスキー分解を使って、AB の一般化固有値を計算します。
'qz'一般化 Schur 分解とも呼ばれる QZ アルゴリズムを使用します。このアルゴリズムは A および B の対称性を無視します。

一般に、この 2 つのアルゴリズムは同じ結果を返します。QZ アルゴリズムは、悪条件の行列を伴うような特定の問題に対してより安定しています。

algorithm 引数を省略すると、関数 eig は、AB のプロパティに基づいてアルゴリズムを選択します。この関数は、対称 (エルミート) A と対称 (エルミート) 正定 B に対しては、'chol' アルゴリズムを使用します。それ以外については 'qz' アルゴリズムを使用します。

A または B が非対称の場合は、指定するアルゴリズムにかかわらず、関数 eig は常に QZ アルゴリズムを使用します。

eigvalOption — 固有値のオプション'vector' | 'matrix'

固有値のオプション。'vector' または 'matrix' として指定します。このオプションを使用して、固有値を列ベクトル lambda か対角行列 D のどちらで返すかを指定します。既定の動作は、指定された出力の数により異なります。

  • lambda = eig(A) のように 1 つの出力を指定する場合、既定では、固有値は列ベクトル lambda として返されます。

  • [V,D] = eig(A) のように 2 つまたは 3 つの出力を指定する場合、既定では、固有値は対角行列 D として返されます。

例: D = eig(A,'matrix') は、1 つの出力構文により固有値の対角行列を返します。

データ型: char

出力引数

すべて折りたたむ

lambda — 固有値列ベクトル

固有値。多重度をもつ固有値 (またはペアの一般化固有値) を含む列ベクトルとして返されます。

  • A が実数かつ対称または複素エルミートの場合、Av = λv を満たす lambda の値は実数になります。

  • A が実数かつ歪対称または歪エルミートの場合、Av = λv を満たす lambda の値は純粋な虚数または 0 になります。

V — 右固有ベクトル正方行列

右固有ベクトル。A の右固有ベクトルまたはペア (A,B) の一般化右固有ベクトルを列にもつ正方行列として返されます。V の形式と正規化は、入力引数の組み合わせによって異なります。

  • [V,D] = eig(A) は、A*V = V*D となるような、A の右固有ベクトルを列にもつ行列 V を返します。V の固有ベクトルは、個々の 2 ノルムが 1 となるように正規化されます。

  • [V,D] = eig(A,'nobalance') は、行列 V も返します。ただし、各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。

  • [V,D] = eig(A,B) および [V,D] = eig(A,B,algorithm) は、A*V = B*V*D を満たす一般化右固有ベクトルを列にもつ行列として V を返します。各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。この場合、D には、主対角に沿ってペアの一般化固有値 (A,B) が含まれます。

    A が対称で B が対称正定の場合、V の固有ベクトルは、個々の B ノルムが 1 になるように正規化されます。

D — 対角固有値行列対角行列

対角固有値行列。A の固有値またはペア (A,B) の多重度をもつ一般化固有値を含む行列として返されます。

  • A が実数かつ対称または複素エルミートの場合、Av = λv を満たす D の値は実数になります。

  • A が実数かつ歪対称または歪エルミートの場合、Av = λv を満たす D の値は純粋な虚数または 0 になります。

W — 左固有ベクトル正方行列

左固有ベクトル。A の左固有ベクトルまたはペア (A,B) の一般化左固有ベクトルを列にもつ正方行列として返されます。W の形式と正規化は、入力引数の組み合わせによって異なります。

  • [V,D,W] = eig(A) は、W'*A = D*W' となるような、A の左固有ベクトルを列にもつ行列 W を返します。W の固有ベクトルは、個々の 2 ノルムが 1 になるように正規化されます。A が対称の場合、WV と同じになります。

  • [V,D,W] = eig(A,'nobalance') は、行列 W も返します。ただし、各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。

  • [V,D,W] = eig(A,B) および [V,D,W] = eig(A,B,algorithm) は、W'*A = D*W'*B を満たす一般化左固有ベクトルを列にもつ行列として W を返します。各固有ベクトルの 2 ノルムは必ずしも 1 である必要はありません。この場合、D には、主対角に沿ってペアの一般化固有値 (A,B) が含まれます。

    AB が対称の場合、WV と同じになります。

詳細

すべて折りたたむ

ヒント

  • 関数 eig は、構文 lambda = eig(A) に対して、実数、対称、スパース行列の固有値を返します。関数 eigs は、その他のすべてのスパース固有値および固有ベクトルの問題に対して使用します。

参考

| | | | |

この情報は役に立ちましたか?