• 検索結果がありません。

固有値問題

N/A
N/A
Protected

Academic year: 2021

シェア "固有値問題"

Copied!
56
0
0

読み込み中.... (全文を見る)

全文

(1)

電気

303/

電情

303

数値解析

(6)

固有値問題

(2)

前回付記

(1)

• Gauss-Seidek法は, ものの本を見ると, 以下の差 分方程式を解け, というふうに書いてある.

x(k+1)i = 1 aii

−X

j<i

aijx(k+1)j −X

j>i

aijx(k)j +bi

ただしx(k)i は第k回目の繰り返しにおけるベク トルxの第i成分.

(3)

前回付記

(2)

• 上述の式は左辺にx(k+1)i ,右辺にx(k+1)j があるた め計算不能に見えるが,x(k+1)j に関する和がj < i に限定されているため, i= 1,2,3· · · という順で 計算すれば, 矛盾なく計算できる. 順番を変える と計算できないので注意. この種の見づらい記法 は数値解析の分野では珍しくない.

(4)

前回付記

(3)

• SOR法についても同様に,成分ごとの差分方程式 で書くと以下のようになる.

y(k+1)i = 1 aii

−X

j<i

aijx(k+1)j −X

j>i

aijx(k)j +bi

x(k+1)i =x(k)i +w

y(k+1)i −x(k)i

(5)

前回付記

(4)

• 行列の演算を上記の差分方程式で置き換えると, 使用するメモリは減る.

• Jacobi法も同様.

• 実行速度はどうかというと, 先週の例のGauss- Seidel法とSOR法では, 上記の書き換えにより MATLABでは求解が高速化されたが, Scilabで は逆に遅くなった.

(6)

前回付記

(5)

• ScilabはMATLABと比べて全般に低速であり, 特に繰り返し(for文やwhile文など)を用いたと きの性能の低下が顕著. MATLABを使っている 分には行列の成分ごとの計算が出てもとくに気に する必要はないが, Scilabでは成分ごとの計算を すると処理が遅くなることがある.

(7)

はじめに

(1)

• 黎明期のプログラミング言語はCOBOL (1959–

;事務用)とFortran (1954–;科学技術計算用).

• これらは今でも使われている.

年号の典拠:

http://sunsite.univie.ac.at/Fortran-Guide/ch1-1.html http://americanhistory.si.edu/cobol/introduction

(8)

はじめに

(2)

以下の議論の典拠は Elizabeth Jessup, Numerical Linear Algebra,

ftp://ftp.mcs.anl.gov/pub/petaflops/summer.study/linear.tex www.netlib.org/

http://jp.mathworks.com/company/newsletters /articles/matlab-incorporates-lapack.html https://www.scilab.org/scilab/history http://math-atlas.sourceforge.net/

https://software.intel.com/en-us/intel-mkl/

(9)

はじめに

(3)

• 線形計算のためのサブルーチン集であるLIN- PACKとEISPACK はFortranで書かれた.

• LINPACKは1979年にリリースされた線形

方程式を解くためのサブルーチン集.

• EISPACKは1976年にリリースされた固有値 問題を解くためのサブルーチン集.

(10)

はじめに

(4)

• MATLABは, 1970年代に, LINPACKとEIS- PACKに基づく対話的な計算ソフトとして出

発した (今日では線形計算はMATLABのご

く一部になっている).

• Scilabは1980年代にMATLABと類似したソ フトとして開発された(当時の名称はBlaise),

(11)

はじめに

(5)

• 今日では,LINPACKとEISPACKはLAPACKと いうパッケージに統合されている.

• ATLAS(Automatically Tuned Linear Algebra Soft-

ware)を使うと数値計算のライブラリを特定のコ

ンピュータ向きに高効率化できる.

• Intelは, Math Kernel Libraryというライブラリ を公開している.

(12)

はじめに

(6)

• LINPACKとEISPACKが併存したことからわか るように, 線形方程式を解くことと, 固有値問題 を解くことは,線形計算の二大重要トピック.

• しかし教科書では固有値問題が取り扱われてい ない.

• よって, 教科書を離れて, 固有値問題の解法につ いて概説する.

(13)

今回の講義の参考文献

• 杉原,室田,線形計算の数理,岩波書店, 2009.

• 森,数値解析,第2版,共立出版, 2002.

• 山本,数値解析入門[増補版],サイエンス社, 2003.

• 斎藤,数値解析入門,東京大学出版会, 2012.

• 久保田, 工学基礎 数値解析とその応用, 数理工学社, 2010.

• 伊理,藤野,数値計算の常識,共立出版, 1985.

(14)

固有値と固有ベクトル

(1)

• n次の正方行列Aに対し,複素数λとn次のベク トルx 6=0がAx = λxという方程式を満たす とき, λをAの固有値,xを固有値λに対応する 固有ベクトルという.

