共振を防ぐように設計を行ったり, 振動を早く減衰させる設計を行う際, 固有値と固有ベクトルを求めることが重要

Slides:



Advertisements
Similar presentations
Absolute Orientation. Absolute Orientation の問題 二つの座標系の間における剛体 (rigid body) 変換を復元す る問題である。 例えば: 2 台のステレオカメラから得られた3次元情報の間の関 係を推定する問題。 2 台のステレオカメラから得られた3次元情報の間の関.
Advertisements

大規模な三角 Toeplitz 線形方 程式の高速解法とその応用 ○ 安村 修一(法政大学 4 年) 李 磊(法政大学) 日本応用数理学会「行列・固有値の解法とその応用」研究部会 第6回研究会.
5.制御構造と配列 場合分け( If Then Else , Select Case ) 繰返し( Do While ) 繰返しその2( For Next )
0章 数学基礎.
データ解析
研究集会 「超大規模行列の数理的諸問題とその高速解法」 2007 年 3 月 7 日 完全パイプライン化シフト QR 法による 実対称三重対角行列の 固有値並列計算 宮田 考史  山本 有作  張 紹良   名古屋大学 大学院工学研究科 計算理工学専攻.
4.3 連立1次方程式   Ax = b   (23) と書くことができる。
6.3 2次元DFT (1)2次元DFTとは 画像のような2次元信号をサンプリングしたデータを 2次元DFTを
IT入門B2 ー 連立一次方程式 ー.
第3章 重回帰分析 ー 計量経済学 ー.
第3章 重回帰分析 ー 計量経済学 ー.
線形代数学 4.行列式 吉村 裕一.
情報基礎A 第14週プログラミング 実際のデータ処理での応用(2)
4.2 連立非線形方程式 (1)繰返し法による方法
      線形写像  線形写像 U,V:R上のベクトル空間 T:UからVへの写像 (1)T(u+v)=T(u)+T(v)  (u,v∈U),
透視投影(中心射影)とは  ○ 3次元空間上の点を2次元平面へ投影する方法の一つ  ○ 投影方法   1.投影中心を定義する   2.投影平面を定義する
6.4 離散的コサイン変換 (DCT : discrete cosine transform ) (1)DCTとは
電気回路学Ⅱ エネルギーインテリジェンスコース 5セメ 山田 博仁.
(ラプラス変換の復習) 教科書には相当する章はない
電気回路Ⅱ 演習 特別編(数学) 三角関数 オイラーの公式 微分積分 微分方程式 付録 三角関数関連の公式
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
数学 ---> 抽象化、一般化 より複雑な関係ー>解析学 一次関数 y=ax+b より多くの要素ー>線形代数 x y f(x) y1 x1
本時の目標 「簡単なプログラム言語の意味を理解し、マクロ機能を使って簡単なプログラムを作ることができる。」
情報工学Ⅱ (第9回) 月曜4限 担当:北川 晃.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
電磁気学C Electromagnetics C 5/28講義分 電磁波の反射と透過 山田 博仁.
プログラミング演習I 行列計算と線形方程式の求解
LU分解を用いた連立一次方程式.
6. ラプラス変換.
電磁気学Ⅱ Electromagnetics Ⅱ 6/30講義分 電磁波の反射と透過 山田 博仁.
電気回路学Ⅱ 通信工学コース 5セメ 山田 博仁.
「R入門」  5.7 行列に対する諸機能  10月23日 (木) 発表者 大城亜里沙.
知能システム論I(13) 行列の演算と応用(Matrix) 2008.7.8.
実践プログラミング入門2 配列を使ってゲームを作ろう 徳山 豪 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
変換されても変換されない頑固ベクトル どうしたら頑固になれるか 頑固なベクトルは何に使える?
電気回路学Ⅱ コミュニケーションネットワークコース 5セメ 山田 博仁.
パターン認識特論 担当:和田 俊和 部屋 A513 主成分分析
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
資料 線型変換のイメージ 固有値、固有ベクトル 平賀譲(209研究室) 資料
4. システムの安定性.
わかりやすいパターン認識 第7章:部分空間法  7.1 部分空間法の基本  7.2 CLAFIC法                  6月13日(金)                  大城 亜里沙.
データ解析 静岡大学工学部 安藤和敏
データ解析 静岡大学工学部 安藤和敏
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
電気回路学Ⅱ エネルギーインテリジェンスコース 5セメ 山田 博仁.
行列式 方程式の解 Cramerの公式 余因数展開.
情報工学Ⅱ (第9回) 月曜4限 担当:北川 晃.
原子核物理学 第7講 殻模型.
電気回路学Ⅱ 通信工学コース 5セメ 山田 博仁.
行列 一次変換,とくに直交変換.
ヒープソート.
電気回路学Ⅱ 通信工学コース 5セメ 山田 博仁.
密行列固有値解法の最近の発展 (I) - Multiple Relatively Robust Representation アルゴリズム - 2004年11月26日 名古屋大学 計算理工学専攻 山本有作 日立製作所の山本有作です。 「~」について発表いたします。
情報工学Ⅱ (第8回) 月曜4限 担当:北川 晃.
Cプログラミング演習 ニュートン法による方程式の求解.
ベクトル関数の回転(カール、ローティション)
目次 はじめに 収束性理論解析 数値実験 まとめ 特異値計算のための dqds 法 シフトによる収束の加速
電磁気学Ⅱ Electromagnetics Ⅱ 6/7講義分 電磁波の反射と透過 山田 博仁.
場合分け(If Then Else,Select Case) 繰返し(Do While) 繰返しその2(For Next)
6.2 高速フーリエ変換 (1)FFT(fast Fourier transform)とは
6.5 アダマール(Hadamard)変換 (1)アダマール変換とは
7.2 回帰曲線 身長と体重…関係がありそう? ??? 身長と体重の関係をグラフで観察する.
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
プログラミング言語によっては,複素数が使えない。
2008年 7月17日 応用数理工学特論 期末発表 鈴木綾華,程飛
5.2 グレゴリー・ニュートン(Gregory-Newton)の補間式 (1)導入
8.2 数値積分 (1)どんなときに数値積分を行うのか?
5.3 ラグランジェ(Lagrange)の補間式
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

