MATLAB の固有値と固有ベクトル

Ammar Ali 2021年11月29日
MATLAB の固有値と固有ベクトル

このチュートリアルでは、MATLAB の eig() 関数を使用して、特定の行列の固有値と固有ベクトルを見つける方法について説明します。

MATLAB で eig() 関数を使用して固有値と固有ベクトルを見つける

Matlab には、特定の行列の固有値と固有ベクトルを見つけるための組み込み関数 eig() が用意されています。行列は正方行列である必要があります。それ以外の場合、Matlab はエラーを表示します。構文:E = eig(mat) は、行列マットの固有値を含む列ベクトルを返します。たとえば、ランダム行列を作成し、eig() 関数を使用してその固有値を見つけましょう。以下のコードを参照してください。

mat = [1 3; 4 2]
E = eig(mat)

出力:

mat =

     1     3
     4     2


E =

    -2
     5

構文:[EV, DV] = eig(mat) は、列が右の固有ベクトルであり、指定された行列マットの固有値の対角行列 DV である行列 EV を返します。たとえば、上記の行列の固有値と固有ベクトルを見つけましょう。以下のコードを参照してください。

mat = [1 3; 4 2]
[EV,DV] = eig(mat)

出力:

mat =

     1     3
     4     2


EV =

   -0.7071   -0.6000
    0.7071   -0.8000


DV =

    -2     0
     0     5

次の関係を使用して結果を確認することもできます:mat x EV --EV x DV = 0。方程式の左辺の結果はゼロに近いはずですが、eig() はを使用して分解を実行するため、正確にゼロではありません。浮動小数点計算。ご覧のとおり、変数 DV には、対角要素にソートされた固有値が含まれています。ただし、多くの場合、それらはソートされていません。これらの値を並べ替えるには、diag() 関数を使用して対角エントリを抽出し、sort() 関数を使用して値を並べ替えることができます。たとえば、magic() 関数を使用して別の行列を作成し、そのソートされた値を見つけましょう。以下のコードを参照してください。

mat = magic(3)
[EV,DV] = eig(mat)
[SV, indi] = sort(diag(DV))

出力:

mat =

     8     1     6
     3     5     7
     4     9     2


EV =

   -0.5774   -0.8131   -0.3416
   -0.5774    0.4714   -0.4714
   -0.5774    0.3416    0.8131


DV =

   15.0000         0         0
         0    4.8990         0
         0         0   -4.8990


SV =

   -4.8990
    4.8990
   15.0000


indi =

     3
     2
     1

行列 DV 内の固有値は並べ替えられていませんが、値を並べ替えた diag() および sort() 関数が変数 SV に保存されるようになりました。sort() 関数も固有値のインデックスを返しました。インデックスを使用して、ソートされた固有値を行列 DV に戻すことができます。これで、インデックスと SV ベクトルを使用して、ソートされた DV および EV マトリックスを見つけることができます。以下のコードを参照してください。

mat = magic(3);
[EV,DV] = eig(mat);
[SV, indi] = sort(diag(DV));
DVs = DV(indi,indi)
SVs = EV(:,indi)

出力:

DVs =

   -4.8990         0         0
         0    4.8990         0
         0         0   15.0000


SVs =

   -0.3416   -0.8131   -0.5774
   -0.4714    0.4714   -0.5774
    0.8131    0.3416   -0.5774

可能な限り、対角行列 DV にはソートされた固有値が含まれるようになりました。上記の関係を使用して、結果を確認することもできます:mat x SVs - SVs x DVs = 0。構文:[EV, DV, WV] = eig(mat) は、右の固有ベクトル EV、固有値 DV、および左の固有ベクトル WV を返します。たとえば、上記の行列マットの右固有ベクトル、固有値、および左固有ベクトルを見つけましょう。以下のコードを参照してください。

mat = magic(3)
[EV,DV,WV] = eig(mat)

出力:

EV =

   -0.5774   -0.8131   -0.3416
   -0.5774    0.4714   -0.4714
   -0.5774    0.3416    0.8131


DV =

   15.0000         0         0
         0    4.8990         0
         0         0   -4.8990


WV =

   -0.5774   -0.7416   -0.0749
   -0.5774    0.6667   -0.6667
   -0.5774    0.0749    0.7416

eig() 関数を使用して、2つの行列の一般化された固有値と右固有ベクトルを見つけることもできます。構文 [EV,DV] = eig(mat1, mat2) は、ペア(mat1、mat2)の一般化された固有値と右固有ベクトルを返します。たとえば、2つの行列を作成し、eig() 関数を使用してそれらの一般化された固有値と右固有ベクトルを見つけましょう。以下のコードを参照してください。

mat1 = magic(2)
mat2 = [1 2; 2 1]
[EV,DV] = eig(mat1,mat2)

出力:

mat1 =

     1     3
     4     2


mat2 =

     1     2
     2     1


EV =

    1.0000   -0.5000
   -1.0000    1.0000


DV =

    2.0000         0
         0    1.6667

結果は、mat1 x EV - mat2 x EV x DV = 0 の関係を使用して確認できます。方程式の左辺はゼロに近くなります。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - MATLAB Vector