• n次行列Aの固有値は,代数方程式det(sI−A) = 0の根であり(ただしI はn次の単位行列でsは 変数), 重複度を含めて高々n個である.

(15)

固有値と固有ベクトル

(2)

• 固有値λに対応する固有ベクトル全体が張る線形 部分空間をλに対応する固有空間という.

• 行列Aの固有ベクトル全体が張る線形部分空間 (どの固有値に対応するかは問わない)を,Aの固 有空間という. Aの固有空間は必ずしも全空間と は一致しない.

(16)

固有値と固有ベクトル

(3)

• Aの固有空間を拡張して全空間を張るようにし たものを, 一般化固有空間という. これに対応す るのがJordan標準形である. 一般化固有空間ま で広げて考えれば, (一般化)固有値の数は(重複 度を含めて)nに一致する.

(17)

固有値・固有ベクトルの応用

• 微分方程式・差分方程式の求解と特性解析

• googleによるページのランキング

http://www.ams.org/samplings/feature-column/fcarc-pagerank

• パターン認識 www.tuat.ac.jp/~s-hotta/SSII/slide_pattern.pdf

• 建造物の共振の解析 (地震や風への応答など)

http://www.kozosoft.co.jp/gijyutu/s07.html

• 他にも色々

(18)

固有値の数値計算

(1)

• 理論的には, det(sI −A) = 0という代数方 程式をsについて解けば,行列Aの固有値を すべて求めることができるが・・・

• 行列式を求めること自体が数値的に大変な上 に, 代数方程式の求解は数値計算の誤差に弱 いので,ふつうはそんなことはやらない.

(19)

固有値の数値計算

(2)

• Scilabの組み込み関数roots()のマニュアル は次のようになっている.

x=roots(p)は 多項式pのxである 複素ベ クトルを返す. 100次以下の実数多項式の 場合,高速な(Jenkins-Traub法に基づく)

RPOLYアルゴリズムが使用される. その

他の場合, その根はコンパニオン行列の固 有値として計算される.

(20)

固有値の数値計算

(3)

• 固有値を求めるために代数方程式を解くので はなく,代数方程式を解くために固有値を求 めることもある.

• 連立一次方程式が理論的には有限回の計算で 解けるのに対し, 固有値問題は5次以上の行 列に対しては有限回の演算では解けない.

(21)

固有値の数値計算

(4)

• よって,固有値問題は数値的には本質的に近 似の問題.

• 固有問題の数値解法は技巧的なので, 初学者 が自分でプログラムを組むのは危険. この講 義でもアルゴリズムの概要の紹介にとどめる.

(22)

固有値の数値計算

(5)

• 固有値の数値計算の難易度は, 易しい順に,

⊲ 対称行列

⊲ 対角化可能行列

⊲ 対角化不能行列 (Jordan標準形を数値 的に求めるとき)

(23)

固有値の数値計算

(6)

• 有限精度の計算機でJordan標準形を求める ことには数値的な困難があり(数学的な困難 ではないことに注意),これを回避するために 様々な工夫がなされている.

典拠:鈴木,渡邉,明, Jordan標準形の数値計算について,数理解析研究所講究録, Vol. 990, pp.

52–61, 1997.

(24)

固有値の数値計算

(7)

• Jordan標準形に関する議論は初学者には敷

居が高すぎると思われるが, 一方で対称行列 については取り扱う必然性が不明瞭と思われ るので,この講義では対角化可能行列(n次の 行列で,重複度を含めてn個の固有値があり, 対応する固有空間が全空間を張るもの)を対 象として議論を進める.

(25)

羃乗法

(1)

• Aの(複素)固有値をλ1, . . . , λnとする. こ れらは絶対値が大きい順に並べられているも のとする.

• |λ1|>|λ2|のときには, λ1とそれに対応する 固有ベクトルは,比較的簡単に求められる.

(26)

羃乗法

(2)

• 初期値x(0)を適切な単位ベクトルとし,以下 の差分方程式を解けばよい.

yk+1 =Axk,

xk+1 =y(k+1)/ky(k+1)k

• ただし,初期値の取り方が悪い場合にはやり 直しが必要となることがある.

(27)

羃乗法

(3)

• 上記の解法を羃乗法という.

• 羃乗法がうまくいく条件と, その理由は, い ずれも簡単.

• |λ1|>|λ2| ≥ · · · ≥ |λn|とする.

• λiに対応する固有ベクトルをviとする.

(28)

羃乗法

(4)

• 初期値 x0 を固有ベクトルで展開した結果, x(0) =c1v1+· · ·+cnvnとなったものとする.

• c1 6= 0が羃乗法がうまくいくための条件.