共振を防ぐように設計を行ったり, 振動を早く減衰させる設計を行う際, 固有値と固有ベクトルを求めることが重要 3.固有値と固有ベクトル 共振を防ぐように設計を行ったり, 振動を早く減衰させる設計を行う際, 固有値と固有ベクトルを求めることが重要

(1)固有値と固有ベクトルの定義 以下の を固有値, を固有ベクトルという。 N行N列の正方行列 について (1) となる解のうち なる解を考える。(1)式を変形すると, (2) : N行N列の単位行列 係数行列 が逆行列を持つと,解は になる。 となる解を持つためには が逆行列を持たない, すなわち,行列式が零でならなければならない。したがって, (3)

式(1)の解釈 (1) ベクトルに行列 の変換操作を行っても,向きは変わらず,大きさだけが 倍となるベクトル が存在する。 固有ベクトルと呼ぶが,次のように無限のベクトルが考えられる。 そこで,単位ベクトルを の代表として選ぶ。

固有ベクトルを使った対角化 ベクトルに固有値ベクトルを並べた を使うと として対角化することができる。

簡単な行列を使った具体例(1) とすると, となる。 すなわち, 従って,固有値は または

簡単な行列を使った具体例(2) のとき 一方, から (符号が逆転していることに注意)

簡単な行列を使った具体例(2) のとき 同様に, から (同一符号であることに注意)

2次元平面で図示するとλ=1,λ=3のいずれの組をとっても 直交することが分かる。 固有ベクトル同士の乗算を行うと直交性の確認ができる。

簡単な行列を使った具体例(3) 固有ベクトルを並べた行列 を使って を計算すると

外力がない場合の振動解析,すなわち自由振動問題となる 振動系そのものが固有に有する特性を求めること (2)固有値問題の意味づけ 外力がない場合の運動方程式 を考える。 ここで :質量行列, :剛性行列, :変位ベクトル, :加速度ベクトル とすると この問題を解くのが固有値問題そのものである。 言い換えると 外力がない場合の振動解析,すなわち自由振動問題となる 振動系そのものが固有に有する特性を求めること

(3)固有値および固有ベクトルの求め方 ①最低次の振動モード 周期が長く,振幅が大きく,減衰しにくい。 ②高周波の振動モード    周期が長く,振幅が大きく,減衰しにくい。 ②高周波の振動モード     騒音等の検討で重要。 したがって,工学的には, 最小固有値と最大固有値が重要

手法の分類 大きくは,以下の2つに分類できる。 ①反復法   (繰返し計算により求める) ②行列変換法   (行列の変換により求める)

