Excelユーザー関数:実固有値・固有ベクトル算出

スポンサーリンク

Excelで対象行列に対する固有値と固有ベクトルを算出するユーザー関数です。

Excelで主成分分析、慣性テンソルから主慣性モーメントなどを算出する際に使用できます。

VBAコード

説明

ヤコビ法を使って、対称行列に対し回転行列で相似変換をします。

$$
\begin{bmatrix}cos\theta&sin\theta\\-sin\theta&cos\theta\end{bmatrix}
\begin{bmatrix}a_{11}&a_{12}\\a_{12}&a_{22}\end{bmatrix}
\begin{bmatrix}cos\theta&-sin\theta\\sin\theta&cos\theta\end{bmatrix}
=
\begin{bmatrix}a_1&0\\0&a_2\end{bmatrix}
$$

左辺を展開すると

$$
\begin{bmatrix}a_{11}cos^2\theta +2a_{12}sin\theta\cos\theta +a_{22}sin^2\theta&
a_{12}(cos^2\theta-sin^2\theta)+(a_{22}-a_{11}sin\theta\cos\theta\\
a_{12}(cos^2\theta-sin^2\theta)+(a_{22}-a_{11}sin\theta\cos\theta&
a_{11}sin^2\theta +2a_{12}sin\theta\cos\theta +a_{22}cos^2\theta\end{bmatrix}
$$

となります。

この非対角項を消去にするには

$$
a_{12}(cos^2\theta-sin^2\theta)+(a_{22}-a_{11})sin\theta\cos\theta=0
$$

を解くことになり、両辺をcos2θで割って整理すると

$$
tan\theta=\frac{-a_{11}-a_{12}\pm\sqrt{(a_{11}-a_{22})^2+4a_{12}^2}}{2a_{12}}
$$

となり、±を+で採用すると固有値は大きい順に並びます。

tanθが求まったことから、cosθとsinθが求まります。

$$
cos\theta=\sqrt{\frac{1}{1+tan^2\theta}}\\
sin\theta=cos\theta\tan\theta
$$

これで変換行列(回転行列)を求めることが出来ます。

この操作を非対角項全てに対して順番に繰り返し求めることで、最終的には固有値が求まります。また、逐次変換行列同士を掛けて行くことで固有ベクトルが求まります。

使い方

例えば、下記のような対称行列の固有値を計算してみます。

$$
\begin{bmatrix}4&1&2\\1&3&0\\2&0&5\end{bmatrix}
$$

3行4列の範囲を指定し、

=eig(行列範囲)

と入力し、CTRL+SHIFT+ENTERを押します。

CTRL+SHIFT+ENTERはExcelで配列数式を扱う際の操作になります。

一番左の1列は、固有値

その右側の1列ずつ固有ベクトルとなります。

この例の行列の場合

固有値は

$$
1.854897309,3.476023603,6.669079088
$$

固有ベクトルは

$$
\begin{bmatrix}
0.679313061948559&0.374361954852286&0.63117896877609\\
-0.593233311996296&0.786435698692206&0.172026536791294\\
-0.431981482709593&-0.491296263553547&0.756320024866686
\end{bmatrix}
$$

となります。

参考資料

CQ出版社、VisualBasicによる固有値計算&振動解析プログラム、黒田英夫著

なお、現在は絶版となっていて、古本はプレミアの値段がついてしまっています。

コメント

タイトルとURLをコピーしました