• このとき, k → ∞としたとき, (λi/λ1)k → 0 である.

(29)

羃乗法

(5)

• Akx(0)=c1λk1v1+Pn

j=2cjλkjvjだから, Akx(0)

kAkx(0)k = c1λk1v1 kc1λk1v1+Pn

j=2cjλkjvjk +

Pn

j=2cjλkjvj

kc1λk1v1+Pn

j=2cjλkjvjkq

(30)

羃乗法

(6)

• 右辺の分母と分子をλk1で割ると

Akx(0)

kAkx(0)k = c1v1 kc1v1+Pn

j=2cj(λj/λ1)kvjk +

Pn

j=2cj(λj/λ1)kvj

kc1v1+Pn

j=2cj(λj/λ1)kvjkq

(31)

羃乗法

(7)

• k→ ∞とするとj≥2に対して(λj/λ1)k →0と なるから,kvk1が単位ベクトルに取られていたこ とを思い出すと, lim

k→∞

Akx(0)

kAkx(0)k = c1

|c1|v1.

• 固有ベクトルの定数倍はやはり固有ベクトルだ から(この場合, 定数として複素数を許容する),

c1

|c1|v1は確かに固有ベクトルになっている.

(32)

羃乗法

(8)

• 行列Aの固有値の中に絶対値が等しいもの がない場合には, (絶対値)最大固有値とそれ に対応する固有ベクトルを使って行列Aを 適切に変形することにより,行列Aのすべて の固有値を求めることができる. この手順を 減次という. 詳細については杉原,室田,線形 計算の数理 (岩波書店)などを参照.

(33)

QR

法

(1)

• 小規模な行列の固有値の計算に用いられる代 表的な方法がQR法.

• QR法の説明に入る前に, いくつか言葉の準 備をしておく.

(34)

QR

法

(2)

• n次正方行列Qの列ベクトルが正規直交基底を なすとき, すなわちQTQ=Iとなるとき, Qを 直交行列という.

• n次正方行列Qの列ベクトルが複素内積の意味 で正規直交規定をなすとき, すなわちQHQ=I となるとき, Qをユニタリ行列という.

• QH はHermite転置(行列を転置してから各成分 の複素共役を取ったもの) をあらわす.

(35)

QR

法

(3)

• QR法の基礎となるのは, 次の数学的事実で ある([斎藤], [杉原, 室田]):

複素行列Aは, 適切なユニタリ行列Uを取る ことにより, A = U SUH という形に変換で きる. ただし,Sは上三角行列である(Aは対 角化可能でなくてもよい).

(36)

QR

法

(4)

• 上記の事実は,「複素行列Aは少なくともひ とつ固有値と対応する固有ベクトルを持つ」

という事実を用い, 帰納法によって証明され

る(この講義では証明は述べない).

• 数値としてはSの固有値とAの固有値は一 致する.

(37)

QR

法

(5)

• Aが対角化可能のときには,Aの各固有値と 対応するSの固有値の重複度は一致する.

• Aが対角化不能のときには,Aの各固有値と 対応するSの固有値の重複度に一致しない ものが出る.

(38)

QR

法

(6)

• A=QSUH という形の表現(ただしQはユ ニタリ行列, S は上三角行列) をSchur分解 という.

• QR法とは, 行列AのSchur分解を近似的に 求める方法である([杉原,室田]).

(39)

QR

法

(7)

• ScilabでSchur分解を求める関数はschur.

• AのSchur分解がA =U T UH であるとき, [U,T]=schur(A)とすると,Uにユニタリ行列 が,Tに上三角行列が返される(結果を受け取 る変数の名称は任意).

(40)

QR

法

(8)

• 正方行列のSchur分解はつねに可能だが, QR 法は行列Aが正則でないと使えない.

• 以下では,Aは正則であると仮定する. (Aが 対角化可能であることも仮定されていたこと を思い出すこと).

(41)

QR

法

(9)

• QR法の基礎となるのは, 行列のQR分解と 呼ばれる分解である([森]).

複素正則行列Aは,適切なユニタリ行列Qを 取ることにより, A=QRという形に変換で き, この表現は一意的である. ただし, Rは対 角成分が正の上三角行列である.

(42)

QR

法

(10)

• ScilabでQR分解を求める関数はqrである.

[Q,R]=qr(A)のようにして使う.

• qrは行列Aが非正則または正方でない場合 にも適用可能で, A = QRとなるユニタリ 行列Qと上三角行列R(正方行列とは限らな い)が計算される.

(43)

QR

法

(11)

• QR分解の手法にはこの講義では立ち入らないが, どのような方法があるかを列挙しておく[杉原,室 田].

• 数学的には,行列Aの列ベクトルにGram-Schmidt の直交化を適用するとQR分解を求められるが, この方法は数値計算の誤差に弱いので実用上は用 いられない.