反復法 [一部の固有値のみ。固有ベクトルも求まる] ①べき乗法(最大固有値を求める方法。累乗法ともいう)    逆行列を計算し,その最大固有値を求め逆数をとることで,   最小固有値を計算できる。 ②逆反復法(最小固有値を求める方法) ③行列サブスペース法(逆反復法の拡張。大次元問題に対して,    ごく一部の固有値を求める。なお,手法の複雑さに対して    ごく一部の固有値しか求められないので,省略する) [固有ベクトルは求まらないが,すべての固有値が求まる] ④LR法(下三角行列と上三角行列に変換し,三角行列に収斂させる方法) ⑤QR法(直交行列と上三角行列に分けて,三角行列に収斂させる方法)

行列変換法 ①ヤコビ法     回転行列による直交変換を繰り返す。 ②ハウスホルダー法     三重対角行列に変換し,二分法を適用して     固有値を計算する。

①べき乗法(Power Iteration Method)の考え方(1) n行n列の行列 の固有値と固有ベクトルを とし, の順に並んでいるものとする。 固有ベクトルの任意の組は,正規直交基底となるから任意のベクトル は次のように表すことができる。 両辺に を乗じて この処理を 回繰り返すと

①べき乗法(Power Iteration Method)の考え方(2) を大きくしていくと, であるから, すなわち, となるので, と の比は に近づく。

①べき乗法(Power Iteration Method)の考え方(3) [処理手順] (1)初期値として,最大成分が1であるような列ベクトルを設定する。例えば, (2) を計算する。 (3) とし, として単位ベクトル化する。 (4) により収束を判定し,収束していなければ (2)~(4)を繰り返す。

VBでプログラムを作る ①シートの定義(λx, Axの計算の式定義を入れておくこと)

②データの設定部分 Private A() As Double Private D() As Double Private X() As Double Function べき乗データ設定() N = 4 ReDim A(N, N), X(N) With Worksheets("Sheet1") For i = 1 To N For j = 1 To N A(i, j) = Val(.Cells(i + 1, j + 1)) Next End With べき乗データ設定 = N End Function

③結果の設定とイベントハンドラ Sub べき乗法結果設定(X, λ, N) With Worksheets("Sheet1") .Cells(2, 14) = λ For i = 1 To N .Cells(i + 1, 15) = X(i) Next End With End Sub Sub ボタン5_Click() N = べき乗データ設定() EPS = 0.000001 べき乗法 A, EPS, X, λ, N べき乗法結果設定 X, λ, N

④処理本体(1) (続きあり) Public Sub べき乗法(A, EPS, X, λ, N) Dim i, K1, K2, Iter, IterMax As Integer ' Dim T As Double Dim XTemp() As Double IterMax = 100 ReDim XTemp(2, N) K1 = 2: K2 = 1 XTemp(K2, 1) = 1 For i = 2 To N XTemp(K2, i) = 0 Next E = EPS * 100 Iter = 0 Do While Iter < IterMax And E > EPS Iter = Iter + 1 KK = K2: K2 = K1: K1 = KK ' K1:前回計算,K2:今回 (続きあり)

④処理本体(2) (続きあり) ' 行列式の乗算 For i = 1 To N T = 0 For j = 1 To N T = T + A(i, j) * XTemp(K1, j) Next XTemp(K2, i) = T 'ノルム1=1による方法 T = T + XTemp(K2, i) * XTemp(K2, i) λ = Sqr(T) If Abs(λ) < EPS Then '固有値が0の場合は収束しないものとする E = EPS * 100 Exit Do End If XTemp(K2, i) = XTemp(K2, i) / λ (続きあり)

④処理本体(3) T1 = 0: T2 = 0 For i = 1 To N DX = XTemp(K2, i) - XTemp(K1, i) T1 = T1 + DX * DX T2 = T2 + XTemp(K2, i) * XTemp(K2, i) Next If Abs(T2) < EPS Then '固有ベクトルが0のとき収束しないものとする E = EPS * 100 Exit Do End If E = T1 / T2 Loop X(i) = XTemp(K2, i) If E > EPS Then MsgBox "収束しません " & λ & " 繰返し回数" & Iter & " E=" & E Else MsgBox λ & " 繰返し回数" & Iter & " E=" & E End Sub

②逆反復法(Inverse Iteration Method)の考え方 正則対称行列 の場合,逆行列を求め, とし, べき乗法により最大固有値を求め,その逆数をとれば最小固有値となる。 したがって,適当な を初期値として, を計算し, の絶対値の逆数をとればよい。 逆行列の計算のかわりに,以下の連立方程式を解いてもよい。 連立方程式の解法として三角分解を用いれば,計算量を減らすことができる。