(44)

QR

法

(12)

• 実際に使われる主要な方法は,修正Gram-Schmidt 法, Householder変換による方法, Givens 変換に よる方法である. 詳細については[杉原,室田]を 参照.

• Scilabの関数qrは処理をLAPACKに丸投げ.

(45)

QR

法

(13)

• QR法のアルゴリズムは極めて単純である.

• 次ページにアルゴリズムの形で示す.

• QR法には停止条件は定められていないので, 利用者が適切に止める必要がある.

(46)

QR

法

(14)

QR

法のアルゴリズム

(初期化) A1 =A, k = 1とする.

(ループ) AkをQR分解する. Ak = QkRkと分解 されているものとし, Ak+1 = RkQkと定義する.

k =k+ 1としてループ冒頭に戻る.

(47)

QR

法

(15)

• QR法の収束性については, 次の事実が成り 立つ([森]).

行列Aが正則かつ対角化可能で, その固有値 の絶対値がすべて相異なるとき, QR法によっ て得られる行列Akは上三角行列に収束し,そ の対角成分には固有値が絶対値の大きい方か 順に並ぶ.

(48)

QR

法

(16)

• Scilabで固有値を求める関数はspec.

• Aを行列としたとき, spec(A)とすると固有 値が求められる.

(49)

QR

法

(17)

• [R,D]=spec(A)とすると(結果を受けとる変 数の名前は任意),DにAを対角化した結果(対 角要素に固有値が並んだ行列), Rに対角化の ための正則行列が返される.

(50)

QR

法

(18)

Scilabによる数値例 (1) -->A=[1 2;3 4];spec(A)

ans =

- 0.3722813 5.3722813

Aの固有値は-0.3722813と5.3722813.

(51)

QR

法

(19)

Scilabによる数値例 (2): AのSchur分解 -->[U,T]=schur(A)

T =

- 0.3722813 - 1.

0. 5.3722813

U =

- 0.8245648 - 0.5657675 0.5657675 - 0.8245648

(52)

QR

法

(20)

Scilabによる数値例 (3) QR法(1回目) -->[Q,R]=qr(A);A=R*Q

A =

5.2 1.6 0.6 - 0.2

(53)

QR

法

(21)

Scilabによる数値例 (4) QR法(2回目) ->[Q,R]=qr(A);A=R*Q

A =

5.379562 - 0.9562044 0.0437956 - 0.3795620 対角要素はすでに固有値に近い.

(54)

QR

法

(22)

Scilabによる数値例 (5) QR法(7回目) ->[Q,R]=qr(A);A=R*Q

A =

5.3722813 1.0000001 6.980D-08 - 0.3722813 小数点以下7桁まで正しい.

(55)

Scilab

における一般化固有ベクトル

• Scilabで一般化固有ベクトルを求めるには

bdiagという関数を使う. 名前だけは覚えて おくこと.

(56)

固有値問題のその他の解法

• QR法は簡単ではあるが規模が大きい問題には使 えない.

• 他の代表的なアルゴリズムの名称のみ列挙する と[杉原, 室田], LR法, Arnoldi法, Lanczos法, Jacobi-Davison法などといった方法がある.

• 対称行列の固有値を求めるための古典的な解法に Jacobi法(1846年)がある[杉原,室田]. この手法 は今日でも用いられることがある.

参照

関連したドキュメント

ⓒ2012 Information Processing Society of Japan.. フィルタとその伝達関数 大規模な N

6 まとめ 6.1 固有値についてわかったこと r≡0として、pxをpx =x2−3 2x+ 1とpx =x2−1 2x+1 2のよう にx= 0またはx= 1を軸として線対称になるような関数を用いた場合、 固有値は等しくなる。 また、rxを関数にすると、固有値の平方根の比 rλn λ1 はr ≡ 0として

この 際境界 $L$ と $\Gamma$ 上に二節点をもっ“ 三角形” に対しては , Zlamal の曲要素を使う などして適合条件 $V_{h}\subset V$

154 京都大学数理解析研究所講究録 水の波偏差分方程式の固有値問題 電気通信大学大学院情報工学専攻 松木美保子 (MATSUKI, Mihoko) 電気通信大学情報工学科

1 はじめに

, αn は 複素数 に分解される。したがっ て、 [三宅] のように

計算に用いたプログラム(①で作成したサブルーチンまたは関数を使って③を解いたもの (prog03_1_1.f または prog03_1_1.c)と②で作成したサブルーチンまたは関数を使って③ を解いたもの(prog03_1_2.f または prog03_1_2.c))と、③で得られた固有値、固有ベク

2011年ハイパフォーマンスコンピューティングと計算科学シンポジウム High Performance Computing