(逆行列を求めた後,べき乗法を用いる方法) VBでプログラムを作る (逆行列を求めた後,べき乗法を用いる方法) ①シートの定義(べき乗法の定義に追加する)

②データの設定部分 Private A() As Double Private D() As Double Private X() As Double Function データ設定() N = 4 ReDim A(N, N + N), X(N) With Worksheets("Sheet1") For i = 1 To N For j = 1 To N A(i, j) = Val(.Cells(i + 1, j + 1)) Next End With データ設定 = N End Function

③結果の設定 Sub 最小固有値結果設定(A, X, λ, N) With Worksheets("Sheet1") .Cells(2, 16) = λ For i = 1 To N .Cells(i + 1, 17) = X(i) Next For j = 1 To N .Cells(i + 11, j + 1) = A(i, j) End With End Sub

④イベントハンドラ(べき乗法を呼び出す) Sub ボタン6_Click() N = データ設定 EPS = 0.00001 ‘ 掃出法については連立方程式の項参照 If 掃出法(A, N, EPS) Then Exit Sub For i = 1 To N ‘ N+1列目移行に逆行列が入っているので移動 For j = 1 To N A(i, j) = A(i, j + N) Next EPS = 0.001 べき乗法 A, EPS, X, λ, N ‘ べき乗法の実行 最小固有値結果設定 A, X, 1 / λ, N End Sub

収束しない? …だけど結果はよさそう このような場合, 収束条件について検討する必要がある。 すなわち,逆行列をとって計算する場合は, 収束しない? …だけど結果はよさそう このような場合, 収束条件について検討する必要がある。 すなわち,逆行列をとって計算する場合は, 収束条件を別の方法にする必要がある。 たとえば,固有値が収束しているかどうか等に切り替える。

を解く方法 同じ行列で,何回も連立方程式を解く場合はLU分解を用いる。 すなわち, として,Lを用いた前進代入,Uを用いた後退代入を行って連立方程式を解くと,計算量が減る。

VBでプログラムを作る による方法 ①シートの定義(べき乗法の定義に追加)

②データの設定部分 Private A() As Double Private C() As Double Private X() As Double Private LU() As Double Private Ipivot() As Integer Function 逆反復法データ設定() N = 4 ReDim A(N, N), X(N) With Worksheets("Sheet1") For i = 1 To N For j = 1 To N A(i, j) = Val(.Cells(i + 1, j + 1)) Next End With 逆反復法データ設定 = N End Function

③結果の設定とイベントハンドラ Sub 逆反復法結果表示(X, λ, N) With Worksheets("Sheet1") .Cells(2, 18) = λ For j = 1 To N .Cells(j + 1, 19) = X(j) Next End With End Sub Sub ボタン9_Click() N = 逆反復法データ設定() 逆反復法 A, X, λ, N 逆反復法結果表示 X, 1 / λ, N

④処理本体(1) Sub 逆反復法(A, X, λ, N) Dim i, j, k, Iter, IterMax As Integer Dim T As Double Dim LU() As Double Dim B() As Double Dim Ipivot() As Integer ReDim B(N) ReDim LU(N, N) ReDim Ipivot(N) EPS = 0.00000001 LU分解 A, LU, Ipivot, N, EPS X(1) = 1 For i = 2 To N X(i) = 0 Next IterMax = 20 Iter = 0: λ = 1 E = EPS * 100 (続きあり)

④処理本体(2) Do While E > EPS And Iter < IterMax Iter = Iter + 1 For i = 1 To N ‘前進代入 T = X(Ipivot(i)) For j = 1 To i - 1 T = T - LU(Ipivot(i), j) * B(j) Next B(i) = T Next ‘後退代入 For i = N To 1 Step -1 T = B(i) For j = i + 1 To N B(i) = T / LU(Ipivot(i), i) (続きあり)

④処理本体(3)   T = 0 ‘ Bの絶対値を固有値λとする For i = 1 To N T = T + B(i) * B(i) Next λ = Sqr(T) If λ < EPS Then ‘ 固有値0のとき収束しない E = EPS * 100 Exit Do End If For i = 1 To N      ‘ 固有ベクトルの計算 X(i) = B(i) / λ T1 = 0: T2 = 0 ‘ 収束条件の計算 DX = X(i) - B(i) T1 = T1 + DX * DX T2 = T2 + X(i) * X(i) (続きあり)

④処理本体(3) If Abs(T2) < EPS Then '固有ベクトルが0のとき収束しない E = EPS * 100 Exit Do End If E = T1 / T2 Loop MsgBox λ & " " & E & " " & Iter End Sub

■発案者のルーティスハウザー(Lutishauser)が, 下三角行列をL行列(Left triangular matrix), ③LR分解による固有値演算 ■発案者のルーティスハウザー(Lutishauser)が, 下三角行列をL行列(Left triangular matrix), 上三角行列をR行列( Right triangular matrix ) と呼んでいたため,こう呼ばれる。 ■固有値問題では, ルーティスハウザーにならって,   LU分解のことをLR分解と呼ぶ。

LR分解の考え方 固有値の定義から 左辺の係数行列 をLU分解したときの下三角行列,上三角行列を とすると 左から を乗じて,次のように置くこととする。 上式から,次の関係をもつ反復式を考えることができる。 ここで は上三角行列に収束し,対角要素が固有値になることが, 知られている。これを利用して固有値を求める方法である。  固有ベクトルを求めることはできないが,  工学的には,固有値のみを求めれば良い場面も多く,  そのような場合には,単純で分かりやすい方法である。

LR分解の手順 ①初期値を とする。 ②行列 に対して,LU分解し, を求め次の計算を行う。 ③行列 が上三角行列になるまで,②を繰り返す。 終了条件は,たとえば行列 の 行 列の要素を とすると とする。

VBでプログラムを作る ①シートの定義 (単純化のためにLU分解はクラウト法による方法を用いる)

With Worksheets("Sheet1") For i = 1 To 4 For j = 1 To 4 ②データの設定部分 Private A(4, 4) As Double Sub データ設定() With Worksheets("Sheet1") For i = 1 To 4 For j = 1 To 4 A(i, j) = .Cells(i + 1, j + 1) Next End With End Sub

With Worksheets("Sheet1") For i = 1 To 4 For j = 1 To 4 ③結果の設定とイベントハンドラ Sub 結果設定(A) With Worksheets("Sheet1") For i = 1 To 4 For j = 1 To 4 .Cells(i + 1, j + 7) = A(i, j) Next End With End Sub Sub ボタン1_Click() データ設定 EPS = 0.00001 R = LR分解固有値計算(A, EPS, 500, 4) 結果設定 A

C(i, j) = C(i, j) + A(i, k) * B(k, j) Next ④共通ルーチン Sub 行列乗算(A, B, C, N1, N2) For i = 1 To N1 For j = 1 To N2 C(i, j) = 0 For k = 1 To N2 C(i, j) = C(i, j) + A(i, k) * B(k, j) Next End Sub

Function LR分解固有値計算(A, EPS, iterMax, N) ⑤処理本体 Function LR分解固有値計算(A, EPS, iterMax, N) Dim L() As Double: ReDim L(N, N) Dim U() As Double: ReDim U(N, N) R = 0: E = EPS * 100: E2 = EPS * EPS Do While R < iterMax And E > E2 R = R + 1 LU分解 A, L, U, N 行列乗算 U, L, A, N, N E = 0 For i = 2 To N For j = 1 To i - 1 E = E + A(i, j) * A(i, j) Next Loop LR分解固有値計算 = R End Function

■LR法と処理手順は同じであるが,L行列ではなく,直交行列を用いる。 ④QR分解による固有値演算 ■LR法と処理手順は同じであるが,L行列ではなく,直交行列を用いる。 ■直交化法としては,先に示したグラム・シュミットの方法を使うこととする。 ■最近では,LR法よりQR法がよく用いられている。

QR分解の考え方 固有値の定義から 左辺の係数行列 をQR分解したときの直交行列と上三角行列を とすると 左から を乗じて,次のように置くと, 上式から,次の関係をもつ反復式を考えることができる。 LR法と同様, は上三角行列に収束し,対角要素が固有値になることが, 知られている。これを利用して固有値を求める方法である。 手順は,LR法とほぼ同様である。

VBでプログラムを作る ①シートの定義 (QR分解はグラム・シュミットの直交化法を用いる) (データ設定,結果設定,行列乗算は,LR法と同じ)

Sub ボタン1_Click() データ設定 EPS = 0.00001 R = QR分解固有値計算(A, EPS, 500, 4) ②イベントハンドラ Sub ボタン1_Click() データ設定 EPS = 0.00001 R = QR分解固有値計算(A, EPS, 500, 4) MsgBox R 結果設定 A End Sub

Function QR分解固有値計算(A, EPS, iterMax, N) ③固有値計算 Function QR分解固有値計算(A, EPS, iterMax, N) Dim Q() As Double: ReDim Q(N, N) Dim R() As Double: ReDim R(N, N) k = 0: E = EPS * 100: E2 = EPS * EPS Do While k < iterMax And E > E2 k = k + 1 QR分解 A, Q, R, N 行列乗算 R, Q, A, N, N E = 0 For i = 2 To N For j = 1 To i - 1 E = E + A(i, j) * A(i, j) Next Loop QR分解固有値計算 = k End Function

(4)行列変換法 (すべての固有値,固有ベクトルが求まる)   ①ヤコビ法   ②ハウスホルダ法

①ヤコビ法 ■実対称行列の固有値を求める方法 ■工学系で現れる行列のほとんどは,実対称行列である。 [覚えておきたい定理] 正方行列 , 正則行列 に対して, と (および ) の固有値は一致する。 (固有値を変換させない変換を相似変換という)

直交行列とは 正則行列 の転置行列 と逆行列 逆行列 が一致する行列。 すなわち, [ヤコビ法] に対して直交行列で相似変換を行い, 対角成分以外をすべて 0 にする方法。 対角成分の値が固有値となる。

考え方(1) 二つの行に回転の成分をもち,それ以外の対角成分が 1 ,非対角成分が 0 となる直交行列を考える。 Z [最も簡単な例] X Y Z軸回りの回転を意味する。したがってベクトルの大きさは変わらない。

考え方(2) [Aが対象行列の場合] 2行1列目または1行2列目を0とおくと 一方, から のとき

ただし, 考え方(3) のとき とおけばよい。 その他の項は以下のようにして計算すればよい

考え方(4) ここで とおくと すなわち対角項は

ウイルキンソン(Wilkinson)の公式 二つの行に回転の成分をもち,それ以外の対角成分が 1 ,非対角成分が 0 となる直交行列を考える。 第 p 行 第 q 行

ウイルキンソン(Wilkinson)の公式 と置いて, ① ② ③ のとき,①を適用すると

VBでプログラムを作る ①シートの定義(A・W=D・Wの式定義も行う)

②データの設定部分 Private A() As Double Private D() As Double Function データ設定() N = 4 ReDim A(N, N), D(N) With Worksheets("Sheet1") For i = 1 To N For j = 1 To N A(i, j) = Val(.Cells(i + 1, j + 1)) Next End With データ設定 = N End Function

③結果の設定とイベントハンドラ Sub 結果表示(A, D, N) With Worksheets("Sheet1") For i = 1 To N For j = 1 To N .Cells(j + 1, i + 7) = A(i, j) Next .Cells(i + 1, 13) = D(i) End With End Sub Sub ボタン1_Click() N = データ設定() Jacobi A, D, N 結果表示 A, D, N

④処理本体(1) (続きあり) Sub Jacobi(A, D, N) Dim i, j, k As Integer Dim T, C, S, X, Y As Double Dim Iter, MaxIter As Integer Dim OK As Boolean Dim V() As Double: ReDim V(N) Dim W() As Double: ReDim W(N, N) For k = 1 To N For j = 1 To N W(k, j) = 0 Next W(k, k) = 1: D(k) = A(k, k) Iter = 0: MaxIter = 50 Do Iter = Iter + 1: OK = True For j = 1 To N - 1 For k = j + 1 To N T = Abs(D(j)) + Abs(D(k))     If Abs(A(j, k)) + T <> T Then OK = False (続きあり)

④処理本体(2) T = (D(k) - D(j)) / (2 * A(j, k)) If T >= 0 Then T = 1 / (T + Sqr(T * T + 1)) _ Else T = 1 / (T - Sqr(T * T + 1)) C = 1 / Sqr(T * T + 1): S = T * C: T = T * A(j, k) D(j) = D(j) - T: D(k) = D(k) + T: A(j, k) = 0 For i = 1 To j - 1 X = A(i, j): Y = A(i, k) A(i, j) = X * C - Y * S: A(i, k) = X * S + Y * C Next For i = j + 1 To k - 1 X = A(j, i): Y = A(i, k) A(j, i) = X * C - Y * S: A(i, k) = X * S + Y * C For i = k + 1 To N X = A(j, i): Y = A(k, i) A(j, i) = X * C - Y * S: A(k, i) = X * S + Y * C For i = 1 To N X = W(j, i): Y = W(k, i) W(j, i) = X * C - Y * S: W(k, i) = X * S + Y * C End If

④処理本体(3) Next Next Loop Until OK Or (Iter > MaxIter) If OK Then For i = 1 To N - 1 k = i For j = i + 1 To N If D(j) > D(k) Then k = j T = D(i): D(i) = D(k): D(k) = T For j = 1 To N T = W(i, j): W(i, j) = W(k, j): W(k, j) = T A = W Else MsgBox "収斂しません" End If End Sub

②三重対角化法 ■固有値問題とは,いわば座標変換により行列を対角化すること。 ■いきなり対角化することは困難であるが,三重対角化は有限ステップで可能。 ■三重対角化行列とは,対角項とその隣以外が零となるような行列である。 ■最も有名な方法にハウスホルダー(Householder)法がある。

鏡映変換とは ■面を鏡の面として,できた像の位置にベクトルを移す変換を鏡映変換という。 (ベクトルの大きさは変わらない)   (ベクトルの大きさは変わらない) ■ハウスホルダー変換は鏡映変換のひとつである。 [簡単な例]

ハウスホルダ変換とは 変換法 :単位行列 に垂直な面

三重対角化するハウスホルダ変換(1) 実対称行列 を列ベクトル を列とする行列とする。 ①第1段のハウスホルダ変換は ② であるから とすると の符号は,桁落ちがおきないよう と同じにする。

三重対角化するハウスホルダ変換(2) ③ として計算できる。 ④ は, の第1項が0であるから, (*は 0 と限らない部分) の形になる。 ⑤ 次の計算を行う。

三重対角化するハウスホルダ変換(3) ⑥ の形と の対称性から の第1行目も,これを転置した形になる。 ⑦ ところで, とおくと さらに したがって をあらかじめ計算しておくと,単純化できる。

三重対角化するハウスホルダ変換(4) ⑧その結果, ⑨第2列目以降は,次のようになるので,1行・1列目に影響を与えない。 の第1行と第1列を除いた部分 ⑨第2列目以降は,次のようになるので,1行・1列目に影響を与えない。 したがって,1列目,第2列目を除いた小行列に対して処理することになる。

三重対角化するハウスホルダ変換(5) ⑩その結果,以下の行列が得られる。 この変換によっても固有値は変化しない。したがって固有値を求める前に,この変換を行っておくことで,Nが大きい場合,ヤコビ法より速く固有値を求めることができる。

VBでプログラムを作る ①シートの定義(A・W=D・Wの式定義も行う)

②データの設定部分 Public A() As Double Public D() As Double Public E() As Double Function データ設定() N = 4 ReDim A(N, N), D(N), E(N) With Worksheets("Sheet1") For I = 1 To N For J = 1 To N A(I, J) = Val(.Cells(I + 1, J + 1)) Next End With データ設定 = N End Function

③三重対角化結果の設定とイベントハンドラ Sub 結果表示(A, D, E, N) With Worksheets("Sheet1") For I = 1 To N .Cells(I + 1, 14) = D(I) .Cells(I + 1, 15) = E(I) Next End With End Sub Sub ボタン1_Click() N = データ設定() EPS = 0.00001 三重対角化 A, D, E, EPS, N 結果表示 A, D, E, N

④三重対角処理本体(1) (続きあり) Sub 三重対角化(A, D, E, EPS, N) Dim I, J, K As Integer Dim S As Double Dim V() As Double Dim W() As Double ReDim V(N), W(N)  For K = 1 To N - 2 D(K) = A(K, K) For I = K + 1 To N W(I) = A(I, K) Next S = 0 S = S + W(I) * W(I) (続きあり)

④三重対角処理本体(2) (続きあり) If Abs(S) > EPS Then If W(K + 1) >= 0 Then S = Sqr(S) Else S = -Sqr(S) E(K + 1) = -S: W(K + 1) = W(K + 1) + S S = 1 / Sqr(W(K + 1) * S) For I = K + 1 To N W(I) = W(I) * S Next S = 0 For J = K + 1 To I S = S + A(I, J) * W(J) For J = I + 1 To N S = S + A(J, I) * W(J) V(I) = S (続きあり)

④三重対角処理本体(3) (続きあり) S = 0 For I = K + 1 To N S = S + W(I) * V(I) Next V(I) = V(I) - S * W(I) For J = K + 1 To I A(I, J) = A(I, J) - W(I) * V(J) - W(J) * V(I) ' 固有ベクトルを求めるときWの内容をAに移す A(I, K) = W(I) Else E(K + 1) = 0 End If (続きあり)

④三重対角処理本体(4) (続きあり) D(N - 1) = A(N - 1, N - 1): D(N) = A(N, N) E(1) = 0: E(N) = A(N, N - 1) '以下,固有ベクトル計算用 For K = N To 1 Step -1 If K < N - 1 Then For I = K + 1 To N W(I) = A(I, K) Next S = 0 For J = K + 1 To N S = S + A(I, J) * W(J) V(I) = S A(I, J) = A(I, J) - V(I) * W(J) End If (続きあり)

④三重対角処理本体(5) For I = 1 To N A(I, K) = 0 Next A(K, K) = 1 End Sub

⑤固有値と固有値ベクトルのためのデータ設定 Function 固有値用データ設定() N = 4 ReDim A(N, N), D(N) With Worksheets("Sheet1") For I = 1 To N For J = 1 To N A(I, J) = Val(.Cells(I + 1, J + 1)) Next End With 固有値用データ設定 = N End Function

⑥固有値と固有値ベクトルのためのイベントハンドラ Sub 固有値結果表示(A, D, N) With Worksheets("Sheet1") For I = 1 To N .Cells(I + 1, 13) = D(I) For J = 1 To N .Cells(I + 1, J + 7) = A(I, J) Next End With End Sub Sub ボタン5_Click() N = 固有値用データ設定() EPS = 0.00001 三重対角化による固有値 A, D, N 固有値結果表示 A, D, N

⑦固有値と固有値ベクトルの処理本体(1) (続きあり) Function Zero(D, E, I) As Boolean If I > 1 Then T = Abs(D(I)) + Abs(D(I - 1)) Else T = 0 Zero = ((T + Abs(E(I))) = T) End Function Sub 三重対角化による固有値(A, D, N) Dim MaxIter, I, K, H, L As Integer Dim S, C, T, W, X, Y, Z As Double Dim E() As Double MaxIter = 20 ReDim E(N) EPS = 0.00001 三重対角化 A, D, E, EPS, N E(1) = 1: H = N Do While Zero(D, E, H) H = H - 1 Loop (続きあり)

⑦固有値と固有値ベクトルの処理本体(2) (続きあり) Do While H > 1 E(1) = 0: L = H - 1 Do While Not Zero(D, E, L) L = L - 1 Loop Iter = 0 Do Iter = Iter + 1 If Iter > MaxIter Then MsgBox "収斂しません" Exit Sub End If W = (D(H - 1) - D(H)) / 2 S = Sqr(W * W + E(H) * E(H)) If W < 0 Then S = -S X = D(L) - D(H) + E(H) * E(H) / (W + S) Y = E(L + 1) Z = 0 (続きあり)

⑦固有値と固有値ベクトルの処理本体(3) (続きあり) For K = L To H - 1 If Abs(X) >= Abs(Y) Then T = -Y / X: C = 1 / Sqr(T * T + 1): S = T * C Else T = -X / Y: S = 1 / Sqr(T * T + 1) If T < 0 Then S = -S C = T * S End If W = D(K) - D(K + 1): T = (W * S + 2 * C * E(K + 1)) * S D(K) = D(K) - T: D(K + 1) = D(K + 1) + T E(K) = C * E(K) - S * Z E(K + 1) = E(K + 1) * (C * C - S * S) + W * S * C For I = 1 To N X = A(K, I): Y = A(K + 1, I) A(K, I) = C * X - S * Y: A(K + 1, I) = S * X + C * Y Next If K < N - 1 Then X = E(K + 1): Y = -S * E(K + 2): Z = Y E(K + 2) = C * E(K + 2) Loop Until Zero(D, E, H) (続きあり)

⑦固有値と固有値ベクトルの処理本体(4) E(1) = 1: H = H - 1 Do While Zero(D, E, H) Loop '以下,固有ベクトル For K = 1 To N - 1 L = K For I = K + 1 To N If D(I) > D(L) Then L = I Next T = D(K): D(K) = D(L): D(L) = T For I = 1 To N T = A(K, I): A(K, I) = A(L, I): A(L, I) = T End Sub

(X)演習 (問題1)次の行列の固有値と固有ベクトルをサンプルプログラムを利用して求めよ。