Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
基礎数値解析–偏微分方程式の数値シミュレーション技法入門–
岐阜大学工学部数理デザイン工学科田中光宏 ([email protected])
2006年 4月 1日
babababababababababababababababababababab
これは岐阜大学大学院工学研究科の修士 1年生を対象に,ここ数年間にわたって担当した「基礎数値解析」という講義の配布資料をまとめたものです.筆者の専門が流体力学,中でも水面波動などの波動現象の研究ということから,本講義で取り上げた題材は,そのような分野で基礎方程式として現れてくる,時間と空間を独立変数とする偏微分方程式を数値的に扱い,場の時間発展を追跡しようとする際に必要となるさまざまな基本的な数値手法を・・・という観点で選びました.少しでも学生諸君の学習のお役に立てば幸いです.もしお気づきの点などありましたら,上記メールアドレスまでご連絡下さい.
目 次
第 0章 イントロダクション 6
第 1章 常微分方程式の初期値問題の解法 8
1.1 問題設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2 方向の場 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 Euler法(最も原始的) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4 打切り誤差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.1 局所打切り誤差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.2 Euler法の局所打切り誤差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Euler法の改良 (Runge-Kutta法への橋渡し) . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.1 修正 Euler法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.2 ホインの方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 Runge-Kutta法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.1 2ステージの Runge-Kutta法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.2 3ステージの Runge-Kutta法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6.3 4ステージの Runge-Kutta法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.6.4 メモリー節約型の Runge-Kutta法 . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.6.5 キザミの自動制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.6.6 Runge-Kutta-Fehlberg法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.7 Adams–Bashforth法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.7.1 Lagrangeの補間多項式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.7.2 2次の Adams-Bashforth法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.7.3 3次の Adams-Bashforth法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.7.4 より高次の Adams-Bashforth法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.7.5 Adams-Bashforth法の特徴 (Runge-Kutta法との比較) . . . . . . . . . . . . . . . . 31
1.8 Adams–Moulton法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.8.1 4次の Adams-Moulton法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.9 Adams-Bashforth-Moulton法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1.10 安定性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
第 2章 浮動小数点数と丸め誤差 37
2.1 計算機内での数の表現法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.1.1 整数型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1
2.1.2 実数型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.1.3 丸め誤差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.2 実際によく使われる浮動小数点数の形式:IEEE754 . . . . . . . . . . . . . . . . . . . . . . 39
2.2.1 4バイト (32ビット)実数型:単精度実数型 (real∗4) . . . . . . . . . . . . . . . . . . 39
2.2.2 8バイト (64ビット)実数型:倍精度実数型 (real∗8 or double precision) . . . . . . . 40
2.3 10進数と β 進数との変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.3.1 10進整数 x の β 進数化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.3.2 10進純小数 x の β 進数化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3.3 β 進整数の 10進数化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.3.4 β 進 (有限)小数の 10進数化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.4 Horner法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.5 四則演算に伴う誤差の伝播 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.6 丸めが引き起こす様々なトラブルの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.6.1 多くの数を加える時 (小さな丸め誤差の累積) . . . . . . . . . . . . . . . . . . . . . . 43
2.6.2 大きな数と小さな数の和—「積み残し」「情報落ち」 . . . . . . . . . . . . . . . . . 44
2.6.3 常微分方程式の数値解法でキザミが小さすぎると誤差が増大したこと . . . . . . . . 44
2.6.4 桁落ち—よく似た数どうしの引き算 . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
第 3章 差分法 47
3.1 差分による微分係数の近似法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.1.1 1階微分に対する差分表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.1.2 2階微分に対する差分表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.1.3 より高次の公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.1.4 不等間隔メッシュの場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2 拡散方程式に対する差分法の適用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.1 拡散方程式に対する FTCSスキーム . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.2 適合性 (consistency)と打切り誤差 (truncation error) . . . . . . . . . . . . . . . . . 52
3.2.3 安定性 (stability) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.2.4 CTCSスキーム (Leapfrogスキーム) . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.2.5 Laxの同等定理 (Equivalence Theorem) . . . . . . . . . . . . . . . . . . . . . . . . 56
3.2.6 完全陰的スキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.3 Thomasアルゴリズム—3重対角行列に対する効率的な消去法 . . . . . . . . . . . . . . . . 57
3.4 2次元・3次元の拡散方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.4.1 FTCSスキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.4.2 ADIスキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.5 移流方程式に対する差分法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.5.1 FTCSスキーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.5.2 CTCSスキーム (Leapfrogスキーム) . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.5.3 移流項に対する風上差分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2
3.5.4 マルチステップ法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.6 線の方法 (Method of Lines) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
第 4章 重み付き残差法 66
4.1 偏微分方程式の数値解法(空間の離散化)の分類 . . . . . . . . . . . . . . . . . . . . . . . 66
4.2 重み付き残差法 (weighted residual method) . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.1 重み付き残差法とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.2.2 差分法との相違点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3 いろいろな重み付き残差法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3.1 サブドメイン法 (subdomain method) . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3.2 選点法 (collocation method) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.3 ガラーキン法 (Galerkin method) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.4 計算例:定常問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.4.1 選点法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.4.2 ガラーキン法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.5 計算例:非定常問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.6 (古典的)Galerkin法のまとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.7 (古典的)Galerkin法の問題点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.7.1 第 1の問題点:重み関数の一次独立性の悪化 . . . . . . . . . . . . . . . . . . . . . . 74
4.7.2 第 2の問題点:係数行列の大型化に伴う計算量の増加 . . . . . . . . . . . . . . . . . 76
4.7.3 第 3の問題点:多次元化,複雑形状 . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.7.4 第 4の問題点: Galerkin法の間接性 . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
第 5章 有限要素法入門 78
5.1 古典的 Galerkin法の改良 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.1.1 展開係数への関数値の採用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.1.2 試行関数の局在性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.1.3 「要素」という概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1.4 試行関数の具体形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1.5 例題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.2 実際に近い解法手順 (1) 1次元問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.2.1 重み付き残差方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.2.2 弱形式化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.2.3 要素方程式の導出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.2.4 全体方程式の組み立て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.2.5 境界条件の考慮 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.3 実際に近い解法手順 (2) 多次元・複雑形状領域 . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.3.1 問題設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.3.2 弱形式化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3
5.3.3 アイソパラメトリック要素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.3.4 要素方程式と全体方程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.3.5 Gauss積分法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
第 6章 スペクトル法 94
6.1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.2 普通のフーリエ級数の復習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.2.1 フーリエ級数の定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.2.2 パーセバルの等式,平均収束 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.3 フーリエ級数の各点収束 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.4 フーリエ級数の収束の速さと関数の滑らかさの関係 . . . . . . . . . . . . . . . . . . 96
6.3 離散フーリエ変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.3.1 離散データの表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.3.2 三角関数の離散直交関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.3 離散フーリエ変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.3.4 離散フーリエ変換の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.3.5 本当のフーリエ級数との関係 (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.3.6 本当のフーリエ級数との関係 (2):エイリアジング誤差 . . . . . . . . . . . . . . . . 103
6.3.7 一般的な周期の場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
6.3.8 離散フーリエ変換を使った微分係数の計算 . . . . . . . . . . . . . . . . . . . . . . . 106
6.3.9 高速フーリエ変換 (Fast Fourier Transform, FFT) . . . . . . . . . . . . . . . . . . . 107
6.3.10 複素離散フーリエ変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
6.4 フーリエ・スペクトル法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
6.4.1 フーリエ・ガラーキン法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
6.4.2 フーリエ・選点法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.5 チェビシェフ・スペクトル法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6.5.1 チェビシェフ多項式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.5.2 チェビシェフ展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
6.5.3 離散チェビシェフ展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.5.4 チェビシェフ選点法における空間微分の計算法 . . . . . . . . . . . . . . . . . . . . . 119
6.5.5 その他の計算領域への適用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
第 7章 連立一次方程式の解法 124
7.1 Gaussの消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.1.1 Gaussの消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.1.2 LU分解ー Gaussの消去法の行列演算としての表現 . . . . . . . . . . . . . . . . . . 126
7.1.3 LU分解による Ax = b の解法の手続き . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.1.4 解の反復改良 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
7.1.5 LU分解による逆行列の計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4
7.1.6 LU分解による行列式の計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.1.7 LU分解の任意性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.1.8 LDU分解とコレスキー分解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.1.9 QR分解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.2 反復法 I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
7.2.1 Jacobi法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
7.2.2 Gauss-Seidel法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
7.2.3 逐次過緩和法 (SOR)法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.2.4 反復法の収束条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.3 反復法 II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7.3.1 最小化問題としての解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7.3.2 最急降下法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
7.3.3 共役勾配法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
5
第0章 イントロダクション
我々の身の回りで起こるすべての力学的現象は,ニュートンの法則「質量×加速度=力」に支配されてい
る.加速度は速度を時間について 1階微分したもの,変位から見れば時間について 2階微分したものであり,したがって運動を支配する方程式には必然的に時間微分という演算が入ってくる.1 また,我々が実際
に取り扱わなければならない対象は,よく力学の例題に出てくる投げられたボールのような「質点」として
扱えるようなものではなく,例えば土中の圧力や,建設部材中のひずみの分布や,海岸・海洋工学の水面波
形であったりと,空間的に広がりを持った領域におけるある物理量の分布状況であることが多い.
このようにある空間内で連続的に分布しているある物理量の時間発展を,保存則などの基礎的原理に基
づいて数学的に記述すると,通常,時間および空間変数についての微分演算(場合によっては積分演算も)
を含む偏微分方程式(偏微積分方程式)に行き着く.例えば,水や空気など「流体」と呼ばれる連続媒質に
対して,運動量の保存則(すなわちニュートンの法則)を適用すると,流体力学における基礎方程式として
よく知られたナビエ・ストークス方程式という流速ベクトルに対する非線形な偏微分方程式が得られる.
筆者の研究分野である水面波の時間発展追跡を例にとって,偏微分方程式の数値シミュレーションの代表
的な手続きを述べると以下のようになる.
• 空間の離散化ある時刻 t における水面の変位 η(x, y, t) は,本来は連続的な空間座標 (x, y) の関数として与えられるものであるが,計算機はこのような無限個の未知量を扱うことはできない.そこで対象とする空間領
域の中に離散的な有限個の点,例えばもっとも単純なやり方としては,十分小さいと思えるメッシュ
間隔 ∆x, ∆y を用いて
(x, y) = (i∆x, j∆y) (i = 1, 2, . . . , nx; j = 1, 2, . . . , ny)
のようなメッシュ点を設定し,そこにおける η の値 ηij(t) (= η(i∆x, j∆y)) だけを追跡することを考える.2
• 偏微分方程式の離散化上のように空間が離散化され,η(x, y, t)の有限個の値 ηij(t)だけを相手にすることにすると,η(x, y, t)の時間発展を記述する偏微分方程式(水面波の基礎方程式)
∂η(x, y, t)∂t
= f(η, t)
もdηij
dt= fij(η11, η12, · · · , ηnxny−1, ηnxny︸ ︷︷ ︸
すべての点における η
, t) (i = 1, 2, . . . , nx; j = 1, 2, . . . , ny) (1)
のように離散化されることになる.
ここで f(η, t) には通常,η(x, y, t) の x や y についての微分や積分が含まれるので,fij の値を計算
するためには,これらの微分値,積分値を有限個の ηij だけを用いて近似的に表現することが必要に
なる.1そもそも微分と言う演算自体,この必要性に迫られてニュートンが考案したものである.2これは差分法や有限要素法などの考え方である.別のやり方として,η(x, y, t) を (x, y) の適当な関数系 {ϕk(x, y)} (k = 1, . . . , n)
を用いた有限項の展開形で η(x, y, t) =Pn
k=1 ak(t)ϕk(x, y) のように近似的に表現し,その展開係数 {ak(t)} の時間発展を追跡するという方法もある.このタイプにはスペクトル法などが含まれる.(いずれも後述)
6
• 連立常微分方程式の積分上で得られた連立常微分方程式系 (1)を,与えられた初期値 ηij(0) から出発して数値的に積分し,任意の時刻 t における波形データ ηij(t) を得る.3
3このようにまず空間の離散化によって偏微分方程式を連立常微分方程式系に帰着させ,それを常微分方程式用の数値積分法を用いて時間方向に追跡する手法は,一般に線の方法 (Method of Lines) と呼ばれている.(後述)
7
第1章 常微分方程式の初期値問題の解法
1.1 問題設定
前章で挙げたいくつかのプロセスのうち,まずは最後の「連立常微分方程式の初期値問題」に関する数値
的手法から詳しく見て行くことにする.前のままではちょっと見にくいので,
1. 未知数 ηij には通し番号 1, 2, . . . , n(= nx × ny) をつける.
2. また独立変数,従属変数の名前をそれぞれ t, ηij から x, yi (i = 1, 2, . . . , n) と変更する.
この時 (1)は以下のような連立の一階常微分方程式の初期値問題
dy1(x)dx
= f1(x, y1, y2, . . . , yn), y1(0) : given
dy2(x)dx
= f2(x, y1, y2, . . . , yn), y2(0) : given
... (1.1)dyn(x)
dx= fn(x, y1, y2, . . . , yn), yn(0) : given
またはベクトル記法
y =
y1
y2
...yn
, f =
f1
f2
...fn
を使えば
dy(x)dx
= f(x,y), y(0) = y0 : given (1.2)
に帰着される.
• 単一の常微分方程式用の解法を連立常微分方程式系の場合に拡張する方法は単純で自明なので,今後説明はもっぱら単一の常微分方程式の初期値問題
dy(x)dx
= f(x, y), y(0) = y0 : given (1.3)
についてのみ行う.
• また,一般に高階の常微分方程式は連立の一階微分方程式に帰着させることが可能である.例えば単一の3階常微分方程式
d3y(x)dx3
= f(x, y, y′, y′′) (1.4)
は
y1 = y, y2 = y′, y3 = y′′ (1.5)
8
とおくことにより
dy1
dx= y2 (= f1(x, y1, y2, y3))
dy2
dx= y3 (= f2(x, y1, y2, y3)) (1.6)
dy3
dx= f(x, y1, y2, y3) (= f3(x, y1, y2, y3))
のように 3元連立の一階常微分方程式系に帰着させることができる.したがって以下では一階の微分方程式のみを扱うことにする.一階微分方程式を解く手法を知っていれば,任意階数の微分方程式を
解くことができる.
1.2 方向の場
ところで,常微分方程式の初期値問題
dy(x)dx
= f(x, y), y(x0) = y0: given (1.7)
を解くということは,一体どういうことなんだろう?
よく知っているように dy/dx はグラフ y(x) の傾きを表す.したがって,それが f(x, y) という関数で指定されているということは,x-y 平面のすべての点において,「その点に来たら次はどっちへ進め」という方向が指定されているということになる.
したがって,常微分方程式の初期値問題 (1.7)を解くということは,与えられた点 (x0, y0) から出発して,次々に指定された方向に進んでいくとどういう曲線 y = y(x) をたどって行くことになるのか,その曲線を求めることに対応している.
【例】dy
dx= −2xy2, y(0) = y0 (1.8)
を考える.これは変数分離形で
dy
dx= −2xy2 =⇒ dy
y2= −2xdx =⇒ 1
y= x2 + c =⇒ y(x) =
1x2 + c
のように積分ができ,初期条件から定数 c を決めると解析解
y(x) =1
x2 + 1/y0(1.9)
が簡単に得られる.この微分方程式に対する方向の場を図 1.1に示す.
1.3 Euler法(最も原始的)
微分の定義dy(x)dx
= limh→0
y(x + h) − y(x)h
(1.10)
より,もし h を十分小さく取れば
f(x, y(x)) =dy(x)dx
≈ y(x + h) − y(x)h
(1.11)
9
0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 1.000
2.00
1.75
1.50
1.25
1.00
0.75
0.50
0.25
0.00
X
Y
= 1.000e+000
図 1.1: y′ = −2xy2 に対する「方向の場」
すなわち,
y(x + h) ≈ y(x) + f(x, y(x))h (1.12)
が成り立つであろう.
x 軸方向には x0 から出発して,小さなキザミ(ステップサイズ) h ずつ進むことにする.1
今後
• k ステップ目の x の値,すなわち x0 + kh (k = 1, 2, . . .) を xk,
• xk における真の y の値を y(xk),
• xk における数値計算により求めた y の近似値を yk
と書くことにする.2 この時,
Euler法¶ ³y1 = y0 + f(x0, y0)h
y2 = y1 + f(x1, y1)h...
yk+1 = yk + f(xk, yk)h...µ ´
によって順次 y(x) の近似値を求めていく方法を Euler法と呼ぶ.
1h は1ステップごとに変えてもいいが,ここでは一定としておく.2y(xk) と yk の区別に注意すること.
10
計算例前出の例題 y′ = −2xy2 を Euler法で解くためのサンプルプログラムを以下に示す.
c============================================================
c
c program euler.for
c
c integrates the ordinary differetntial equation
c
c dy(x)/dx = -2xy^2
c
c by Euler’s method in Double Precision
c
c updated on April 12, 2002
c===========================================================
implicit real*8 (a-h,o-z)
f(x,y)=-2*x*y**2
y_sol(x,y0)=1/(x**2+1/y0)
c------------------------------------------------------
x0=0.d0
xend=1.d0
y0=1.d0
write(*,*) ’@@ enter l (nstep=10**l) @@’
read(*,*) l
nstep=10**l
h=xend/nstep
x=x0
y=y0
err=0.d0
write(*,*) x,y,err
c------------------------------------------------------
do 10 k=1,nstep
y=y+f(x,y)*h
x=x+h
err=y-y_sol(x,y0)
write(*,*) x,y,err
10 continue
stop
end
y(0) = 1 とし,0 ≤ x ≤ 1 の範囲で3つの異なるキザミ h を用いて Euler法により求めた数値解のグラフを図 1.2に示す.図 1.3は x = 1 における y の (大局)誤差をキザミ h の関数として両対数目盛りでプロッ
トしたものであるが,これによると Euler法の (大局)誤差は h の1乗に比例していることが分かる.3
1.4 打切り誤差
1.4.1 局所打切り誤差
xk における数値解 yk から xk+1 における数値解 yk+1 を出す操作を形式的に
yk+1 = yk + h · Φ(xk, yk, h) (1.13)
と書くことにする.
もし
limh→0
Φ(x, y, h) = f(x, y) (1.14)
3図 1.2 によると,h が小さくなりすぎるとかえって誤差が増大することが分かる.この現象については次章で説明する.
11
0.4
0.5
0.6
0.7
0.8
0.9
1
1.1
0 0.2 0.4 0.6 0.8 1
Solution curve for y'=-2xy2, y(0)=1.
h=1/5h=1/10h=1/20y_exact
y
x
図 1.2: Euler法による数値解: y′ = −2xy2, y(0) = 1
10-13
10-11
10-9
10-7
10-5
0.001
0.1
10-10 10-8 10-6 0.0001 0.01 1
Global Error of Euler's Method (at x=1; y'=-2xy2, y(0)=1)
Euler_err
h
Eul
er_e
rr
h
図 1.3: Euler法による打切り誤差: y′ = −2xy2, y(0) = 1
12
である場合,この数値スキームはもとの微分方程式に適合している (consistent)と言う.この呼び方は
yk+1 − yk
h= Φ(xk, yk, h) と lim
h→0
y(xk+1) − y(xk)h
= f(xk, y(xk))
を考え合わせれば納得が行く.
真の解 y(x) がはたしてどの程度 (1.13)の関係を満たすかを考えることにより,逆にその数値スキームの精度を評価することができる.
第 k ステップ目の数値解は完全に正しい,すなわち yk = y(xk) と仮定して,関係 (1.13)で出した (k +1)ステップ目の数値解 yk+1 と真の解 y(xk+1) との差,すなわち
∆k+1 = y(xk+1) − {yk + h · Φ(xk, yk, h)} (1.15)
を局所打切り誤差 (local truncation error)または局所離散化誤差 (local discretization error)と呼
ぶ.局所打切り誤差とは,1ステップ進む間に生じる誤差である.
1.4.2 Euler法の局所打切り誤差
y(xk+1) は xk のまわりに Taylor展開することにより
y(xk+1) = y(xk + h) = y(xk) + y′(xk)h +12y′′(xk)h2 + · · ·
= yk + f(xk, yk)h +12y′′(xk)h2 + · · · .
したがって
∆k+1 ={
yk + f(xk, yk)h +12y′′(xk)h2 + · · ·
}− {yk + f(xk, yk)h}
=12y′′(xk)h2 + O(h3).
すなわち Euler法の局所打切り誤差は O(h2) である. したがって Euler法の場合,例えば h を半分にする
と,1ステップあたりの誤差はほぼ 1/4 に減少する.
しかし現実の数値計算で重要なのは,1ステップあたりの誤差ではなく,むしろある目標の x までたど
り着いたときに y に含まれる誤差であり,これは大局打切り誤差 (global truncation error)とか大局離
散化誤差 (global discretization error)と呼ばれる.
大局誤差は局所誤差の積み重ねであり,ステップ数に比例して増大する.決まった x まで行くのに必要な
ステップ数はキザミ h に反比例するので,おおざっぱに言って大局誤差は
大局誤差 ∼局所誤差× O(h−1)
で評価することができる.4 これによると
Euler法の大局誤差 ∼ O(h2) × O(h−1) ∼ O(h)
となり,Euler法の大局誤差はキザミ h の 1乗にほぼ比例することが予想される.これは図 1.3で見た振舞いとつじつまがあっている.
大局誤差がキザミ h の p 乗に比例するような数値手法を一般に p 次公式と言う.したがってEuler法は
1次公式である.4このことから,大局誤差のオーダーはいつも局所誤差のオーダーより 1次下がる.すなわち m次公式の場合,大局誤差 ∼ O(hm),
局所誤差 ∼ O(hm+1).
13
1.5 Euler法の改良 (Runge-Kutta法への橋渡し)
Euler法だけではあまりに原始的でさみしいし,それにキザミを小さくしても精度もなかなか上がらない.例えば,10進法でもう 2桁精度を上げようと思うと,キザミは 1/100 にしなければならず,その結果計算量は 100倍になる.
Euler法の精度がなかなか上がらないのは,1ステップ進む間の,f(x, y) が決める「方向の場」の変化をまったく考慮していないためであり,そこを少し工夫することによりもっと精度の高い方法が得られる.
1.5.1 修正Euler法
修正 Euler法¶ ³(1) d(1) = f(xk, yk)
(2) d(2) = f(xk +12h, yk +
12hd(1))
(3) yk+1 = yk + hd(2)µ ´すなわち
1. まず (xk, yk) で矢印の向きを計算する (d(1)).
2. その向きに 12h だけ行ってみて,そこでまた矢印の向きを計算する (d(2)).
3. この中間点での矢印の向きを使って (xk, yk) から (xk+1, yk+1) まで行く.
この方法は修正 Euler 法 (modified Euler method) とか改良多角形法 (improved polygonal
method)と呼ばれる.
1.5.2 ホインの方法
ホインの方法¶ ³(1) d(1) = f(xk, yk)
(2) d(2) = f(xk + h, yk + hd(1))
(3) yk+1 = yk +12h(d(1) + d(2))µ ´
すなわち
1. まず (xk, yk) で矢印の向きを計算する (d(1)).
2. その向きに h だけ進んで仮の yk+1 を出し,その点における矢印の向きを計算する (d(2)).
3. xk での向きと xk+1 での (仮の)向きの相加平均の向きに,もう一度 (xk, yk) から h だけ進める.
14
この方法はホインの方法 (Heun’s method),または改良Euler法 (improved Euler method)と呼ば
れる.
これらの方法は二つとも 1ステップの間に微分係数 f(x, y) を 2回計算しないといけないので,おなじ h
を使うならば Euler法より時間がかかる.
図 1.4に大局誤差ときざみ h の関係を示す.図が示すように,これらの方法はどちらも 2次の公式であ
り,大局打切り誤差が h2 に比例する(これについては次節で説明する).この図によると,仮に許容誤差
10-12
10-10
10-8
10-6
10-4
0.01
10-10 10-8 10-6 0.0001 0.01
Heun2Imp_PolyEuler
Err
or a
t x=
1
h
Global Error of 2nd-order Methods (y'=-2xy2, y(0)=1)
図 1.4: Euler法の改良版による打切り誤差: y′ = −2xy2, y(0) = 1
を 10−5 とする時,Euler法なら h = 0.0003 程度のキザミを使う必要がある.しかし,修正 Euler法を使えば h = 0.01 程度のキザミで同程度の精度を得ることができ,これにより計算時間を大幅に短縮できる可能性がある.もし微分係数の計算がCPU時間の大半を占めるような計算なら,これら2次精度のスキームを使うことによって計算時間を 1/15以下に短縮できるかもしれない.プログラム上の修正としては,先に示した Euler法のプログラムの
y=y+f(x,y)*h
の行を,修正 Eulerなら
d1=f(x,y)
d2=f(x+0.5d0*h,y+0.5d0*h*d1)
y=y+h*d2
またホイン法なら
d1=f(x,y)
d2=f(x+h,y+h*d1)
y=y+0.5d0*h*(d1+d2)
と修正するだけである.
15
1.6 Runge-Kutta法
いくつかの (x, y)に対して f(x, y)の値を計算し,打切り誤差が互いにキャンセルしあって小さくなるように適切な重みをつけてそれらを平均し,それを用いて次のステップの y を求めていく方法をRunge-Kutta
法と言う.1ステップ進む間に微分係数 f(x, y) を計算する回数をステージ数と言う.
1.6.1 2ステージのRunge-Kutta法
常微分方程式dy
dx= f(x, y)
に対して
d(1) = f(xk, yk)
d(2) = f(xk + ah, yk + bhd(1))
yk+1 = yk + h[c1d
(1) + c2d(2)
](1.16)
として,なるべく打切り誤差が小さくなるように 4つの係数 a, b, c1, c2 を決めることを考える.
準備1 (y(x) の x についての Taylor展開) 5
y(xk+1) = y(xk + h) = y + hy′ +12h2y′′ +
16h3y′′′ + O(h4) (1.17)
ここで
y′ = f(x, y) (1.18)
y′′ = fx + fyy′ = fx + ffy (1.19)
y′′′ = (fx + ffy)′ = (fxx + fxyy′) + [(fx + fyy′)fy + f(fxy + fyyy′)]
=(fxx + 2ffxy + f2fyy
)+ (fx + ffy) fy. (1.20)
が成り立つことから
y(xk+1) = y(xk + h) = y + hy′ +12h2y′′ +
16h3y′′′ + O(h4)
= y + hf +12h2 (fx + ffy) +
16h3
[(fxx + 2ffxy + f2fyy
)+ (fx + ffy) fy
]+ O(h4) (1.21)
準備 2(2変数関数の Taylor展開)
g(x + ϵ, y + δ) = g(x, y) + (ϵgx + δgy)
+(
12ϵ2gxx + ϵδgxy +
12δ2gyy
)+ O(ϵ3, ϵ2δ, ϵδ2, δ3) (1.22)
真の値 y(xk+1) は (1.21)のように,(xk, yk) における f の値で表現されている.一方近似解は (1.16)のように,(xk, yk) からずれた点における f を用いて表現されている.したがって両者を比較して近似解に
含まれる誤差を見積もるためには,近似解 (1.16)をすべて (xk, yk) における f で表現しなおす必要があり,
以下ではまずこれを行う.
5以下では特に独立変数が示していないものはすべて (xk, yk) で評価した値を示すものとする.
16
まず準備 2を用いると
d(2) = f(xk + ah, yk + bhd(1)) = f + [(ah)fx + (bhf)fy]
+[12(ah)2fxx + (ah)(bhf)fxy +
12(bhf)2fyy
]+ O(h3)
= f + h(afx + bffy) +12h2
[a2fxx + 2abffxy + b2f2fyy
]+ O(h3). (1.23)
これより
yk+1 = yk + h[c1d
(1) + c2d(2)
]= yk + h(c1 + c2)f + c2h
2(afx + bffy)
+12c2h
3[a2fxx + 2abffxy + b2f2fyy
]+ O(h4). (1.24)
したがって (1.21)と (1.24)より局所打切り誤差 ∆k+1 は
∆k+1 = y(xk+1) −{
yk + h[c1d
(1) + c2d(2)
]}= h(1 − c1 − c2)f + h2
[(12− c2a
)fx +
(12− c2b
)ffy
]+
16h3
[(1 − 3c2a
2)fxx + 2(1 − 3c2ab)ffxy + (1 − 3c2b2)f2fyy + (fx + ffy)fy
]+ O(h4) (1.25)
となり,これより
c1 + c2 = 1, c2a =12, c2b =
12 (すなわち b = a) (1.26)
を満たすように c1, c2, a, b を取れば
∆k+1 =16h3
[(1 − 3
2a
)(fxx + 2ffxy + f2fyy
)+ (fx + ffy)fy
]+ O(h4)
となり,∆k+1 が h3 に比例する,すなわち 2次の公式が得られることになる.6 4つの変数 c1, c2, a, b に
対して,3つの条件が課せられるだけなので, これを満たす c1, c2, a, b の組は無限にたくさんある.仮に a
を自由なパラメタとすると,b, c1, c2 は a から
b = a, c1 = 1 − 12a
, c2 =12a
(1.27)
のように決まる.
特に a = 1/2 とすると b = 1/2, c1 = 0, c2 = 1 となり
d(1) = f(xk, yk)
d(2) = f(xk +12h, yk +
12hd(1)) (1.28)
yk+1 = yk + hd(2)
なる 2次公式が得られるが,これは前節の修正 Euler法に他ならない.
一方 a = 1 と取ると b = 1, c1 = 1/2, c2 = 1/2 となり
d(1) = f(xk, yk)
d(2) = f(xk + h, yk + hd(1)) (1.29)
yk+1 = yk +12h
[d(1) + d(2)
]なる 2次公式が得られるが,これは前節のHeunの方法そのものである.
すなわち,前節の2つの 2次公式はいずれも,無限にある 2ステージ 2次精度の Runge-Kutta法の中の特殊な場合にすぎない.
6{a, b, c1, c2} の選択だけでは O(h3) の係数を消すことはできない.
17
1.6.2 3ステージのRunge-Kutta法
同じ精神で今度は
d(1) = f(xk, yk)
d(2) = f(xk + a2h, yk + b21hd(1)) (1.30)
d(3) = f(xk + a3h, yk + b31hd(1) + b32hd(2))
yk+1 = yk + h(c1d
(1) + c2d(2) + c3d
(3))
のように微分係数 f(x, y) を 1ステップあたり 3回計算して,なるべく打切り誤差が小さくなるように 8つの係数 {a2, b21, a3, b31, b32, c1, c2, c3} を決めることを考える.ただし
b21 = a2, b31 + b32 = a3, (1.31)
なる関係は仮定するものとする.(仮定しなくても自動的に出てくるが・・・)
d(2) は (1.23)で a, b をともに a2 に置き換えるだけなので,
d(2) = f + a2h(fx + ffy) +12a22h
2(fxx + 2ffxy + f2fyy
)+ O(h3). (1.32)
また
d(3) = f(xk + a3h, yk + h(b31d
(1) + b32d(2))
)= f + (a3h)fx + h
(b31d
(1) + b32d(2)
)fy
+12(a3h)2fxx + (a3h)h
(b31d
(1) + b32d(2)
)fxy +
12h2
(b31d
(1) + b32d(2)
)2
fyy + O(h3)
= f + h [a3fx + (b31 + b32)ffy]
+ h2
[b32a2(fx + ffy)fy +
12a23fxx + a3(b31 + b32)ffxy +
12(b31 + b32)2f2fyy
]+ O(h3). (1.33)
ここで (1.31)の第 2式を用いると
d(3) = f + a3h(fx + ffy) + h2
[b32a2(fx + ffy)fy +
12a23
(fxx + 2ffxy + f2fyy
)]+ O(h3). (1.34)
これより,第 (k + 1) ステップの数値解 yk+1 は
yk+1 = yk + h[c1d
(1) + c2d(2) + c3d
(3)]
= yk + h(c1 + c2 + c3)f + h2(c2a2 + c3a3)(fx + ffy)
+12h3
[(c2a
22 + c3a
23)
(fxx + 2ffxy + f2fyy
)+ 2c3b32a2(fx + ffy)fy
]+ O(h4) (1.35)
となる.これと y(xk+1) に対する表式 (1.21)の差から局所打切り誤差 ∆k+1 は
∆k+1 = y(xk+1) −[yk + h
(c1d
(1) + c2d(2) + c3d
(3))]
= h [1 − (c1 + c2 + c3)] f + h2
[12− (c2a2 + c3a3)
](fx + ffy)
+16h3
[{1 − 3(c2a
22 + c3a
23)
} (fxx + 2ffxy + f2fyy
)+ (1 − 6c3b32a2)(fx + ffy)fy
]+ O(h4)
(1.36)
で与えられる.これより (1.31)の条件に加えて,
c1 + c2 + c3 = 1, c2a2 + c3a3 =12, c2a
22 + c3a
23 =
13, c3b32a2 =
16
(1.37)
18
を満たせば ∆k+1 = O(h4) となって 3次の公式が得られることになる.
8つの未知数 {a2, b21, a3, b31, b32, c1, c2, c3} に対して 6つの条件が課されるので,2つの自由なパラメタを含む形で解くことができる.2つの自由なパラメタとして a2, a3 を用いることにすると,残りの6つ
の係数は
b21 = a2,
b31 =a3(−3a2 + 3a2
2 + a3)a2(−2 + 3a2)
,
b32 =a3(a2 − a3)
a2(−2 + 3a2), (1.38)
c1 =2 − 3a2 − 3a3 + 6a2a3
6a2a3,
c2 =2 − 3a3
6a2(a2 − a3),
c3 =−2 + 3a2
6a3(a2 − a3)
と表される.
特に (a2, a3) = (1/3, 2/3) と取ると (b21, b31, b32) = (1/3, 0, 2/3), (c1, c2, c3) = (1/4, 0, 3/4) となり,Heunの 3次法 (Heun’s third-order method)
Heunの 3次法¶ ³d(1) = f(xk, yk)
d(2) = f(xk +13h, yk +
13hd(1)) (1.39)
d(3) = f(xk +23h, yk +
23hd(2))
yk+1 = yk +14h
[d(1) + 3d(3)
]µ ´が得られる.
また (a2, a3) = (1/2, 1) と取ると (b21, b31, b32) = (1/2,−1, 2), (c1, c2, c3) = (1/6, 2/3, 1/6) となり,Kuttaの 3次法 (Kutta’s third-order method)
Kuttaの 3次法¶ ³d(1) = f(xk, yk)
d(2) = f(xk +12h, yk +
12hd(1)) (1.40)
d(3) = f(xk + h, yk − hd(1) + 2hd(2))
yk+1 = yk +16h
[d(1) + 4d(2) + d(3)
]µ ´が得られる.
19
1.6.3 4ステージのRunge-Kutta法
まったく同様の精神で,f(x, y)を 1ステップあたり 4回評価することにより,4ステージのRunge-Kutta法を構築することができる.計算は単純だがあまりに煩雑なので以下では特にポピュラーなものについて,
その結果だけを記す.これらはどちらも局所打切り誤差が ∆k+1 = O(h5) で 4次の公式である.
4次Runge-Kutta法 (I) 7
4次Runge-Kutta法 (I)¶ ³d(1) = f(xk, yk)
d(2) = f(xk +12h, yk +
12hd(1))
d(3) = f(xk +12h, yk +
12hd(2)) (1.41)
d(4) = f(xk + h, yk + hd(3))
yk+1 = yk +16h
[d(1) + 2d(2) + 2d(3) + d(4)
]µ ´4次Runge-Kutta法 (II) 8
4次Runge-Kutta法 (II)¶ ³d(1) = f(xk, yk)
d(2) = f(xk +13h, yk +
13hd(1))
d(3) = f(xk +23h, yk − 1
3hd(1) + hd(2)) (1.42)
d(4) = f(xk + h, yk + hd(1) − hd(2) + hd(3))
yk+1 = yk +18h
[d(1) + 3d(2) + 3d(3) + d(4)
]µ ´前出の例題 (1.8)に対して,キザミを変えた時の 4次のRunge-Kutta法の大局打切り誤差の変化を図 1.5にプロットした.大局誤差がたしかに h4 に比例するのを見ることができる.
陽(explicit)なRunge-Kutta法で到達可能な次数
ステージ数とそれによって得られる次数の関係は表 1.1のようになる.
ステージ数 1 2 3 4 5 6 7 8 9 10 11 · · ·次数 1 2 3 4 4 5 6 6 7 7 8 · · ·
表 1.1: 陽(explicit)な Runge-Kutta法で到達可能な次数
これによると,4ステージまではステージ数と同じ次数の公式が得られるが,4次を越えるとそうはうまく行かなくなる.9 Runge-Kutta法の場合にはこの意味でも,やはり「4次」というのが次数選択の際の一つの目安となる.
7最もよく知られた方法.8こっちの方が少し打切り誤差が小さく精度がいいと言われる.(cf. Pozrikidis(1998), p.472 や Fornberg(1998), p.198)9ただし後述するように,自励系の微分方程式の場合には,必ずステージ数と同じ次数を持つ公式を構築することができる.
20
10-15
10-13
10-11
10-9
10-7
10-5
0.001
10-10 10-8 10-6 0.0001 0.01 1
EulerHeun2RK3(1/4)RK4(1/6)
Err
or a
t x=
1
h
Global Error of RK4 (y=-xy2, y(0)=1)
図 1.5: 4次 Runge-Kutta法による打切り誤差: y′ = −2xy2, y(0) = 1
1.6.4 メモリー節約型のRunge-Kutta法
2次元,3次元の大規模シミュレーションになると取り扱う従属変数 y が,何 100万,何 1000万という膨大な数の要素を持つベクトルになる.このような状況で,例えば 4次 Runge-Kutta法 (I) を (1.41)のままの形で用いて 1ステップ進むには,{y}, {y} のサブステップでの仮の値, {d(1)}, {d(2)}, {d(3)}, {d(4)}と,{y} と同じ大きさの配列を計6つ記憶する必要があり,これが計算のネックとなることがありうる.
この場合,以下のような手続きに書き換えることにより,まったく同等の計算を {Y }, {G} {P} という{yk} 3つ分の記憶量だけで行うことができるということが知られている.
21
メモリー節約型のRunge-Kutta法¶ ³Y = yk
G = Y
P = f(xk, Y )
Y = Y +12hP
G = P
P = f(xk +12h, Y )
Y = Y +12h(P − G) (1.43)
G =16G
P = f(xk +12h, Y ) − 1
2P
Y = Y + hP
G = G − P
P = f(xk + h, Y ) + 2P
yk+1 = Y + h(G +16P ).µ ´
また自励系 (autonomous system),すなわち微分係数 f(x, y) が独立変数 x を陽に含まないような系
に対しては,スキマティックに表現すると
自励系用の m 次Runge-Kutta法¶ ³Set
Y = yk
For n = m, 1,−1 (1.44)
Y = yk +1n
h f(Y )
End for
yk+1 = Yµ ´のような容量節約型のスキームを用いることもできる.10 このスキームは任意の次数 m の Runge-Kutta法に対応しており,またメモリーも次数によらず {yk}, {Y }, {f(Y )} と {yk} 3つ分しか必要としない.表1.1では一般的な系に対して,陽なRunge-Kutta法で到達可能な次数とステージ数の関係を示したが,それによると 5次以上の公式を得るには,次数を越えるステージ数が必要であった.しかし自励系の場合には,上のスキームのように,次数 m がどんなに高くても,m ステージで必ず m 次公式を得ることができる.
上の例で見るように,自励系はいろいろな点において非自励系に比べて好ましい性質を持っている.任意
10Canuto et al.(1988), p.109 参照.
22
の非自励系dyi
dx= fi(x, y1, y2, . . . , yn) (i = 1, 2, . . . , n) (1.45)
は,t = x により新しい独立変数 t を,また y0(t) = x により新たな従属変数 y0(t) を導入することにより,(n + 1) 個の従属変数を含む自励系
dy0
dt= 1, (1.46)
dyi
dt= fi(y0, y1, y2, . . . , yn) (i = 1, 2, . . . , n) (1.47)
に変換することが可能である.
1.6.5 キザミの自動制御
数値解の誤差はキザミ幅 h に左右されるので,自分の要求する精度が得られるような h を選択すること
が非常に重要になる.一般に h を小さくすれば精度は上がるが,h をやたら小さくすると計算量が膨大に
なるばかりでなく,図 1.5などで見たように,小さくしすぎるとかえって誤差が増大することにもなる (次章で説明する丸め誤差の影響).
本格的な大規模シミュレーションにおいては,なるべく少ない計算量で,かつ必要な精度を持つ数値解を
得るためのキザミの自動制御 (adaptive stepsize control) が欠かせないテクニックとなる.要求精度を
満たしつつ,キザミをなるべく大きく保つためには局所打切り誤差に対する定量的な評価が必要であるが,
これは以下に説明するように,高次の公式と低次の公式を結び付けることによって可能となる.ただしこの
誤差評価は,系の発展の追跡という数値シミュレーションの本来の目的から見ると言わば余計な部分であ
り,したがってそれがあまり計算の負担になっても困るので,二つの公式がなるべく同じ点における傾き{d(i)
}を共有するよう,うまい組み合わせを選ぶ必要がある.
なお,Runge-Kutta法のような一段法は過去の情報を利用しないので,各ステップごとに異なるキザミh を使うことが容易にできる.この点は次節で述べる多段法と比較して大変有利な点である.
局所打ち切り誤差評価法の一例
2次である改良多角形法 (以下では添え字「IP」で表す)
d(1) = f(xk, yk)
d(2) = f(xk +12h, yk +
12hd(1)) (1.48)
yk+1 = yk + hd(2)
と 3次である Kuttaの公式(以下では添え字「K3」で表す)
d(1) = f(xk, yk)
d(2) = f(xk +12h, yk +
12hd(1)) (1.49)
d(3) = f(xk + h, yk − hd(1) + 2hd(2))
yk+1 = yk +16h
(d(1) + 4d(2) + d(3)
)は d(1) と d(2) を共有している.この二つを組み合わせることにより,以下のように改良多角形法の打切り
23
誤差を評価することができる.
∆(IP)k+1 = y(xk+1) − y
(IP)k+1 = y(xk+1) −
[yk + hd(2)
]∼ O(h3)
∆(K3)k+1 = y(xk+1) − y
(K3)k+1 = y(xk+1) −
[yk +
16h
(d(1) + 4d(2) + d(3)
)]∼ O(h4)
=⇒ ∆(IP)k+1 =
[y(K3)k+1 − y
(IP)k+1
]+ ∆(K3)
k+1 ≈ y(K3)k+1 − y
(IP)k+1 =
16h[d(1) − 2d(2) + d(3)]. (1.50)
したがって,改良多角形法では使わない d(3) を余分に計算することにより,各ステップごとに改良多角形
法の局所打切り誤差 ∆(IP)k+1 を定量的に評価することができ,この評価に基づいて,打切り誤差がある許容
範囲を超えないように h を調節しながら進んで行くことが可能となる.
この手法を前出の例題 (1.8)に適用するためのプログラム例を図 1.6に示す.またそれによって得られた解曲線および各ステップごとのキザミ h の値をそれぞれ図 1.7,図 1.8に示す.ただし,ここで示したサンプルプログラムは,あくまでもキザミ制御の基本精神の説明が目的であり,不成功ステップのやり直しな
ど,実際のシミュレーションの際には必要となるような細かな配慮はなされていないので,その点は注意す
ること.
ここでの誤差推定は改良多角形法の局所打切り誤差 ∆(IP)k+1 に対してのものであるので,その意味では次
ステップにおける数値解 yk+1 としてもやはり改良多角形法が与える y(IP)k+1 を採用するのが筋であろう.し
かし,せっかくより高精度な 3次のKutta法による y(K3)k+1 も求めているのだから,それを yk+1 として採用
しない手はない.このサンプルプログラムでは,次ステップの数値解 yk+1 として,y(K3)k+1 と y
(IP)k+1 のどち
らも選択できるようになっている.図 1.9に,yk+1 として y(K3)k+1 を採用した場合と y
(IP)k+1 を採用した場合の
各ステップにおける誤差をプロットしてあるが,確かに y(K3)k+1 を用いた方が数段精度が良いのが分かる.
1.6.6 Runge-Kutta-Fehlberg法
キザミの自動制御を組み込んだRunge-Kutta法としては,以下のようなRunge-Kutta-Fehlberg公式
(埋め込み型公式)を用いるものが有名である.
Runge-Kutta-Fehlberg法¶ ³d(1) = f(xk, yk)
d(2) = f(xk +14hk, yk +
14hkd(1))
d(3) = f(xk +38hk, yk +
132
hk(3d(1) + 9d(2)))
d(4) = f(xk +1213
hk, yk +1
2197hk(1932d(1) − 7200d(2) + 7296d(3)))
d(5) = f(xk + hk, yk + hk(439216
d(1) − 8d(2) +3680513
d(3) − 8454104
d(4))) (1.51)
d(6) = f(xk +12hk, yk + hk(− 8
27d(1) + 2d(2) − 3544
2565d(3) +
18594104
d(4) − 1140
d(5)))
yk+1 = yk + hk
[25216
d(1) +14082565
d(3) +21974104
d(4) − 15d(5)
]yk+1 = yk + hk
[16135
d(1) +665612825
d(3) +2856156430
d(4) − 950
d(5) +255
d(6)
]µ ´ここで yk+1 は4次精度の近似値 (局所打切り誤差 ∝ h5),また yk+1 は5次精度の近似値 (局所打切り誤差∝ h6)を与える.またキザミ h はステップごとに変化するので添え字を付けて hk と記した.表 1.1による
24
���������������������0!'% ������D�<£5Gí<#eN�®à<����®Ò</$%<ETC<STEPSIZE<STEPSIZE�FOR������������������������������������������������������������������������������������������������������������������������������������������������������������������������C����������������������������������������������������������������������������C��������C����������������������PROGRAM�STEPSIZE�FOR��������C��������C�����INTEGRATES�THE�ORDINARY�DIFFERETNTIAL�EQUATION��������C��������C����������DY�X�DX��� �XY>������Y���AT�X�����������C��������C�����BY�)MPROVED�0OLYGONAL�METHOD��ORDER���WITH�STEP SIZE�CONTROL���������C��������C�����4HE�LOCAL�TRUNCATION�ERROR�IS�ESTIMATED�BY�COMBINING��THE��������C�����IMPROVED�POLYGONAL�METHOD��ORDER���WITH�THE�2+���ORDER�����������C��������C�����!CTUAL�UPDATING�IS�PERFORMED�BY�EITHER�THE�IMP?POL�OR�2+����������C��������C���������������������������������������UPDATED�ON�!PRIL�����������������C����������������������������������������������������������������������������������IMPLICIT�REAL���A H�O Z��������������PARAMETER��X����D��Y����D��XEND���D���������������PARAMETER��TOL���D ��H����D ���������������F�X�Y� �XY���������������Y?SOL�X����X����Y���������C ��������������WRITE���� �CHOOSE�THE�SCHEME�FOR�UPDATING� ���������������WRITE���� �IMPROVED�POLYGONAL���OR�2+���� ���������������READ���IND��������������IF��IND�EQ���THEN���������������OPEN����FILE��STEPSIZE?IMP�DAT��FORM��FORMATTED����������������REWIND������������������WRITE������X�Y�H�ERR?IMP���������������ELSE�IF�IND�EQ���THEN���������������OPEN����FILE��STEPSIZE?RK��DAT��FORM��FORMATTED����������������REWIND������������������WRITE������X�Y�H�ERR?RK����������������ELSE���������������STOP�������������������END�IF��������C ��������������������X�X���������������Y�Y���������������ERR���D���������������NSTEP����������������H�H���������������WRITE�����X�Y�H�ERR��������C ��������������IF�X�GT�XEND�THEN���������������CLOSE������������������GO�TO�������������������END�IF��������������D��F�X�Y��������������D��F�X����D�H�Y����D�HD���������������D��F�X�H�Y HD����D�HD���������������NSTEP�NSTEP����������������X�X�H��������������IF�IND�EQ���THEN���������������Y�Y�HD���������������ELSE���������������Y�Y�H�D���D��D�����������������END�IF��������������ERR�Y Y?SOL�X��������������WRITE�����X�Y�H�ERR��������������WRITE���NSTEP�REAL�X��������C �COMPUTATION�OF�NEXT�H� ��������������DK�H�D� ��D�D��D����D���������������H?TEMP�H�TOL�ABS�DK���D�����������������IF�H?TEMP�GT��H�THEN���������������H��H��������������ELSE�IF�H?TEMP�LT�H���THEN���������������H�H����������������ELSE���������������H�H?TEMP��������������END�IF��������������GO�TO�����������������END
図 1.6: キザミ可変のサンプルプログラム
25
�
���
���
���
���
�
���
� � � � � �
Solution with step-size control (y' = -2xy2, y0 = 1)
y
x
stepsize_sol.qpc
図 1.7: キザミ自動制御により得られた解曲線
�
����
���
����
���
� � � � � �
Change of stepsize (y' = -2xy2, y0 = 1; ∆tol = 10-5, h0 = 0.01)
h
x
stepsize_h.qpc
図 1.8: キザミ h の変化
26
�������
������
���� �
�
���� �
������
�������
� � � � � �
ERR?RK�ERR?IMP
erro
r
x
stepsize_err.qpc
図 1.9: 時間発展部分に改良多角形法を用いた場合と 3次 Kutta法を用いた場合の数値誤差
と 5次精度を得るためには最低でも6ステージは必要であり,したがってこのRunge-Kutta-Fehlberg公式は,5次公式に 4次公式を埋め込んだ公式としては,最少のステージ数を実現していると言える.
誤差評価とキザミ制御
前小々節で見たと同様に,yk+1 の打切り誤差は yk+1 の打切り誤差に比べ高次であるので無視すること
ができ,したがって yk+1 の局所打切り誤差 ∆k+1 は yk+1 − yk+1 で評価することができる.一方許容で
きる局所打切り誤差を ∆tol とすると,|∆k+1| と ∆tol の大小関係により二つの場合に別れる.
1. |∆k+1| < ∆tol の時:
yk+1, yk+1 を求めるのに使ったキザミ hk で誤差が許容範囲におさまっているので,第 k ステップの
キザミとして hk をそのまま採用し,また xk+1 (= xk + hk) における近似解としては yk+1 を採用す
る.11
さらに次のステップにおいて最初に使ってみるキザミ hk+1 を設定しておかなければならない.y の
局所打切り誤差はキザミの5乗に比例するので
∆k+2 ≈(
h5k+1
h5k
)∆k+1 (1.52)
が成り立つと考えられる.これより hk+1 は |∆k+2| が ∆tol 以下になるように
hk+1 = 5
√∆tol
∆k+1
hk (1.53)
と決めればいい.実際の数値計算では y は発展させられる従属変数すべてを含む大次元のベクトルで
あり,その場合には
hk+1 = C · Min
[5
√∆tol
∆k+1
hk
](1.54)
とする.ここでMinはすべての従属変数について評価した時の最小値,また C は適当な大きさ (例えば 0.9程度) の安全係数.ただし,キザミの急激な変化は数値計算上好ましくないので,(1.53)で
11厳密に言えば yk+1 を採用するのが筋道であろうが,前小々節のサンプルプログラムの場合と同様,せっかく求まっているより高精度な近似解 yk+1 を使わない手はない.
27
決まる hk+1 がいっぺんに hk の何倍にもなるような場合には,ある程度のところ (例えば 5倍程度)で押さえておく方がいいようである.
2. |∆k+1| > ∆tol の時:
hk のままでは局所打切り誤差が許容範囲 ∆tol を越えてしまうので,キザミをより小さい値 h′k に変
えて,もう一度今やった第 k ステップの計算をやり直す必要がある.h′k は (1.53)の時と同様に考えて
h′k = C · 5
√∆tol
∆k+1
hk (1.55)
のように決めればいい.ここで C は安全係数で 0.9程度の数を用いればいい.またここでもキザミの急激な変化は好ましくないので,例えば h′
k ≤ 0.1hk の場合には h′k = 0.1hk とするなどの制限をつ
けるのがいいようである.
1.7 Adams–Bashforth法
常微分方程式dy
dx= f(x, y) (1.56)
は,
y(xk+1) = y(xk) +∫ xk+1
xk
f(x, y(x)) dx (1.57)
と同値である.したがって,知っている情報を用いて,右辺の積分を近似的に表現することにより,次の
ステップの y に対する近似値 yk+1 を求めることができる.この見方により,常微分方程式を解く手法と,
定積分を計算する手法との接点が生まれてくる.
1.7.1 Lagrangeの補間多項式
本論に入る前に,予備知識として必須となる Lagrangeの補間多項式について復習しておこう.(n+1) 個の異なる x座標 x0, x1, . . . , xn に対して y 座標 y0, y1, . . . , yn が与えられた時,これらすべての点を通過
する n 次の多項式 Pn(x),すなわち
Pn(x) = a0 + a1x + a2x2 + · · · + anxn, (an = 0)
Pn(xi) = yi (i = 0, 1, . . . , n) (1.58)
を満たすような Pn(x) がただ一つ存在する.実際にそのような多項式を構築することによりその存在を示そう.まず
Li(x) ≡n∏
j=0j =i
(x − xj)(xi − xj)
=(x − x0)(x − x1) · · · (x − xi−1)(x − xi+1) · · · (x − xn)
(xi − x0)(xi − x1) · · · (xi − xi−1)(xi − xi+1) · · · (xi − xn), (i = 0, 1, . . . , n) (1.59)
を定義する.Li(x) は明らかに n 次の多項式で
Li(xk) = δik =
1, if i = k,
0, if i = k.(1.60)
28
が成り立つ.12
このように定義された Li(x) (i = 0, 1, . . . , n) を用いると,求める補間多項式 Pn(x) は明らかに
Pn(x) =n∑
i=0
yiLi(x) (1.61)
のように表すことができる.この Pn(x) は Lagrangeの補間多項式 (Lagrange interpolation polyno-
mial)と呼ばれる.
1.7.2 2次のAdams-Bashforth法
xk と xk+1 の間の f(x, y(x)) を,現在いる第 k ステップの情報 xk, fk (= f(xk, yk)) と,1つ前の第(k − 1)ステップの情報 xk−1, fk−1 (= f(xk−1, yk−1)) を使った 1次の Lagrange補間多項式 P1(x) で近似することを考える.13 すなわち
yk+1 = yk +∫ xk+1
xk
P1(x) dx
P1(x) = fk−1Lk−1(x) + fkLk(x), (1.62)
Lk−1(x) =x − xk
xk−1 − xk, Lk(x) =
x − xk−1
xk − xk−1.
ここで簡単のためきざみ h は一定とし,また積分の便宜のために x = xk + hξ により ξ を導入すると,
xk±1 = xk ± h より∫ xk+1
xk
Lk−1(x) dx =∫ xk+1
xk
x − xk
xk−1 − xkdx =
∫ 1
0
hξ
−hhdξ = −h
[12ξ2
]1
0
= −12h, (1.63)
∫ xk+1
xk
Lk(x) dx =∫ xk+1
xk
x − xk−1
xk − xk−1dx =
∫ 1
0
h(ξ + 1)h
hdξ = h
[12ξ2 + ξ
]1
0
=32h (1.64)
となって一つの積分スキーム
2次のAdams-Bashforth法¶ ³yk+1 = yk +
h
2(−fk−1 + 3fk) (1.65)µ ´
を得る.このスキームの局所打切り誤差は
∆k+1 = y(xk+1) −{
y(xk) +h
2[−f(xk−1, y(xk−1)) + 3f(xk, y(xk))]
}= y(xk+1) − y(xk) − h
2[−y′(xk−1) + 3y′(xk)]
={
y + hy′ +12h2y′′ +
16h3y′′′ + · · ·
}− y − h
2
[−
{y′ − hy′′ +
12h2y′′′ − · · ·
}+ 3y′
]=
{hy′ +
12h2y′′ +
16h3y′′′ + · · ·
}− h
2
[2y′ + hy′′ − 1
2h2y′′′ + · · ·
]=
512
h3y′′′ + O(h4) (1.66)
より O(h3),したがって大局打切り誤差は O(h2)で 2次の公式となる.この手法は2次のAdams-Bashforth
法と呼ばれる.この手法は陽 (explicit)で,xk, xk−1 という2つのステップの情報を利用する 2段法 (two-
step method)である.14
12例えば仮に全部で 10 点ある,すなわち n = 9 の時,L5(x) は 5 番目の点で 1,残りの 9 点では 0 となるような 9 次多項式,L8(x) は 8 番目の点で 1,残りの 9 点では 0 となるような 9 次多項式といった具合.
13ここで第 (k + 1) ステップを使うと陰的手法 (implicit scheme) になる.(次節 Adams-Moulton 法参照)14これに対して前節の Runge-Kutta 法は過去のステップの情報を一切使わず,現在いるステップの情報だけで次ステップを求める1段法である.
29
1.7.3 3次のAdams-Bashforth法
まったく同様の精神で, xk と xk+1 の間の f(x, y(x)) を,第 k ステップ,第 (k − 1)ステップに加え,2ステップ前の第 (k − 2)ステップの情報 xk−2, fk−2 (= f(xk−2, yk−2)) も使った 2次の Lagrange補間多項式 P2(x) で近似することを考える.すなわち
yk+1 = yk +∫ xk+1
xk
P2(x) dx,
P2(x) = fk−2Lk−2(x) + fk−1Lk−1(x) + fkLk(x),
Lk−2(x) =(x − xk−1)(x − xk)
(xk−2 − xk−1)(xk−2 − xk), (1.67)
Lk−1(x) =(x − xk−2)(x − xk)
(xk−1 − xk−2)(xk−1 − xk),
Lk(x) =(x − xk−2)(x − xk−1)
(xk − xk−2)(xk − xk−1).
ここでまた x = xk + hξ により ξ を導入すると xk−1 = xk − h, xk−2 = xk − 2h より∫ xk+1
xk
Lk−2(x) dx =∫ xk+1
xk
(x − xk−1)(x − xk)(xk−2 − xk−1)(xk−2 − xk)
dx
=∫ 1
0
h(ξ + 1) · hξ
−h · −2hhdξ =
h
2
∫ 1
0
ξ(ξ + 1) dξ =512
h, (1.68)
∫ xk+1
xk
Lk−1(x) dx =∫ xk+1
xk
(x − xk−2)(x − xk)(xk−1 − xk−2)(xk−1 − xk)
dx
=∫ 1
0
h(ξ + 2) · hξ
h · −hhdξ = −h
∫ 1
0
ξ(ξ + 2) dξ = −43h, (1.69)
∫ xk+1
xk
Lk(x) dx =∫ xk+1
xk
(x − xk−2)(x − xk−1)(xk − xk−2)(xk − xk−1)
=∫ 1
0
h(ξ + 2) · h(ξ + 1)2h · h
hdξ =h
2
∫ 1
0
(ξ + 1)(ξ + 2) dξ =2312
h (1.70)
であるので,これより一つの積分スキーム
3次のAdams-Bashforth法¶ ³yk+1 = yk +
h
12(5fk−2 − 16fk−1 + 23fk) (1.71)µ ´
30
が得られる.このスキームの局所打切り誤差は
∆k+1 = y(xk+1) −{
y(xk) +h
12[5f(xk−2, y(xk−2)) − 16f(xk−1, y(xk−1)) + 23f(xk, y(xk))]
}
= y(xk+1) − y(xk) − h
12[5y′(xk−2) − 16y′(xk−1) + 23y′(xk)]
={
y + hy′ +12h2y′′ +
16h3y′′′ +
124
h4y(4) + · · ·}
− y − h
12
[5
{y′ + (−2h)y′′ +
12(−2h)2y′′′ +
16(−2h)3y(4) + · · ·
}
− 16{
y′ + (−h)y′′ +12(−h)2y′′′ +
16(−h)3y(4) + · · ·
}+ 23y′
]
={
hy′ +12h2y′′ +
16h3y′′′ +
124
h4y(4) + · · ·}− h
12
[12y′ + 6hy′′ + 2h2y′′′ − 4h3y(4) + · · ·
]=
38h4y(4) + O(h5) (1.72)
より O(h4), したがって大局打切り誤差は O(h3)となり3次精度である.この陽な 3段法は 3次のAdams-
Bashforth法と呼ばれる.
1.7.4 より高次のAdams-Bashforth法
一般に m ステップの Adams-Bashforth法は,m次のスキームを与える.
以下により高次の公式をその結果だけ示す.
4次のAdams-Bashforth法¶ ³yk+1 = yk +
h
24(−9fk−3 + 37fk−2 − 59fk−1 + 55fk) (1.73)µ ´
5次のAdams-Bashforth法¶ ³yk+1 = yk +
h
720(251fk−4 − 1274fk−3 + 2616fk−2 − 2774fk−1 + 1901fk) (1.74)µ ´
6次のAdams-Bashforth法¶ ³yk+1 = yk +
h
1440(−475fk−5 + 2877fk−4 − 7298fk−3 + 9982fk−2 − 7923fk−1 + 4277fk) (1.75)µ ´
1.7.5 Adams-Bashforth法の特徴 (Runge-Kutta法との比較)
1. Adams-Bashforth法は過去の計算済みの情報をうまく利用するので,計算量を増やさずに次数を上げることができる.Adams-Bashforth法では,何次の公式であろうと,各ステップでの微分係数 f(x, y)の計算は一回だけでよい.これに対して Runge-Kutta法では,次数を上げるためには各ステップでの f(x, y) の計算回数, すなわちステージ数を増やす必要がある.例えば 4次の Runge-Kutta法では1ステップ進むのに4回 f(x, y) を計算する必要がある.
31
2. Adams-Bashforth法は多段法であるために,それだけでは初期条件から出発することができない.初期の必要な数ステップは Runge-Kutta法などの一段法の助けが必要となる.
3. 同じ次数のRunge-Kutta法と比べると,Adams-Bashforth法の打切り誤差はかなり大きい.したがって Runge-Kutta法に比べて小さなキザミ幅を使う必要がある.
4. また Adams-Bashforth 法は Runge-Kutta 法と比べると数値不安定性を起こしやすい.この理由からもやはり Runge-Kutta法に比べて小さなキザミ幅を使わないといけない.(後述の「安定性」の項参照)
5. Adams-Bashforth法は過去の情報を利用する多段法なので,1段法の Runge-Kutta法に比べ,キザミの自動制御がかなりむつかしくなる.
1.8 Adams–Moulton法
Adams-Bashforth法では,次のステップに進むために必要な xk と xk+1 の間の f(x, y(x)) の積分値を評価するのに,現在いる第 k ステップおよびそれ以前のステップの情報だけを使ったが,まだ未知である
第 (k + 1) ステップも使うことにより,より高精度のスキームを得ることができる.
1.8.1 4次のAdams-Moulton法
例えば,上述した「3次の Adams-Bashforth法」で用いた k, (k − 1), (k − 2) の 3ステップの情報に加えて (k + 1)ステップの量も使った 3次の Lagrange補間多項式 P3(x)
P3(x) =2∑
j=−1
fk−jLk−j(x) = fk−2Lk−2(x) + fk−1Lk−1(x) + fkLk(x) + fk+1Lk+1(x) (1.76)
を基に,
yk+1 = yk +1∑
j=−2
fk+j
∫ xk+1
xk
Lk+j(x) dx (1.77)
というスキームを考えると,前とまったく同様な初等的な計算により
3ステップ (4次)のAdams-Moulton法¶ ³yk+1 = yk +
h
24[fk−2 − 5fk−1 + 19fk + 9fk+1] (1.78)µ ´
を得る.このスキームの局所打切り誤差 ∆k+1 を前と同様にして評価すると
∆k+1 = − 19720
h5y(5)(xk) + O(h6) (1.79)
となり,4次精度であることが分かる.この手法は 3ステップ (4次)のAdams-Moulton法と呼ばれる.
一般にmステップのAdams-Moulton法の次数は (m+1)となり,同じだけ過去のステップを使うAdams-Bashforth法と比べると 1だけ次数が高くなる.しかし Adams-Bashforth法が陽解法で未知量 yk+1 が直
接求められるのに対し,Adams-Moulton法は陰解法であり,未知量 yk+1 を求めるための式 (1.78) の右辺に yk+1 に依存する fk+1 が入っており,通常何らかの繰り返し(イタレーション)手法を用いないと yk+1
を求めることはできない.
その他の次数の Adams-Moulton法は以下のようになる.
32
2ステップ (3次)のAdams-Moulton法¶ ³yk+1 = yk +
h
12[−fk−1 + 8fk + 5fk+1] (1.80)µ ´
4ステップ (5次)のAdams-Moulton法¶ ³yk+1 = yk +
h
720[−19fk−3 + 106fk−2 − 264fk−1 + 646fk + 251fk+1] (1.81)µ ´
5ステップ (6次)のAdams-Moulton法¶ ³yk+1 = yk +
h
1440[27fk−4 − 173fk−3 + 482fk−2 − 798fk−1 + 1427fk + 475fk+1] (1.82)µ ´
1.9 Adams-Bashforth-Moulton法
Adams-Moulton法は陰解法なのでこのままでは使いづらい.しかし以下のように陽解法である Adams-Bashforth法と組み合わせた予測子修正子法 (predictor-corrector method)により,使いやすい高精度
の陽解法を構築することができる.
例えば 3ステップの Adams-Bashforth法(3次精度)を予測子,3ステップの Adams-Moulton法(4次精度) を修正子として採用すると
4次のAdams-Bashforth-Moulton法 (I)¶ ³y(P )k+1 = yk +
h
12(5fk−2 − 16fk−1 + 23fk) ,
yk+1 = yk +h
24
(fk−2 − 5fk−1 + 19fk + 9f(xk+1, y
(P )k+1)
)(1.83)µ ´
という 3ステップの予測子修正子法ができる.このスキームの打切り誤差 ∆k+1 は O(h5) で 4次精度である.この方法は 4次のAdams-Bashforth-Moulton法と呼ばれる.一般に m ステップの陽の予測子と,
m ステップの陰の修正子を組合せて作った予測子修正子法の次数は (m + 1) になる.
上のようにステップ数が等しい(すなわち次数が異なる)予測子と修正子を用いるよりは,記憶しておか
ないといけない過去の情報量は一段増えるが,同じ次数を持つ予測子と修正子を組合せる方が打切り誤差を
小さく押さえるという点では有利である.例えば上の場合,予測子を 4ステップ (4次)のAdams-Bashforth法に置換えると
4次のAdams-Bashforth-Moulton法 (II)¶ ³y(P )k+1 = yk +
h
24(−9fk−3 + 37fk−2 − 59fk−1 + 55fk) ,
yk+1 = yk +h
24
(fk−2 − 5fk−1 + 19fk + 9f(xk+1, y
(P )k+1)
)(1.84)µ ´
という別の 4次のAdams-Bashforth-Moulton法が得られる.
1.10 安定性
計算量を減らし,計算を高速にするためにはできるだけ大きなキザミ h を使いたい.h の大きさを制限
する一つのファクターは,今まで述べてきたように計算の精度である.すなわち計算結果がある要求精度を
33
満たすためには,キザミをある値以下にする必要がある.しかし,精度以外にもう一つキザミ幅を制限する
重要なファクターとして,安定性 (stability)がある.
試験的な常微分方程式の初期値問題として
dy(x)dx
= λy(x), y(0) = 1. (1.85)
を考える.ここで λ は実数か複素数の定数.もちろんこれの解析解は y(x) = eλx である.
この問題に対して 4次の Runge-Kutta法 (RK4)を適用して 1ステップ進めると
yk+1 = F (hλ)yk, F (hλ) = 1 + (hλ) +12(hλ)2 +
16(hλ)3 +
124
(hλ)4 (1.86)
となる.一方解析解のほうは
y(xk+1) = ehλy(xk) (1.87)
となる.F (hλ) は ehλ のMcLaurin展開,すなわち hλ = 0 のまわりの Taylor展開の最初の 5項に一致しており,これがまた「RK4の局所打切り誤差は ∆k+1 = O(h5) である」という事実にもつながっている.
λ = λr + iλi の場合,実部 λr は増幅率,虚部 λi は角振動数を表す.µ = hλ(複素数) として複素 µ 平
面における |F (µ)| の等高線図を図 1.10に示す.
図 1.10: RK4に対する F (µ) の絶対値
• λ が実数の場合 (λi = 0):
– λr > 0 の時 (図 1.10の正の実軸上に対応),解析解は単調に増幅し,無限大に発散する.またこの時 F (hλ) > 1 であり,RK4が与える数値解には 1ステップごとに 1より大きなファクターがかかり,その結果数値解の方も +∞ への単調な発散という定性的に正しい振舞いを示す.
– λr < 0 の時 (図 1.10の負の実軸上に対応),解析解は単調に減衰し,t → ∞ で0になる.一方,
RK4による数値解は 0 < F (hλ) < 1 の場合にはやはり単調に減衰する.しかし F (hλ) は hλ
34
の 4次の多項式なので,この条件は hλ の限られた範囲,具体的には −2.8 < hλr < 0 でしか成立しない.これはキザミ h をこの条件が満足される程度に小さく取らないと,RK4が与える数値解は単調減少どころか,1ステップごとに絶対値が1より大きなファクターがかかり,どんどん発散していくことを示している.
• λ が真に複素数 (図 1.10の実軸以外)の場合,λr = 0 なら中立振動,λr < 0 なら減衰振動を表すが,これらの場合も RK4による数値解の絶対値が発散せず定性的に正しい振舞いを示すための必要十分条件はやはり |F (hλ)| < 1 である.例えば中立振動 (λr = 0)の場合,図 1.10の虚軸上に対応するが,図で |F (hλ)| = 1 の等高線が虚軸を横切る座標を見ると,RK4による数値解が発散しないためにはh|λi| < 2.8 が必要であることが分かる.これはキザミ h を振動周期 T = 2π/λi の 44%以上に取ってはならないことを意味する.15
��� �
����
����
���
� � �� �� ��
DX�����
y
x
��� �
����
����
���DX����
y
��� ��� ���
����������
DX�����
y
図 1.11: RK4に現われる不安定現象
例として周期 T = 1 の調和振動する系
d2y
dx2= −(2π)2y, y(0) = 1, y′(0) = 0 (1.88)
15単一の振動数しか含まないような現象であれば,最初からこんな大きなキザミを使おうと思う人はだれもいないであろう.しかし,現実の系では数多くの自由度が連立しており,一つの系の中には一般にさまざまな振動数成分が含まれている.そのような場合,自分が着目したい振動に対しては十分細かいキザミを取ったつもりでも,その系に含まれるさまざまな振動成分の中で最も変化の速い成分,すなわち最も振動数の高い成分や最も減衰率の大きな成分に対しても,この安定性条件が満たされるように h を取らないと,その振動成分がどんどん成長し,計算を破綻に導くことになる.時間変化の速さが大きく異なるような成分を含むような連立方程式系は一般にスティフである (stiff) と言われる.
35
を 3種類のキザミ h を使って RK4により解いた結果を図 1.11に示す.h = 0.05 では本来の中立振動を忠実に再現すること,h = 0.46 では安定限界を超えているために解が発散すること,また h = 0.2 では数値不安定は起こらないものの,キザミが大きくて本来の中立振動と異なりかなり大きな減衰が起こることな
どを見ることができる.
µ = hλ(複素数) としてさまざまな次数の Runge-Kutta法について,|F (µ)| < 1 が成り立つ範囲を複素µ 平面上に示したのが図 1.12である.図中の p は次数を表している.安定領域は実軸に関して対称なので,
上半面だけが示してある.これによると Runge-Kutta法では,次数が上がるにつれて,精度だけでなくスキームの安定性も向上することが分かる.
図 1.12: Runge-Kutta法の安定領域 (p は次数.Schwarz(1989)より)
図 1.13: Adams-Bashforth法などの安定領域 (Schwarz(1989)より)
同様な解析を多段法である Adams-Bashforth法などに対して行うと図 1.13の結果が得られる.図中のAB4は4ステップ (4次)の Adams-Bashforth法 (1.73),AM3は 3ステップ (4次)の Adams-Moulton法(1.78),ABM43は予測子として 4ステップの Adams-Bashforth法,修正子として 3ステップの Adams-Moulton法を用いた 4次精度の予測子修正子法 (1.84)を示す.これによると,よく用いられる ABM43は安定性に関しては RK4に比べてかなり劣っていることが分かる.
36
第2章 浮動小数点数と丸め誤差
2.1 計算機内での数の表現法
2.1.1 整数型
• 1バイト型(8ビット):28 = 256 通り;-128(−27)~127(27 − 1)まで
• 2バイト型(16ビット):216 通り;-32768(−215)~32767(215 − 1)まで
• 4バイト型(32ビット):232 通り;-2147483648(−231)~2147483647(231 − 1)まで
• 8バイト型(64ビット):264 通り;−263 ~ 263 − 1 まで
例えば JIS FORTRAN95での基本的な整数型は 4バイト型.すなわち特に型宣言をしないで i~nのアルファベットで始まる変数名を使うと,自動的に 4バイト型の整数と解釈される.
整数型は使われるバイト数に応じて表現できる整数の範囲に制限はあるが,その範囲内の整数について
は誤差なく完全に表現することができる.
2.1.2 実数型
計算機の中では整数型以外の数はすべて浮動小数点数 (floating-point number)として表現される.β
進法 s 桁の浮動小数点数とは
± (0.f1f2 · · · fs)β × βe (2.1)
という形で表現される数である.( )β は β 進数表示を意味する.ここで f1, . . . , fs, β, e はすべて整数で
1 ≤ f1 ≤ β − 1, 0 ≤ fi ≤ β − 1 (i = 2, 3, . . . , s) (2.2)
m ≤ e ≤ M (M は正の整数,m は負の整数) (2.3)
である.1 ± (0.f1f2 · · · fs)β を仮数部 (mantissa),e を指数部 (exponent),β を基数 (base)と呼ぶ.仮
数部を普通の数に直すと
(0.f1f2 · · · fs)β = f1β−1 + f2β
−2 + · · · + fsβ−s (2.4)
となる.
表現すべき実数はもちろん無限個あるのに対して,浮動小数点数はとびとびで,しかも有限個しかない.β
進法 s桁の場合,前の符号が2通り,f1 が (β−1)通り,f2 ~ fs がそれぞれ β 通り,指数 eが (M−m+1)通り取り得るので,表現できる実数の個数は全部で
2 × (β − 1) × β × β × · · · × β︸ ︷︷ ︸(s − 1)個
×(M − m + 1) + 1 (2.5)
1f1 = 0 と決めておかないと指数 e が決まらなくなる.
37
である.2
例えば具体的に 2進 3桁,すなわち β = 2, s = 3 で,指数の範囲として m = −1, M = 2 とした場合,表現できる数字は以下のようになる.
まず仮数部は
(0.f1f2f3)2 −→
(0.100)2(0.101)2(0.110)2(0.111)2
(2.6)
の 4種類.また指数部は2−1, 20, 21, 22 (2.7)
の 4種類.したがってこれらの組合わせの数に符号 (±) の分で 2倍,0のための 1個を加えて,合計 33個の数字しか表現することができない.仮数部を 10進数に直すと
0.1000.1010.1100.111
2
=
1/2 + 0/4 + 0/81/2 + 0/4 + 1/81/2 + 1/4 + 0/81/2 + 1/4 + 1/8
10
=
4/85/86/87/8
10
(2.8)
なので,表現できる実数は
2−1 ×
4/85/86/87/8
10
, 20 ×
4/85/86/87/8
10
, 21 ×
4/85/86/87/8
10
, 22 ×
4/85/86/87/8
10
(2.9)
すなわち 4/165/166/167/16
10
,
4/85/86/87/8
10
,
4/45/46/47/4
10
,
4/25/26/27/2
10
(2.10)
の 16個とそれに負符号を付けたもの,および 0の計 33個である.これらを数直線上にプロットすると図2.1.2のようになる.この図から分かるように浮動小数点の分布は等間隔ではなく,0から遠いところほど
図 2.1: 浮動小数点数の分布の例
間隔が広がり分布が粗くなる.
浮動小数点数では表現できる絶対値に最大値 (0.β−1β−1β−1 · · ·β−1)β×βM と最小値 (0.10 · · · 0)β×βm
がある.ある演算の結果の絶対値が最大数より大きくなることをオーバーフロー (overflow), 非零絶対値最小数より小さくなることをアンダーフロー (underflow)という.
2最後の + 1 は 0 の分.0 は浮動小数点表現にはなじまないので特別扱いされる.
38
2.1.3 丸め誤差
有限桁の浮動小数点数だけを使って実数を表現しようとすると必然的に表現誤差が生じる.ある実数を一
つの浮動小数点数で近似することを丸める (rounding)といい,その時発生する誤差を丸め誤差 (rounding
error)という.丸めには
• 四捨五入的:一番近いものに丸める.2進法なら「0捨 1入」.
• 切り捨て:0に近い側の一番近いものに丸める.
• 切り上げ:0から遠い側の一番近いものに丸める.
の 3種類がある.
隣り合う浮動小数点数はそれらの仮数部
(0.f1f2 · · · fs)β (2.11)
の最終桁 fs の値が1だけ異なっている. fs が 1だけ変わったときに生じうる相対誤差,すなわち実数を近くの浮動小数点数に丸める時に生じうる相対誤差は,仮数部が最小の時,すなわち
(0.10 · · · 0)β (2.12)
のときに最大で,その時0.
s︷ ︸︸ ︷00 · · · 1
β
/0.
s︷ ︸︸ ︷10 · · · 0
β
= β−s
/β−1 = β−(s−1) (2.13)
となる.もし「四捨五入的」な丸めを採用していれば,丸めにより,高々
β−(s−1)
/2 (2.14)
の相対誤差が生じることになる.3
2.2 実際によく使われる浮動小数点数の形式:IEEE754
名大の VPPなど大型計算機センターのメインフレームから PCに至るまで,ほとんどのコンピュータでは,以下のような IEEE754と呼ばれる 2進法に基づく規格が用いられている.
2.2.1 4バイト (32ビット)実数型:単精度実数型 (real∗4)
• これは JIS FORTRANの基本実数型.すなわち特に型宣言をしないで,i~n以外のアルファベットで始まる変数名を使うと自動的にこの型と解釈される.
• 一つの実数を表現するのに 32ビットを使う.
• このうち 1ビットを符号 + or − を表すのに使う.
• 8ビットを 28 − 2 = 254 通りの指数 e を表すのに使う4 (−126 ≤ e ≤ 127).3丸めによる誤差は必ず相対誤差として現われる.4この 8 ビット部分が与える整数を E とすると,指数 e は e = E − 127 で表される.E のうち,すべてのビットが 0 およびす
べてのビットが 1 の場合は通常の浮動小数点数としては扱われない.
39
• のこり 23ビットで仮数部の f2, f3, . . . , f24 を表現する.5
• 丸めは 0捨 1入で行う.
この表現方法で表現可能な絶対値の範囲は,2−127(≈ 6× 10−39) から 2127(≈ 1.7× 1038) となる. また,丸め誤差 (丸めによる相対誤差)は高々
β−(s−1)/2 = 2−23/2 = 2−24 ∼ 6 × 10−8 (2.15)
の程度であり,したがって 10進数に換算して約 7桁の精度がある.
2.2.2 8バイト (64ビット)実数型:倍精度実数型 (real∗8 or double precision)
• 一つの実数を表現するのに 64ビットを使う.
• このうち 1ビットを符号 + or − を表すのに使う.
• 11ビットを 211 − 2 = 2046 通りの指数 e を表すのに使う.(−1022 ≤ e ≤ 1023).
• のこり 52ビットで仮数部の f2, f3, . . . , f53 を表現する.
• 丸めは 0捨 1入で行う.
この表現方法で表現可能な絶対値の範囲は,2−1023(≈ 10−308) から 21023(≈ 10308) となる. また,丸め誤差 (丸めによる相対誤差)は高々
β−(s−1)/2 = 2−53 ∼ 1.1 × 10−16 (2.16)
の程度であり,したがって 10進数に換算して 15桁以上の精度がある.
2.3 10進数と β 進数との変換
2.3.1 10進整数 x の β 進数化
10進整数 x を β 進整数に変換する,すなわち
x = akβk + ak−1βk−1 + · · · + a1β + a0 = (akak−1 · · · a1a0)β , (2.17)
1 ≤ ak ≤ β − 1, 0 ≤ ai ≤ β − 1 (i = 1, . . . , k − 1)
と表現した時の係数 {a0, a1, . . . , ak} を求めるには,以下のように x を β でどんどん割って行った時の
余りを順に求めていけばいい.
÷β ) akβk + ak−1βk−1 + · · · + a2β
2 + a1β + a0
÷β ) akβk−1 + ak−1βk−2 + · · · + a2β + a1 あまり a0
÷β ) akβk−2 + ak−1βk−3 + · · · + a2 あまり a1
......
......
÷β ) akβ + ak−1 あまり ak−2
ak あまり ak−1
(2.18)
52進法では fi は 0か 1であり,f1 = 0 という条件から f1 は1に決まっているので,f1 を覚えるのに 1ビットを当てる必要がない.(ケチ表現)
40
例えば 10進数の 45を 2進数で表現するなら
2 ) 45
2 ) 22 あまり 1
2 ) 11 あまり 0
2 ) 5 あまり 1
2 ) 2 あまり 1
1 あまり 0
(2.19)
より結局 (45)10 = (101101)2 が得られる.
検算
1 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = 32 + 8 + 4 + 1 = 45. (2.20)
2.3.2 10進純小数 x の β 進数化
10進純小数 x を β 進数に変換する,すなわち
x = f1β−1 + f2β
−2 + f3β−3 + · · · = (0.f1f2 · · · )β 0 ≤ fi ≤ β − 1 (i = 1, 2, . . .) (2.21)
となるような係数 {f1, f2, . . .} を求めるには,x の小数部分をどんどん β 倍しては,その整数部分を順次
取り出していけばいい.すなわち
×β ) f1β−1 + f2β
−2 + f3β−3 + · · ·
×β ) f1 + f2β−1 + f3β
−2 + · · · → f1
×β ) f2 + f3β−1 + f4β
−2 + · · · → f2
......
......
(2.22)
例えば x = (0.7)10 を 2進小数にするには,
0.7 × 2 = 1.4 → f1 = 1
0.4 × 2 = 0.8 → f2 = 0
0.8 × 2 = 1.6 → f3 = 1
0.6 × 2 = 1.2 → f4 = 1
0.2 × 2 = 0.4 → f5 = 0
0.4 × 2 = 0.8 → f6 = 0
......
(2.23)
となり,結局 (0.7)10 = (0.101100110 · · · )2 となる.これと前述の整数の変換法とあわせて用いれば,例えば
(45.7)10 = (101101.101100110 · · · )2 (2.24)
のように一般の 10進数を 2進数に変換することができる.
41
2.3.3 β 進整数の 10進数化
β 進整数を 10進数に変換するには,定義式をそのまま計算すればいい.なおこの時以下のようなHorner
法6を用いるのが計算効率,精度の両面から好ましい.
(akak−1 · · · a0)β = akβk + ak−1βk−1 + · · · + a1β + a0
= (· · · (((akβ + ak−1) × β + ak−2) × β + ak−3) × β + · · · ) × β + a0 (2.25)
2.3.4 β 進 (有限)小数の 10進数化
有限桁の β 進小数を 10進数に変換するには,まず
(0.f1f2 · · · fs)β = (f1f2 · · · fs)β × β−s (2.26)
のようにして,それから整数部分 (f1f2 · · · fs)β を前述の方法で変換した後,β−s を掛ける.
例として上で求めた 10進数 (0.7)10 に対する 2進数表現 (0.101100110 · · · )2 を,もとの 10進数に戻してみよう.2進表現のほうを仮に 5桁で近似(丸めは 0捨 1入)したとすると,
(0.1011001100110 · · · )2 ≈ (0.10110)2 = (10110)2 × 2−5
= ((((1 × 2 + 0) × 2 + 1) × 2 + 1) + 0) × 2−5
= 22 × 2−5 = 0.6875 (2.27)
相対誤差 = 0.0125/0.7 ≈ 0.018 ⇐⇒ 丸め誤差単位 = 2−5 ≈ 0.03.
あと 2桁増やして 2進 7桁にすると
(0.1011001100110 · · · )2 ≈ (0.1011010)2 = (1011010)2 × 2−7
= ((((((1 × 2 + 0) × 2 + 1) × 2 + 1) × 2 + 0) × 2 + 1) × 2 + 0) × 2−7
= 90 × 2−7 = 0.703125 (2.28)
相対誤差 = 0.003125/0.7 ≈ 4.5 × 10−3 ⇐⇒ 丸め誤差単位 = 2−7 ≈ 7.8 × 10−3.
2.4 Horner法
例えば上のように β 進小数を 10進数に変換したり,データの補間等の目的のために多項式で表現された近似式を具体的に数値として評価したりする場合など,ある与えられた x に対して多項式
P (x) = anxn + an−1xn−1 + · · · + a1x + a0 (2.29)
の数値を計算したいということがよくある.この場合,定義式そのままの形で計算すると,必要な計算はた
し算が n回,かけ算が n + (n − 1) + · · · + 1 = n(n + 1)/2 回必要となる.
これを
((· · · ((anx + an−1) × x + an−2) × x + · · · + a2) × x + a1) × x + a0 (2.30)
という形で計算すると,必要な計算はたし算が n回,かけ算が n 回ですむ.この手法はHorner法と呼ば
れる.Horner法より少ない数の四則演算で多項式を評価することは不可能であり,この意味で Horner法は最良の方法である.また計算誤差の観点からも好ましいとされている.
式で書くと面倒そうだが,実際のプログラムは以下のようにとても簡単.6次節参照
42
p=a(n)*x+a(n-1)
do k=n-2,0,-1
p=p*x+a(k)
end do
2.5 四則演算に伴う誤差の伝播
x, y にそれぞれ ∆x(> 0), ∆y(> 0) 程度の大きさの誤差が含まれる時,一般に z = f(x, y) で定義される z には
∆z = |fx|∆x + |fy|∆y. (2.31)
程度の大きさの誤差が生じうる.
f(x, y) = x + y, すなわち加 (減)算の場合
∆z = ∆x + ∆y (2.32)
から「絶対誤差」が和となって現われる.一方 f(x, y) = xy, すなわち乗 (除)算では
∆z = y∆x + x∆y =⇒ ∣∣∣∣∆z
z
∣∣∣∣ =∣∣∣∣∆x
x
∣∣∣∣ +∣∣∣∣∆y
y
∣∣∣∣ (2.33)
から「相対誤差」が和になって現われる.
2.6 丸めが引き起こす様々なトラブルの例
2.6.1 多くの数を加える時 (小さな丸め誤差の累積)
例:
私の手持ちの FUJITSU FORTRANを使って 0.01 を 10000回足すという計算を行うと,
10000∑n=1
0.01 = 99.99999776 (単精度計算)
= 100.0000000000143 (倍精度計算) (2.34)
というような結果が得られ,答えはちょうど 100 にはならない.この計算に含まれうる丸め誤差の大きさについて考えてみよう.
1. n 項までの部分和は約 0.01n で与えられる.
2. 丸め誤差の単位を ϵ とすると,この第 n 部分和を浮動小数点数で表す時点で 0.01n × ϵ 程度の誤差
が発生しうる.
3. 各ステップでの丸め誤差を合計すると,最悪の場合全体で
10000∑n=1
0.01nϵ ∼ 0.01 × (10000)2
2× ϵ ∼ 5 × 105ϵ (2.35)
程度の絶対誤差が生じうることになる.
43
4. §2.2で述べたように,4バイト実数型(単精度)では ϵ ∼ 6 × 10−8 なので 0.03 程度,また 8バイト実数型 (倍精度)では ϵ ∼ 10−16 なので 5 × 10−11 程度の絶対誤差が生じても文句は言えないという
ことになる.
この計算の場合,繰り返しの各段階で発生する丸め誤差は正負の符号がほぼ同程度に出現するために,
誤差のかなりの部分は互いにキャンセルしあい,その結果最悪のケースを想定した場合に比べると,
実際にはかなり高い精度の答えが得られたものと考えられる.
2.6.2 大きな数と小さな数の和—「積み残し」「情報落ち」
かけ算や割り算と違って,たし算やひき算は指数部分を揃えないとできない.
例えば β 進 6桁の β3 倍ほど違う 2数の和を考えてみる.
0. f1 f2 f3 f4 f5 f6 × β0
+ 0. g1 g2 g3 g4 g5 g6 × β−3
これは計算機の中では指数部を揃えるために,小さいほうの数字(第 2数)の仮数部を右に 3桁ずらして,
0. f1 f2 f3 f4 f5 f6 × β0
+ 0. 0 0 0 g1 g2 g3 × β0
として計算される.もともと有限桁 (ここでは 6桁)の仮数部しか相手にしていないので,この結果 g4g5g6
の部分は捨て去られてしまう.2数の大きさの違いがもっとひどくて,例えば
0. f1 f2 f3 f4 f5 f6 × β0
+ 0. g1 g2 g3 g4 g5 g6 × β−6
のようだと,第 2数の仮数部は右に 6桁ずらされて,
0. f1 f2 f3 f4 f5 f6 × β0
+ 0. 0 0 0 0 0 0 × β0
となり,結局第 2数はまったく足されないのと同じことになってしまう.このような現象は積み残しとか情報落ちなどと呼ばれる.
2.6.3 常微分方程式の数値解法でキザミが小さすぎると誤差が増大したこと
1章図 1.5(以下に再掲)で見たように,常微分方程式の数値解に含まれる誤差は,キザミ h が適切なうち
は h が減少するにつれて理論的な予測どおりの速さで減少するが,h が小さくなりすぎると h の減少に伴
い,かえって増大するようになる.この現象は,全数値誤差は打切り誤差と丸め誤差の二つの部分からなっ
ていることを考えると理解することができる.
例えば 1次精度の Euler法の場合,大局的打切り誤差は O(h) である.一方丸め誤差は,丸め誤差の単位を ϵ とすると,各ステップにおいて yk × ϵ ∼ ϵ 程度の誤差が発生し,したがって大局的には ϵ × N,すな
わち ϵ/h 程度の丸め誤差が発生することになる.これより総大局誤差 E(h) は,打切り誤差と丸め誤差の合計として,ほぼ
E(h) ∼ ϵ/h + h (2.36)
のようになると考えられる.キザミ h が大きい間は第 2項の打切り誤差が卓越し,h が小さくなると次第
に第 1項の丸め誤差が卓越するようになる.
44
10-15
10-13
10-11
10-9
10-7
10-5
0.001
10-10 10-8 10-6 0.0001 0.01 1
EulerHeun2RK3(1/4)RK4(1/6)
Err
or a
t x=
1
h
Global Error of RK4 (y=-xy2, y(0)=1)
図 2.2: 異なる次数の Runge-Kutta法による誤差: y′ = −2xy2, y(0) = 1
E(h) を一番小さくする最適なキザミ hopt およびその時の E の値 Eopt はおよそ以下のようにして見積
ることができる.dE(h)
dh∼ − ϵ
h2+ 1 = 0 −→ hopt ∼
√ϵ −→ Eopt ∼
√ϵ. (2.37)
倍精度計算なら ϵ ∼ 10−16 なので,hopt ∼ 10−8, Eopt ∼ 10−8 程度と予想される.
一方,2次の Runge-Kutta法の場合,大局的打切り誤差は O(h2) の程度であり,丸め誤差は上と同じくO(ϵ/h) なので,
E(h) ∼ ϵ/h + h2. (2.38)
全誤差が一番小さくなるのは,
dE(h)dh
∼ − ϵ
h2+ h = 0 −→ hopt ∼ ϵ1/3 −→ Eopt ∼ ϵ2/3 (2.39)
倍精度計算 (ϵ ∼ 10−16)の場合, hopt ∼ 10−5, Eopt ∼ 10−11 程度と予想される.1次,2次どちらについ
ても以上のおおざっぱな予測は,図の結果とよく整合していることが分かる.
babababababababababababababababababababab
最近ではコンピュータの性能も上がり,メモリーもふんだんに使えるようになったが,だからと
いって,やたら細かいキザミで計算することは,時間や電力の浪費であるばかりでなく,計算結
果自身をかえって悪くしてしまう可能性もあるということは,頭の片隅に留めておく必要がある.
2.6.4 桁落ち—よく似た数どうしの引き算
計算機内部では数値は浮動小数点数として近似的にしか表現されないので,値が近い 2数の引き算をしてその結果の絶対値が小さくなると,その分相対誤差が増大する.これにより有効数字がいっぺんに減少し
てしまうことがあるので注意が必要である.
45
例:(伊理・藤野著:「数値計算の常識」共立出版 より)
例えば 1 − 1√1 + x
を x = 0.31834×10−2に対して計算することを考える.(正解は 0.158790979 · · · × 10−2).
途中の計算はすべて有効数字 5桁でやるものとして,2通りのやり方で答えを求めてみる.
やり方 1:式のままの形で
1.0000 − 1√1.0032
= 1.0000 − 11.0016
= 1.0000 − 0.99840 = 0.00160 (2.40)
これだと合っているのは最初の 2桁だけ.
やり方 2:分子の有理化(プロのやり方)
1 − 1√1 + x
=√
1 + x − 1√1 + x
=√
1 + x − 1√1 + x
×√
1 + x + 1√1 + x + 1
=x
(1 + x) +√
1 + x(2.41)
なので,最後の形で計算すると
x
(1 + x) +√
1 + x=
0.0031834(1.0032) + (1.0016)
=0.0031834
2.0048= 0.0015879 (2.42)
となって全桁 (5桁)とも正解が得られる.
上の二通りのやり方の必要計算回数を数えてみると, 「やり方 1」では たし算 1回,引き算 1回,わり算1回,平方根 1回.一方「やり方 2」では,たし算 2回,わり算 1回,平方根 1回で,両者は計算量としてはまったく同等である.
このようにちょっとした計算手法のちがいで,計算精度に決定的な差が生じることがある.素人の手によ
る「素朴な」プログラムでは,「やり方 1」にあたることが平気でなされている危険がある.
babababababababababababababababababababab
• 自分の目的に見合ったもので,専門家によって作られた信頼のできるプログラムがある場合には,積極的にそれを利用するほうがいい.
• ただしその場合でも「なんだか分からないけど,とにかくこれを入れればこれが出てくる」式の,完全なブラックボックスとしての利用ではあまりに情けない.論文を書いたり学会で
発表した時に,例えば「この微分方程式を解くのにどんな数値手法を使っているのですか?」
と聞かれて,「さー,パッケージに聞いて下さい.」ではあまりに無責任であり,またいい恥
さらしでもある.
• たとえ出来合いのライブラリーやプログラムパッケージを使うにしても,少なくともそこで使われているアルゴリズムの大筋や,その基本精神くらいは理解しておくべきであり,それ
がこの講義が目指す「まっとうなユーザー」の姿である.
46
第3章 差分法
3.1 差分による微分係数の近似法
空間 x の関数 u(x) の値を,離散的な x の値 xj = j∆x (j = 1, 2, . . .) についてのみ知っているとして,xj における u の値 u(xj) を単に uj と書くことにする.1
3.1.1 1階微分に対する差分表現
例えば xj を中心に {xj−1, xj , xj+1} の 3点における u の値 {uj−1, uj , uj+1} を使って,xj における x
についての 1階偏微分係数[∂u
∂x
]j
を近似するような表現
[∂u
∂x
]j
≈ a uj−1 + b uj + c uj+1 (3.1)
を作りたいとき,その係数 a, b, c はどのように選べばよいであろうか.
まず,すべての量を xj のまわりで x について Taylor展開すると2
uj = u (3.2)
uj±1 = u(xj ± ∆x) = u ± ∂u
∂x∆x +
12
∂2u
∂x2∆x2 ± 1
6∂3u
∂x3∆x3 +
124
∂4u
∂x4∆x4 + · · · . (3.3)
これより
a uj−1 + b uj + c uj+1 = (a + b + c)u + (−a + c)∆x∂u
∂x
+ (a + c)∆x2
2∂2u
∂x2+ (−a + c)
∆x3
6∂3u
∂x3+ · · · . (3.4)
この一次結合が[∂u
∂x
]j
に対する近似値を与えるためには
a + b + c = 0
(−a + c)∆x = 1
(a + c)∆x2
2= 0
すなわち
a = − 1
2∆x
b = 0
c =1
2∆x
(3.5)
となっていなければならない.この時,(3.4)の∂3u
∂x3の係数 (−a + c)
∆x3
6は
∆x2
6となるので,結局
[∂u
∂x
]j
=−uj−1 + uj+1
2∆x− ∆x2
6
[∂3u
∂x3
]j
+ · · · =−uj−1 + uj+1
2∆x+ O(∆x2) (3.6)
1我々が主に扱うのは偏微分方程式であり,従属変数 u は x のみの関数ではなく,他の変数(例えば t)の関数でもあろうが,ここでは他の変数についての依存性は重要ではないので,問題となる独立変数およびそれに対応する添え字のみを記すことにする.
2j 点における量については添え字 j を省略する.
47
という関係が得られる. これよりキザミ ∆x の 2乗程度の誤差を覚悟すれば,[∂u
∂x
]j
を−uj−1 + uj+1
2∆xで
近似的に表現することができる.この例のように,着目している点の両側の離散点を対称に考慮した差分
公式は一般に中心差分 (centered difference)と呼ばれる.
上の例でもし {j, j + 1} の2点しか使わないのであれば,その場合には a = 0 と取ることになり,(3.4)より {
b + c = 0
c∆x = 1 すなわち
b = − 1
∆x
c =1
∆x
(3.7)
となり, [∂u
∂x
]j
=−uj + uj+1
∆x− ∆x
2
[∂2u
∂x2
]j
+ · · · =−uj + uj+1
∆x+ O(∆x) (3.8)
が得られる.これは前進差分 (forward difference)と呼ばれる.
また 3点をつかうにしても右側だけ,または左側だけの点を使うこともできる.3 例えば j 点における 1階微分係数を {j, j + 1, j + 2} の 3点を使って近似する公式は以下のようにして得られる.まずすべての量を点 j のまわりに Taylor展開すると
uj = u (3.9)
uj+1 = u +∂u
∂x∆x +
12
∂2u
∂x2∆x2 +
16
∂3u
∂x3∆x3 +
124
∂4u
∂x4∆x4 + · · · (3.10)
uj+2 = u +∂u
∂x(2∆x) +
12
∂2u
∂x2(2∆x)2 +
16
∂3u
∂x3(2∆x)3 +
124
∂4u
∂x4(2∆x)4 + · · · . (3.11)
これより
a uj + b uj+1 + c uj+2 = (a + b + c)u + (b + 2c)∆x∂u
∂x
+ (b + 4c)∆x2
2∂2u
∂x2+ (b + 8c)
∆x3
6∂3u
∂x3+ · · · . (3.12)
これが[∂u
∂x
]j
に対する近似値を与えるためには
a + b + c = 0
(b + 2c)∆x = 1
(b + 4c)∆x2
2= 0
すなわち
a = − 3
2∆x
b =2
∆x
c = − 12∆x
(3.13)
この時,(3.12)の∂3u
∂x3の係数 (b + 8c)
∆x3
6は −∆x2
3となるので,結局[
∂u
∂x
]j
=−3uj + 4uj+1 − uj+2
2∆x+
∆x2
3
[∂3u
∂x3
]j
+ · · · =−3uj + 4uj+1 − uj+2
2∆x+ O(∆x2) (3.14)
が得られる.
3.1.2 2階微分に対する差分表現
まったく同様にして,{j − 1, j, j + 1} の 3点を使って,[∂2u
∂x2
]j
≈ a uj−1 + b uj + c uj+1 (3.15)
3このような公式は境界の近くでよく用いられる.また後述の「風上差分」でも必要となる.
48
のような形で j 点における 2階偏微分係数[∂2u
∂x2
]j
を近似する差分表現を作りたければ,まず xj のまわ
りでの Taylor展開 (3.3)を用いて
a uj−1 + b uj + c uj+1 = (a + b + c)u + (−a + c)∆x∂u
∂x+ (a + c)
∆x2
2∂2u
∂x2
+ (−a + c)∆x3
6∂3u
∂x3+ (a + c)
∆x4
24∂4u
∂x4+ · · · . (3.16)
これが[∂2u
∂x2
]j
を近似するためには,
a + b + c = 0
(−a + c)∆x = 0
(a + c)∆x2
2= 1
すなわち
a =
1∆x2
b = − 2∆x2
c =1
∆x2
(3.17)
となっていなければならない.この時,(3.16)の∂3u
∂x3の係数は,等間隔メッシュで中心差分という対称性
のおかげで自動的に 0 になり,また∂4u
∂x4の係数 (a + c)
∆x4
24は
∆x2
12となるので,[
∂2u
∂x2
]j
=uj−1 − 2uj + uj+1
∆x2− ∆x2
12
[∂4u
∂x4
]j
+ · · · =uj−1 − 2uj + uj+1
∆x2+ O(∆x2) (3.18)
が得られる (2階微分に対する中心差分).
もし右側だけの 3点 {j, j + 1, j + 2} を使って近似したいのなら,Taylor展開 (3.11)を用いることにより
a uj + b uj+1 + c uj+2 = (a + b + c)u + (b + 2c)∆x∂u
∂x
+ (b + 4c)∆x2
2∂2u
∂x2+ (b + 8c)
∆x3
6∂3u
∂x3+ · · · . (3.19)
から, a + b + c = 0
(b + 2c)∆x = 0
(b + 4c)∆x2
2= 1
すなわち
a =
1∆x2
b = − 2∆x2
c =1
∆x2
(3.20)
この時,(3.19)の∂3u
∂x3の係数 (b + 8c)
∆x3
6は ∆x となるので,結局[
∂2u
∂x2
]j
=uj − 2uj+1 + uj+2
∆x2− ∆x
[∂3u
∂x3
]j
+ · · · =uj − 2uj+1 + uj+2
∆x2+ O(∆x) (3.21)
が得られる.4
3.1.3 より高次の公式
使う点数を増やせば,それだけたくさんの不要な項の係数を 0 にすることができるので,いくらでも精密な(打切り誤差の小さい)公式を導くことができる.5 以下では参考までに,1階微分および 2階微分に対する 3点,5点および 7点の中心差分公式のみを記す.
4上で得られた中心差分の公式に比べて,誤差の次数が低い,すなわち誤差が大きいことに注意.5例えば Abramowitz & Stegun: Handbook of mathematical functions (Dover, 1971) にはこのような公式が山ほど載ってい
る.
49
3点中心差分¶ ³[∂u
∂x
]j
=1
2∆x(−uj−1 + uj+1) + O(∆x2) (3.22)
[∂2u
∂x2
]j
=1
∆x2(uj−1 − 2uj + uj+1) + O(∆x2) (3.23)
µ ´5点中心差分¶ ³[
∂u
∂x
]j
=1
12∆x(uj−2 − 8uj−1 + 8uj+1 − uj+2) + O(∆x4) (3.24)
[∂2u
∂x2
]j
=1
12∆x2(−uj−2 + 16uj−1 − 30uj + 16uj+1 − uj+2) + O(∆x4) (3.25)
µ ´7点中心差分¶ ³[
∂u
∂x
]j
=1
60∆x(−uj−3 + 9uj−2 − 45uj−1 + 45uj+1 − 9uj+2 + uj+3) + O(∆x6) (3.26)
[∂2u
∂x2
]j
=1
180∆x2(2uj−3 − 27uj−2 + 270uj−1 − 490uj + 270uj+1 − 27uj+2 + 2uj+3) + O(∆x6)
(3.27)µ ´一階微分係数に対する 3点中心差分公式 (3.22)および 5点中心差分公式 (3.24)を指数関数 f(x) = exp(x)
に適用した場合の誤差の振舞いを図 3.1に示す. キザミ幅 ∆x が小さすぎない場合には,理論どおりの速さ
で誤差が減少することを確認することができる.6
�� ��
�� ��
�� ��
�� �
�� �
�� �
����
�
�� � �� � �� � ����� ��� ��
�½a»p��`¸±»0Ns6aÖF�X�EXP�X��X��
bM;�dM;�
Err
or
∆ x
図 3.1: 3点及び 5点中心差分公式による一階微分係数の誤差:f(x) = ex at x = 1.
ただし,
• 高次公式は多くのメッシュ点を使うので,特に境界付近では取り扱いが煩雑になる.
6小さすぎる ∆x に対して誤差が増大するのは前述の丸め誤差の影響である.考察は各自にまかせる.
50
• 打切り誤差の評価はあくまでも ∆x → 0 の漸近的な評価であり,また対象とする関数は限りなくスムーズで何回でも微分可能であることを前提としている.しかし現実のシミュレーションでは,メモ
リーサイズなど計算機性能の制限や,経済的・時間的な制限から,不十分な粗いメッシュサイズで我
慢しなければならない場合が少なくない.そのような不十分なメッシュサイズに対しては,必ずしも
高次公式が漸近的評価どおりのパフォーマンスを示すとは限らない.
などの点を考えると,やたら高次の差分公式を使ってもあまりメリットはないであろう.
3.1.4 不等間隔メッシュの場合
メッシュが不等間隔の場合にも,Taylor展開に基づく全く同じ考え方で,微分係数を近似する差分表現を導出することができる.しかし不等間隔メッシュの場合には,そのような方法に替えて,むしろ独立変数
{xj}, 従属変数 {uj} をともにメッシュ番号 {j} の関数と考えて,パラメタ表示の微分,すなわち[∂u
∂x
]j
=[∂u
∂j
]j
/[∂x
∂j
]j
(3.28)
で評価するほうが便利であろう.メッシュ番号 j は必然的に等間隔なので,このやり方を使えば,よく知
られている等間隔メッシュに対するいろいろな次数の差分公式をそのままの形で利用することができる.
3.2 拡散方程式に対する差分法の適用
この節では,偏微分方程式の簡単な例として,1次元拡散方程式の初期値境界値問題
∂u
∂t= α
∂2u
∂x2, u(x, 0) = u0(x), u(0, t) = ul(t), u(1, t) = ur(t) (3.29)
を題材に取り,代表的な差分スキームの紹介とあわせて,差分法全般に共通する基本的な概念を説明してい
く. 対象とする独立変数の空間,すなわちこの場合 x-t 平面の 0 ≤ x ≤ 1, 0 ≤ t < ∞ という半無限帯状領
域において,x, t をそれぞれ間隔 ∆x, ∆t で離散化し,点 (x, t) = (j∆x, n∆t) における u の値を unj と書
くことにする.
3.2.1 拡散方程式に対するFTCSスキーム
時間微分を 1次精度の前進差分で,また空間微分を 2次精度の 3点中心差分で置き換えると
un+1j − un
j
∆t= α
unj−1 − 2un
j + unj+1
∆x2, (3.30)
すなわち
un+1j = sun
j−1 + (1 − 2s)unj + sun
j+1, s =α∆t
∆x2(3.31)
という代数方程式に帰着する.これは新しい時刻におけるあるメッシュでの値 un+1j が直接求められる陽
(explicit)なスキームである.この差分スキームは時間に関しては前進差分 (Forward–Time),空間に関しては中心差分 (Centered–Space) を採用しているので FTCS スキームと呼ばれている. FTCS スキームによる拡散方程式の初期値境界値問題の数値計算例を図 3.2 に示す. なお,この計算では,境界条件はu(0, t) = u(1, t) = 100, 初期条件は u(0, 0) = u(1, 0) = 50, u(x, 0) = 0 (0 < x < 1), α = 1 とした.このとき ∆x = 1/32,s = 0.45 は ∆t ≈ 4.4 × 10−4 を意味し,したがって例えば t = 0.1 はほぼ 228ステップ目にあたる.
51
��
�
��
��
��
��
���
���
��� � ��� ��� ��� ��� � ���
s=0.450 T����T����T����T����
u(x,
t)
x
図 3.2: FTCSスキームの計算例 (∆x = 1/32, s = 0.45)
3.2.2 適合性 (consistency)と打切り誤差 (truncation error)
∆x → 0, ∆t → 0 の極限において,真の解 u(x, t) が差分化により得られる代数方程式を満たす時,この差分スキームはもともとの偏微分方程式に適合している (consistent)という.そもそも差分による微分係
数の近似表現は,前節で述べたように Taylor展開に基づいて導出されたものなので,偏微分方程式の各微分係数をこれらの差分近似で置き換えることによって導出された代数方程式は,∆x → 0, ∆t → 0 の極限で必ずもとの偏微分方程式に戻り,したがって適合性を満足しているはずである.
FTCSスキームの場合,差分化によって得られた代数方程式 (3.30)に真の解 u(x, t) を代入し,(j, n) メッシュ点,すなわち (x, t) = (j∆x, n∆t) のまわりに Taylor展開を行うと,
un+1j − un
j
∆t=
[∂u
∂t
]n
j
+12∆t
[∂2u
∂t2
]n
j
+ O(∆t2) (3.32)
unj−1 − 2un
j + unj+1
∆x2=
[∂2u
∂x2
]n
j
+∆x2
12
[∂4u
∂x4
]n
j
+ O(∆x4) (3.33)
となり,これより
(3.30) ⇐⇒[∂u
∂t
]n
j
− α
[∂2u
∂x2
]n
j
+ Enj = 0. (3.34)
であることが分かる.ここで
Enj =
12∆t
[∂2u
∂t2
]n
j
− α∆x2
12
[∂4u
∂x4
]n
j
+ O(∆t2, ∆x4). (3.35)
明らかに ∆x → 0, ∆t → 0 の極限で Enj → 0 となり,FTCSスキームはもともとの拡散方程式に適合した
スキームとなっていることが確認できる.また誤差 Enj の主要項から,このスキームの(大局)打切り誤
差は,∆t については1次,∆x については2次であることが分かる.7
7この Enj は局所打切り誤差ではなく,大局打切り誤差である. 第 1 章の常微分方程式の時のような言い方で言えば,この式から
次のステップの un+1j を求める時に,En
j に時間キザミ ∆t がかかった程度の局所誤差が生じ,それにステップ数 (∝ 1/∆t) が掛けられると ∆t が取れるので,結局 En
j 自身は大局誤差に対する目安ということになる.
52
3.2.3 安定性 (stability)
上記の例で分かるように,差分近似すると偏微分方程式は代数方程式に帰着させることができる.しかし
前章で述べた丸め誤差の存在により,われわれはこの代数方程式ですら完全に解くことはできない.丸め誤
差を発端として発生した誤差が,差分スキームを使って時間発展を追跡していくうちに限りなく増大して
いく場合, そのスキームは不安定 (unstable)であると言われる. スキームの安定性を調べるのによく使われる方法としては,行列の方法と von Neumannの方法がある.行列の方法は境界条件の影響も取り込む
ことができ,より一般的ではあるが, 空間メッシュ点数を次元とする行列の固有値問題を取り扱う必要があり,実際に行うにはかなり煩雑な計算が必要となる. 一方 von Neumannの方法は誤差関数の Fourier分解に基づいているために,厳密に言えば,線形で定係数(すなわち空間的に一様)の偏微分方程式にしか適用
することができない.8 しかし,von Neumannの方法は行列の方法に比べて大変使いやすいので,現実的には von Neumannの方法が与える安定性条件を参考にして,それに適当な安全係数をかけて運用するケースが多いようである.以下では上述の拡散方程式に対する FTCSスキームを例にとって,von Neumannの方法による安定性解析について説明する.
丸めによる数値誤差がまったくないとした時に差分スキームが与える代数方程式の厳密な解を unj , それ
に対して実際にわれわれが手にしている数値解を unj + un
j とする.ここで unj ≫ un
j と考えると,誤差部
分 unj の時間発展は,差分スキームが与える代数方程式を un
j のまわりに線形化した式で支配される.拡散
方程式に対する FTCSスキームが与える代数方程式
un+1j = sun
j−1 + (1 − 2s)unj + sun
j+1 (3.36)
はもともと線形であり,したがって unj に対する式も全く同じ式
un+1j = sun
j−1 + (1 − 2s)unj + sun
j+1 (3.37)
となる.
ある時刻の誤差関数 u(x, t) を Fourier級数で表現する:
u(x, t) =∑
k
u(k, t)eikx すなわち uj(t) =∑
k
u(k, t)ei(k∆x)j . (3.38)
誤差の式 (3.37)は線形で定係数なので,各波数成分について別々に取り扱うことが許される.誤差関数の中の波数 k の誤差成分の増幅について調べるために,k∆x を簡単のために θ と書いて
unj = a(n)eiθj (3.39)
として,(3.37)に代入すると,
a(n+1)eiθj = a(n){
s eiθ(j−1) + (1 − 2s) eiθj + s eiθ(j+1)}
= a(n)eiθj{s e−iθ + (1 − 2s) + s eiθ
}. (3.40)
これより,1ステップ進む間の,誤差の中の波数 k (= θ/∆x) の成分の増幅率は,
a(n+1)/a(n) = s(e−iθ + eiθ
)+ (1 − 2s)
= 1 − 2s(1 − cos θ) = 1 − 4s sin2 θ
2(3.41)
で与えられることが分かる. この増幅率はステップ番号 n によらないので,誤差の中のこの波数成分の振
幅は1ステップ進むたびに,この比率で変化していくことになる.
8したがって安定性に対する境界条件の影響を考慮することもできない.
53
一般に誤差の中にはあらゆる波数成分が含まれているので, 数値誤差が限りなく大きくなっていくようなことが起こらないためには,すべての k,すなわちすべての θ に対して∣∣∣∣1 − 4s sin2 θ
2
∣∣∣∣ ≤ 1 すなわち − 1 ≤ 1 − 4s sin2 θ
2≤ 1 (3.42)
が成り立つことが必要十分である. ここで右の不等号はいつも成立し,左の不等号より
s sin2 θ
2≤ 1
2(3.43)
を得る. この条件がすべての θ に対して成り立つための条件として
s =α∆t
∆x2≤ 1
2(3.44)
が得られる.すなわち,s が 1/2 を超える場合には,誤差の中に限りなく増幅していくような波数成分が存在することになる.
具体的な計算例を図 3.3に示す. 図 3.2のときと同様,境界条件は u(0, t) = u(1, t) = 100, 初期条件はu(0, 0) = u(1, 0) = 50, u(x, 0) = 0 (0 < x < 1), α = 1 とし,∆x = 1/32 と固定して,∆t = 0.45∆x2(s =0.45) および ∆t = 0.505∆x2(s = 0.505) として計算を行った. 臨界値 s = 0.5 をはさむ両者の振舞いの違いをはっきりと見ることができる.また誤差の中で s が安定限界 (s = 1/2)を越えた時に真っ先に増幅してくる波数成分は
sin2 θ
2= 1 −→ θ (≡ k∆x) = ±π −→ λ ≡ 2π
k= 2∆x (3.45)
より,波長 λ がちょうど 2空間メッシュ 2∆x であるような成分であると予想されるが,これは s = 0.505に対する計算結果で目だって増幅してくる誤差成分とよく符号している.
3.2.4 CTCSスキーム (Leapfrogスキーム)
FTCSスキームは時間 ∆t について 1次の精度しかない.より精度を上げるために時間微分についても中心差分を用いることを考えると,CTCSスキーム(Centered–Time, Centered–Space scheme) と呼ばれる以下のようなスキームを得る.
∂u
∂t= α
∂2u
∂x2
=⇒un+1
j − un−1j
2∆t= α
unj−1 − 2un
j + unj+1
∆x2
=⇒ un+1j = 2s
(un
j−1 − 2unj + un
j+1
)+ un−1
j , s =α∆t
∆x2. (3.46)
このように時間について中心差分を用いる差分公式はしばしばカエル跳び (Leapfrog)スキームとも呼ば
れる.
対応する数値誤差の式は
un+1j = 2s
(un
j−1 − 2unj + un
j+1
)+ un−1
j (3.47)
となる.von Neumannの方法でこのスキームの安定性を調べるために,以前と同様
unj ∝ a(n)eiθj (3.48)
を代入すると,1ステップあたりの増幅率
G = a(n+1)/a(n) = a(n)/a(n−1) (3.49)
54
��
�
��
��
��
��
���
���
��� � ��� ��� ��� ��� � ���
s=0.450 T����T����T����T����
u(x,
t)
x
��
�
��
��
��
��
���
���
��� � ��� ��� ��� ��� � ���
T����T����T����T����
u(x,
t)
x
s=0.505
図 3.3: FTCSスキームの安定性
55
に対する式として
G2eiθj = 2sG(e−iθ − 2 + eiθ
)eiθj + eiθj , (3.50)
すなわち
G2 + 8s sin2 θ
2G − 1 = 0 (3.51)
を得る.この G に対する 2次方程式はつねに 2実根を持ち,しかもそのうち一つは必ず G < −1,すなわち |G| > 1 である.これより,この CTCSスキームは,どんな s(> 0),したがってどんな ∆x, ∆t の組み
合わせに対しても,誤差の中のすべての波数成分の増幅率が 1 より大きいことになる.すなわち,このスキームは無条件に不安定 (unconditionally unstable)である.
bababababababababababababababababababababいくら打切り誤差が小さくて精度が高くても,不安定なスキームは役には立たない!!
3.2.5 Laxの同等定理 (Equivalence Theorem)
差分方程式の解 unj が ∆x → 0, ∆t → 0 の極限で,すべてのメッシュ点において,偏微分方程式の真の
解 u(x, t) に限りなく近づく時,差分方程式の解は偏微分方程式の解に収束する (convergent)と言う.9
偏微分方程式の解を数値的に求めるという目的からすると,収束性が保証されてはじめて,得られた数値
解は意味を持つことになる.しかし,真の解が分からないからこそ,数値的に近似解を求めざるを得ない
のであるから, この定義に則って収束性を確認することは実際には不可能である. しかし,偏微分方程式が線形の場合には,差分スキームが適合性を満たし,かつ安定であれば,それが与える数値解は ∆x → 0,∆t → 0 の極限で,もとの偏微分方程式の解に収束することが数学的に証明されている.これを Laxの同等
定理 (Equivalence Theorem)と呼ぶ.
理工学で取り扱う偏微分方程式は非線形なものが多いが,そのような場合に対してこの同等定理が成り
立つことはまだ数学的に保証されてはいない.しかしそのような場合にも経験上,差分スキームが適合性と
安定性を満たしていれば,∆x, ∆t を小さくするにつれて,数値解は真の解に収束すると考えられている.
これは,数値的に解いている代数方程式が元の偏微分方程式に近いことを「適合性」が保証してくれて,自
分が得ている数値解が代数方程式の真の解に近いことを「安定性」が保証してくれると解釈すれば,ある程
度了解できるであろう.
3.2.6 完全陰的スキーム
差分スキームの安定性を向上させる一般的なテクニックとして,陰的スキームの採用がある.例えば,時
間微分を前進差分,空間微分を (n + 1) ステップ目で評価する以下のようなスキームは完全陰的スキーム(fully implicit scheme),もしくはBTCSスキームと呼ばれる.10
∂u
∂t= α
∂2u
∂x2
=⇒un+1
j − unj
∆t= α
un+1j−1 − 2un+1
j + un+1j+1
∆x2
=⇒ −sun+1j−1 + (1 + 2s)un+1
j − sun+1j+1 = un
j , s =α∆t
∆x2. (3.52)
9前述の「適合性」との違いは,「適合性」は解いている「式」が本当に解くべき「式」に近いかどうかを気にしているのに対し,「収束性」は数値「解」が本当の「解」に近いかどうかを気にしているという点である.
10言い方を変えれば,前の FTCS スキームで,時間微分を後退差分に置き換えたということ.
56
この代数方程式には新しい時刻 (n + 1)∆t における異なるメッシュ点での値が 3つ同時に含まれているので, これから {un+1
j } を求めるためには連立方程式11 を解く必要がある.このように新しい時間ステップに
おける未知の関数値が複数個同時に出現し,それらを求めるためには連立方程式を解く必要があるような
差分スキームを一般に陰的スキーム (implicit scheme)と呼ぶ.
von Nuemannの方法を用いて,1ステップあたりの増幅率 G = a(n+1)/a(n) を求めると,
G{−se−iθ + (1 + 2s) − seiθ
}= 1 =⇒ G =
11 + 2s(1 − cos θ)
=1
1 + 4s sin2 θ2
(3.53)
となり,任意の s (> 0), θ に対し |G| ≤ 1 が成り立ち,したがって無条件に安定であることが分かる.このスキームはどんな s (> 0) でも,すなわち ∆t をどんなに大きくとっても,不安定にはならない.ただし,
時間についての打切り誤差は FTCSと同じく O(∆t) なので,∆t は安定性からの要求ではなく,精度から
の要求で制限されることになる.この BTCSスキームにおいては,各時間ステップで 3重対角行列を係数に持つような連立一次方程式を解く必要があるが,これについては次節で述べる Thomasアルゴリズムという効率の良い計算手法がある.
なお,上記 BTCSスキームの改良版として,uxx の項を nステップ目での値と n + 1ステップ目での値の相加平均で評価するCrank-Nicolsonスキームがよく知られている.Crank-Nicolsonスキームは,空間だけでなく,時間についても2次精度を持ち,やはり無条件に安定なスキームである.
3.3 Thomasアルゴリズム—3重対角行列に対する効率的な消去法
係数行列が 3重対角行列であるような連立一次方程式
b1 c1
a2 b2 c2
· · ·· · ·ai bi ci
· · ·· · ·
aN−1 bN−1 cN−1
aN bN
x1
x2
··xi
··
xN−1
xN
=
d1
d2
··di
··
dN−1
dN
(3.54)
は,Gaussの消去法のスペシャルバージョンであるThomasアルゴリズムにより効率良く解くことができ
る.12
Thomasアルゴリズムは (1)前進消去と (2)後退代入の 2段階よりなる.第 1段階の前進消去では,係数行列の ai が消去され,また対角成分 bi が 1にされることにより,もともとの連立一次方程式 (3.54)は
1 c′1
1 c′2
· · ·· · ·
1 c′i· · ·
· · ·1 c′N−1
1
x1
x2
··xi
··
xN−1
xN
=
d′1
d′2
··d′
i
··
d′N−1
d′N
(3.55)
11今の場合は,線形なので連立一次方程式となり,その係数行列は 3 重対角行列となっている.12大規模連立一次方程式のその他の数値解法については,本講義の最終章で論ずる予定.
57
の形に変形される.これは以下のようなプログラムで実行できる.
c(1)=c(1)/b(1)
d(1)=d(1)/b(1)
do 10 i=2,N
bumbo=b(i)-a(i)*c(i-1)
c(i)=c(i)/bumbo
d(i)=(d(i)-a(i)*d(i-1))/bumbo
10 continue
第 2段階の後退代入では xN から順に xi (i = 1, · · · , N) が求められる.プログラムは
x(N)=d(N)
do 20 i=N-1,1,-1
x(i)=d(i)-c(i)*x(i+1)
20 continue
比較的時間のかかるかけ算,わり算だけを数えると,前進消去の部分で 4N 回,後退代入の部分で N 回
の計 5N 回の計算になる.13 最も単純な陽解法である FTCSスキームでも各時間ステップごとに,2N 回
の計算はどうしても必要である.スキームの安定性によって時間キザミ ∆t が制限されないですむことを考
えると,特にこの例のように連立 (一次)方程式が比較的簡単に解ける場合には,陰解法も有望な選択肢の一つである.
3.4 2次元・3次元の拡散方程式
2次元等方性媒質中の拡散方程式は以下のようになる.
∂u
∂t= α
(∂2u
∂x2+
∂2u
∂y2
)(3.56)
3.4.1 FTCSスキーム
1次元の場合と同様にして,時間については前進差分 (1次精度),空間については中心差分 (2次精度)を採用すると 2次元版の FTCSスキーム
un+1j,k − un
j,k
∆t= α
unj−1,k − 2un
j,k + unj+1,k
∆x2+ α
unj,k−1 − 2un
j,k + unj,k+1
∆y2, (3.57)
すなわち
un+1j,k = sxun
j−1,k + (1 − 2sx − 2sy)unj,k + sxun
j+1,k + syunj,k−1 + syun
j,k+1 (3.58)
を得る. ここで sx = α∆t/∆x2, sy = α∆t/∆y2.
以前と同様
unj,k = a(n)ei(θxj+θyk) (3.59)
とおいて,von Neumannの方法で安定性を調べると,安定性の条件として
sx + sy ≤ 12
(3.60)
13密行列の場合の,直接法として代表的な手法である LU 分解の場合,LU 分解の部分だけで約 N3/3 回の計算が必要(後述).
58
が得られる.これは 1次元の場合(s ≤ 1/2))に比べ,きびしい条件になっている. まったく同様に 3次元になると安定条件は
sx + sy + sz ≤ 12
(3.61)
となり,∆t に対する制限はますます厳しくなり,陽解法は次元が上がるにつれて次第に非効率的となる.
3.4.2 ADIスキーム
2次元の場合にも 1次元の時と同じ精神で,完全陰解法のスキームを作ることができる.このスキームはvon Neumannの方法によると無条件安定である.しかし,この場合,各時間ステップで 5重対角行列14 を
係数に持つような連立一次方程式を解かなければならなくなり,3重対角行列を Thomasアルゴリズムで解けばよかった 1次元の時と比べ大幅に効率が悪くなってしまう. これを解決する手段として考案されたのがADI(Alternating Direction Implicit,交互方向陰解法)と呼ばれる以下のようなスキームである.
ADIスキームにおいては n から (n + 1) への 1ステップは以下のような二つのサブステップから成る.
un+ 1
2j,k − un
j,k
(∆t/2)= α
un+ 1
2j−1,k − 2u
n+ 12
j,k + un+ 1
2j+1,k
∆x2+ α
unj,k−1 − 2un
j,k + unj,k+1
∆y2, (3.62)
un+1j,k − u
n+ 12
j,k
(∆t/2)= α
un+ 1
2j−1,k − 2u
n+ 12
j,k + un+ 1
2j+1,k
∆x2+ α
un+1j,k−1 − 2un+1
j,k + un+1j,k+1
∆y2. (3.63)
すなわち,はじめのサブステップでは x 方向だけを陰的に扱い,次のサブステップでは y 方向だけを陰的
に扱う.そしてこれを交互に繰り返す. 15 x, y それぞれの方向のメッシュ点数を M , N とすると,はじめ
のサブステップで解かないといけない連立 1次方程式の係数行列は次元 M の 3重対角行列,あとのサブステップのそれは次元 N のやはり 3重対角行列であり, ともに Thomasアルゴリズムにより効率よく解くことができる.
von Neumannの安定性解析を適用すると,完全な 1ステップの間の増幅率 G は, 各サブステップの増幅率 G′, G′′ の積として
G = G′G′′ =[
1 − 2sy sin2(θy/2)1 + 2sx sin2(θx/2)
] [1 − 2sx sin2(θx/2)1 + 2sy sin2(θy/2)
](3.64)
で与えられる.この表現は任意の sx(> 0), sy(> 0), θx, θy に対して |G| ≤ 1 を保証し,したがって ADIスキームは無条件に安定であることが分かる.また,1次元 FTCSスキームと 1次元BTCSスキームの,1ステップあたりの誤差の増幅率 GFTCS(∆x,∆t), GBTCS(∆x, ∆t) に対する表現 (3.41),(3.53)と比較すると,
G′ = GBTCS
(∆x,
∆t
2
)× GFTCS
(∆y,
∆t
2
), G′′ = GFTCS
(∆x,
∆t
2
)× GBTCS
(∆y,
∆t
2
), (3.65)
となっていることが分かる.
このように 2次元の ADIスキームは,
• 無条件に安定であること,
• 陰解法でありながら解くべき連立一次方程式の係数が 3重対角行列となり,Thomas法により効率的に解けること,
• 時間・空間ともに 2次の精度を有していること
143 重対角行列の対角線からある数だけ離れた左右両側にもう 1 本ずつ非零の要素が並んでいる.15x と y のどちらを先に陰的に扱うかは,1 ステップごとに変えたほうがよい.
59
から,2次元拡散方程式に対する大変有用なスキームとなっている.
2次元ADIスキームの精神はそのまま 3次元の場合にも拡張することができる.その場合,1完全ステップ ∆t を ∆t/3 ずつのサブステップに分け,各サブステップでは一つの空間方向だけを陰的に取り扱うことになる.ただし,3次元 ADIスキームを 3次元拡散方程式
∂u
∂t= α
(∂2u
∂x2+
∂2u
∂y2+
∂2u
∂z2
)(3.66)
に適用した場合,空間的には 2次精度であるが,時間については 1次精度のスキームとなる.また 2次元ADIが持っていた「無条件に安定」という良い性質も失われ,条件
sx + sy + sz ≤ 32
(3.67)
が満足される場合にのみ安定となる.なおここでは触れないが,3次元 ADI法を改良した手法にDouglas
法と呼ばれる手法がある.16 この手法は 1ステップを 3つのサブステップから構成するADI法に,予測子修正子法的な考えを加味することによって,空間時間ともに 2次精度で,しかも無条件に安定という大変好ましい性質を実現している.
3.5 移流方程式に対する差分法
前節で扱った拡散 (diffusion)と並んで,自然界に普遍的に見られる素過程として移流 (convection も
しくは advection)がある.本節では,クーラン数や風上差分など,移流方程式の差分化に特有な基本的
な概念について簡単に説明する.
3.5.1 FTCSスキーム
ここでは簡単のため,次のような線形の移流方程式 (convection equation)
∂u
∂t+ c
∂u
∂x= 0 (3.68)
を考える. この式は物理的には,ある物理量 u(x, t) が速度 c で伝播することを示している. c が一定で,
−∞ < x < ∞ に対して初期波形が u(x, 0) = f(x) で与えられた場合,この方程式の解析解は
u(x, t) = f(x − c t) (3.69)
で与えられる.
さてこの式に FTCSスキームを適用すると
un+1j − un
j
∆t+ c
unj+1 − un
j−1
2∆x= 0 =⇒ un+1
j = unj − C
2(un
j+1 − unj−1
)(3.70)
となる.ここで
C ≡ c∆t
∆x= c
/∆x
∆t(3.71)
はクーラン数 (Courant number)と呼ばれる. このスキームに von Neumannの安定性解析を適用すると
G = 1 − C
2(eiθ − e−iθ
)= 1 − iC sin θ =⇒ |G|2 = 1 + C2 sin2 θ (3.72)
より,任意の C および θ に対して |G| ≥ 1 となる.すなわち,拡散方程式に対しては条件付きで安定であった FTCSスキームも, 移流方程式に適用すると無条件に不安定なスキームとなってしまう.このように,時間微分や空間微分に対して同じ精神で作った差分スキームでも,対象とする偏微分方程式が異なれ
ば,その安定性はまったく異なったものになるので注意が必要である.16例えば Pozrikidis: Numerical Computation in Science and Engineering (Oxford U.P., 1998), p.548 参照.
60
3.5.2 CTCSスキーム (Leapfrogスキーム)
一方,(3.68)に CTCSスキームを適用すると
un+1j − un−1
j
2∆t+ c
unj+1 − un
j−1
2∆x= 0 =⇒ un+1
j = un−1j − C
(un
j+1 − unj−1
). (3.73)
von Neumannの安定性解析を適用すると,増幅率 G に対する式として
G2 + 2i C sin θ G − 1 = 0 (3.74)
を得る.もし C ≤ 1 なら
G = −iC sin θ ±√
1 − C2 sin2 θ =⇒ |G| = 1. (3.75)
すなわち拡散方程式に対しては無条件に不安定で使い物にならなかった CTCSスキームが, 移流方程式に対しては条件付きで中立安定という使えるスキームになる.
ここで安定性の条件として C ≤ 1 という条件が導かれた.この条件は CTCSスキームに限らず他の差分スキームを移流方程式に適用した際にもよく登場するもので,クーラン・フリードリックス・レヴィ条
件 (Courant-Friedrichs-Lewy condition),略して CFL条件と呼ばれている. クーラン数 C の定義
(3.71)を見ると,CFL条件は,数値計算のために時空間に導入したメッシュ (∆x,∆t) に起因する特徴的な速度 ∆x/∆t が,実際の物理量の伝播速度 c より速くなければならないことを要求している.
3.5.3 移流項に対する風上差分
上述のように,移流方程式 (3.68)は u が c で伝播することを示している.したがって c > 0 の時は左から右へ,c < 0 の時には逆に右から左へ伝わることになる.17 これより c > 0(< 0) の時は着目しているメッシュ点はそれより左 (右)の点の影響を受けると考えられるので,差分近似も左 (右)側のメッシュ点に重みをおいたものを採用するのが,式の性質にかなった近似方法であると考えられる.このような発想から得ら
れた移流項に対する差分法は,上流差分 (upstream differencing)や風上差分 (upwind differencing)
と呼ばれる. 具体的には以下のようになる:18
• 1次精度風上差分法
c∂u
∂x
∣∣∣∣j
=⇒
cj(uj − uj−1)/∆x, (cj > 0)
cj(uj+1 − uj)/∆x, (cj < 0)(3.76)
• 2次精度風上差分法19
c∂u
∂x
∣∣∣∣j
=⇒
cj(3uj − 4uj−1 + uj−2)/2∆x, (cj > 0)
cj(−3uj + 4uj+1 − uj+2)/2∆x, (cj < 0)(3.77)
• 3次精度風上差分法
c∂u
∂x
∣∣∣∣j
=⇒
cj(2uj+1 + 3uj − 6uj−1 + uj−2)/6∆x, (cj > 0)
cj(−uj+2 + 6uj+1 − 3uj − 2uj−1)/6∆x, (cj < 0)(3.78)
17ここでは x 軸が左から右に向かっているものと仮定している.18例えば 河村哲也著「流体解析 I」(朝倉 1996) など参照.19前述の (3.14) 参照.
61
1次精度の風上差分式は
c∂u
∂x
∣∣∣∣j
=⇒ cjuj+1 − uj−1
2∆x− |cj |∆x
2uj+1 − 2uj + uj−1
∆x2(3.79)
と単独の式で書くことができる. この第 1項は (3.22)で見たように 1階微分に対する中心差分近似を表す.また第 2項は風上差分を用いたために加わった項であるが,これはやはり (3.23)が示すように,2階微分∂2u/∂x2 を表現する中心差分に,∆x に比例する係数がかかったものになっている.このことから,1次風上差分を用いると,もともとの方程式にはなかった拡散20 を持ち込むことになる.これは数値粘性とか人
工粘性と呼ばれる. したがって 1次精度風上差分を移流方程式 (3.68)に適用すると,本来なら任意の初期波形が速度 c で定常に伝播しなければならないところが,伝播と共にどんどん波形が拡散してなまってし
まうという現象が起こる.図 3.4, 3.5, 3.6は,(3.68)で伝播速度 c を1とした式に対して,1次精度風上差分を適用した計算例を示す.初期波形としてはガウス的なパルスを与えている.クーラン数 C を一定にし
て ∆x を大きくするほど波形の拡散の程度がひどくなることや,C を大きく取るほど伝播速度の精度が低
下することなどがわかる.
-0.200.20.40.60.811.20 5 10 15 20
t=0t=5t=5(exact)t=10t=10(exact)x
(dx=0.01, C=0.1)
図 3.4: 1次風上差分によるパルスの伝播.実線は t = 5, t = 10 における数値解,点線は対応する時刻の解析解を表す. (∆x = 0.01, C = 0.1)
同様な考察を行うと,2次精度風上差分は ∆x2∂3u/∂x3 に比例する数値分散を,また 3次精度風上差分は ∆x3∂4u/∂x4 に比例する数値拡散を引き起こすことが分かる.
3.5.4 マルチステップ法
移流方程式に対する陽解法の精度を上げる手段の一つとして,一つのステップを,互いに異なる数値手法
で実行されるいくつかのサブステップに分けて実行するということがしばしばなされる.多くの場合,サブ
ステップのうちのいくつかは他のサブステップのための予測子として働き,残りのサブステップがこれを修
正する.ここではこのようなマルチステップ法の例として,衝撃波を含む圧縮性流体の数値計算などに用い
られるマコーマック法 (MacCormack method)を紹介する.
20流体力学の Navier-Stokes 方程式では粘性 (viscosity) に相当する.
62
-0.200.20.40.60.811.20 5 10 15 20
t=0t=5t=5(exact)t=10t=10(exact)x
(dx=0.05, C=0.1)
図 3.5: 図 3.4に同じ.(∆x = 0.05, C = 0.1)
-0.200.20.40.60.811.20 5 10 15 20
t=0t=5t=5(exact)t=10t=10(exact)x
(dx=0.01, C=0.3)
図 3.6: 図 3.4に同じ.(∆x = 0.01, C = 0.3)
63
線形の移流方程式 (3.68)に適用した場合,MacCormack法における 1ステップは,以下のような 2つのサブステップから成る:
第 1サブステップu∗
j − unj
∆t+ c
unj+1 − un
j
∆x= 0, (3.80)
第 2サブステップun+1
j − unj
∆t+ c
12
(un
j+1 − unj
∆x+
u∗j − u∗
j−1
∆x
)= 0. (3.81)
書き換えると
第 1サブステップ u∗j = (1 + C)un
j − Cunj+1, (3.82)
第 2サブステップ un+1j =
12
[un
j + u∗j − C
(u∗
j − u∗j−1
)]. (3.83)
第 1サブステップの予測子の計算では,FTFSスキーム,すなわち時間微分も空間微分も前進差分で近似するスキームが用いられている.一方それを修正する第 2サブステップにおいては,時間はやはり前進差分が用いられているが,空間については前進差分と後退差分の複合型が用いられている.第 1サブステップにおいて前進差分を用いて求められた予測子 u∗
j に対して,第 2サブステップでは逆に後退差分が適用されている点に注意する.21 このスキームは時間空間ともに 2次の精度を有し,|C| ≤ 1 に対して安定である.
MacCormack法は,移流速度 c が一様でないような場合にも有効なスキームであると言われている.保
存形で表現された(非線形)移流方程式22
∂u
∂t+
∂F (u)∂x
= 0 (3.84)
に対するMacCormack法は以下のようになる.
u∗j = un
j − r(Fn
j+1 − Fnj
), un+1
j =12
[un
j + u∗j − r
(F ∗
j − F ∗j−1
)]. (3.85)
ここで r = ∆t/∆x.移流方程式が上のように保存形で表現された場合,MacCormack法の安定性に対するCFL条件は
r
∣∣∣∣dF (u)du
∣∣∣∣max
≤ 1 (3.86)
で与えられる.なおここでは触れないが,上記の陽なMacCormack法の安定特性を大幅に向上させた陰的なMacCormack法も開発されている.23
3.6 線の方法 (Method of Lines)
今まで述べてきた差分スキームでは,いつも時間と空間に関する離散化が同時に行われた.しかし,これ
と別のやり方として,まず空間についてだけ離散化を行って,もとの偏微分方程式を連立の常微分方程式系
に帰着させ,その後それを常微分方程式用の手法で時間について積分するというやり方もある.このよう
な方法は一般に線の方法 (Method of Lines)とか半離散化 (semi-discretization)と呼ばれる. 24
例えば拡散方程式 (3.29)の場合,空間についてのみ離散化し,2階微分係数の近似として 3点による中心差分を用いると
duj
dt= α
uj+1 − 2uj + uj−1
∆x2, uj(0) = u0(j∆x, 0), (j = 1, 2, . . . , N) (3.87)
21予測子と修正子のどちらに前進差分を用いてどちらに後退差分を用いるかは,1 完全ステップごとに逆転させた方が良いとされている.
22非線形な移流方程式では,c が u の関数となる.例えば F = u2/2 なら非粘性の Burgers 方程式を表す.23例えば Fletcher:Computational Techniques for Fluid Dynamics, Vol.2 (Springer-Verlag, 1991), §18.3.1 など参照.24本講義の第 0 章イントロダクションで触れた手法はこの「線の方法」であった.
64
という t についての N 元連立の 1階常微分方程式系の初期値問題を得る.これは,例えば Runge-Kutta法や Adams-Bashforth法など常微分方程式の初期値問題の標準的な解法を用いて解くことができる. もしここで Euler法を用いれば,本章で触れた FTCSスキームと同等のスキームが得られることになる.ただし注意しなければならないことは,ここで扱う常微分方程式系には,すでに空間の離散化 (差分化)に付随する誤差が入っており,完全に正しい式ではなくなっているという点である.
数値計算例を図 3.7に示す.これは連立常微分方程式系 (3.87)を t について積分することにより求めた
拡散方程式の t = 0.3 における数値解と解析解との差の rmsを,時間積分に用いたキザミ ∆t の関数とし
てプロットしたものである.時間積分には 4次の Runge-Kutta法を用い,また他の計算条件としては以前と同様,境界条件は u(0, t) = u(1, t) = 100, 初期条件は u(0, 0) = u(1, 0) = 50, u(x, 0) = 0 (0 < x < 1),α = 1,∆x = 1/32 とした.∆t を細かくして精度を上げようとしてもすぐに飽和状態になってしまい,精
度が上がらない様子が見える.これは Runge-Kutta法の打切り誤差によるものでも,また丸め誤差の集積によるものでもない.単に,空間の差分化をした段階ですでに解いている式 (3.87)が最初の式(偏微分方程式)と異なったものになっており,それをいくら精密に時間積分しても本当の解との差を減らすことはで
きないという事実を反映しているに過ぎない.このように,線の方法を用いる場合には,時間積分のところ
だけに高精度の手法を用いても,必ずしもそれに見合う精度の向上は望めない.
0.02
0.04
0.06
0.08
0.1
10-7 10-6 10-5 0.0001 0.001 0.01
RMS誤差∆t
図 3.7: 線の方法による解の誤差
線の方法では,時間方向の取り扱いと,空間変数に関する取り扱い (離散化)は独立になされるので,空間に関する離散化の手法として差分法を使う必然性はまったくない.むしろこの方法は,空間変数に関する
取り扱いがより精密な,有限要素法やスペクトル法25 などと組み合わせて用いられることが多い.
25共に後述の予定.
65
第4章 重み付き残差法
4.1 偏微分方程式の数値解法(空間の離散化)の分類
• 差分法 (finite difference method)
• 重み付き残差法 (weighted residual method)
– サブドメイン法 (subdomain method)
– 選点法 (collocation method)
– ガラーキン法 (Galerkin method)
∗ 古典的ガラーキン法 (traditional Galerkin method)
∗ 有限要素法 (finite element method)
– スペクトル法(spectral method)1
∗ スペクトル・ガラーキン法∗ スペクトル・タウ法∗ スペクトル・選点法 (擬スペクトル法)
4.2 重み付き残差法 (weighted residual method)
4.2.1 重み付き残差法とは
解きたい微分方程式(偏微分または常微分)を
L(u) = 0 (4.1)
と書く.例えば 1次元拡散方程式なら
L(u) ≡ ∂u
∂t− α
∂2u
∂x2= 0. (4.2)
これに対する近似解もしくは試行解 (trial solution) u(x, t) として
u(x, t) =N∑
n=1
an(t)ϕn(x) (4.3)
のような形を仮定する.ここで,{ϕ1(x), ϕ2(x), · · · } は試行関数 (trial function)と呼ばれる関数系で,自
分が適当に選ぶ.この形の近似解 u(x, t) が本当の解 u(x, t) に「なるべく近くなるように」係数 an(t) (n =1, 2, . . . , N) を決めることを考える.u(x, t) は近似解なので,式 L(u) = 0 に代入しても 0にはならず「おつり」が出る.このおつりを残差 (residual)と呼び,ここでは R(x, t) と書く.すなわち
R(x, t) = L(u). (4.4)1スペクトル法は運用方法で選点法にもガラーキン法にもなる.
66
ここで試行関数とは別に,重み関数 (weight function or test function)と呼ばれる関数系 {w1(x), w2(x), · · · }を用意する.これも自分が適当に選ぶ.そして,重み付き残差法 (weighted residual method)では,N
個の異なる重み関数による重みを付けた残差 R(x, t) の,対象空間領域 D 全体にわたる積分が 0になること,すなわち ∫
D
wm(x)R(x, t) dx = 0, (m = 1, 2, . . . , N) (4.5)
を要求する.重み関数の系 {wm(x)} が一次独立であれば,一つ一つの重み関数 wm(x) が,展開係数 {an}に対する一つずつ独立な条件式を与え,結局 N 個の未知数に対する N 個の方程式が得られる.この操作
により,もとの問題が定常問題であれば,未知定数 {an} に対する代数方程式系が,また非定常問題であれば,時間の関数 {an(t)} に対する常微分方程式系が得られる.
4.2.2 差分法との相違点
1. 差分法では,メッシュ点における関数値 unj = u(j∆x, n∆t) だけが対象となり,メッシュとメッシュ
の間で u(x, t) がどうなっているということはまったく念頭にない.一方,重み付き残差法では,本来メッシュ点という概念はなく,空間領域すべての点での関数値を対象としている.2
2. 差分法では u(x, t) のメッシュ点における値 unj が直接求められる.これに対し,重み付き残差法で
まず求められるのは,近似解を試行関数の一次結合で表現した時の展開係数 {an}であり,本当に知りたい u(x, t) の値を出すにはもう一段階の計算が必要となる.3
4.3 いろいろな重み付き残差法
重み付き残差法には,試行関数と重み関数の選び方によって,さまざまな種類がある.重み関数 {wm(x)}の選び方に着目した場合,以下のようなものがよく知られている.
4.3.1 サブドメイン法 (subdomain method)
対象空間領域を N 個の副領域(サブドメイン) Dm (m = 1, 2, . . . , N) に分割し,重み関数として
wm(x) =
1 (if x ∈ Dm),
0 (otherwise)(4.6)
を採用する.これに対応して,N 個の条件式∫Dm
R(x, t) dx = 0, (m = 1, 2, . . . , N) (4.7)
を得る.サブドメイン Dm(m = 1, 2, . . . , N) 同士は互いに重なる部分があっても構わない.
2しかし,より進歩した重み付き残差法である有限要素法や擬スペクトル法では,再びメッシュという概念が登場する (後述).3ただし,有限要素法では特別な試行関数を採用することにより,また擬スペクトル法では特別な選点を用いることにより,とも
にこの不便は解消されている (後述).
67
4.3.2 選点法 (collocation method)
対象空間領域から N 個の点 xm (m = 1, 2, . . . , N) を選び,重み関数として
wm(x) = δ(x − xm) (4.8)
を採用する.ここで δ(x) はディラックのデルタ関数を示す.これに対応する N 個の条件式は
0 =∫
wm(x)R(x, t) dx =∫
δ(x − xm)R(x, t) dx = R(xm, t), (m = 1, 2, . . . , N) (4.9)
となる.要するに,選点法では,選んだ N 個の点で,試行解 (trial solution)が完全に目的の微分方程式を満足することを要求する.この意味で,重み付き残差法の中では,一番差分法の感覚に近い.
4.3.3 ガラーキン法 (Galerkin method)
ガラーキン法では,重み関数を試行関数と同じファミリーから取る.すなわち,
wm(x) = ϕm(x), (m = 1, 2, . . . , N). (4.10)
また {ϕm(x)} は通常完全系の低次のメンバーから順に使う.この時,残差 R(x) は N → ∞ で完全系のすべてのメンバーと直交することになり,したがって残差は平均の意味で 0に収束することが保証される.ただし,これは必ずしも各点で R(x) = 0 を意味するものではない.
4.4 計算例:定常問題
定常問題の例として,常微分方程式の初期値問題
L(y) =dy(x)dx
− y = 0, y(0) = 1, 0 ≤ x ≤ 1 (4.11)
を考える.もちろん厳密解は y(x) = ex である.残差 R(x) は
R(x) = L(y) =dy(x)dx
− y (4.12)
で与えられる.例えば,試行関数 {ϕn(x)} として x のベキ関数
{ϕn(x)} = {1, x, x2, x3, . . .} (4.13)
を採用すると,試行解の形は
y(x) =N∑
n=0
anxn = a0 + a1x + a2x2 + · · · + aNxN (4.14)
のようになる.ただし,x = 0 での条件より a0 = 1 であり,未知の係数は {a1, a2, . . . , aN} の N 個であ
る.これを (4.12)に代入すると
R(x) =N∑
n=1
nanxn−1 −N∑
n=0
anxn = −1 +N∑
n=1
(nxn−1 − xn
)an. (4.15)
この問題に対して,重み付き残差法の中でも特によく用いられている選点法とガラーキン法を適用する
と以下のようになる.
68
4.4.1 選点法
(4.15)の残差 R(x) を 0にする点として 0 ≤ x ≤ 1 の N 等分点
xm =m
N(m = 1, . . . , N) (4.16)
とすると,係数 {an} に対する条件式は
R(xm) = −1 +N∑
n=1
[n
(m
N
)n−1
−(m
N
)n]
an = 0, (m = 1, . . . , N) (4.17)
となり,{an} に対する連立一次方程式 Cmn
a1
...aN
=
b1
...bN
(4.18)
Cmn = n(m
N
)n−1
−(m
N
)n
, bm = 1 (4.19)
が得られる.
N = 2 の時y(x) = 1 + a1x + a2x
2 (4.20)(1/2 3/40 1
)(a1
a2
)=
(11
)=⇒
(a1
a2
)=
(1/21
)=⇒ y = 1 +
12x + x2 (4.21)
数値解と厳密解 y(x) = ex との違いを rms誤差
rms誤差 =
√∫ 1
0
{y(x) − ex}2dx (4.22)
で評価することにすると,この時 rms誤差 = 1.5 × 10−1 となる.4
N = 3 の時y(x) = 1 + a1x + a2x
2 + a3x3, (4.23) 2/3 5/9 8/27
1/3 8/9 28/270 1 2
a1
a2
a3
=
111
=⇒
a1
a2
a3
=
29/271/31/3
. (4.24)
=⇒ y = 1 +2927
x +13x2 +
13x3, =⇒ rms誤差 = 1.4 × 10−2 (4.25)
N = 4 の時y(x) = 1 + a1x + a2x
2 + a3x3 + a4x
4, (4.26)3/4 7/16 11/64 15/2561/2 3/4 5/8 7/161/4 15/16 81/64 351/2560 1 2 3
a1
a2
a3
a4
=
1111
=⇒
a1
a2
a3
a4
=
403/406107/20324/20316/203
. (4.27)
=⇒ y = 1 +403406
x +107203
x2 +24203
x3 +16203
x4 =⇒ rms誤差 = 1.0 × 10−3 (4.28)
図 4.1に選点法により得られた数値解を示す.4ただし,選点法の精度は代表点の選び方に非常に敏感である.
69
�
���
�
���
�
� ��� ��� ��� ��� �
Collocation Method (y'=y, y(0)=1)
EXP�X.��.��y
(x)
x
図 4.1: 選点法による数値解
4.4.2 ガラーキン法
重み関数は試行関数と同じになるように
wm(x) = ϕm(x) = xm−1, (m = 1, 2, . . . , N) (4.29)
とする.この時,m 番目の重み関数による重みをつけた残差 (4.15)が消えるという式は
N∑n=1
∫ 1
0
(nxn−1 − xn
)xm−1 dx · an =
∫ 1
0
xm−1 dx (m = 1, 2, . . . , N) (4.30)
となる.係数 {an} に対する連立一次方程式は Cmn
a1
...aN
=
b1
...bN
(4.31)
Cmn =∫ 1
0
(nxn+m−2 − xn+m−1
)dx =
[n
n + m − 1xn+m−1 − 1
n + mxn+m
]1
0
=n
n + m − 1− 1
n + m(4.32)
bm =∫ 1
0
xm−1 dx =1m
[xm
]10
=1m
(4.33)
のようになる.5
N = 2 の時y(x) = 1 + a1x + a2x
2, (4.34)
5前の選点法と異なり,ガラーキン法の場合係数行列 Cmn, bm に N が入って来ないので,N を増やして近似の精度を上げる際に,Cmn, bm のすでに計算済みの要素については計算をやり直す必要がない.
70
(1/2 2/31/6 5/12
)(a1
a2
)=
(1
1/2
)=⇒
(a1
a2
)=
(6/76/7
)(4.35)
=⇒ y = 1 +67x +
67x2 =⇒ rms誤差 = 9.7 × 10−3. (4.36)
N = 3 の時y(x) = 1 + a1x + a2x
2 + a3x3, (4.37) 1/2 2/3 3/4
1/6 5/12 11/201/12 3/10 13/30
a1
a2
a3
=
11/21/3
=⇒
a1
a2
a3
=
72/7130/7120/71
(4.38)
=⇒ y = 1 +7271
x +3071
x2 +2071
x3 =⇒ rms誤差 = 5.6 × 10−4 (4.39)
N = 4 の時y(x) = 1 + a1x + a2x
2 + a3x3 + a4x
4, (4.40)1/2 2/3 3/4 4/51/6 5/12 11/20 19/301/12 3/10 13/30 11/211/20 7/30 5/14 25/56
a1
a2
a3
a4
=
1
1/21/31/4
=⇒
a1
a2
a3
a4
=
1000/1001510/1001140/100170/1001
(4.41)
=⇒ y = 1 +10001001
x +5101001
x2 +1401001
x3 +70
1001x4 =⇒ rms誤差 = 2.7 × 10−5 (4.42)
上で述べた選点法とガラーキン法について,項数 N を増やした時の rms誤差の減少をプロットすると図4.2のようになる.縦軸が対数の片対数グラフで直線であるということは,項数 N が増大するときに誤差
が指数関数的に減少することを示している.
�� �
������
�����
����
���
�
� � � � �
RMS?COLLOCATIONRMS?'ALERKIN
rms
erro
r
N (Number of Terms)
図 4.2: 選点法とガラーキン法の rms誤差
71
4.5 計算例:非定常問題
次に以下のような拡散方程式の初期値境界値問題を Galerkin法で解いてみよう.
∂u
∂t=
∂2u
∂x2, u(0, t) = 0, u(1, t) = 1, u(x, 0) = x + sin πx. (4.43)
初期条件および境界条件を考慮して,試行解を
u(x, t) = u0(x) +N∑
n=1
an(t)ϕn(x), u0(x) = x + sin πx (4.44)
と置いてみる.
以前のように単純に
{ϕn} = {x, x2, x3, . . .} (4.45)
としては u(x, t) が境界条件を満たさないので,{ϕn(x)} は
ϕn = xn (1 − x) (n = 1, 2, . . . , N) (4.46)
と取ることにする.6 また初期条件を満足するためには an(0) = 0 でなければならない.
u(x, t) に対する表現 (4.44)を残差
R(x, t) =∂u
∂t− ∂2u
∂x2(4.47)
に代入することにより
R(x, t) = −d2u0
dx2+
N∑n=1
(dan
dtϕn − an
d2ϕn
dx2
)(4.48)
を得る.ここで記述を簡潔にするために
(ϕm, ϕn) ≡∫ 1
0
ϕm(x)ϕn(x) dx (4.49)
により,ϕm(x) と ϕn(x) の内積を定義すると,Galerkin法が要求する式は
(ϕm, R) = 0, (m = 1, . . . , N) (4.50)
すなわちN∑
n=1
(ϕm, ϕn)an =N∑
n=1
(ϕm,
d2ϕn
dx2
)an +
(ϕm,
d2u0
dx2
), (m = 1, . . . , N) (4.51)
となる.ここでは簡単のため dan/dt を an と記した.これは展開係数の時間微分 an に対する連立一次方
程式 Cmn
a1
...aN
=
Dmn
a1
...aN
+
e1
...eN
, (4.52)
6次節およびそこでの脚注も参照.
72
であり,その係数行列は
Cmn = (ϕm, ϕn) =∫ 1
0
(xm − xm+1)(xn − xn+1)dx
=1
m + n + 1+
1m + n + 3
− 2m + n + 2
, (4.53)
Dmn =(
ϕm,d2ϕn
dx2
)=
∫ 1
0
(xm − xm+1){n(n − 1)xn−2 − (n + 1)nxn−1
}dx
= n(n − 1)(
1m + n − 1
− 1m + n
)− (n + 1)n
(1
m + n− 1
m + n + 1
), (4.54)
em =(
ϕm,d2u0
dx2
)= −π2
∫ 1
0
xm(1 − x) sin πx dx (4.55)
で与えられる.各時間ステップにおいてこの連立一次方程式を解いて {an} を求め,それを Runge–Kuttaなど常微分方程式用の手法を用いて数値的に積分することにより,任意時刻の {an(t)} が得られ,それを(4.44)に代入して {u(x, t)} を求めるということになる.
なおこの問題は厳密解
u(x, t) = x + sin πx e−π2t (4.56)
が得られるので,これと比較することにより,数値解の誤差を評価することができる.図 4.3は t = 0.3 における数値解の rms誤差を展開項数 N の関数としてプロットしたものである.また ∂2u/∂x2 の項を 3点の中心差分で評価した差分法についての結果も示した.また時間方向の積分はすべて 4次の Runge-Kutta法を用いて行い,時間キザミは ∆t = 10−6 とした.Galerkin法を使うと,差分法に比べずっと少ない項数で精度を上げることができることがよく分かる.7
�� �
�� �
�� �
������
�����
����
���
� � �� �� �� ��
rms error of numerical solutions of the diffusion equation
FINITE DIFFERENCE'ALERKIN
rms
erro
r
N or jmax
(4th-order Runge-Kutta method for time-integration)
図 4.3: 拡散方程式の数値解の rms誤差
7展開項数の1つおきにしか精度が向上していないように見えるが,これはこの例題の場合,正解が空間変数についてはっきりした偶奇性を持っているためであろうと考えられる.
73
4.6 (古典的)Galerkin法のまとめ
1. Galerkin法は重み付き残差法の一種である.
2. 重み関数 {wm(x)} は試行関数 {ϕn(x)} と同じ関数系から取る.
3. {ϕn(x)} は一次独立でなければならない.
4. {ϕn(x)} は「完全系」の最初の N 個のメンバーであるように選ぶ.
5. {ϕn(x)} は境界条件を満足するように選ぶ.もし最初に選んだ {ϕn(x)} が境界条件を満たさない場合には,上記 (4.46)でやったように,{ϕn(x)} を基にして境界条件を満足するような関数系を新たに構成して,それをあらためて {ϕn(x)} として用いる.8
2. は Galerkin 法の定義であり,Galerkin 法と呼ばれるためには必須な条件である.3. は N 個の未知数
{an} に対する N 個の独立な条件を得るために必要な条件であり,これも必須である.4.は必須ではないが,Galerkin法をより効率的なものにするために好ましい条件である.
(古典的な)Galerkin法はもともと手計算のために考案された手法であり,項数 N が数 1000,数 10000 になることなどは想定していない.したがってそのままの形で,現代の工学的数値計算で要求されているよう
な複雑な問題に適用し,しかも高精度を得ようとすると,次節で述べるようなさまざまな問題点が出てく
る.このような問題点を克服し,大規模計算への適用が可能となるように考案されたのが,より現代的な
Galerkin法であり,その代表的なものに有限要素法やガラーキン的スペクトル法などがある.
4.7 (古典的)Galerkin法の問題点
4.7.1 第 1の問題点:重み関数の一次独立性の悪化
例えば 4.4節の計算例で,Galerkin法の展開項数を増やして,もっと精度を上げることを考える. Cmn
a1
...aN
=
b1
...bN
(4.57)
ここで
Cmn =n
n + m − 1− 1
n + m, bm =
1m
. (4.58)
これで例えば N = 1000 とすると,解くべき連立一次方程式は1 · · · 1000... · · ·
...1.001 × 10−6 · · · 0.500000.999 × 10−6 · · · 0.49975
a1
...a999
a1000
=
1...
1/9991/1000
(4.59)
のようになる.図 4.4は 4.4節の計算例で用いた重み関数 wm(x) = xm,また図 4.5は 4.5節の計算例で用いた重み関数 wm(x) = xm (1− x) のうちいくつかを示したものである. 古典的なGalerkin法では,重み
8{ϕn(x)} が境界条件を満足しない場合,別のやり方もある.すなわち,まず試行解はそのまま {ϕn(x)} の一次結合で表現する.境界条件が NB 個あるとして,そのそれぞれに試行解を代入すると,NB 個の条件式が出てくる.全部で N 個の未知係数 {an} がある場合,残差が N 個のすべての試行関数 (=重み関数)に直交することを要求するかわりに,最初の (N −NB) 個の試行関数だけに直交することを要求することで (N −NB) 個の条件式を得る.境界条件からの NB 個の式と合わせて,結局 N 個の未知係数に対して N 個の式を得る.この手法は Galerkin 法と区別して,タウ法 (tau method) と呼ばれている.
74
���
�
���
���
���
���
�
���
� ��� ��� ��� ��� �
weight function used in exercise(1): wn(x)=xn
x2
X�X��X��
wn(
x)
x
図 4.4: 「計算例:定常問題」で用いた重み関数
-0.05
0
0.05
0.1
0.15
0.2
0.25
0.3
-0.2 0 0.2 0.4 0.6 0.8 1 1.2
Weight function used in exercise(2): wn(x)=xn(1-x)
X�� XX��� XX��� XX���� X
wn(
x)
x
図 4.5: 「計算例:非定常問題」で用いた重み関数
75
関数 (=試行関数)として x のべき関数など簡単な関数系が伝統的によく用いられてきたが,このような関
数系では図 4.5が示すように,m が大きくなると wm−1(x) と wm(x) はほとんど違わなくなり,重み関数の一次独立性がどんどん損なわれていく.その結果,{an} に対する連立一次方程式の係数行列 Cmn の各
行の一次独立性が悪化し,Cmn は次第に特異行列に近くなり,(4.57)は解けない連立一次方程式に近づいていく.
4.7.2 第 2の問題点:係数行列の大型化に伴う計算量の増加
4.4節の計算例で見たように,定常な線形問題の場合には,Galerkin法は {an} に対する連立一次方程式 Cmn
a1
...aN
=
b1
...bN
(4.60)
を解くことに帰着する.一方,4.5の計算例のような非定常な線形問題の場合には,各時間ステップにおいて {an} に対する連立一次方程式 Cmn
a1
...aN
=
Dmn
a1
...aN
+
e1
...eN
(4.61)
を解き,その解に基づいて Runge-Kutta法など常微分方程式用の手法を用いて時間発展を追跡することになる.係数行列 C, D は通常密行列で,これらを構成するだけで N2 に比例する計算量が必要となる.ま
た上記のような C を係数行列とする連立一次方程式を解くのに,例えば標準的な LU分解に基づく直接解法9 を採用するならば,LU分解の部分だけで N3/3 程度の演算回数が必要となる.(4.61)の場合 C は定
数行列なので,LU分解さえ最初に一度やっておけば各時間ステップで必要となる計算量は N2 程度で済ま
すことができる.
しかし方程式が非線形項を含むような場合には状況は格段に悪くなる.例として Burgers方程式10
∂u
∂t+ u
∂u
∂x− ∂2u
∂x2= 0 (4.62)
の解の時間発展を Galerkin法で追跡する場合を考えてみよう.試行解を
u(x, t) =N∑
n=1
an(t)ϕn(x) (4.63)
として (4.62)に代入すると,残差に対する表現は
R(x, t) =N∑
n=1
anϕn +
(N∑
n=1
anϕn
)(N∑
l=1
aldϕl
dx
)−
(N∑
n=1
and2ϕn
dx2
)(4.64)
となる.Galerkin法が与える方程式系の m 番目の式 (ϕm, R) = 0 は
N∑n=1
(ϕm, ϕn)an = −N∑
n=1
N∑l=1
(ϕm, ϕn
dϕl
dx
)anal +
N∑n=1
(ϕm,
d2ϕn
dx2
)an, (m = 1, . . . , N) (4.65)
9本講義第 7 章で取り上げる予定.10Burgers 方程式は,流体力学のもっとも基礎的な方程式である Navier-Stokes 方程式を,その重要なファクターである非線形な移流効果と拡散効果を残したまま 1 次元化したモデル方程式として知られている.また粘性や熱伝導などの散逸効果を考慮した場合の,有限振幅音波 (衝撃波も含む) の 1 次元伝播を記述する方程式にもなっている.
76
となり,全体では Cmn
a1
...aN
=
b1
...bN
(4.66)
のような {an} に対する連立一次方程式となる.ここで,Cmn = (ϕm, ϕn), また bm は (4.65) の右辺全体を表す.仮に試行関数の内積
(ϕm, ϕn
dϕl
dx
)を記憶しておけたとしても,(4.65)の右辺第 1項を一回計算する
のに N3 に比例する計算量が必要となる.この計算は各時間ステップで必要になるので,総計算量はほぼ
N3 と時間ステップ数の積に比例して増加していく.現実的には N が少し大きくなると,(ϕm, ϕn
dϕl
dx
)を
記憶しておくことすらかなり困難になる.例えば N = 1000 というかなり控えめな項数の場合を考えても,倍精度で記憶するとなると 8バイト× 10003 ≈ 8ギガバイト 程度のメモリーが必要ということになる.これを記憶しておくことができなければ各時間ステップでいちいち計算かハードディスクから呼び出すこと
になり,どちらにしてもより一層計算量(時間)が増大する.これは非線形性としては最低次である 2次の非線形項がある場合の話であるが,より高次の,例えば 3次,4次の非線形項が入っていれば,計算量は最低でも N4,N5 に比例して増大していくことになる.
4.7.3 第 3の問題点:多次元化,複雑形状
古典的なGalerkin法が成功を収めてきた理由の一つは,境界条件を満足し,しかも完全系をなすような関数系を見つけることができ,それを試行関数として採用してきたことにある.しかし,今日われわれが直
面するより現実的な問題においては,対象領域の形状はかなり複雑であり,多くの場合その境界は座標系の
「座標線」(座標系のうちのある座標が一定値であるような線 or面)と一致してはいない.そのような状況のもとで,問題が要求する境界条件を満足し,しかも完全系をなすような試行関数系 {ϕn(x)} を構成するのは現実的には不可能である.
4.7.4 第 4の問題点: Galerkin法の間接性
メッシュ点における関数値 u(xj) を直接対象とする差分法に対して,Galerkin法でまず求められるのは試行解の展開係数 {an} であり,本当に知りたい関数値 u(x) はその後で
u(x) =N∑
n=1
anϕn(x) (4.67)
から求めなければならず,一段階余計な計算が必要となる.
上記挙げた4つの問題点のうち,最初の問題点は「解けるか解けないか」に関わる本質的な問題点であ
り,あとの3つは主に計算量や有効性に関連する問題点である.次章では,有限要素法の導入により,これ
らの問題点がすべて解消,もしくは軽減されていく様子を見ていくことにする.
77
第5章 有限要素法入門
本章では有限要素法についての入門的解説を行う.まず,前章末にあげた古典的 Galerkin法のさまざまな問題点が,有限要素法の導入によりどのように解決されていくかという点から話を始めて,有限要素法
の基本的な考え方や手法を概説していく.
本章の議論のうち最初の §5.1では,「有限要素法はGalerkin法の一つ」という立場に立って,前章で展開した重み付き残差法の一般論にそのまま添う形で話を進めているので,通常の有限要素法の導入法とは多
少異なるものになっている.より実際に近い取り扱い法については,後半の §5.2や §5.3で触れる.
なお,有限要素法の定式化の方法には,ここで議論する Galerkin法の一種 (したがって重み付き残差法の一種)としての定式化のほかに,変分原理に基礎をおく方法がある.しかし後者の立場では,解こうとしている方程式の解が極値を与えるような,都合のよい汎関数の存在が要求される.ここでは有限要素法を
より適用範囲の広いものとして扱うために,Galerkin法としての定式化を採用した.
5.1 古典的Galerkin法の改良
5.1.1 展開係数への関数値の採用
有限要素法では,空間に節とかノード (node)と呼ばれる離散点を設定する.そして試行解を構成する時
の展開係数 {an} として,各ノードにおける関数値 {uj} を直接採用する.すなわち,試行解として
u(x) =N∑
j=1
ujϕj(x) (5.1)
の形を仮定する.このようにすることにより,問題が解けた時点で {uj} が直接求まっており,展開係数から具体的な関数値を出すというプロセスが必要なくなる(問題点 4「Galerkin法の間接性」の解消).
ただし,解をこのような形に仮定できるためには,試行関数 ϕj(x) (j = 1, . . . , N) は
ϕj(x) =
1 at x = xj
0 at x = xi (i = j)(5.2)
という条件を満たしていなければならない1.x のべき関数 {xn} など古典的Galerkin法で用いられてきた試行関数では,ある試行関数が特定の空間点と結びついているというような感覚は全くなかった.一方,有
限要素法で用いられる試行関数は (5.2)が示すように,N 個の試行関数の中で,第 j ノード xj で 0 でない値を持つものは,唯一 ϕj(x) だけであり,これにより「一つ一つの試行関数 ϕj(x)」と「一つ一つのノード xj」の間に明確な対応関係が生じている.またこの試行関数とノードの対応関係は,前章で触れた問題
点 1 「重み関数の一次独立性の悪化」も同時に解消してくれる.
5.1.2 試行関数の局在性
古典的Galerkin法で用いられてきた試行関数 ϕj(x) は,いつも計算領域全体にわたって 0 でない値を取るグローバルな関数であったが,有限要素法では試行関数 ϕj(x) として,第 j ノードの近傍だけで 0 でな
1この段階では,ノードとノードの間はどうなっていてもいい.
78
い値を取るような,空間的に局在した関数を用いる (以下の §5.1.4参照).
後の計算例で分かるように,試行関数のこの空間的な局在性が,展開係数 {uj} もしくはその時間微分{uj} に対する連立方程式の係数行列を,古典的Galerkin法の時のような密行列から,対角成分の近くにだけ 0 でない成分を持つ帯行列に変え,その結果計算量の大幅な削減を可能にする(問題点 2「係数行列の大型化に伴う計算量の増加」の解消).同時にまた,この試行関数の局在性は,多次元複雑形状領域への適
用を可能にする要因にもなっている(問題点 3「多次元化,複雑形状への対応の困難さ」の解消).
5.1.3 「要素」という概念
有限要素法は重み付き残差法の一種であり,そこでは残差 R(x) の重み付き平均,すなわち残差と重み関
数との内積∫
D
ϕj(x)R(x) dx が本質的な役割を果たす.2 したがって,メッシュ点そのものが中心的役割を
果たした差分法と異なり,重み付き残差法(したがって有限要素法)においては,メッシュ点 (今の場合はノード)ではなく,積分に寄与するような有限な測度(長さ or 面積 or 体積)を持つ領域が中心的役割を果たすことになる.有限要素法では,計算領域は要素 (element)と呼ばれる多くの小領域の集まりに分割さ
れ,計算領域全体にわたる積分は各要素についての積分の総和として表現される.
例えば 1次元問題の場合,まず対象区間全体をいくつかの要素に分割する.要素とノードの関係はさまざまありうる.もっとも単純なやり方は,各要素の両端をノードとして採用するやり方で1次要素 (linear
element)と呼ばれる.もう少し面倒だがその分高精度が得られるやり方は,各要素の両端だけでなく,そ
の内部にもう一点ずつノードを追加するもので,これは 2次要素 (quadratic element)と呼ばれる.1次元 2次要素の場合,ノード数は要素数の約2倍となる.以下に述べるように通常,1次要素に対しては試行関数 ϕj(x) も 1次の区分的多項式,また 2次要素に対しては 2次の区分的多項式が用いられる.
5.1.4 試行関数の具体形
有限要素法では ϕj(x) としては,低次 (通常は 1次か 2次)の区分的多項式を採用する.1次元1次要素の場合,(5.2)及び §5.1.2で述べた ϕj(x) の局在性と考え合わせて, ϕj(x) として
ϕj(x) =
0 for x < xj−1,
x − xj−1
xj − xj−1for xj−1 ≤ x ≤ xj
xj+1 − x
xj+1 − xjfor xj ≤ x ≤ xj+1
0 for x > xj+1
(5.3)
で表される局在化した区分的 1次関数を採用する (図 5.1参照).
ノードではなく,ある要素,例えばノード xj−1 と xj で挟まれた要素 j に着目して見ると,そこで 0でない値を持つ試行関数は,この要素に所属する2つのノード xj−1,xj に付随する試行関数 ϕj−1(x),ϕj(x)の 2つだけであり,したがってこの要素内では (5.1)の試行解 u(x) はこれら 2つの試行関数の一次結合
u(x) = uj−1ϕj−1(x) + ujϕj(x) (5.4)
となる.簡単に言えば,要素 j 内での u(x) を,左端での値 uj−1 と右端での値 uj を直線で結んだ1次関
数で近似的に表現しようとしていることになる.3 ここで重要なのは,ある要素内の u(x) の振舞いは,そ
2ここで重み関数が ϕj(x) となっているのは,有限要素法が Galerkin 法の一種だから.3これは 1 次補間 (linear interpolation) と呼ばれる.
79
�
φ j (x)
x
xj-2 xj-1xj
xj+1 xj+2
φj φj+1
element J element J+1
φj-1
図 5.1: 1次補間関数 ϕj
の要素に所属するノードにおける u の値だけで決定されており,別の要素に属するノードにおける u の値
にはまったく依存していないという点である.これはすべての有限要素法が共通に持っている重要な性質で
ある.
ϕj(x) の局在性より,ϕj(x) を重み関数とする重み付き残差方程式∫
D
ϕj(x)R(x) dx = 0 には,第 j 要
素および第 (j + 1) 要素の2つからのみゼロでない寄与があり,したがってその結果得られる代数方程式は,3つのノードにおける未知量 uj−1, uj , uj+1 のみを含む.これらをすべて連立させて解くことにより,すべ
てのノードにおける関数値 {uj} が求められると言うことになる.4
2次要素の場合には,ϕj(x) の形は,第 j ノードが,その所属する要素の左端か,右端か,内点かによっ
て図 5.2に示すようになる.ある要素において 0でない値を持つ試行関数は,やはりその要素に属するノードに対応した 3つだけである.例えば図 5.2のように,xj−1 ≤ x ≤ xj+1 の範囲が要素 Bに対応している場合,要素 Bにおいて 0でない値を持つ試行関数は,ϕj−1(x), ϕj(x), ϕj+1(x) の 3つであり,要素 B内におけるそれらの具体的な関数形は,Lagrange補間多項式を用いて,それぞれ
ϕj−1(x) =(x − xj)(x − xj+1)
(xj−1 − xj)(xj−1 − xj+1), (5.5)
ϕj(x) =(x − xj−1)(x − xj+1)
(xj − xj−1)(xj − xj+1), (5.6)
ϕj+1(x) =(x − xj−1)(x − xj)
(xj+1 − xj−1)(xj+1 − xj), (5.7)
で与えられる.またこの要素内では試行解 u(x) はこれら 3つの試行関数の一次結合として
u(x) = uj−1ϕj−1(x) + ujϕj(x) + uj+1ϕj+1(x) (5.8)
のように表現される.言い換えれば,この要素内での u(x) を,(xj−1, uj−1), (xj , uj), (xj+1, uj+1) の3点を通る2次関数として近似的したことになる.1次要素の場合と同様,やはりある要素における u(x) の振舞いは,その要素に属するノードにおける u の値のみに依存している.
4例えば以下の計算例の (5.24) 参照.
80
���
�
���
���
���
���
�
���
��� φJ �φJφJ��
φ j (x)
mesh number
j j+1 j+2j-1j-2j-3
element Belement A
図 5.2: 2次補間関数 ϕj
ϕj−1 や ϕj+1 など (2次)要素の端点に対応する試行関数を重み関数として採用した重み付き残差方程式は,それぞれ j − 3 から j + 1, j − 1 から j + 3 の 5つのノードにおける未知の関数値 u がからむ代数方
程式を与え,ϕj のようなノードの内点に対応する試行関数を重み関数とする重み付き残差方程式は,j − 1から j + 1 の 3つのノードにおける u がからむ代数方程式を与える.これらをすべて連立させて解くこと
により,すべてのノードにおける関数値 {uj} が決まる.5
5.1.5 例題
前章の §4.4で古典的 Galerkin法を用いて解いた常微分方程式の初期値問題
du
dx= u, 0 ≤ x ≤ 1, u(0) = 1 (5.9)
を 1次補間を用いた有限要素法で解いてみよう.ただし,この例題では,「有限要素法はGalerkin法の一種」という第 4章の立場が明確になるようなやり方で問題を解いており,「要素」という概念が十分には活用されていないので,その点注意されたい.次節では,実際の有限要素法の運用方法により近い形での解法を
示す.
まず試行解として
u(x) =N∑
j=0
ujϕj(x) (5.10)
と仮定する.ここで uj は第 j ノードにおける数値解の値,ϕj(x) はそのノードに対応する試行関数で,ここでは 1次補間関数を用いるものとする.6
最初に,以下の計算を簡単にするために各要素において,要素座標 (element-based coordinate)とい
う局所的な座標 ξ を導入する.1次元1次要素の場合ならば,各要素の左端で ξ = −1,右端で ξ = 1 とな5ただし,次節で示すように,実際の有限要素法の運用においては,このように一つ一つの ϕj(x) と残差 R(x) の内積が 0になる
ことを要求する代わりに,これと同等ではあるが,{ϕj(x)} の任意の一次結合としてただ一つの重み関数 w(x) を考え,それと R(x)の内積が 0 になることを要求する.
6x0 = 0, xN = 1 としている.ノード間隔は等間隔でなくてもいい.
81
るような座標 ξ を x からの線形変換によって導入し,試行関数も ξ の関数として表現する.例えば第 m
要素 (xm−1 ≤ x ≤ xm) での要素座標 ξ は
ξ =2
[x − 1
2 (xm−1 + xm)]
∆m, ∆m ≡ xm − xm−1 (5.11)
で与えられ,この第 m 要素で 0でない2つの試行関数 ϕm−1, ϕm は ξ の関数として,それぞれ
ϕm−1(ξ) =12(1 − ξ), ϕm(ξ) =
12(1 + ξ), (5.12)
と表される.
N 個の重み関数 ϕm(x) (m = 1, . . . N) と残差との内積より,N 個の条件式 (重み付き残差方程式)
N∑j=0
(ϕm,
dϕj
dx
)uj −
N∑j=0
(ϕm, ϕj)uj = 0, (m = 1, 2, . . . , N) (5.13)
を得る.ϕm(x) は 要素 m と要素 (m + 1) 以外では値を持たないので,内積に寄与があるのはこれらの 2つの要素だけからである.要素座標を用いてそれぞれを評価すると・・・・
• 要素 m からの寄与
{ϕj} の中で要素 m において 0でない値を持つのは j = m − 1 と j = m だけ.
⋄ j = m − 1: ∫ xm
xm−1
ϕm(x)ϕm−1(x) dx =∆m
2
∫ 1
−1
12(1 + ξ)
12(1 − ξ) dξ =
∆m
6, (5.14)∫ xm
xm−1
ϕm(x)dϕm−1(x)
dxdx =
∆m
2
∫ 1
−1
12(1 + ξ)
(− 1
∆m
)dξ = −1
2(5.15)
⋄ j = m: ∫ xm
xm−1
ϕm(x)ϕm(x) dx =∆m
2
∫ 1
−1
12(1 + ξ)
12(1 + ξ) dξ =
∆m
3, (5.16)∫ xm
xm−1
ϕm(x)dϕm(x)
dxdx =
∆m
2
∫ 1
−1
12(1 + ξ)
(1
∆m
)dξ =
12
(5.17)
• 要素 (m + 1) からの寄与
{ϕj} の中で要素 (m + 1) において 0でない値を持つのは j = m と j = m + 1 だけ.
⋄ j = m: ∫ xm+1
xm
ϕm(x)ϕm(x) dx =∆m+1
2
∫ 1
−1
12(1 − ξ)
12(1 − ξ) dξ =
∆m+1
3, (5.18)∫ xm+1
xm
ϕm(x)dϕm(x)
dxdx =
∆m+1
2
∫ 1
−1
12(1 − ξ)
(− 1
∆m+1
)dξ = −1
2(5.19)
⋄ j = m + 1: ∫ xm+1
xm
ϕm(x)ϕm+1(x) dx =∆m+1
2
∫ 1
−1
12(1 − ξ)
12(1 + ξ) dξ =
∆m+1
6, (5.20)∫ xm+1
xm
ϕm(x)dϕm+1(x)
dxdx =
∆m+1
2
∫ 1
−1
12(1 − ξ)
(1
∆m+1
)dξ =
12
(5.21)
82
以上の結果,m 番目の重み付き残差方程式(m = 1, 2, . . . , N − 1)は(−1
2− ∆m
6
)um−1 −
(∆m + ∆m+1
3
)um +
(12− ∆m+1
6
)um+1 = 0 (5.22)
となる.ただし第 N 番目の式だけは,要素 (N + 1) からの寄与がないので,(−1
2− ∆N
6
)uN−1 +
(12− ∆N
3
)uN = 0 (5.23)
となる.境界条件 u0 = 1 を考慮すると,最終的に解くべき連立一次方程式
−∆1+∆2
312 − ∆2
6...
. . ....
......
· · · − 12 − ∆m
6 −∆m+∆m+13
12 − ∆m+1
6 · · ·...
......
. . ....
· · · · · · · · · − 12 − ∆N
612 − ∆N
3
u1
...um
...uN
=
12 + ∆1
6
0......0
(5.24)
が得られる.
解くべき連立一次方程式の係数行列が,古典的なGalerkin法の場合のように密行列とはならずに,帯行列 (3重対角)になったのは,試行関数 (=重み関数)の局在性のおかげである.このような 3重対角行列を係数行列とする連立一次方程式は,§3.3の Thomasアルゴリズムにより,約 5N 回の演算で効率よく解く
ことができる.密行列の場合の代表的な直接解法である LU分解 (約 N3/3 回の演算回数)を用いる方法と比べると,大幅なスピードアップが期待できる.ただし,有限要素法では「区分的多項式」というたちの
悪い試行関数を用いて解を表現しているので,同じ精度の解を求めるために必要な項の数は,一般に古典
的 Galerkin法と比べるとかなり多くなる.図 5.3は,有限要素法によって得られた数値解に含まれる rms誤差とノード数の関係を,上の例題の場合について示したものである.一般に一次補間関数を用いた有限
要素法による数値解の誤差は,空間キザミ ∆x の 2乗に比例して減少するとされているが,確かにそのような振舞を確認することができる.7 §4.2でまったく同じ例題を x のべき関数を試行関数とする古典的な
Galerkin法を用いて解いたが,そこでは数値解に含まれる誤差が展開項数 N の増加に伴って指数関数的に
減少したことを思い出してもらいたい.この例題の場合,独立変数が x 一つであり,また境界条件が片側
だけ (x = 0)で与えられているので,常微分方程式の解法を使って問題を解くこともできる.図ではそのような立場から Euler法および修正 Euler法を用いて得られた結果も合せて示している.
5.2 実際に近い解法手順 (1) 1次元問題
前節では,有限要素法は Galerkin法の一種であるという側面や,また有限要素法の導入により,古典的Galerkin法を大規模計算に適用した際に生じ得る種々の問題点がどのように解消されるのかという側面を強調するあまり,解法手順が実際の有限要素法の運用方法とはかなり異なったものになった嫌いがある.本
節および次節では,工学的問題に広く現われる Poisson方程式を題材として,より実際に近い運用法及びそこで用いられる手法などを紹介する.
5.2.1 重み付き残差方程式
まずは例として1次元の Poisson方程式の境界値問題
d2u(x)dx2
= f(x) (0 ≤ x ≤ 1), u(0) = α,du
dx
∣∣∣∣x=1
= β (5.25)
72 次の補間関数を用いた場合は ∆x3 に比例する.
83
0.0001
0.001
0.01
0.1
1
1 10 100
RMS?FEMRMS?EULERRMS?IMP
RM
S e
rror
N
図 5.3: 有限要素法による数値解の rms誤差 vs. ノード数
を有限要素法で解くことを考えよう.
領域 0 ≤ x ≤ 1 を N 個の要素に分割し,試行解として
u(x) =N∑
j=0
ujϕj(x) (5.26)
と仮定する.ここで uj は第 j ノードにおける数値解の値,ϕj(x) はそのノードに対応する試行関数で,ここでは 1次補間関数 (5.3)を用いるものとする.
古典的な Galerkin法の手続きでは, (N + 1) 個の重み関数 ϕj(x) (j = 0, 1, . . . N) と残差 R(x) との内積から (N + 1) 個の重み付き残差方程式を出したのであるが,有限要素法では (N + 1) 個の重み関数の任意の 1次結合からなるただ一つの重み関数 w(x) を
w(x) =N∑
j=0
wjϕj(x) (5.27)
により導入する.w(x) は任意であるが,u(x) の値が陽に指定されている境界8 においては 0になるものとする.u(x) に対する表現 (5.26)と比べると,wj (j = 1, . . . N) は各ノードにおける重み関数 w(x) の値を表していることが分かる.この時,重み付き残差方程式はただ一つの式∫ 1
0
w
(d2u
dx2− f
)dx = 0 (5.28)
となる.
5.2.2 弱形式化
(5.28)を部分積分すると [w
du
dx
]1
0
−∫ 1
0
dw
dx
du
dxdx −
∫ 1
0
wf dx = 0, (5.29)
8今の問題では x = 0 がそれに当たる
84
ここで境界条件
w(0) = 0,du
dx
∣∣∣∣x=1
= β (5.30)
を考慮すると ∫ 1
0
dw
dx
du
dxdx +
∫ 1
0
wf dx − βw(1) = 0 (5.31)
を得る.逆に,w(0) = 0 となる任意の関数 w(x) に対して (5.31)を満足し,かつ境界条件 u(0) = α を満
たす関数 u(x) は,十分な微分可能性を持っていれば,それは境界値問題 (5.25)の解である.(5.31)はもともとの境界値問題 (5.25)の弱形式 (weak form)と呼ばれる.この名前は関数 u(x) に要求される微分可能性が弱いことに由来する.すなわち,もとの微分方程式では u(x) は 2回微分可能な関数である必要があるが,弱形式 (5.31)では 1回微分可能であればいい.したがって試行関数としても方程式が要求するより低次の微分可能性しか持たないような関数を使うことができる.有限要素法で微分方程式の境界値問題を解
く場合には,このように弱形式がその基礎として用いられる.
また上の例でも分かるように,境界条件は以下の 2種類に大別される.
1. 基本境界条件 (essential boundary condition) 9
上の例題の x = 0 での条件のように,解 u(x) の値そのものが与えられているような境界条件.そこでは重み関数 w(x) はつねに 0とされるため,このタイプの境界条件は重み付き残差方程式には組み込まれない.したがって,試行解 u(x) がその条件を満足するように自分で操作する必要がある.
2. 自然境界条件 (natural boundary condition) 10
上の例の x = 1 での条件のように,u の微分値が与えられる境界条件.ここでは w(x) は 0ではなく,したがってその条件は自動的に重み付き残差方程式の中に組み込まれる.
5.2.3 要素方程式の導出
上の問題に一次要素に基づく有限要素法を適用しよう.まず対象空間 0 ≤ x ≤ 1 を (N + 1) 個のノード
0 = x0 < x1 < · · · < xN = 1 (5.32)
により N 個の要素に分割する.隣り合ったノード i と j (= i + 1) に挟まれた要素 e に着目しよう.(5.4)で示したように,e 内では u は以下のように 2項の和として表現される.11
ue(x) = uiϕi(x) + ujϕj(x) = uiNi(ξ) + ujNj(ξ) = ⟨Ni(ξ) Nj(ξ)⟩
(ui
uj
). (5.33)
ここで ξ は前節 (5.11)で導入した要素座標で,
ξ = 2[x − 1
2(xi + xj)
]/∆e, ∆e = xj − xi (5.34)
で定義され,xi ≤ x ≤ xj が −1 ≤ ξ ≤ 1 に対応する.また Ni(ξ), Nj(ξ) はそれぞれ
Ni(ξ) =12(1 − ξ), Nj(ξ) =
12(1 + ξ) (5.35)
で与えられる (図 5.4 参照).Ni(ξ), Nj(ξ) は形状関数 (shape function),また ue(x) は要素補間関数(element interpolation function)と呼ばれる.ue(x) をすべての要素についてつなげたものが試行解
9より一般的にはディリクレ (Dirichlet) 境界条件と呼ばれる.10より一般的にはノイマン (Neumann) 境界条件と呼ばれる.11有限要素法では,試行関数はよく Nj(x) などと書かれる.ここでは試行関数 ϕj(x) を要素座標 ξ で表現したものを Nj(ξ) と書くことにする.
85
図 5.4: 1次元形状関数
u(x) となる.要素 e における重み関数 we(x) も同様に,要素の両端での値 wi, wj と形状関数 Ni(ξ), Nj(ξ)を用いて
we(x) = wiNi(ξ) + wjNj(ξ) = ⟨Ni(ξ) Nj(ξ)⟩
(wi
wj
)(5.36)
と表される.
弱形式 (5.31)に現われる全領域にわたる積分は
∑e
(∫ 1
−1
dwe
dx
due
dx
dx
dξdξ
)+
∑e
(∫ 1
−1
wefdx
dξdξ
)− wNβ = 0 (5.37)
のように各要素からの寄与の総和として計算される.ここで
due
dx=
⟨dNi(ξ)
dx
dNj(ξ)dx
⟩(ui
uj
)= ⟨−1/∆e 1/∆e⟩
(ui
uj
), (5.38)
同様にdwe
dx= ⟨−1/∆e 1/∆e⟩
(wi
wj
)= ⟨wi wj⟩
(−1/∆e
1/∆e
). (5.39)
またソース項 f(x) も u や w と同様に
f(ξ) = ⟨Ni Nj⟩
(fi
fj
)(5.40)
と表す.12
したがって ∫ 1
−1
dwe
dx
due
dx
dx
dξdξ = ⟨wi wj⟩
∫ 1
−1
(−1/∆e
1/∆e
)⟨−1/∆e 1/∆e⟩
(ui
uj
)∆e
2dξ
= ⟨wi wj⟩1
∆e
[1 −1−1 1
](ui
uj
), (5.41)
12f(x) は既知関数で,すべての x についてその値は分かるが,これだけを精密に扱ってもしかたないので,通常はノードでの値のみを使って,未知関数の u(x) と同じレベルの補間近似式で表現する.
86
∫ 1
−1
wefdx
dξdξ = ⟨wi wj⟩
∫ 1
−1
(Ni
Nj
)⟨Ni Nj⟩
(fi
fj
)∆e
2dξ
= ⟨wi wj⟩∆e
8
[ ∫ 1
−1(1 − ξ)2 dξ
∫ 1
−1(1 − ξ)(1 + ξ) dξ∫ 1
−1(1 + ξ)(1 − ξ) dξ
∫ 1
−1(1 + ξ)2 dξ
] (fi
fj
)
= ⟨wi wj⟩∆e
[1/3 1/61/6 1/3
](fi
fj
). (5.42)
5.2.4 全体方程式の組み立て
以上により要素方程式,すなわち各要素からの寄与分が計算できたので,これをまとめて領域全体のノー
ドにおける関数値に対する式である全体方程式を構成する.例えば,対象領域 0 ≤ x ≤ 1 を 3つの要素に等分配する場合を考える.したがって ∆e = ∆ = 1/3.4つのノードにおける u(x) と w(x) の値をそれぞれ一つのベクトルとして
⟨u0 u1 u2 u3⟩ , ⟨w0 w1 w2 w3⟩ (5.43)
とする.重み付き残差方程式 (5.37)の左辺に対する各要素からの寄与を別々に書くと・・・
【第1要素】
⟨w0 w1 w2 w3⟩
1∆
1 −1 0 0
−1 1 0 00 0 0 00 0 0 0
u0
u1
u2
u3
+ ∆
1/3 1/6 0 01/6 1/3 0 0
0 0 0 00 0 0 0
f0
f1
f2
f3
, (5.44)
【第2要素】
⟨w0 w1 w2 w3⟩
1∆
0 0 0 00 1 −1 00 −1 1 00 0 0 0
u0
u1
u2
u3
+ ∆
0 0 0 00 1/3 1/6 00 1/6 1/3 00 0 0 0
f0
f1
f2
f3
, (5.45)
【第3要素】
⟨w0 w1 w2 w3⟩
1∆
0 0 0 00 0 0 00 0 1 −10 0 −1 1
u0
u1
u2
u3
+ ∆
0 0 0 00 0 0 00 0 1/3 1/60 0 1/6 1/3
f0
f1
f2
f3
−
000β
.
(5.46)
各要素からの寄与をすべて組合せることにより,(5.37)の残差方程式に対応する連立一次方程式
⟨w0 w1 w2 w3⟩
1∆
1 −1 0 0−1 2 −1 00 −1 2 −10 0 −1 1
u0
u1
u2
u3
+ ∆
F0
F1
F2
F3
−
000β
= 0 (5.47)
を得る.ただし F0
F1
F2
F3
=
1/3 1/6 0 01/6 2/3 1/6 00 1/6 2/3 1/60 0 1/6 1/3
f0
f1
f2
f3
. (5.48)
87
5.2.5 境界条件の考慮
ここで境界条件 w0 = 0, u0 = α を考慮すると,
⟨w1 w2 w3⟩
1∆
−1 2 −1 00 −1 2 −10 0 −1 1
α
u1
u2
u3
+ ∆
F1
F2
F3
−
00β
= 0. (5.49)
これが任意の < w1 w2 w3 > に対して成り立つための条件として,最終的に < u1 u2 u3 > に対する連立
一次方程式
1∆
2 −1 0−1 2 −10 −1 1
u1
u2
u3
= −∆
F1
F2
F3
+
00β
− α
∆
−100
(5.50)
を得る.例えば f が一定の場合,< F1 F2 F3 >= f < 1 1 1/2 > となり, 2 −1 0−1 2 −10 −1 1
u1
u2
u3
= −(
13
)2
f
11
1/2
+(
13
) 00β
+
α
00
=
−f/9 + α
−f/9−f/18 + β/3
.
(5.51)これを解いて u1
u2
u3
=
α + β/3 − 5f/18α + 2β/3 − 4f/9
α + β − f/2
(5.52)
を得る.ちなみに,この時の解析解は
u(x) =12fx2 + (β − f)x + α (5.53)
であり,上の有限要素法による数値解の3つのノード x = 1/3, 2/3, 1 における値 (5.52)は,これらの座標における解析解の値と完全に一致している.13
5.3 実際に近い解法手順 (2) 多次元・複雑形状領域
5.3.1 問題設定
次に 2次元 Poisson方程式∂2u
∂x2+
∂2u
∂y2= f(x, y) (x, y) ∈ R (5.54)
の境界値問題を考える.境界 Γ (R の周囲)のうち,Γ1 の部分では u(x, y) 自身の値が関数 α(x, y) で,また Γ2 の部分では Γ に直角方向の微分係数 ∂u/∂n の値が関数 β(x, y) で指定されているものとする.(図5.5参照)
5.3.2 弱形式化
重み関数 w(x, y) を導入する.基本境界 Γ1 上では,w には
w(x, y) = 0 on Γ1 (5.55)13試行解は区分的一次関数なので,もちろんノードとノードの間では,解析解とは一致していない.
88
なる条件が課される.
任意のスカラー場 f(x, y) 及びベクトル場 v(x, y) に対して
div (fv) = fdiv v + grad f · v (5.56)
が成り立つので
w
(∂2u
∂x2+
∂2u
∂y2
)= w div (grad u) = div (w grad u) − grad w · grad u. (5.57)
これと Gaussの発散定理より∫∫R
wf dxdy =∫∫
R
w
(∂2u
∂x2+
∂2u
∂y2
)dxdy =
∫Γ
w grad u · n ds −∫∫
R
grad w · grad u dxdy. (5.58)
ここで境界条件を考慮すると,(5.54)および与えられた境界条件に対応する弱形式として∫∫R
(∂w
∂x
∂u
∂x+
∂w
∂y
∂u
∂y
)dxdy +
∫∫R
wf dxdy −∫
Γ2
wβ ds = 0 (5.59)
を得る.
5.3.3 アイソパラメトリック要素
領域 R 全体を例えば四角形の要素で分割することにする.隣接する 2つの要素は共通の 2つのノードとそれを結ぶ辺で接している.2つの要素が重なったり隙間ができてはいけない.また辺の途中に他の要素の頂点が来てもいけない.(図 5.5参照)
図 5.5: 2次元領域の四角形要素による分割
任意の四角形要素を統一的に取り扱うために,図 5.6に示すような要素座標系 (ξ, η) を導入する.着目する要素 e の 4つのノードに臨時に 1, 2, 3, 4 と番号を振り14,4つの形状関数
N1(ξ, η) =14(1 − ξ)(1 − η) (5.60)
N2(ξ, η) =14(1 + ξ)(1 − η) (5.61)
N3(ξ, η) =14(1 + ξ)(1 + η) (5.62)
N4(ξ, η) =14(1 − ξ)(1 + η) (5.63)
14これはあくまでも一時的なもので,全体を通してのノード番号とは異なる.
89
図 5.6: 2次元要素座標系
を導入する15.明らかに Ni(ξ, η) (i = 1, 2, 3, 4) は
Ni(ξ, η) =
1 (頂点 i)
0 (他の 3つの頂点)(5.64)
を満たす.
この要素内の要素補間関数 ue(x, y) および 要素重み関数 we(x, y) は,1次元の時と同様,各ノードにおける値と形状関数 Ni(ξ, η) を用いて
ue(ξ, η) =4∑
i=1
uiNi(ξ, η), we(ξ, η) =4∑
i=1
wiNi(ξ, η) (5.65)
のように表現される.またこれと同時に,要素 e内の x, y 座標も,4つのノードでの x座標 (x1, x2, x3, x4)および y 座標 (y1, y2, y3, y4) と Ni(ξ, η) を用いて
x(ξ, η) =4∑
i=1
xiNi, y(ξ, η) =4∑
i=1
yiNi (5.66)
と表現する.このように,要素内の解 u(x, y) や重み関数 w(x, y) に対する補間式と全く同じ補間式を,独立変数である x や y に対しても用いて,各要素を積分計算に便利な要素座標平面 (ξ-η 平面)上の正方形に写像して扱う手法を,アイソパラメトリック要素 (isoparametric element)と呼ぶ.
5.3.4 要素方程式と全体方程式
弱形式 (5.59)を各要素からの寄与の和として書くと∑e
∫∫Re
(∂w
∂x
∂u
∂x+
∂w
∂y
∂u
∂y
)dxdy +
∑e
∫∫Re
wf dxdy −∑m
∫Γm
2
wβ ds = 0 (5.67)
ただし,左辺第 3項の Γm2 は境界 Γ2 に接している辺を表している.(5.67)に現われる各要素に関する積
分は ∫∫Re
G(x, y) dxdy =∫ 1
−1
∫ 1
−1
G[x(ξ, η), y(ξ, η)]|J | dξdη (5.68)
15ここでは x 方向,y 方向ともに 1次の補間を考えている.このような補間を双 1次補間 (bilinear interpolation)と言う.2次元の場合の 2 次要素は,通常 9 個のノードを含み,またそれぞれに対応する 9 個の形状関数 {Ni(ξ, η)} がある.各 Ni(ξ, η) は 1次元の場合の2次補間関数の積として表現され,双2次補間 (bi-quadratic interpolation) と呼ばれる.例えば,左下角のノード (ξ, η) = (−1,−1) に対応する形状関数は Ni(ξ, η) = 1
4ξ(ξ − 1)η(η − 1) となる.
90
のように,図 5.6で示された ξ-η 平面上の正方形の上で実行される.ここで J は変数変換に伴うヤコビア
ンで
J =∂(x, y)∂(ξ, η)
=
∣∣∣∣∣∣∣∣∂x
∂ξ
∂x
∂η
∂y
∂ξ
∂y
∂η
∣∣∣∣∣∣∣∣ =∂x
∂ξ
∂y
∂η− ∂x
∂η
∂y
∂ξ. (5.69)
例えば (5.67)の左辺第 2項に対するある要素 e からの寄与は
∫∫Re
wf dxdy = ⟨w1 w2 w3 w4⟩∫ 1
−1
∫ 1
−1
N1
N2
N3
N4
⟨N1 N2 N3 N4⟩
f1
f2
f3
f4
|J | dξdη (5.70)
= ⟨w1 w2 w3 w4⟩
mij
f1
f2
f3
f4
(5.71)
のようになる.ここで
mij =∫ 1
−1
∫ 1
−1
Ni(ξ, η)Nj(ξ, η)|J | dξdη. (5.72)
左辺第 1項についても同様な計算により,ある適当な行列 [kij ] を用いて
⟨w1 w2 w3 w4⟩
kij
u1
u2
u3
u4
(5.73)
のような形で表現される.
このようにして各要素に対する要素方程式ができたら,前節の 1次元問題の時と同様,全体をとおしてのノード番号に応じてずらしながら,それらをすべて一つにまとめると,全体方程式ができあがる.そして
そこで境界条件
u(x, y) = α, w(x, y) = 0 on Γ1 (5.74)
を考慮し,任意の重み関数に対して成立することを要求すると,最終的に領域の内部および境界 Γ2 の上の
ノードにおける未知関数値 {uj} に対する連立一次方程式が得られる.この大規模連立一次方程式は,LU分解を用いた直接法や,共役勾配法 (及びその発展版)などの反復法により解かれることになる.16
5.3.5 Gauss積分法
アイソパラメトリック要素を使った場合,(5.71)や (5.73)で現われる行列要素 [mij ], [kij ] などの計算を解析的に行うのは大変煩雑なので,ガウス積分法と呼ばれる手法を用いて数値的に行われることが多い.
区間 −1 ≤ x ≤ 1 における関数 f(x) の積分値を,n 個の x 座標 {xk} (k = 1, . . . , n) における関数値f(xk) および n 個の重み {wk} (k = 1, . . . , n) で近似する積分公式∫ 1
−1
f(x) dx ≈n∑
k=1
wkf(xk) (5.75)
について考える.16これらについては第 7 章にて扱う予定.
91
もし {xk} があらかじめ与えられていて,重み {wk} だけが選べるのであれば,最適な積分公式は §1.7.1で述べた Lagrangeの補間多項式に基づくものであり,それに基づいて導出された積分公式は (n− 1) 次の精度を有する.17
しかし,もし我々に {xk} も選ぶ自由がある場合,すなわち任意の x において関数値 f(x) を求めることができる場合には,{xk} として
Pn(x) =1
2nn!dn
dxn
[(x2 − 1)n
](5.76)
で定義される n 次の Legendre多項式 (Legendre Polynomial) Pn(x) のゼロ点を取り,あわせて適切な重み {wk} を用いることにより,(2n − 1) 次の精度を有する積分公式を作ることができることが知られており,これはガウス積分法 (Gaussian quadrature)と呼ばれている.ここでは説明は省略して,いく
つかの n に対して,{xk} および {wk} を表 5.1に示すにとどめる.なお,表にあるように {xk} の分布はx = 0 に関して対称であり,また x = 0 に関して対称な xk における重み wk はつねに相等しい.
n ±xk wk
2 0.57735 02691 89626 1.00000 00000 00000
3 0.00000 00000 00000 0.88888 88888 888890.77459 66692 41483 0.55555 55555 55556
4 0.33998 10435 84856 0.65214 51548 625460.86113 63115 94053 0.34785 48451 37454
5 0.00000 00000 00000 0.56888 88888 888890.53846 93101 05683 0.47862 86704 993660.90617 98459 38664 0.23692 68850 56189
6 0.23861 91860 83197 0.46791 39345 726910.66120 93864 66265 0.36076 15730 481390.93246 95142 03152 0.17132 44923 79170
7 0.00000 00000 00000 0.41795 91836 734690.40584 51513 77397 0.38183 00505 051190.74153 11855 99394 0.27970 53914 892770.94910 79123 42759 0.12948 49661 68870
表 5.1: Gauss積分に用いられる x座標 {xk} とその重み {wk} (Abramowitz and Stegun (1964)より)
2重積分に対しては ∫ 1
−1
∫ 1
−1
f(x, y) dxdy ≈n1∑
k1=1
n2∑k2=1
wk1wk2f(xk1 , yk2) (5.77)
のように積の形で用いればよい.
図 5.7は Gauss積分法の計算例として, ∫ 1
−1
cosπ
2x dx =
4π
(5.78)
を n をいろいろに変えて計算した時の誤差をプロットしたものである.比較的少数のデータ点数でも,非
常に高精度の積分値が得られることが分かる.
17すなわち,(n − 1) 次以下の任意の多項式に対して完全に正しい積分値を与える.
92
�� ��
�� ��
�� �
�� �
�� �
����
� � � � � � � �
|err
or|
n
図 5.7: Gauss積分法の計算例
93
第6章 スペクトル法
6.1 はじめに
スペクトル法は有限要素法と同様,重み付き残差法の一種である.したがって第 4章で述べたように,まず「試行解」は
u(x, t) =N∑
n=1
an(t)ϕn(x) (6.1)
のように,試行関数 {ϕn(x)} の一次結合で表現される.そして未知数である展開係数 {an(t)} は重み関数{wm(x)} の重みをつけた 残差 R(x, t) の積分が 0になることを要求する残差方程式∫
D
wm(x)R(x, t) dx = 0 (m = 1, 2, . . . , N) (6.2)
から決定される.このように,一つの重み付き残差法は,試行関数と重み関数の選び方により特定される.
スペクトル法において用いられる試行関数は,無限回微分可能で領域全体に広がったグローバルな関数
である.多くの場合直交関数系が用いられるが,中でも三角関数系とチェビシェフ多項式がよく用いられ,
それぞれフーリエ・スペクトル法,チェビシェフ・スペクトル法などと呼ばれる.これに対して有限要素法
では領域はまず「要素」に分割され,試行関数は各要素の中で定義されるローカルな関数で,通常1次や2
次といった低次の区分的多項式である.有限要素法は試行関数のこの局在性のおかげで複雑形状の領域に
も対応することができたが,同時にこの試行関数の「関数としてのたちの悪さ」から,要素数を増加させて
もなかなか精度を上げることができない.スペクトル法では以下に示すように,境界条件に応じて適切な
試行関数を採用すると,展開に用いる項数の増加に伴う解の収束が非常に速く,あまり多くない項数でも高
精度の解を得ることができる.しかしその反面,工学的に要求されるような複雑な形状の領域には適用が
難しいという欠点もある.
スペクトル法はまた重み関数の選び方によって,ガラーキン法,選点 (コロケーション)法,タウ法に分
類される.ガラーキン法では重み関数は試行関数と同じ関数系が用いられる.またスペクトル法の脈絡で
ガラーキン法と言う場合には,通常一つ一つの試行関数が単独で境界条件を満足することまで要求される.
一方,タウ法はガラーキン法によく似ているが,試行関数それぞれが境界条件を満たすことまでは要求せ
ず,その代わり,展開係数 {an} に対する式を構成する際に,残差方程式 (6.2)のうち一番高次のいくつかを捨てて,その分境界条件に対応する拘束条件を要求する.また,選点法では実空間の選ばれた N 個の点
{xj} (j = 1, . . . , N) にだけ値を持つデルタ関数を重み関数として用いる.したがってこの方法では残差の重み付き積分ではなく,これらの選点における残差 R(xj) が 0となることが要求される.
スペクトル法のうちもっともポピュラーでまた取っ付きやすいのは,三角関数系を試行関数とするフー
リエ・スペクトル法であるので,本講義ではこの手法を中心に述べることにする (§6.4).まず最初の3節(§6.1–6.3)ではその予備知識として,普通の連続フーリエ級数および離散フーリエ変換について復習する.また最後の §6.5ではチェビシェフ多項式及びそれに基づくスペクトル法について簡単に紹介する.
94
6.2 普通のフーリエ級数の復習
6.2.1 フーリエ級数の定義
f(x) を周期 2π のある実数値周期関数とし,これを三角関数 {1, cos x, sinx, cos 2x, sin 2x, · · · } の一次結合で表現することを考える.1 仮に,
f(x) =12a0 +
∞∑k=1
(ak cos kx + bk sin kx) (6.3)
と書けたとすると,三角関数の直交性 すなわち,任意の正の整数 m, n に対して,∫ π
−π
cos mxdx =∫ π
−π
sinmxdx = 0, (6.4)
∫ π
−π
cos mx cos nx dx =∫ π
−π
sin mx sinnx dx =
π (m = n)
0 (m = n)= πδmn (6.5)
∫ π
−π
cos mx sinnx dx = 0 (6.6)
より
フーリエ級数¶ ³ak =
1π
∫ π
−π
f(x) cos kx dx, (k = 0, 1, 2, · · · ) (6.7)
bk =1π
∫ π
−π
f(x) sin kx dx, (k = 1, 2, · · · ) (6.8)
となっているはずである.f(x) から決まるこれらの {ak}, {bk} を f(x) のフーリエ係数,またこれらを係数に持つ三角級数
12a0 +
∞∑k=1
(ak cos kx + bk sin kx) (6.9)
を f(x) に対応するフーリエ級数と呼ぶ.µ ´またこのフーリエ級数を N 次で打ち切った三角多項式
12a0 +
N∑k=1
(ak cos kx + bk sin kx) (6.10)
をN 次の有限フーリエ級数と呼び,FN (x) と書くことにする.
1周期が L の場合には,x −→ x = (2π/L)x と変数変換すればいい.
95
6.2.2 パーセバルの等式,平均収束
パーセバルの等式¶ ³−π ≤ x ≤ π において区分的連続な任意の f(x) に対して,
1π
∫ π
−π
{f(x)}2 dx =12a20 +
∞∑k=1
(a2k + b2
k) (6.11)
が成り立つ.これはパーセバルの等式 (Parseval’s equation)と呼ばれる.µ ´パーセバルの等式は, ∫ π
−π
{f(x) − FN (x)}2dx −→ 0 (N → ∞), (6.12)
すなわち,有限フーリエ級数の次数 N を上げていけば,平均2乗誤差はいくらでも小さくすることができ
ることを意味している.この性質は「任意の区分的連続な関数 f(x) に対して,そのフーリエ級数は平均の意味で f(x) に収束する」と表現される.ただし,これは必ずしも各点収束,すなわち N → ∞ の極限で,
−π ≤ x ≤ π の各点で FN (x) → f(x) となることを意味しているわけではない.事実,f(x) が区分的連続という条件だけではフーリエ級数が収束することすら保証されない.
パーセバルの等式 (6.11)より直ちに,f(x) が区分的連続であれば
ak, bk → 0 (k → 0) (6.13)
が成り立つことも分かる.これはリーマン・ルベーグの補題 (Riemann-Lebesgue’s lemma) と呼ばれる.
6.2.3 フーリエ級数の各点収束
各点収束の条件¶ ³周期 2π の任意の周期関数 f(x) について,f(x) が −π ≤ x ≤ π において区分的滑らか,すなわち,
f(x) も f ′(x) も区分的連続ならば,
12
[f(x − 0) + f(x + 0)] =12a0 +
∞∑k=1
(ak cos kx + bk sin kx) (6.14)
が成り立つ.すなわち,f(x) に対するフーリエ級数は,f(x) が連続な点においては正しく f(x) に,また不連続な点においては右側極限値と左側極限値の平均値に収束する.µ ´
6.2.4 フーリエ級数の収束の速さと関数の滑らかさの関係
収束の速さに関する定理¶ ³周期 2π の周期関数 f(x) が,−π ≤ x ≤ π で,両端も含めて最初の (n − 1) 階導関数が連続で,第 n
階導関数が区分的連続のとき,言い換えれば,f(x) が n 階微分して初めて不連続が現れるような関数
であれば,f(x) のフーリエ係数 ak, bk は,k → ∞ で O(1/kn+1) 程度で小さくなる.µ ´この事から,滑らかな関数ほど,すなわち,微分してもなかなか不連続が出てこないような関数ほど,フー
リエ係数の減衰は速く,従ってより少ない項数でもとの関数 f(x) を精度よく近似することができる.もし
96
f(x) が境界も含めて何回でも微分ができる関数であれば,そのフーリエ係数はあらゆるベキより速く減少する.
例として,滑らかさの異なる3つの関数について,そのフーリエ係数を計算してみよう.
例 1 (y 自身が不連続;n = 0 に対応)
y =x
2=⇒ a0 = π, ak = 0, bk = −1/k, (6.15)
例 2 (y は連続,y′ が不連続;n = 1 に対応)
y =12(π − x)2 =⇒ a0 = π2/3, ak = 2/k2, bk = 0, (6.16)
例 3 (正則関数;n = ∞ に対応)
y =3
5 − 4 cos x=⇒ a0 = 2, ak = 2/2k, bk = 0. (6.17)
�
�
�
�
�
�
�
�
�
� ��� � ��� �
Y?�Y?�Y?�
y(x)
x / 2π
図 6.1: 滑らかさの異なる 3つの関数
例3の関数は何回微分しても不連続の現われない正則関数であるが,それに対するフーリエ係数は図 6.2から見られるように k とともに,指数関数的な速さで減少する.したがって,この関数を有限フーリエ級数
で近似すると,その近似精度は N の増加に伴い急速に向上する.一方,この関数を,例えば有限要素法の
ように区分的な1次関数で近似するとすると,[0, 2π] に用いる点数 N を増加させた時の平均2乗根誤差は,
1/N2 程度でしか減少していかない.2 対象とする関数が非常に滑らかな性質のよい関数の場合,このよう
に (有限)フーリエ級数を用いた近似的表現の精度は,用いる項数 (or点数)の増加に伴い,どんなベキよりも速く急速に向上する.この性質はフーリエ級数のスペクトル的精度 (spectral accuracy)と呼ばれる.
6.3 離散フーリエ変換
現実のデータ解析では,f(x) はある一定のサンプリング間隔を持ったとびとびの x に対してのみ与えら
れていることが多い.また数値計算でも離散的な有限個の点における関数値しか取り扱うことができない.
このような状況では,§6.2で述べたフーリエ級数の理論は離散フーリエ変換という形で応用される.離散2区分的2次関数を用いれば 1/N3 程度の速さ.
97
�� ��
�� �
�� �
������
����
�
� �� ���
BK�OF�Y��XAK�OF�Y��XAK�OF�Y��X
|ak|
or |b
k|
k
図 6.2: フーリエ係数の減少の速さの違い
フーリエ変換は,スペクトル法という数値計算の1テクニックにとどまらず,時系列のスペクトル解析など
工学のさまざまな局面における必須の道具でもあるので,その意味や性質をここできちんと再確認してお
こう.
6.3.1 離散データの表現
いま,0 ≤ x ≤ 2π の N 等分点 xj = j∆x (j = 0, 1, · · · , N ;∆x = 2π/N) における関数値 f(xj) だけが分かっているとする.ただし f(x) は周期 2π の周期関数で,したがって f(x0) = f(xN )とする.3
「本当のフーリエ係数」 ak(k = 0, 1, . . .), bk(k = 1, 2, . . .)は
ak =1π
∫ 2π
0
f(x) cos kx dx, bk =1π
∫ 2π
0
f(x) sin kx dx (6.18)
で定義されるので,これだけのとびとびの情報からでは求めることができない.そこで,今使える情報が
N 個しかないので,N 個の係数を持つ次のような N/2 次の三角多項式 fN/2(x)
fN/2(x) =12a0 +
N/2−1∑k=1
(ak cos kx + bk sin kx) +12aN/2 cos
N
2x (6.19)
で f(x) を近似することを考える.そして,N 個の係数 ak(k = 0, 1, . . . N/2), bk(k = 1, 2, . . . N/2− 1) は,全ての標本点 xj (j = 1, . . . , N) において fN/2(xj) がデータ値 fj (j = 1, . . . , N) に等しくなるように決めることにする.ここでは「本当のフーリエ係数」と区別するために,各係数の上にチルダ ( ) を付けた.また (6.19)で fN/2(x) に aN/2 cos N
2 x の項だけを入れて bN/2 sin N2 x の項を入れなかったのは,
sinN
2xj = sin
(N
22π
Nj
)= sin(πj) = 0 (6.20)
より,その項はすべての標本点 xj において 0 となるため,fN/2(x) の「補間性」に意味の無い項だからである.逆に,もしこの項を入れてしまうと,補間性の要求からはその係数 bN/2 を決められなくなってし
まう.3周期が 2π でない場合については §6.3.7 で触れる.
98
6.3.2 三角関数の離散直交関係
fN/2(x)の補間性を実現するような ak, bk の計算は,以下の三角関数の離散直交関係に基づいてなされる.
三角関数の離散直交関係¶ ³任意の整数 m, n に対して以下の等式が成り立つ.
N∑j=1
cos mxj =
N (m が N の倍数)
0 (それ以外の整数),
N∑j=1
sinmxj = 0. (m は任意の整数). (6.21)
N∑j=1
cos mxj cos nxj =
N, m + n も m − n も N の倍数
N/2, m + n と m − n のどちらかが N の倍数
0, m + n も m − n も N の倍数でない
(6.22)
N∑j=1
sinmxj sin nxj =
N/2, m − n が N の倍数で m + n がそうでない
0, m − n と m + n がともに N の倍数か,ともにそうでない
−N/2, m + n が N の倍数で m − n がそうでない
(6.23)
N∑j=1
sinmxj cos nxj = 0 (m,n は任意の整数) (6.24)
µ ´前述の三角関数の直交関係と比較すると,(6.21)は (6.4)に,(6.22),(6.23)は (6.5)に,(6.24)は (6.6)にそれぞれ対応していることが分かる.(6.21)から (6.24)の証明は以下のようである.
【(6.21)の証明】
オイラーの公式よりN∑
j=1
cos mxj + i
N∑j=1
sin mxj =N∑
j=1
eimxj =N∑
j=1
ei 2mπN
j . (6.25)
これは公比 r = ei 2mπN ,初項 ei 2mπ
N (= r),項数 N の等比級数.従って,公比 r が 1以外の時(すなわちm が N の倍数でない時)は
(6.25) = r1 − rN
1 − r= 0, ⇐= rN =
(ei 2mπ
N
)N
= ei2πm = 1. (6.26)
また公比 r が 1の時(すなわちmが N の倍数の時)は明らかに
(6.25) =N∑
j=1
1 = N. 結局 N∑
j=1
eimxj =
N, (m が N の倍数の時)
0, (それ以外)(6.27)
これの実部虚部を取れば (6.21)の 2つの関係を得る.
【(6.22)の証明】N∑
j=1
cos mxj cos nxj =12
N∑j=1
{cos(m + n)xj + cos(m − n)xj}
=12
N∑j=1
cos(m + n)xj +12
N∑j=1
cos(m − n)xj
ここで (6.21)の結果を使えば
99
=
N/2 (m + n が N の倍数)
0 (それ以外)+
N/2 (m − n が N の倍数)
0 (それ以外)(6.28)
【(6.23)の証明】
N∑j=1
sinmxj sinnxj =12
N∑j=1
{cos(m − n)xj − cos(m + n)xj}
=12
N∑j=1
cos(m − n)xj −12
N∑j=1
cos(m + n)xj
ここで (6.21)の結果を使えば
=
N/2 (m − n が N の倍数)
0 (それ以外)−
N/2 (m + n が N の倍数)
0 (それ以外)(6.29)
【(6.24)の証明】
N∑j=1
sinmxj cos nxj =12
N∑j=1
{sin(m − n)xj + sin(m + n)xj}
=12
N∑j=1
sin(m − n)xj +12
N∑j=1
sin(m + n)xj
ここで (6.21)の結果を使えば
= 0 + 0. (6.30)
6.3.3 離散フーリエ変換
各標本点で fN/2(xj) がデータ値 fj に等しいこと,すなわち
fj =12a0 +
N/2−1∑l=1
(al cos lxj + bl sin lxj) +12aN/2 cos
N
2xj (j = 1, . . . , N) (6.31)
を要求する.なお xj = j∆x = 2πj/N を代入すれば (6.31)は
fj =12a0 +
N/2−1∑l=1
{al cos
(2πlj
N
)+ bl sin
(2πlj
N
)}+
12aN/2 cos(πj) (6.32)
と書くこともできる.
(6.31)の両辺に cos kxj (0 ≤ k ≤ N/2) をかけて,j について 1 から N までの和を取ると,
N∑j=1
fj cos kxj =12a0
N∑j=1
cos kxj +N/2−1∑
l=1
al
N∑j=1
cos kxj cos lxj
+
N/2−1∑l=1
bl
N∑j=1
cos kxj sin lxj
+12aN/2
N∑j=1
cos kxj cosN
2xj . (6.33)
離散直交関係 (6.21)と 0 ≤ k ≤ N/2 より,右辺第1項の和は Nδk0. 右辺第 2項のカッコ内は (6.22)と,1 ≤ k + l ≤ N − 1, −N/2 + 1 ≤ k − l ≤ N/2− 1 より N/2δkl. 第3項のカッコは (6.24)より常に 0.第4
100
項の和は (6.22)と,N/2 ≤ k + N/2 ≤ N , −N/2 ≤ k − N/2 ≤ 0 より NδkN/2. これらをまとめると
N∑j=1
fj cos kxj =N
2a0δk0 +
N
2
N/2−1∑l=1
alδkl +N
2aN/2δkN/2 =
N
2ak, (6.34)
すなわち
ak =2N
N∑j=1
fj cos kxj , (k = 0, 1, . . . , N/2). (6.35)
次に,(6.31)の両辺に今度は sin kxj (1 ≤ k ≤ N/2 − 1) をかけて,やはり j について 1 から N までの
和を取ると,
N∑j=1
fj sin kxj =12a0
N∑j=1
sin kxj +N/2−1∑
l=1
al
N∑j=1
sin kxj cos lxj
+
N/2−1∑l=1
bl
N∑j=1
sin kxj sin lxj
+12aN/2
N∑j=1
sin kxj cosN
2xj . (6.36)
離散直交関係 (6.21),(6.24)より,右辺第1項,第2項,第4項は常に 0.第3項のカッコは (6.23)と,2 ≤k + l ≤ N − 2, −N/2 + 2 ≤ k − l ≤ N/2 − 2 より N/2δkl. これより
N∑j=1
fj sin kxj =N
2
N/2−1∑l=1
blδkl =N
2bk, (6.37)
すなわち
bk =2N
N∑j=1
fj sin kxj . (k = 1, . . . , N/2 − 1). (6.38)
以上の結果をまとめると・・・
離散フーリエ変換¶ ³N/2 次三角多項式
fN/2(x) =12a0 +
N/2−1∑k=1
(ak cos kx + bk sin kx) +12aN/2 cos
N
2x (6.39)
は ak, bk を
ak =2N
N∑j=1
fj cos kxj =2N
N∑j=1
fj cos2πkj
N, (k = 0, 1, 2, . . . , N/2) (6.40)
bk =2N
N∑j=1
fj sin kxj =2N
N∑j=1
fj sin2πkj
N, (k = 1, 2, . . . , N/2 − 1) (6.41)
のように選ぶとき,またそのときに限って,N 個の標本点 xj (j = 1, 2, . . . , N) すべてにおいて正しいデータ値 fj を与える.µ ´
離散データ {fj} から (6.40),(6.41)により {ak, bk} を求める操作を離散フーリエ変換 (Discrete Fourier
Transform, DFT),また逆に {ak, bk} から (6.31)により {fj} を求める操作を逆離散フーリエ変換 (In-
verse Discrete Fourier Transform, IDFT)と呼ぶ.
101
6.3.4 離散フーリエ変換の例
例として §6.2で用いた 3つの関数のうちの一つ
y(x) =12(π − x)2 (0 ≤ x ≤ 2π) (6.42)
に対する離散フーリエ変換を求めてみよう.本当のフーリエ係数は
a0 = π2/3, ak = 2/k2, bk = 0 (6.43)
であった.
N = 8, 64, 256 とした場合の離散フーリエ変換の係数を,a4 まで書くと
k ak ak(N = 8) ak(N = 64) ak(N = 256)
0 π2/3 ≈ 3.2899 3.3927 3.2915 3.2900
1 2 2.1061 2.0016 2.0001
2 0.5 0.61685 0.50161 0.50010
3 2/9 ≈ 0.2222 0.36134 0.22384 0.22232
4 2/16 = 0.125 0.30843 0.12662 0.12510
のようになる.
�
�
�
�
�
�
�
�
� ��� � ��� �
Y?C�XY�XY�X?J
y_c(
x)
x / π
図 6.3: 有限フーリエ級数 (y = (π − x)2/2, N = 8)
有限フーリエ級数 FN/2(x) では平均2乗誤差∫ 2π
0
{f(x) − FN/2(x)
}2dx (6.44)
が最小になるように係数 ak, bk が決められるのに対し,離散フーリエ変換では三角多項式 fN/2(x) の値が各標本点 xj (j = 1, . . . , N) で正しく fj になるように係数が決められる.したがって図 6.3と図 6.4を比べて分かるように,FN/2(x) と fN/2(x) とは別物である.しかし,上の表で見るようにこの差は N の増大と
ともに急速に小さくなる.
k → ∞ の時の離散フーリエ変換の係数の漸近的振舞いは,普通のフーリエ係数と同様であることが知られており,したがって近似対象の関数が非常に滑らかな性質のよい関数の場合,点数 N の増加に伴なう近
102
�
�
�
�
�
�
�
�
� ��� � ��� �
Y?D�XY�XY�X?J
y_d(
x)
x / π
図 6.4: 離散フーリエ変換 (y = (π − x)2/2, N = 8)
似精度の向上はやはり 1/N のどんなべきよりも速く,連続なフーリエ級数同様スペクトル的な精度を得る
ことができる.
6.3.5 本当のフーリエ級数との関係 (1)
「本当のフーリエ係数」 ak, bk: (ak
bk
)=
1π
∫ 2π
0
f(x)(
cos kx
sin kx
)dx (6.45)
を,台形則 (trapezoidal rule)∫ b
a
g(x) dx ≈ ∆x
2{g0 + g1} + · · · + ∆x
2{gN−1 + gN} = ∆x
N∑j=1
gj , (∆x = 2π/N) (6.46)
により,N 等分点での関数値だけを用いて近似的に評価すると(ak
bk
)≈ 1
π· 2π
N
N∑j=1
fj
(cos kxj
sin kxj
)=
2N
N∑j=1
fj
(cos kxj
sin kxj
)=
(ak
bk
). (6.47)
すなわち,離散フーリエ変換の係数は,本当のフーリエ係数の計算を台形則で近似したものと解釈するこ
とができる.
6.3.6 本当のフーリエ級数との関係 (2):エイリアジング誤差
離散フーリエ変換の係数 ak (k = 0, 1, . . . , N/2) の定義式 (6.40) に f(x) の本当のフーリエ級数表示
f(x) =12a0 +
∞∑l=1
(al cos lx + bl sin lx) (6.48)
103
を代入すると,
ak =2N
N∑j=1
{12a0 +
∞∑l=1
(al cos lxj + bl sin lxj)
}cos kxj
=a0
N
N∑j=1
cos kxj +2N
∞∑l=1
al
N∑j=1
cos kxj cos lxj
+2N
∞∑l=1
bl
N∑j=1
cos kxj sin lxj
. (6.49)
まず,1 ≤ k ≤ N/2 − 1 の場合を考えると,第1項と第3項は (6.21), (6.24)よりつねに 0.第 2項のカッコ内は,(6.22)より l + k が N の倍数,すなわち l = N − k, 2N − k, 3N − k, · · · の場合と,l − k が N
の倍数,すなわち l = k,N + k, 2N + k, 3N + k, · · · の場合に限って N/2,それ以外の l に対しては 0.4
したがって,
ak = ak + aN−k + aN+k + a2N−k + a2N+k + · · · . (1 ≤ k ≤ N/2 − 1) (6.50)
が成り立つ.また k = 0 の場合は,(6.21)より第 1項の和は N , 第 3項のカッコ内は常に 0.第 2項のカッコ内は (6.22)より,lが N の倍数,すなわち l = N, 2N, 3N, · · · の時のみ N で,それ以外の l に対しては
0.これよりa0 = a0 + 2aN + 2a2N + · · · . (6.51)
また k = N/2 の場合は,第 1項と第 3項はそれぞれ (6.21),(6.24)より 0.第 2項のカッコ内は (6.22) より l が N/2 の奇数倍,すなわち l = N/2, 3N/2, 5N/2, · · · の時のみ N で,それ以外の l に対しては 0.これより
aN/2 = 2aN/2 + 2a3N/2 + 2a5N/2 + · · · . (6.52)
しかし k = 0 と k = N/2 の結果は,最初の 1 ≤ k ≤ N/2 − 1 の場合の結果に含まれるので,結局
ak = ak + aN−k + aN+k + a2N−k + a2N+k + · · · . (0 ≤ k ≤ N/2) (6.53)
が成り立つ.
一方,bk (k = 1, . . . , N/2 − 1) に対しても (6.41)に f(x) のフーリエ級数表示を代入すると
bk =2N
N∑j=1
{12a0 +
∞∑l=1
(al cos lxj + bl sin lxj)
}sin kxj
=a0
N
N∑j=1
sin kxj +2N
∞∑l=1
al
N∑j=1
sin kxj cos lxj
+2N
∞∑l=1
bl
N∑j=1
sin kxj sin lxj
. (6.54)
ここで,離散直交性 (6.21) および (6.24) より,第 1 項と第 2 項は常に 0.第 3 項は (6.23) より,l − k
が N の倍数,すなわち l = k,N + k, 2N + k, · · · の場合に N/2,l + k が N の倍数,すなわち l =N − k, 2N − k, 3N − k, · · · の場合に −N/2,それ以外の l に対しては 0.したがって,
bk = bk − bN−k + bN+k − b2N−k + b2N+k − · · · . (1 ≤ k ≤ N/2 − 1) (6.55)
結局,まとめると
エイリアジング誤差¶ ³ak = ak + aN−k + aN+k + a2N−k + a2N+k + · · · (0 ≤ k ≤ N/2) (6.56)
bk = bk − bN−k + bN+k − b2N−k + b2N+k − · · · (1 ≤ k ≤ N/2 − 1) (6.57)µ ´という関係が得られる.本当のフーリエ係数 ak, bk と,離散フーリエ変換が与える係数 ak, bk の差,すな
41 ≤ k ≤ N/2 − 1 の場合,l + k と l − k がともに N の倍数という事は起こらない.
104
わち (6.56), (6.57)それぞれの右辺第 2項以降の総和をエイリアジング誤差 (aliasing error)と呼ぶ.離散
フーリエ変換では,N 個 という情報量の制約から,k = N/2 より速く振動するような(すなわち,大きなk の)項は初めから考慮されていない.(6.56),(6.57)は,離散フーリエ変換を適用すると,本当のフーリエ級数(無限級数)に含まれている k = N/2 より速く振動する成分はすべて 0 ≤ k ≤ N/2 の範囲のどれかの項に読み替えられてしまうことを意味している.5
離散フーリエ変換に含まれる最高波数 k = N/2に対応する波長は 2π/(N/2) = 2∆x, すなわちサンプリング間隔の 2倍である.上では信号が空間変数 xの関数になっているとして取り扱ったが,時間 tに依存する時
系列データの場合にもまったく同様にして,サンプリング間隔 ∆t の 2倍に対応する周波数 f = 1/(2∆t) が離散フーリエ変換による取り扱い可能な最高周波数となる.これはナイキスト周波数 (Nyquist frequency)
とか折り返し周波数 (folding frequency)などと呼ばれる.
★エイリアジングの発生する理由
N 個の等間隔の標本点 xj (j = 1, 2, . . . , N) での関数値だけでは,
cos kx と cos(Nm ± k)x および sin kx と ± sin(Nm ± k)x (6.58)
とは区別することができない.(ここで m は任意の整数)
【証明】
cos(Nm ± k)xj = cos(2mπj ± kxj) = cos(±kxj) = cos(kxj), (6.59)
± sin(Nm ± k)xj = ± sin(2mπj ± kxj) = ± sin(±kxj) = sin(kxj). (6.60)
このことから,離散フーリエ変換は cos(Nm ± k)x をすべて cos kx と,また ± sin(Nm ± k)x をすべてsin kx と認識してしまうのである.
���
�
���
�
���
�
���
� ��� � ��� �
COS��XCOS���X�´»M
cos(
3x)
& c
os(1
1x)
x / π
図 6.5: エイリアジングが発生する理由 (N = 8 の場合)
5「aliasing」とは「別名」という意味の英語.
105
6.3.7 一般的な周期の場合
今までは周期 2π の周期関数と関係付けることによって,離散フーリエ変換について説明してきたが,こ
こで一般的な周期の場合について触れておく.以下では独立変数を t として時系列データの解析という立
場で述べるが,もちろん空間変数の関数の場合もまったく同様である.
サンプリング間隔 ∆t 秒で T 秒間観測して取得したデータ {f1, f2, . . . , fN} があるとする.データ点数N = T/∆t で与えられる. このデータに対して離散フーリエ変換が想定する N/2 次三角多項式は,観測時間 T を周期とする
fN/2(t) =12a0 +
N/2−1∑k=1
{ak cos
(2πk
Tt
)+ bk sin
(2πk
Tt
)}+
12aN/2 cos
(2π
T
N
2t
)(6.61)
という形のものである.任意の時系列には一般にあらゆる周波数成分が混在しているはずであるが,離散
フーリエ変換はそれを,最低周波数6 fmin = 1/T Hzと最高周波数 fmax = N/(2T ) = 1/(2∆t) Hz にはさまれた有限の周波数帯だけで,しかもそのうち一定間隔 ∆f = 1/T Hz のとびとびの周波数成分だけを用いて,近似的に表現をしようとしていることが分かる.fmax はサンプリング間隔 ∆t によって,また fmin
および ∆f は観測時間 T によって支配されることに注意する.fmax をナイキスト周波数と呼ぶことは前
述したが,観測時間(周期)が 2π であろうとなかろうと,fmax と ∆t の関係はいつも fmax = 1/(2∆t) で変わらない.離散フーリエ変換を用いたデジタル処理により観測データのスペクトル解析を行おうとする
とき,サンプリング間隔が長すぎると,ナイキスト周波数が低くなるためにエイリアジングによる折り返
しの影響を強く受けて誤ったスペクトルを得ることになる.また観測時間が短すぎると,本来連続的である
はずの周波数を激しく離散化することになり,やはり精度の高いスペクトルは得られなくなる.
(6.61)から t = tj (= j∆t = jTN ) における関数値に対する表現を求めると,
fN/2(tj) =12a0 +
N/2−1∑k=1
{ak cos
(2πk
Ttj
)+ bk sin
(2πk
Ttj
)}+
12aN/2 cos
(2π
T
N
2tj
)(6.62)
=12a0 +
N/2−1∑k=1
{ak cos
(2πkj
N
)+ bk sin
(2πkj
N
)}+
12aN/2 cos(πj) (6.63)
となる.サンプリング間隔 ∆t や観測時間 T が入っていないこの最後の表現は,周期 2π の時の j 番目の
N 等分点における関数値 fj と離散フーリエ変換の係数 {ak, bk} の間の関係式 (6.32)とまったく同一である.したがって周期(すなわち観測時間 T)が何であろうと,一定サンプリング間隔で取得した N 個の
データ値に対して離散フーリエ変換を行えば,対応する N/2 次三角多項式 (6.61)の係数 {ak, bk} が出力される.周期(観測時間 T)が 2π かそうでないかの違いは,添え字と周波数の関係のみに現れる.すなわ
ち T = 2π の時は {ak, bk} の添え字 k が角振動数(空間の関数の場合には波数)そのものを表していたの
に対し,任意周期 T の場合には,{ak, bk} が代表する角振動数は k ではなく 2πT k になるということだけ
である.
6.3.8 離散フーリエ変換を使った微分係数の計算
離散フーリエ変換を使うと効率よく離散データの微分係数を計算することができる.等間隔サンプリン
グで取得されたデータ {fj} を入力すると,それに対して離散フーリエ変換 (6.40), (6.41)を行って,係数{ak, bk} を出力するルーチンを形式的にDFT(fj , ak, bk),またこの逆変換,すなわち {ak, bk} を入力すると {fj} を出力するルーチンを IDFT(fj , ak, bk)とそれぞれ書くことにする.この2つのルーチンを用いる
と,以下のような簡単な操作で {fj} から{
dfdt
∣∣∣j
}を求めることができる.
6もちろん周波数 0 の直流成分 a0 を除いて.
106
1. {fj} を入力として DFT(fj , ak, bk)を呼び出すことによって {ak, bk} を出力する.
2. (6.61)を考慮して,置き換え
a0 = aN/2 = 0, ak =2πk
T× bk, bk = −2πk
T× ak (k = 1, . . . , N/2 − 1) (6.64)
をする.
3. 得られた新たな {ak, bk} を入力として逆変換ルーチン IDFT(gj , ak, bk)を呼び出し,対応する N 個
のデータ {gj} を出力する.
4. こうして得られた {gj} は {fj} の微分係数(の近似値)になっている.
このような離散フーリエ変換に基づいて微分・積分を求める手法は,次節のフーリエ・スペクトル法におい
て頻繁に活用される.
6.3.9 高速フーリエ変換 (Fast Fourier Transform, FFT)
ある実関数に対してその離散フーリエ変換 {ak}, {bk} を,(6.40), (6.41)の定義式そのままに計算すると,実数のかけ算が約 N2 回必要となる.またこの他にも,三角関数を約 N2 回計算する必要がある.通常 N
は数千~数万といった大きな数なので,このままでは大変な計算量になってしまう.
Cooley & Tukey (1965)は,特に N が2のべき乗,すなわちある整数 m を使って N = 2m と書ける場
合に,必要な計算量を 52N log2 N 回程度の実数演算にまで減らすことができるようなアルゴリズムを開発
した.離散フーリエ変換を高速に計算するこの手法は高速フーリエ変換 (Fast Fourier Transform),略
して FFTと呼ばれる.現在すべての計算機がこの Cooley-Tukeyの FFTアルゴリズム,もしくは混合基底 FFTなどそれの改良版によって離散フーリエ変換を計算している.
m 8 9 10 11 12 13
N 256 512 1024 2048 4096 8192
N2 65536 2.62 × 105 1.05 × 106 4.19 × 106 1.68 × 107 6.71 × 107
5/2N log2 N 5120 11520 25600 56320 122880 266240
演算量の比 13 23 41 74 137 252
6.3.10 複素離散フーリエ変換
ここまではなじみの深い実三角関数にもとづいて,実数値関数の離散フーリエ変換について説明してき
たが,まったく同様の精神で複素数値関数に対する複素離散フーリエ変換を定義することができる.以下に
見るように,むしろその導出は実変換に比べきわめて簡潔である.必要となるのは,実数の離散直交関係
(6.21)の導出の際に用いた関係,すなわち,任意の整数 m に対して,
N∑j=1
eimxj =N∑
j=1
ei 2πmjN =
N (m が N の倍数の時)
0 (それ以外)(6.65)
が成り立つということだけである.
周期 2π の周期的な複素数値関数 f(x) に対する普通の複素フーリエ級数は
f(x) =∞∑
k=−∞
ck eikx, ck =12π
∫ π
−π
f(x) e−ikx dx (6.66)
107
で与えられる.特に f(x) が実関数の場合には c−k = c∗k が成り立つ.(アステリスク∗ は複素共役)
今 {xj} を [0, 2π] の N 等分点,すなわち xj = (2π/N)j, またそこにおける関数値を {fj} とする.このとき,N/2次の複素三角多項式
fN/2(x) =N/2−1∑
k=−N/2
ck eikx (6.67)
を考え,その N 個の係数 ck (k = −N/2, . . . , N/2− 1) を,fN/2(x) が {fj} に対して補間的になるように,すなわち
fj = fN/2(xj) =N/2−1∑
k=−N/2
ck eikxj =N/2−1∑
k=−N/2
ck ei 2πkjN (j = 0, 1, . . . , N − 1) (6.68)
が成り立つように決めるものとする.
(6.67)の書き方は,(N/2) モードと (−N/2) モードの入り方が非対称的でちょっと不自然な印象を受けるかもしれない.しかし,離散フーリエ変換を計算する際に用いられる高速フーリエ変換 (FFT)のアルゴリズムでは,点数 N は多くの場合2のべき乗であることが要求され,したがって N は通常偶数であるため,
このような正側と負側の非対称性は避けられない.もしこれが気に入らないのなら,実際の計算の中では
c−N/2 = 0 と強制的においてしまってもかまわない.もしこれが何らかの「悪さ」をするようであれば,そもそもそんなところで級数を打ち切ってしまってはダメで,N をもっと大きく取らなければいけないと言
うことである.
−N/2 ≤ l ≤ N/2 − 1 として,(6.68)の両辺に e−ilxj をかけて,j について 1から N まで和を取ると
N∑j=1
fj e−ilxj =N/2−1∑
k=−N/2
ck
N∑j=1
ei(k−l)xj
. (6.69)
右辺のカッコ内の和は (6.65)より Nδkl に等しく,7 これより
ck =1N
N∑j=1
fj e−ikxj =1N
N∑j=1
fj e−i 2πkjN (k = −N/2, . . . , N/2 − 1) (6.70)
が得られる.結局,
複素離散フーリエ変換¶ ³N/2次の複素三角多項式
fN/2(x) =N/2−1∑
k=−N/2
ck eikx (6.71)
は,その係数 {ck} を
ck =1N
N∑j=1
fj e−ikxj =1N
N∑j=1
fj e−i 2πkjN (k = −N/2, . . . , N/2 − 1) (6.72)
のように選ぶとき,またそのときに限って N 等分点 {xj} において正しく {fj} という値を取る.µ ´{fj} から {ck} を求める操作を複素離散フーリエ変換,逆に {ck} から {fj} を求める操作を複素逆離散フーリエ変換と呼ぶ.これらはやはり Cooley-Tukeyの FFTアルゴリズムにより,5N log2 N 回程度の実
数演算で遂行することができる.
7−N/2 ≤ k, l ≤ N/2 − 1 の場合,k − l が N の倍数になるのは k = l の場合しかない.
108
また (6.70)の右辺の fj に対して本当のフーリエ級数表現を代入すると,
ck =1N
N∑j=1
fj e−ikxj =1N
N∑j=1
( ∞∑l=−∞
cl eilxj
)e−ikxj =
1N
∞∑l=−∞
cl
N∑j=1
ei(l−k)xj
= ck +
∞∑m=−∞
m=0
ck+Nm = ck + ck±N + ck±2N + · · · . (6.73)
右辺最後の表現の第 2項以下が ck と ck の差,すなわちエイリアジング誤差を与える.
なお,計算機上で実際に使われるほとんどの FFTルーチンは,複素離散フーリエ変換に対して (6.68)と異なる
fj =N−1∑k=0
ck ei 2πkN j (6.74)
という形を想定しており,係数 {ck} の添え字範囲が (−N/2, . . . , N/2−1) ではなく,(0, . . . , N −1) になっているので注意が必要である.これについては,任意の整数 m に対して
ck+mN =1N
N∑j=1
fj e−i2π(k+mN)
N j =1N
N∑j=1
fj e−i 2πkN j e−i2πmj =
1N
N∑j=1
fj e−i 2πkN j = ck (6.75)
から分かるように,{ck} の添え字には N の整数倍だけの任意性があるので,通常の FFTルーチンが与える {ck} (k = 0, N − 1) のうち,N/2 ≤ k ≤ N − 1 については
ck −→ ck−N (6.76)
と読み替えれば k について (ほぼ)対称的な表現をしたときの係数を知ることができる.特に,後述のスペクトル選点法においては,この複素数版 FFTを用いて空間微分を計算するのであるが,その場合この読み替えは正しい結果を出すための必須な手続きとなる.
109
6.4 フーリエ・スペクトル法
この節では,Burgers方程式∂u
∂t+ u
∂u
∂x= ν
∂2u
∂x2(6.77)
の初期値・境界値問題を題材にして,フーリエ・ガラーキン法とフーリエ・選点法が実際にどのように運用
されるのかを見てみよう.
以下に見るように,フーリエ・ガラーキン法においては,u の空間微分の計算には何の問題も生じない
が,その一方で,非線形項 u∂u∂x や,この Burgers方程式には含まれていないが,線形項であってもその係
数が空間変数に依存するような場合には,その計算方法に工夫が必要となる.一方,フーリエ・選点法で
は,非線形項や変数係数を持つ線形項の評価の仕方も非常に簡便である.
6.4.1 フーリエ・ガラーキン法
[0, 2π] で周期的な場合を考える.試行解 u(x, t) として有限フーリエ級数
u(x, t) =N/2−1∑
k=−N/2
uk(t) eikx (6.78)
を仮定する.8 ガラーキン法における基本的な未知数は展開係数,すなわちフーリエ係数 {uk(t)} である.
残差方程式は ∫ 2π
0
(∂u
∂t+ u
∂u
∂x− ν
∂2u
∂x2
)e−ikx dx = 0 (k = −N
2, . . . ,
N
2− 1) (6.79)
で与えられ,これは直交関係
∫ 2π
0
eikx e−ilx dx = 2πδkl =
0 if k = l,
2π if k = l(6.80)
および
∂u
∂x=
N/2−1∑k=−N/2
ik uk eikx (6.81)
により9
duk
dt+ F
(u
∂u
∂x
)k
+ νk2 uk = 0 (k = −N
2, . . . ,
N
2− 1) (6.82)
となる.10 ここで F(f)k は f(x) の第 kフーリエ係数,すなわち
F(f)k ≡ 12π
∫ 2π
0
f(x)e−ikx dx (6.83)
を表すものとする.{uk(t)} に対する初期値は初期波形 u0(x) から
uk(0) = F(u0)k =12π
∫ 2π
0
u0(x)e−ikx dx (6.84)
8u(x, t)は実数であるが,記法が簡潔なのでここでは複素数の離散フーリエ変換を用いて表現することにする.したがって uk = u∗−k
が成り立っている.9ここでは p.108 で触れたように,k = −N/2 に対してはつねに uk = 0 と置くことを想定している.
10ここで duk/dt に対して連立方程式ではなく,いきなり陽な表現が得られたのは,試行関数として直交関数系を用いているおかげであり,スペクトル法の大きなメリットの一つである.
110
で与えられる.Runge-Kutta法などの手法を用いて,初期条件 (6.84) のもとに {uk(t)} に対する常微分方程式系 (6.82)を積分すれば,任意時刻 t におけるフーリエ係数 {uk(t)} が,したがってまた (6.78)を通じて,近似解 u(x, t) が得られることになる.
(6.82)から分かるように,ガラーキン法を用いる場合,実際の計算上一つの重要なポイントとなるのが,非線形項 F
(u∂u
∂x
)kの取り扱いである.一般的な2次の非線形項
w(x) = u(x)v(x) (6.85)
の場合について考えてみよう.u(x), v(x) に対して打ち切らない真のフーリエ級数
u(x) =∞∑
k=−∞
uk eikx, v(x) =∞∑
k=−∞
vk eikx (6.86)
を代入して計算すると,
wk =12π
∫ 2π
0
w(x) e−ikx dx =∑
p+q=k−∞<p,q<∞
up vq (6.87)
となる.これはたたみこみ和 (convolution sum)と呼ばれる.u, v, w を N/2 次の有限フーリエ級数で近似することにすると,この代わり
F (uv)k = wk =∑
p+q=k−N/2≤p,q≤N/2−1
upvq, (k = −N
2, . . . ,
N
2− 1) (6.88)
となり,特に Burgers方程式に現れるような非線形な移流項に対しては
F(
u∂u
∂x
)k
=∑
p+q=k−N/2≤p,q≤N/2−1
iq upuq (6.89)
となる.
6.4.1.1 変換法によるたたみ込みの計算
実空間における非線形項に対応する,フーリエ空間におけるたたみこみ (6.88) or (6.89)を直接に計算したとすると,O(N2) 程度の計算回数が必要となる.これは例えば差分法を用いて非線形項を計算した時の計算回数 O(N) と比較すると,大幅な計算量の増加になる.しかしこのたたみ込みは,以下のように高速フーリエ変換 (FFT)を利用した変換法 (transform method)を用いることにより O(N log2 N) 程度にまで減少させることができる.この変換法の開発こそが,スペクトル法を大規模シミュレーションにおける現
実的で有力な一手法にまで押し上げた立役者と言うことができよう.
変換法のキーポイントは以下のように離散フーリエ逆変換を用いて,ガラーキン法本来の空間であるスペ
クトル空間 (フーリエ係数の空間)をいったん離れ,たたみ込みに対応する計算を物理空間での積として行い,離散フーリエ変換により再びスペクトル空間に戻るという点である.この方法は,スペクトル空間での
量をいったん実空間に変換し,そこで何らかの演算をした後に,再びスペクトル空間に戻るというもので,
手続きとしてはわざわざ遠回りをしていることになる.それにもかかわらずこの手法がきわめて効率的な手
法になり得たのは,もちろん離散フーリエ変換を高速に実行するFFTアルゴリズムの発明のおかげである.
xj = 2πj/N (j = 1, . . . , N) を [0, 2π] の N 等分点として,{uk}, {vk} から FFTアルゴリズムを用いた逆離散フーリエ変換
uj =N/2−1∑
k=−N/2
uk eikxj , vj =N/2−1∑
k=−N/2
vk eikxj , (j = 1, . . . , N) (6.90)
111
により {uj}, {vj} を求め,これから
wj = ujvj (j = 1, . . . , N) (6.91)
により {wj} を定義すると,その離散フーリエ変換 {wk} は
wk =∑
p+q=k−N/2≤p,q≤N/2−1
upvq +∑
p+q=k±N−N/2≤p,q≤N/2−1
upvq, (k = −N
2, . . . ,
N
2− 1) (6.92)
で与えられる.
【証明】
wk =1N
N∑j=1
wj e−ikxj =1N
N∑j=1
N/2−1∑p=−N/2
up eipxj
N/2−1∑q=−N/2
vq eiqxj
e−ikxj
=1N
N/2−1∑p=−N/2
N/2−1∑q=−N/2
upvq
N∑j=1
ei(p+q−k)xj
(6.93)
と書けるが,ここで離散直交性 (6.65)より
N∑j=1
ei(p+q−k)xj =
N (p + q − k が N の倍数の時)
0 (それ以外)(6.94)
であること,また
−N
2≤ p, q, k ≤ N
2− 1 =⇒ −3
2N + 1 ≤ p + q − k ≤ 3
2N − 2 (6.95)
より,p + q − k が N の倍数になるのは p + q = k の他に,p + q = k ±N の場合があることを考慮すると
(6.92)が得られる.【証明終わり】
この方法によると,3回の FFTと N 回のかけ算,すなわちほぼ(
152 N log2 N + N
)回程度の実数のか
け算で,2つの関数の積のフーリエ係数を求めることができ,3N2/2 程度の計算量を必要とする直接的な計算法と比べて,格段のスピードアップを実現することができる.11
ただし,この方法でたたみ込みを計算すると,(6.92)から分かるように,ガラーキン法で要求されているたたみ込み (右辺第 1項)の他に,エイリアジングによる余分な項 (右辺第 2項)がついてきてしまう.このエイリアジング誤差が実際の数値計算にどの程度の害をもたらすかは,解いている問題の種類により,一般
に粘性などの効果が入った散逸系の計算では,保存系の計算の場合に比べてその害はそれほど深刻ではな
いと言われている.しかしどちらにしても,このままこのエイリアジング誤差を放置しておいては,真の意
味でのガラーキン法にはならない.12 このエイリアジング誤差は多少の計算量の増加を覚悟すれば以下の
ような手法で取り除くことができる.
6.4.1.2 エイリアジング誤差の消去法 (3/2則)
変換法によるたたみ込みの計算に現れるエイリアジング誤差を消去する代表的な手法の一つに,3/2則
(3/2-rule)と呼ばれるものがある.これは (6.90)の逆離散フーリエ変換を行うときに,自分が実際に持っ
11例えば N = 10, 000 のとき,変換法の計算回数は直接法のそれの 1/150 程度まで減少する.12ガラーキン法に近いが,このエイリアジング誤差を残したまま処置をしない手法は疑スペクトル法 (pseudospectral method)と呼ばれる.ただし,この呼び名は人によっては,次に述べる選点法的なスペクトル法を指すのに用いられることも多いので,注意が必要である.
112
ているフーリエ係数 {uk} の数 N ではなく,M ≥ (3/2)N を満たすような M 項の離散変換を用いるもの
である.
xj = 2πj/M (j = 1, . . . ,M) を [0, 2π] の M 等分点として,{Uj}, {Vj} を逆離散フーリエ変換
Uj =M/2−1∑
k=−M/2
uk eikxj , Vj =M/2−1∑
k=−M/2
vk eikxj (j = 1, . . . ,M) (6.96)
により定める.13 ただし,もともとフーリエ係数 {uk}, {uk} は −N/2 ≤ k ≤ N/2 − 1 に対してしか持っていないので,ないところには 0 を当てはめて (zero-padding)
uk =
uk −N/2 ≤ k ≤ N/2 − 1
0 それ以外の k(6.97)
とする.このように延長したフーリエ係数から逆離散フーリエ変換で得られた実空間のM 等分点における
関数値から wj = Uj Vj で {wj} を計算し,それを再び M 点の離散フーリエ変換でスペクトル空間に戻す
と,(6.92)とまったく同様の計算で
wk =∑
p+q=k−M/2≤p,q≤M/2−1
upvq +∑
p+q=k±M−M/2≤p,q≤M/2−1
upvq, (k = −M
2, . . . ,
M
2− 1) (6.98)
となる.
われわれの興味がある k の範囲は −N/2 ≤ k ≤ N/2− 1 であり,もしこの範囲の k に対して右辺第 2項が 0 になるように M を選ぶことができれば,エイリアジング誤差は現われないことになる.upvq が 0でない組み合わせに対しては −N ≤ p + q ≤ N − 2 であるので,k + M > N − 2 であれば p + q = k + M の
タイプのエイリアジングは起きない.−N/2 ≤ k ≤ N/2 − 1 に対してこの条件を満足する正の M は
M > N − 2 − k ≥ N − 2 +N
2=
3N
2− 2. (6.99)
同様に k−M < −N であれば p+q = k−M のタイプのエイリアジングは起きない.−N/2 ≤ k ≤ N/2−1に対してこの条件を満足する正の M は
M > k + N ≥ N
2− 1 + N =
3N
2− 1. (6.100)
このことから,変換法で 2次のたたみ込みを求めるときに,値が 0のフーリエ係数を付け足して逆離散フーリエ変換のデータの長さを (3/2)N 以上になるようすると,積のフーリエ係数のうち,着目している範囲−N/2 ≤ k ≤ N/2 − 1 の係数はエイリアジング誤差の影響を受けなくなる.この手法の演算回数は,エイリアジング誤差を気にしない単純な手法 (6.92)の場合のほぼ 50%増しになる.エイリアジング誤差を取り除くためのこの手法は 3/2則 (3/2-rule)と呼ばれている.14
6.4.2 フーリエ・選点法
やはり [0, 2π] で周期的な場合を考える.フーリエ・選点法では試行解 u(x, t) は,[0, 2π] の N 等分点
xj = 2πj/N (j = 1, . . . , N) における関数値 {uj} で表現される.すなわち,選点法における基本的な未知数は,展開係数 (フーリエ係数)ではなく,N 個の選点における関数値そのものである.
選点法では重み関数は各選点に中心を持つデルタ関数なので,ここで例として考えている Burgers方程式 (6.77)の場合,残差方程式は
duj
dt+ uj
(∂u
∂x
)j
− ν
(∂2u
∂x2
)j
= 0, (j = 1, . . . , N) (6.101)
13N 項の時のフーリエ係数と区別するために,M 項の時の係数は {uk} などと書いた.14ここでは触れないが,エイリアジング誤差を取り除くその他の方法として,「位相シフトによる方法」と呼ばれる方法もある.
113
で与えられる.また初期条件は当然
uj(0) = u0(xj) (j = 1, . . . , N). (6.102)
で与えられる.
(6.101)に基づいて各選点における関数値 uj(t) の時間発展を追跡する場合,前述のGalerkin法の場合に難関となった非線形項は今回は何の障害にもならない.その一方で,Galerkin法に場合には自明であった空間微分項の計算が,選点法にとっては新たな重要なポイントとなる.フーリエ・選点法では,離散フーリ
エ変換を利用して以下のような手続きで空間微分項の計算が行われる.15 すなわち,
1. まず N 個の離散点における関数値 {uj} から FFTを使って離散フーリエ変換
uj =N/2−1∑
k=−N/2
uk eikx (6.103)
の係数 {uk} を求める.
2. 各 uk を ikuk に置き換える.もし m階微分が必要なら uk −→ (ik)muk とする.もし周期が 2π で
なく L ならば,uk −→ (i2πk/L)muk としなければいけない.
3. これを再び FFTを使って逆離散フーリエ変換し,N 等分点における u の微分値(に対する近似値)
を算出する.
このように,選点法においてはスペクトル空間はただ単に空間微分を計算する際の通過点として使われる
に過ぎず,発想自身は差分法によく似ていてなじみやすい.また,この方法では非線形項であろうが,変
数係数を持つ項であろうが,すべて実空間上の各節点における関数値自身の積として取り扱われるために,
特別な困難は引き起こさない.
ここで扱っている三角関数系に基づくフーリエ・スペクトル法の場合,上述の選点法は,§6.4.1.1で触れたエイリアジング誤差を消去しない疑スペクトル法と同値であることを示すことができる.したがってこ
の選点法も疑スペクトル法同様,そのままではエイリアジング誤差を含んでいる.もちろん選点法に対し
ても,疑スペクトル法のところで述べた「3/2則」に対応する手法を用いることにより,エイリアジング誤差を消去することができ,これを行えば選点法はガラーキン法と等価となる.具体的には,上の手続きで
離散フーリエ変換を用いて空間微分値を求める際に,フーリエ係数のうち k ≥ |N/3| の部分をつねに 0と置いてしまうのである.この手法は,原理的には前述の 3/2則と同じであるが,選点法の脈絡では 2/3則
(2/3-rule) と呼ばれる.
6.5 チェビシェフ・スペクトル法
三角関数に基づくフーリエ・スペクトル法は周期境界条件の時にしか使うことができないという実用上大
変大きな制約がある.より一般的な非周期境界条件の場合には,三角関数系に代わり,チェビシェフ多項式
に基づくスペクトル法が用いられることが多い.三角関数系の場合と同様,チェビシェフ多項式系に対して
も,物理空間の選点における関数値と,スペクトル空間における展開係数との間で FFTを利用した高速な変換が可能であり,したがってフーリエ・スペクトル法の場合と同様,効率的なスペクトル法を構築するこ
とが可能である.
チェビシェフ多項式は三角関数に比べてなじみが薄いと思われるので,はじめにチェビシェフ多項式の定
義と基礎的な性質を紹介し,次節でそれに基づくスペクトル選点法の運用の際に必要となる空間微分の計
算法について説明することにする.15実の離散フーリエ変換による微分係数の計算法は,すでに §6.3.8 にて説明済み.
114
6.5.1 チェビシェフ多項式
定理¶ ³k が自然数のとき,cos(kθ) は cos θ の k 次多項式としてあらわすことができる.µ ´
証明:k = 0 および k = 1 については明らか.k ≥ 2 については,三角関数の恒等式
cos[(k + 1)θ] + cos[(k − 1)θ] = 2 cos θ cos(kθ) (6.104)
を用いれば帰納法により O.K.
最初のいくつかについて具体的に書くと
cos(2θ) = 2 cos2 θ − 1, (6.105)
cos(3θ) = 2 cos θ cos(2θ) − cos θ = 4 cos3 θ − 3 cos θ, (6.106)
cos(4θ) = 2 cos θ cos(3θ) − cos(2θ) = 8 cos4 θ − 8 cos2 θ + 1. (6.107)
定義¶ ³k次のチェビシェフ多項式(k-th Chebyshev polynomial) Tk(x) は,上の定理に基づいて,以下のように定義される.
cos(kθ) ≡ Tk(cos θ) = Tk(x) x = cos θ x ∈ [−1, 1] (6.108)µ ´Tk(x) の最初のいくつかを具体的に書くと
T0(x) = 1, (6.109)
T1(x) = x, (6.110)
T2(x) = 2x2 − 1, (6.111)
T3(x) = 4x3 − 3x, (6.112)
T4(x) = 8x4 − 8x2 + 1. (6.113)
★ Tk(x) は その定義から明らかに,
|Tk(x)| ≤ 1 for x ∈ [−1, 1]. (6.114)
★ また同じく定義より Tk(x) は kθ = mπ (m = 0, 1, . . . k) となる点,すなわち
xm = cos(mπ
k
)(m = 0, 1, 2, . . . , k) k ≥ 1 (6.115)
で ±1 という極値を取る.
漸化式 1¶ ³Tk+1(x) = 2xTk(x) − Tk−1(x) k ≥ 1, T0(x) = 1, T1(x) = x. (6.116)µ ´
が成り立つ.
証明:(6.104)において,cos(kθ) → Tk(x), cos θ → x の置き換えをすれば,
Tk+1(x) + Tk−1(x) = 2xTk(x)
となり,これは (6.116)そのもの.
115
����
��
����
�
���
�
���
� �� �� ��� ���
cos(
20θ )
θ (deg)
図 6.6: θ の関数としてプロットした cos(20θ).
����
��
����
�
���
�
���
�� ���� � ��� �
cos(
20θ )
(=
T20
(x))
cos(θ) (=x)
図 6.7: cos θ の関数としてプロットした cos(20θ),すなわち T20(x).
116
漸化式 2¶ ³2Tk(x) =
1k + 1
T ′k+1(x) − 1
k − 1T ′
k−1(x) (k ≥ 2), 2 T1(x) =12
T ′2(x) (6.117)µ ´
が成り立つ.
証明:
右辺 =1
k + 1d cos[(k + 1)θ]
d cos θ− 1
k − 1d cos[(k − 1)θ]
d cos θ
=1
k + 1−(k + 1) sin[(k + 1)θ]
− sin θ− 1
k − 1−(k − 1) sin[(k − 1)θ]
− sin θ
=1
sin θ{sin[(k + 1)θ] − sin[(k − 1)θ]} = 2 cos(kθ) = 2 Tk(x) =左辺.
直交性¶ ³チェビシェフ多項式 Tk(x) (k = 0, 1, 2, . . .) は閉区間 [−1, 1] の上で,重み 1/
√1 − x2 に関して直交関
数系を構成する.すなわち
∫ 1
−1
Tk(x)Tl(x)dx√
1 − x2=
0 if k = l
12π if k = l > 0
π if k = l = 0
k, l = 0, 1, 2, . . . (6.118)
µ ´が成り立つ.
証明:
左辺 =∫ 0
π
cos(kθ) cos(lθ)− sin θ dθ
sin θ=
12
∫ π
−π
cos(kθ) cos(lθ) dθ. (6.119)
ここで三角関数の直交性 (6.5)を使えば (6.118)の右辺になる.
6.5.2 チェビシェフ展開
チェビシェフ展開¶ ³周期関数を三角関数という直交関数系の一次結合で近似したフーリエ級数の場合とまったく同じ考え
で,区間 [−1, 1] で定義された任意の関数 f(x) を {Tk(x)} の一次結合で近似することを考える.もし
f(x) =12c0T0(x) +
∞∑k=1
ckTk(x) (6.120)
が成り立つとすると,両辺に Tm(x)/√
1 − x2 をかけ,[−1, 1] で積分して,直交関係 (6.118)を用いると,
ck =2π
∫ 1
−1
f(x)Tk(x)dx√
1 − x2(k = 0, 1, . . .) (6.121)
が得られる.(6.121) で与えられる係数 {ck} を持つ無限級数 (6.120) を f(x) のチェビシェフ展開(Chebyshev expansion)と呼ぶ.µ ´(6.121)で Tk(x) → cos(kθ), x → cos θ の置き換えをすれば,
ck =1π
∫ π
−π
f(cos θ) cos(kθ) dθ (k = 0, 1, . . .) (6.122)
117
となる.すなわち,f(x) のチェビシェフ展開の係数 {ck} は,周期 2π の偶関数 F (θ) ≡ f(cos θ) の実フーリエ変換,すなわちコサイン変換の係数 {ak} に等しい.
このように,[−1, 1] で定義された f(x) をチェビシェフ多項式で展開することは,2π 周期を持つ偶関数
F (θ) (≡ f(cos θ)) のコサイン展開と同値なので,その収束性についてもフーリエ展開の理論がそのまま適用できる.すなわち,もし f(x) が連続な1階導関数を持つような滑らかな関数であれば,そのチェビシェフ展開 (6.120)は [−1, 1] の各点で正しく f(x) に収束する.また f(x) が解析的で何度でも微分可能であれば,チェビシェフ展開の展開係数 {ck} は k → ∞ の時 k のどんなベキよりも速く減少し,フーリエ級数
の場合と同様に,スペクトル的精度が得られることが保証される.
6.5.3 離散チェビシェフ展開
今 x の区間 [−1, 1] の (N + 1) 個の点
xj = cos(
jπ
N
)(j = 0, 1, 2, . . . , N), x0 = 1, xN = −1 (6.123)
で関数 f(x) の値 {fj} を知っているものとする.16 上で得られたチェビシェフ展開とフーリエコサイン変
換の対応関係と,§6.3で学んだ離散フーリエ変換の理論から,これら (N + 1)個の節点において補間的となる有限チェビシェフ級数,すなわち
fN (xj) = fj (j = 0, . . . , N) (6.124)
が成り立つような N 次有限チェビシェフ級数 fN (x)
fN (x) =12c0T0(x) +
N−1∑k=1
ckTk(x) +12cNTN (x) (6.125)
の係数 {ck} は
ck =2N
N∑j=0
′′
fj cos(kθj), θj =π
Nj (j = 0, . . . , N) (6.126)
で与えられることが分かる.ここで∑′′
は初項と末項を 1/2倍して和を取ることを意味する.これは離散フーリエ変換の係数 {ak} に対する表現 (6.40)とまったく同じであり,したがって FFTにより高速に求めることができる.
もう少し説明を加えると以下のようになる.x = cos θ という変数変換によって独立変数を x ではなく θ
だと思うことにする.x の区間 [−1, 1] が θ の区間 [π, 0] に対応する.そして f(x) をあたらめて θ の関数
として見たとき,それを F (θ) と書くことにする.すなわち
f(x) −→ F (θ) ≡ f(cos θ). (6.127)
また,
xj = cos(
jπ
N
)⇐⇒ θj =
jπ
N(j = 0, . . . , N) (6.128)
なので,x から見て不等間隔の (N + 1)個の節点 {xj} は,θ から見ると [0, π] の N 等分点 {θj} に対応している.したがって,われわれは θ について周期 2π の偶関数 F (θ) の値を [0, π] のN 等分点において知っ
ていることになり,17 これら N 個の点において補間的な N 次三角多項式は §6.3で学んだ (6.19),(6.40)の
16どうせ実際には FFT を使うので,以下では N を2のべきで表される自然数,したがって偶数として話を進める.17これは 2π の 2N 等分点において値を知っていることに対応.§6.3 離散フーリエ変換の話では,N は [0, 2π] の節点数を意味していたが,ここでの N は [0, π] の節点数を意味しているので間違えないように.
118
結果を用いて
FN (θ) =12c0 +
N−1∑k=1
ck cos kθ +12cN cos Nθ, (6.129)
ck =2
2N
2N∑j=1
Fj cos(kθj) =2N
N∑j=0
′′
Fj cos(kθj) (6.130)
で与えられることが分かる.ここで
FN (θ) −→ fN (x), cos(kθ) −→ Tk(x) (6.131)
の置き換えをすれば (6.125), (6.126)が得られる.
6.5.4 チェビシェフ選点法における空間微分の計算法
§6.4のフーリエ選点法のところでも述べたように,選点法では実空間の節点における関数値そのものが基本的な未知数であり,その意味で感覚的にも差分法に近くもっとも取っ付きやすい.選点法では,非線形
項の計算などは単純で18,空間微分を効率よく求めることが計算の重要なポイントとなる.
フーリエ選点法の場合には
{uj}順 FFT−→ {uk} −→ {ik uk}
逆 FFT−→
{∂u
∂x
∣∣∣∣j
}(6.132)
という単純な操作で1階微分の計算ができたが,チェビシェフ選点法の場合,これに比べると,以下に説明
するようなやや煩雑な操作が必要となる.チェビシェフ選点法が,偏微分方程式のシミュレーションのた
めの効率の良い数値手法となるためには,フーリエ選点法の場合の関係式 (6.132)のように,ある関数の展開係数から,その導関数の展開係数が簡単に求められるような関係式が必要である.この関係式は漸化式
(6.117)を用いて以下のように導出することができる.
x の区間 [−1, 1] で定義された任意の関数 f(x) の本当のチェビシェフ展開を
f(x) =12c0 +
∞∑k=1
ckTk(x), (6.133)
またその1階導関数 f ′(x) のチェビシェフ展開を
f ′(x) =12c(1)0 +
∞∑k=1
c(1)k Tk(x) (6.134)
とする.(6.134)に (6.117)を代入すると
f ′(x) =12c(1)0 + c
(1)1 T1(x) +
∞∑k=2
c(1)k Tk(x)
=12c(1)0 T ′
1(x) + c(1)1
14T ′
2(x) +∞∑
k=2
c(1)k
12
{1
k + 1T ′
k+1(x) − 1k − 1
T ′k−1(x)
}
=12c(1)0 T ′
1(x) +14c(1)1 T ′
2(x) +∞∑
k=3
c(1)k−1
2kT ′
k(x) −∞∑
k=1
c(1)k+1
2kT ′
k(x)
=∞∑
k=1
c(1)k−1
2kT ′
k(x) −∞∑
k=1
c(1)k+1
2kT ′
k(x) (6.135)
18もっともエイリアジング誤差を消去しようとすると,前述のように若干の工夫が必要となるが.
119
一方 (6.133)をそのまま x で微分すると
f ′(x) =∞∑
k=1
ckT ′k(x). (6.136)
ここで (6.135)と (6.136)の各 T ′k(x) の係数を等置すると,最終的に漸化式
f ′(x)の展開係数に対する漸化式 1¶ ³2kck = c
(1)k−1 − c
(1)k+1 (k ≥ 1) (6.137)µ ´
が得られる.
実際の有限級数
f(x) ∼ fN (x) =12c0T0(x) +
N−1∑k=1
ckTk(x) +12cNTN (x) (6.138)
の場合,f ′(x) には TN (x) の項はなく,19 したがって
c(1)k = 0 for k ≥ N. (6.139)
これより 0 でない c(1)k は k の大きい方から順に (6.137) を使って
f ′(x)の展開係数に対する漸化式 2¶ ³c(1)k = c
(1)k+2 + 2(k + 1)ck+1 (0 ≤ k ≤ N − 1). (6.140)µ ´
のように決めていくことができる.この漸化式を使えば 2N 回のかけ算で1階導関数のチェビシェフ展開
係数を計算することができる.
漸化式 (6.140)は m 階導関数の展開係数 {c(m)k } と (m + 1) 階導関数の展開係数 {c(m+1)
k } の間ででもそのまま成立する.すなわち
c(m+1)k = c
(m+1)k+2 + 2(k + 1)c(m)
k+1 (0 ≤ k ≤ N − 1) (6.141)
が成り立つ.原理的にはこれを用いればあらゆる階数の導関数の展開係数を求めることができることにな
る.20
例として
f(x) = tanh(x) + cosh(x), (−1 ≤ x ≤ 1) (6.142)
に対して上で説明した手続きで導関数 f ′(x) を求めてみた.f(x) および f ′(x) の形を図 6.8 に示す.グラフ中のマーカーは展開項数 n = 32 の時の離散チェビシェフ変換に用いられる離散点の分布を表している.離散点の分布は一様ではなく,両端で密になっていることが分かる.まず n個の離散点における関数
値 {f(xj)} に基づいて離散チェビシェフ展開の係数 {ck} を求め,次にそれと漸化式 (6.140)から f ′(x) の展開係数 {c(1)
k } を求め,これを逆離散チェビシェフ変換することにより {f ′(xj)} を求める.図 6.9はこうして {f ′(xj)} を求めた場合のメッシュ点数 n と誤差の関係を示す. 誤差は平均 2乗根誤差,すなわち
誤差 =
√√√√ 1n
n∑j=1
{f ′(xj)num − f ′(xj)exact}2 (6.143)
で定義されている.図は片対数グラフであり,したがって浮動小数点の有限桁精度の影響が現れるまでは,
展開項数 n の増加に伴い,誤差が指数関数的に減少していくことが分かる.19離散フーリエ変換の場合の最高次の項 cos N
2x が微分により sin N
2x に変わり,離散フーリエ級数の表現から消えてしまうこと
に対応.20なお f ′(x) の係数 c
(1)k および f ′′(x) の係数 c
(2)k に対しては,f(x) の係数 ck から直接計算できるような陽な表現を作ること
もできる.
120
-1-0.500.511.522.5
-1 -0.5 0 0.5 1ff'f(x)
and
f'(x
)
x
図 6.8: 離散チェビシェフ展開を用いた導関数の計算例の対象関数
10-1410-1210-1010-810-610-40.01
0 10 20 30 40 50 60
rms
erro
r
n
図 6.9: 離散チェビシェフ展開による微分の計算精度と項数の関係
121
ちなみに,このような非周期的な関数に無理やり三角関数に基づく離散 Fourier変換を適用すると,関数値自身に有限な跳びがあるために,その展開係数は波数 k に対して 1/k 程度でしか減少しない.そのよう
な状況で,微分係数を求めようとして各 Fourier係数に k を乗じると,まったく収束しない級数となり,展
開の項数を上げれば上げるほどますますでたらめな数値しか出てこないという結果になる.
6.5.5 その他の計算領域への適用
上の議論では,計算対象領域が,チェビシェフ多項式を考える際の標準的な領域である −1 ≤ x ≤ 1 と仮定していた.対象領域が a ≤ x ≤ b である場合には,線形変換
ξ =2
b − a(x − a) − 1 (6.144)
により新たな独立変数 ξ を導入すれば,ξ から見た対象領域は [−1, 1] となり,標準的なチェビシェフ展開の議論がそのまま適用できる.
対象領域が半無限区間 [0,∞) の場合には,ラゲール多項式 (Laguerre polynomial)と呼ばれる直交多
項式を用いて展開するという道もあるが,これに対しては実空間とスペクトル空間をつなぐ高速変換が開
発されていないので,大規模計算には向いていないと思われる.別の方法としては,やはり適当な変数変換
により,領域を [−1, 1] に写像し,その後チェビシェフ展開を用いるというものが考えられる.この際よく用いられる変数変換としては,
x = L1 + ξ
1 − ξ, ξ =
x − L
x + L(6.145)
のような代数的な変換と,
x = −L ln(
1 − ξ
2
), ξ = 1 − 2e−x/L (6.146)
のような指数関数的なものがある.ここで L はその写像の「長さスケール」を決める適当な実数である.ど
ちらの変数変換も x = 0 において何らの特異性も持ち込まず,近似しようとしている未知関数 u(x) が無限回微分可能で,x → ∞ で指数関数的に減少するような関数の場合には,通常のチェビシェフ展開同様,スペクトル的精度,すなわち表現誤差が展開項数 N のどんな大きなべきよりも速く減少することが保証され
ている.多くの実例では,(6.145)の代数的変換の方が,(6.146)の変換に比べて,より正確でロバストな21
数値解を与えるといわれている.
一方,対象領域が無限区間 (−∞,∞) の場合には,古典的な考え方としてはエルミート多項式 (Hermite
polynomial)と呼ばれる直交多項式を用いて展開することが考えられるが,これに対してもラゲール多項
式同様,実空間とスペクトル空間をつなぐ高速変換が開発されていないので,大規模計算には向かないで
あろう.有望な方法としては,やはり適当な変数変換により,領域を [−1, 1] に写像し,その後チェビシェフ展開を用いるというものであろう.この際よく用いられる変数変換としては,
x = Lξ√
1 − ξ2, ξ ∈ [−1, 1] (6.147)
のような代数的な変換と,
x = L tanh−1 ξ, ξ ∈ [−1, 1] (6.148)
のような指数関数的なものがある(L は適当な実数).未知関数 u(x) が無限回微分可能で,x → ±∞ で
解析的で十分速く減衰する場合には,やはりスペクトル的精度が得られることが保証されている.この方
法の場合,u(x) は x → ±∞ で異なる極限に漸近しても構わない.
無限領域 (−∞,∞) の場合には,適当な変数変換,例えば,
x = −L cot(ξ/2) ξ ∈ [0, 2π] (6.149)21すなわち L の取り方に敏感でない.
122
により 0 ≤ ξ ≤ 2π に写像し,そこでフーリエ級数展開を用いると言う方法も考えられる.ただしこの場
合,スペクトル的精度を得るためには,u(x) およびそのすべての微分係数が存在し,それぞれが x → ±∞で同じ値を取ることが要求される.x → ±∞ で異なる極限値に漸近するような関数の場合には,変換
x = −L cot(ξ), ξ ∈ [0, π] (6.150)
により −∞ < x < ∞ を 0 < ξ < π に写像し,そこで半区間展開(正弦級数 or余弦級数)を用いるという方法も考えられる.
スペクトル法に関する参考書
• C. Canuto, M.Y. Hussaini, A. Quarteroni, T.A. Zang: Spectral Methods in Fluid Dynamics, (Springer1988)
• D. Gottlieb and S.A. Orszag: Numerical Analysis of Spectral Methods, (SIAM 1977)
• B. Fornberg: A Practical Guide to Pseudospectral Methods, (Cambridge 1998)
• 大宮司,三宅,吉澤編:乱流の数値流体力学 (東大出版会 1998),第 5章.
など.
123
第7章 連立一次方程式の解法
連立一次方程式の数値解法としては以下のような手法がよく知られている.
• 直接法
– Gaussの消去法
– LU分解
• 反復法 I
– Jacobi法
– Gauss-Seidel法
– 逐次過緩和法 (SOR)
• 反復法 II
– 最急降下法
– 共役勾配法
以下ではこれら代表的な手法について,順次簡潔に解説していく.
7.1 Gaussの消去法
7.1.1 Gaussの消去法
n 個の未知数 x1, . . . , xn に関する n個の 1次方程式よりなる連立一次方程式を
a11x1 + a12x2 + · · · + a1nxn = b1,
a21x1 + a22x2 + · · · + a2nxn = b2,...
...an1x1 + an2x2 + · · · + annxn = bn
(7.1)
と書く.
以下のように,ある方程式の何倍かを別の方程式に足したり引いたりという操作を繰り返すことによっ
て,もとの連立一次方程式系 (7.1)と同値で,かつ係数行列が上三角行列であるような方程式系に変形してから解く手法をGaussの消去法 (Gaussian elimination)という.
以下では第 i行目を [i] と書くことにする.(7.1)で,[2] − [1] × (a21/a11), [3] − [1] × (a31/a11) のように,2行目以降について [i] − [1] × (ai1/a11) を行うことによって 2行目以降から第 1変数 x1 を消去する
124
と,(7.1)はa11x1 + a12x2 + · · · + a1nxn = b1,
a22x2 + · · · + a2nxn = b2,...
...an2x2 + · · · + annxn = bn
(7.2)
のような形に変わる.この操作で 2行目以降の aij および bi は
aij −→ aij − a1j ×ai1
a11, bi −→ bi − b1 ×
ai1
a11(7.3)
のように変更されているが,ここでは変更後のこれらの値をもとと同じ記号で表現しているので,その点
注意されたい.なお第 1行目の x1 の係数 a11 をこのステップのピボット (pivot)と呼ぶ.
次に [3] − [2] × (a32/a22), [4] − [2] × (a42/a22) のように 3行目以降について,[i] − [2] × (ai2/a22) を行うことにより,3行目以降から第 2変数 x2 を消去すると
a11x1 + a12x2 + a13x3 + · · · + a1nxn = b1,
a22x2 + a23x3 + · · · + a2nxn = b2,
a33x3 + · · · + a3nxn = b3,...
...an3x3 + · · · + annxn = bn,
(7.4)
のような形に変わる.このステップのピボットは第 2行目の x2 の係数 a22 である.
このような操作を (n − 1) 回繰り返すと,最終的に
a11x1 + a12x2 + a13x3 + · · · + a1nxn = b1,
a22x2 + a23x3 + · · · + a2nxn = b2,
a33x3 + · · · + a3nxn = b3,
. . ....
annxn = bn,
(7.5)
のように係数行列を上三角行列に変形することができる.ここまでの操作を前進消去 (forward elimination)
という.
(7.5)のように上三角行列を係数行列に持つ連立一次方程式は,
xn = bn/ann
xn−1 = (bn−1 − an−1,nxn)/an−1,n−1
...
x1 = (b1 −n∑
k=2
a1kxk)/a11
(7.6)
のように,最後の変数 xn から簡単に解いていくことができる.この操作は後退代入 (backward substi-
tution)と呼ばれる.
[例題]2x1 +x2 +x3 = 14x1 +x2 = −2
−2x1 +2x2 +x3 = 7
(7.7)
125
まず [2] − [1] × (4/2), [3] − [1] × (−2/2) をすると
2x1 +x2 +x3 = 1−x2 −2x3 = −43x2 +2x3 = 8
(7.8)
このステップのピボットは a11 = 2.次に [3] − [2] × (3/(−1)) をすると,
2x1 +x2 +x3 = 1−x2 −2x3 = −4
−4x3 = −4
(7.9)
このステップのピボットは a22 = −1.これを下の式から順番に解いていけば
x3 = 1, x2 = 2, x1 = −1. (7.10)
7.1.2 LU分解ーGaussの消去法の行列演算としての表現
p行 q 列成分だけが 1で,その他の成分はすべて 0であるような n × n 行列を Epq と書くことにする.
Kroneckerのデルタ δij を使うと,Epq の (i, j) 成分 eij は
eij = δpiδqj (7.11)
と表現できる.この行列を任意の n × n 行列 A の左から掛けてできる行列 EpqA は,
(EpqA)ij =n∑
k=1
eikakj =n∑
k=1
δpiδqkakj = δpiaqj (7.12)
より,第 p行以外は全て 0で,第 p行には A の第 q行が入ったような行列になる.すなわち,A の第 i 行
ベクトルを ai と書くことにすると,
A =
a11 · · · a1n
......
ap1 · · · apn
......
an1 · · · ann
=
a1
...ap
...an
の時, EpqA =
0...
aq
...0
それでは,単位行列の第一列の対角成分以下の成分だけを 0でない数字に置き換えた行列,すなわち
M1 =
1 0−b2 1 0−b3 0 1
.... . .
−bn 1
のような行列を A の左からかけるとどうなるか.
M1A = (I − b2E21 − · · · − bnEn1)A (7.13)
=
a1
...
...
...an
−
0
b2a1
0...0
− · · · −
0
0...0
bna1
=
a1
a2 − b2a1
a3 − b3a1
...an − bna1
(7.14)
126
より,A の1行目の bj (j = 2, . . . , n) 倍を A の j 行目から引くことになる.
同様に
M2 =
1 00 1... −c3
. . ....
.... . .
0 −cn 1
のような行列を A の左からかけると…
M2A = (I − c3E32 − · · · − cnEn2) A
=
a1
a2
...
...an
−
0
0
c3a2
...0
− · · · −
0
0...0
cna2
=
a1
a2
a3 − c3a2
...an − cna2
(7.15)
より,A の2行目の cj (j = 3, . . . , n) 倍を A の j 行目から引くことになる(以下も全く同様).
このことより,Gaussの消去法で用いられる,ある行の何倍かをそれより下の行から引くという操作は,上のような行列を A の左からかける操作として表現することができる.またこのタイプの行列(すなわち,
単位行列のある列の対角要素の下だけをある数字に置き換えたような行列)に対しては,上に示した性質
より,その逆行列は計算しなくても
M−11 =
1 0b2 1 0b3 0 1...
. . .
bn 1
, M−1
2 =
1 00 1... c3
. . ....
.... . .
0 cn 1
のようになることがわかる.
§7.1.1の[例題]をこのような立場で見直してみよう.
Ax = b, A =
2 1 14 1 0−2 2 1
, x =
x1
x2
x3
, b =
1−27
まず最初のステップは,両辺に左から次の M1 をかけることに対応している.
M1A =
1 0 0−2 1 01 0 1
A =
2 1 10 −1 −20 3 2
, M1b =
1−48
また次のステップは前のステップの結果の両辺に,左から次の M2 をかけることに対応.1 0 0
0 1 00 3 1
(M1A) =
2 1 10 −1 −20 0 −4
≡ U, c ≡ M2(M1b) =
1−4−4
.すなわち Gaussの消去法の前進消去の部分は,方程式の両辺の左から,単位行列のある列の対角成分より下の数字を適当な数字に置き換えたような,特殊な下三角行列を順次掛けて行き,最終的に係数行列を上
三角行列に変形する操作であると解釈することができる.
127
ここで,A をいっぺんに上三角行列 U に変形する行列を M と書く.M は途中の各ステップにおける変
形行列 Mi(i = 1, . . . , n) をすべて掛け合わせたものになっており,したがって下三角行列である.2つの行列 A, B の積 AB は一般には A とも B ともまったく異なる行列であり,具体的に計算してみないとど
のような行列になるか分からない.実際,今の例題の場合も
M = M2M1 =
1 0 00 1 00 3 1
1 0 0−2 1 01 0 1
=
1 0 0−2 1 0−5 3 1
となるが,これは M1, M2 を見ただけでは知ることができない.1
ところが,U を A に戻す行列,すなわち M の逆行列 M−1 の方は,以下に見るように,新たな計算を
まったくしなくても知ることができる.M−1 は下三角行列なので,以下ではこれを L と書くことにする.
L = M−1 = M−11 M−1
2 =
1 0 02 1 0−1 0 1
1 0 0
0 1 00 −3 1
=
1 0 02 1 0−1 −3 1
.
すなわち L の第 1列の対角成分の下には,前進消去の第 1ステップで,第 2式以降から第 1変数 x1 を消
去するために計算した比 ai1/a11(i = 2, . . . , n) が,また L の第2列の対角成分の下には,やはり前進消去
の第 2ステップで,第 2式以降から第2変数 x2 を消去するために計算した比 ai2/a22(i = 3, . . . , n) がそのまま入っているだけである.したがって,前進消去の各ステップで,求めたこれらの比をその都度 L の対
応する場所にはめ込んでいけば,前進消去が終わって A が上三角行列 U に変形された時点で,同時に L
もでき上がっていることになる.
上のようなことがいつも成り立つということを,念のために一般的な 4 × 4 行列の場合について確認しておこう.第 1ステップでかける行列 M1:
M1 =
1 0 0 0
−c21 1 0 0−c31 0 1 0−c41 0 0 1
, M−11 =
1 0 0 0
c21 1 0 0c31 0 1 0c41 0 0 1
, ci1 = ai1/a11.
第 2ステップでかける行列 M2:
M2 =
1 0 0 00 1 0 00 −c32 1 00 −c42 0 1
, M−12 =
1 0 0 00 1 0 00 c32 1 00 c42 0 1
, ci2 = ai2/a22.
第 3ステップでかける行列 M2:
M3 =
1 0 0 00 1 0 00 0 1 00 0 −c43 1
, M−13 =
1 0 0 00 1 0 00 0 1 00 0 c43 1
, ci3 = ai3/a33.
MA = M3M2M1A = U =⇒ A = LU = M−11 M−1
2 M−13 U
L を具体的に計算してみると
L =
1 0 0 0
c21 1 0 0c31 0 1 0c41 0 0 1
1 0 0 00 1 0 00 c32 1 00 c42 0 1
1 0 0 00 1 0 00 0 1 00 0 c43 1
=
1 0 0 0
c21 1 0 0c31 c32 1 0c41 c42 c43 1
1例えば (3, 1) 成分の −5 はどうして出てきたか,計算してみないと分からない.
128
のように,やはり M1, M2, M3 に入っている数字が,符号だけを変えてそのまま同じ場所に入った形になっ
ている.これが A を U に変える行列 M となると
M =
1 0 0 00 1 0 00 0 1 00 0 −c43 1
1 0 0 00 1 0 00 −c32 1 00 −c42 0 1
1 0 0 0−c21 1 0 0−c31 0 1 0−c41 0 0 1
(7.16)
=
1 0 0 0
−c21 1 0 0−c31 + c21c32 −c32 1 0
−c41 + c31c43 + c21(c42 − c32c43) −c42 + c32c43 −c43 1
(7.17)
のようにあらためて計算してみないと分からない行列になる.
この操作により正方行列 A は,対角成分がすべて 1であるような下三角行列 L と上三角行列 U の積 LU
として表現されたことになる.これを行列 A の LU分解 (LU decomposition)と呼ぶ.
以上では,前進消去の各ステップで,ピボット2 が 0にならないことを前提にしている.もしピボットが 0になった場合でも,それより下に,代わりにピボットとして使える 0でない数字がある場合には,行の交換を行うことによって,消去過程を続行することができる3.もし 0ピボットの下もすべて 0の場合には,もともとの係数行列 A が特異行列(非可逆行列)であることを意味している.4 前進消去の途中で 0ピボットが現れはするものの,行の交換さえ行えば消去過程を続行できて最終的に上三角行列に変形でき
るような行列 A は,そのままでは LU分解できないが,途中のピボットの選択時に行う行の交換を最初にA に行ってさえおけば 0ピボットは現れない.前進消去の段階で必要となった行の交換をすべて行う行列を P と書くと5 ,このような A に対しては PA = LU という分解が成り立つ.
7.1.3 LU分解による Ax = b の解法の手続き
係数行列 A の LU分解に基づく連立一次方程式 Ax = b の解法手続きは以下のようになる.
1. まず右辺の非同次項 b はそのままにしておいて,係数行列 A を LU 分解する.これによって解くべ
き方程式は Ax = b から LUx = b に変わる.
2. Lc = b となるような c を求める.L は下三角行列なので,この方程式は前進代入により上から順に
解くことができる.
3. Ux = c となるような x を求める.U は上三角行列なので,この方程式は後退代入により下から順に
解くことができる.
各段階で必要な掛け算割り算の回数は,最初の LU分解の段階で n(n + 1)(n − 1)/3回,次の cベクトル
を求める計算で n(n − 1)/2,最後に解 x を求める計算で n(n + 1)/2 となる.係数行列 A の次元 n が十
分大きいときには,計算量はほぼ n3/3 で見積もることができる.
この手続きを前出の[例題]に対して具体的に行うと,
2すなわち第 k ステップなら,その時点での (k, k) 成分がピボットになる.3ピボットが完全に 0にならなくても非常に小さい数字になると計算誤差が増大するので,なるべく絶対値の大きい数字がピボット
位置に来るように行の交換を行うほうがよいとされている.このような操作は「(部分的) 枢軸選び」と呼ばれる.「枢軸」は「ピボット」に対応する日本語.
4この場合,非同次項 b によっては解が一つもないか,もしくは無限に多くあるかのどちらかであり,どっちにしても,解が一つに決まることはない.
5このような P は,P に表現させたい行の交換を,単位行列に作用させたときにできる行列になっている.
129
1.
A = LU =⇒
2 1 14 1 0−2 2 1
=
1 0 02 1 0−1 −3 1
2 1 1
0 −1 −20 0 −4
(7.18)
2. 1 0 02 1 0−1 −3 1
c1
c2
c3
= b =
1−27
=⇒ c =
1−4−4
(7.19)
3. 2 1 10 −1 −20 0 −4
x1
x2
x3
= c =
1−4−4
=⇒ x =
−121
(7.20)
ということになる.
7.1.4 解の反復改良
ガウスの消去法や LU分解といった直接法で解 x(0) が得られたとしても,それは丸め誤差の累積の影響
であまり精度がよくない可能性がある.
今 Ax = b の厳密な解を X とする.すなわち AX = b. また x(0) に含まれる誤差を e とする.すなわ
ち,X = x(0) + e. この時,AX = A(x(0) + e) = Ax(0) + Ae = b (7.21)
これより
Ae = r(0) where r(0) ≡ b − Ax(0). (7.22)
したがって,求まった解 x(0) から r(0) を計算し,それを右辺とする連立一次方程式 (7.22)を解けば,x(0)
補正すべき量 e が分かり,これによってより高精度の解 x(1) = x(0) + e を求めることができる.必要なら
この手続きを繰り返す.A はすでに LU分解されているので,(7.22)の e を求める計算は r(0) の計算とあ
わせて 2n2 回程度の計算で済む.これは全体の計算量 O(n3/3) から見ればわずなか増加にすぎない.
7.1.5 LU分解による逆行列の計算
応用では,同一の係数行列 A を持った連立一次方程式を多くの非同次項 b に対して解くという場合がよ
くある.この場合,A の逆行列 A−1 さえ求めておけば,あとは A−1 と b の積を求めるだけで済むので効
率的なように思えるが,これは正しくない.
もし A−1 が分かっていたとしても,これに b をかけて x を求めるだけで n2 回 の掛け算が必要である
が,これは A の LU分解ができているときに x を求めるのに必要な計算量とまったく変わらない.すなわ
ち連立一次方程式を解く道具としては LU 分解は A−1 と比べてまったく遜色がない.となると,LU分解と A−1 を求める計算とどちらが少ない計算量でできるかという問題になる.
実は A−1 を求めるもっとも効率的な方法は,係数行列 A を持つ n 個の連立一次方程式
Ax(i) = e(i) (i = 1, . . . , n) (7.23)
を解いて,その解 x(i) を第 i列ベクトルとして持つような正方行列を作ることである.ここで e(i) は,第
i 成分だけが 1であとはすべて 0であるような n項列ベクトルである.この方法ではまず A の LU 分解の
130
ための計算回数 n3/3 に加えて,x(i) を求めるための 2n3/3 程度6 の計算回数を必要とする.このことか
ら,連立一次方程式系を解くとき,たとえ同じ係数行列に対して右辺だけが異なる複数の方程式系を解く
場合にも,A−1 を求めることは A の LU分解を求めることに比べて何のメリットもなく,ただ計算量を増やすだけである.A−1 を求めるのは,A−1 自体がほしいときだけに限るべきである.
7.1.6 LU分解による行列式の計算
連立一次方程式の解法と直接には関係しないが,A の LU分解ができると A の行列式 |A| を簡単に知ることができる.行列式の基本性質
1. |AB| = |A||B|
2. 三角行列の行列式は対角要素の積
を用いれば,
|A| = |LU | = |L||U | = |U | =n∏
i=1
uii (7.24)
により |A| を求めることができる.
仮に {1, . . . , n} の置換に基づく |A| のもともとの定義
|A| =∑
σ
sgn(σ)a1σ(1)a2σ(2) · · · anσ(n) (σ は {1, 2, . . . , n} の置換,sgn(σ) はその符号) (7.25)
に基づいて |A|を求めようとすると,必要な計算回数は n×n!となり,例えばたった n = 25のときですら約3.9×1026 という膨大な回数の掛け算が必要となる.これは現在世界最速の地球シミュレータ(40TFLOPS)をもってしても約 30万年かかるという計算量である.
7.1.7 LU分解の任意性
正方行列 A はたいていの場合,下三角行列 L と上三角行列 U により A = LU と分解できることが
わかった.一般的な上三角行列 L と 下三角行列の U の 0でない成分はそれぞれ n(n + 1)/2,あわせてn(n + 1) = n2 + n であり,それに対して要求される条件の数は,A と LU の n2個の成分がそれぞれ等し
いとする n2 個 である.これは,LU分解は一意的ではなく n 個の自由度があり,L と U の成分のうち,
あわせて n 個は自由に取れることを示している.
よく知られている流儀としては次の2つがある.
• ドゥーリトル (Doolittle)分解
L の対角成分をすべて1と取る.Gaussの消去法で求められる LU分解はこのタイプ.
• クラウト (Crout)分解
U の対角成分をすべて1と取る.
これら2つの LU分解は,単純な操作で相互に変換可能である.ドゥーリトル分解とクラウト分解を上付き添え字 D および C で区別して,
A = LDUD = LCUC . (7.26)
6e(i) の形の特殊性より,Lc(i) = e(i) の必要回数は n3/2 ではなく n3/6 になる.これと Ux(i) = c(i) を解く部分の n3/2 と合わせて 2n3/3.
131
LC の対角成分を成分とする対角行列を D と書けば,
LD = LCD−1, UD = DUC . (7.27)
が成り立つ.
7.1.8 LDU分解とコレスキー分解
ドゥーリトル方式の LU分解 A = LU があるとき,U の対角成分を成分とする対角行列を D と書けば,
A = LDU ′ という形の分解が可能となる.ここで U ′ は対角成分がすべて1の上三角行列である.これを
LDU分解と呼ぶことがある.
A が対称行列の場合,上の A = LDU ′ の L と U ′ は互いに転置行列になり,したがってこの場合,
A = LDLt という形の分解が可能となるが,これは修正コレスキー分解 (modified Cholesky’s decom-
position)と呼ばれる.
さらに A が正値対称行列の場合,A = LDLt に現れる対角行列 D の対角成分 dii, i = 1, . . . , n はすべ
て正であることが保証される.このとき,√
dii を成分とする対角行列を S と書くと,
A = LDLt = LSSLt = (LS)(LS)t. (7.28)
ここで LS を新たに P とおけば,適当な下三角行列 P を用いて,A = PP t と書けることになる.これを
コレスキー分解 (Cholesky’s decomposition)と呼ぶ.
7.1.9 QR分解
今回は詳しくは触れないが,LU分解と並んでよく知られた行列の分解としてQR分解 (QR decompo-
sition)と呼ばれるものがある.これは任意の可逆な正方行列 A を直交行列 Q と上三角行列 R の積とし
て A = QR のように表現するものである.直交行列とは QQt = QtQ = I が成り立つ行列であり,7 した
がって直交行列に対しては,転置するだけで逆行列が得られる.
連立一次方程式の係数行列が特異に近い場合に Gaussの消去法を適用すると,丸め誤差の影響が大きくなり,良い解が求めにくくなる傾向がある.そのような場合に対しては QR分解が有効であると言われている.この方法による Ax = b の解法手順は,
1. 係数行列 A の QR分解 A = QR を求める.
2. Ax = b =⇒ QRx = b =⇒ Rx = Q−1b = Qtb(= r)
最後の R を係数行列とする連立一次方程式は,R が上三角行列なので,後退代入により容易に解くことが
できる.
またQR分解は,行列の固有値・固有ベクトルの数値解法として最もよく使われる手法の一つであるQR
法の基礎となるテクニックでもある.
行列 A の QR分解は,A の列ベクトルに対して Gram-Schmidtの直交化法を適用することに対応している.
7これは Q の列ベクトルの組および行ベクトルの組がともに正規直交系になっていることを意味している.
132
7.2 反復法 I
連立一次方程式 Ax = b の係数行列 A を対角部分 D,下三角部分 L,上三角部分 U に分けて
A = D + L + U (7.29)
D =
a11
a22
. . .
ann
, L =
0
a21. . .
.... . . . . .
an1 · · · an,n−1 0
, U =
0 a12 · · · a1n
. . . . . ....
. . . an−1,n
0
,
(7.30)とおくと,Ax = b は
Dx = −(L + U)x + b (7.31)
と書くことができる.8
7.2.1 Jacobi法
初期の近似解 x(0) から出発して,逐次改良された近似解 x(k+1) を
Dx(k+1) = −(L + U)x(k) + b (7.32)
にしたがって求めていく方法をヤコビ法 (Jacobi Method)という.(7.32)を成分で表現すれば
ヤコビ法¶ ³x
(k+1)i =
1aii
(bi −
i−1∑l=1
ailx(k)l −
n∑l=i+1
ailx(k)l
)(i = 1, 2, . . . , n) (7.33)
µ ´となる.
7.2.2 Gauss-Seidel法
ヤコビ法で x(k+1)i を計算する時点では,x(k+1) のうち {x(k+1)
1 , . . . , x(k+1)i−1 } はすでに求められているに
もかかわらず,計算には利用されていない.計算の各段階において,得られている最新の値を用いるように
ヤコビ法を改良した手法がガウス・ザイデル法 (Gauss-Seidel Method)である.すなわち
Dx(k+1) = b − Lx(k+1) − Ux(k), すなわち x(k+1) = D−1(b − Lx(k+1) − Ux(k)
)(7.34)
成分で書けば
ガウス・ザイデル法¶ ³x
(k+1)i =
1aii
(bi −
i−1∑l=1
ailx(k+1)l −
n∑l=i+1
ailx(k)l
)(i = 1, 2, . . . , n) (7.35)
µ ´となる.
8LU 分解のときの L, U と違い,ここでの L, U は対角成分が 0 であることに注意.
133
7.2.3 逐次過緩和法 (SOR)法
Gauss-Seidel法の反復式 (7.34)を修正量が分かるように書き直すと
x(k+1) = x(k) +{−D−1Lx(k+1) −
(D−1U + I
)x(k) + D−1b
}(7.36)
となる.右辺の { } 内部が x(k) から x(k+1) への修正量を表す.Gauss-Seidel法のこの修正量に,1より大きいパラメタ ω を乗じて修正量を拡大した上で,それを x(k) に加えたものを x(k+1) として採用する
手法,すなわち
x(k+1) = x(k) + ω{−D−1Lx(k+1) −
(D−1U + I
)x(k) + D−1b
}(7.37)
が逐次過緩和法 (SOR method)である.9 パラメタ ω は緩和係数 (relaxation parameter)と呼ばれ
る.(7.37)はDx(k+1) = ωb − ωLx(k+1) + {(1 − ω)D − ωU}x(k) (7.38)
と書け,成分で表現すれば
SOR法¶ ³x
(k+1)i =
1aii
(ωbi − ω
i−1∑l=1
ailx(k+1)l + (1 − ω)aiix
(k)i − ω
n∑l=i+1
ailx(k)l
)(i = 1, 2, . . . , n) (7.39)
µ ´のようになる.緩和係数 ω の値は問題に応じて 1 < ω < 2 の範囲で適切な値が用いられることが多い.
7.2.4 反復法の収束条件
上で述べたヤコビ法,ガウス・ザイデル法,および SOR法の 3種類の反復法はどれも
x(k+1) = Mx(k) + Nb (7.40)
という形で表現することができる.それぞれに対する具体的な M は
M = −D−1(L + U), (ヤコビ法) (7.41)
M = −(D + L)−1U, (ガウス・ザイデル法) (7.42)
M = (I + ωD−1L)−1{(1 − ω)I − ωD−1U
}, (SOR法) (7.43)
(7.44)
となる.行列 M をその反復法の反復行列と言う.(7.40)の真の解 X は
X = MX + Nb (7.45)
を満たす.(7.40)から (7.45)を引くと
x(k+1) − X = M(x(k) − X
)(7.46)
となり,残差ベクトル,すなわち真の解との差が反復のたびに前回の値に M を掛けたベクトルになること
が分かる.これが M を反復行列と呼ぶ所以である.
任意の正方行列 A について,A の固有値の絶対値の最大値 ρ(M) を A のスペクトル半径 (spectral
radius)と呼ぶ.反復法 (7.40)が収束するための必要十分条件は,反復行列 M のすべての固有値 λi が
|λi| < 1 を満たすこと,すなわち ρ(M) < 1 となることである.9Successive Over Relaxation の略.
134
行列 A が
|aii| >n∑
j =i
|aij |, (i = 1, 2, . . . , n) (7.47)
を満たすとき,A は対角優位 (diagonally dominant)であると言う.10 A が対角優位ならば,ヤコビ法
およびガウス・ザイデル法の反復行列 M の固有値の絶対値はすべて 1より小さくなり,したがって両手法とも k → ∞ で Ax = b の解に収束する.
また A が正値対称行列11 の場合には,ガウス・ザイデル法の反復行列,及び 0 < ω < 2 の場合の SOR法の反復行列のスペクトル半径は 1より小さくなることを示すことができ,したがってこの場合,両手法とも k → ∞ で Ax = b の解に収束する.
上記 3種の反復法を,対角優位な係数行列を持つ連立一次方程式
3x1 +x2 = 5x1 +3x2 +x3 = 10
x2 +3x3 +x4 = 15x3 +3x4 = 15
(7.48)
に適用した際の誤差の振舞いを図 7.1に示す.この方程式の厳密解は x = (1, 2, 3, 4) であり,図は x1 に含
まれる誤差の絶対値を反復回数に対して片対数プロットしたものである.反復法の誤差は反復回数に対し
て指数関数的に減少すること,予想通り Jacobi法に比べて Gauss-Seidel法の収束が速いこと,SOR法の収束の速さが緩和係数 ω の選択によって大きく異なることなどを見ることができる.12
10-1610-1410-1210-1010-810-60.00010.011
0 5 10 15 20 25
JacobiGauss-SeidelSOR (ω=1.2)SOR (ω=1.4)
Err
or in
x_1
number of iteration
図 7.1: 反復法の誤差の減少
10対角優位な行列は必ず正則で,逆行列を持つ.11任意のベクトル x に対して,(x, Ax) > 0 が成り立つとき,A を正値 (positive-definite)または正定値という.これは A の固有値がすべて正であることと等価である.また対称行列の固有値はかならず実数になる.
12前回の反復までの誤差の情報を利用して,反復の各ステップで最適な ω を適応的に選択していくようなアルゴリズムも開発されている.
135
7.3 反復法 II
以下では2つの実ベクトル x, y の内積を (x, y) と書くことにする.任意の正方行列 A および任意のベ
クトル x, y に対して
(x, y) = (y, x) (7.49)
(αx, y) = (x, αy) = α(x, y) (7.50)
(x, y + z) = (x, y) + (x, z) (7.51)
(x, Ay) = (AT x,y) (7.52)
などが成り立つ.ここで AT は A の転置行列を表す.特に A が対称行列の場合(すなわち A = AT)に
は (7.52)より(x, Ay) = (Ax,y) (7.53)
が成り立つ.
7.3.1 最小化問題としての解法
正値対称行列 A を係数行列に持つ連立一次方程式 Ax = b に対し,以下のように定義される x の関数
f(x) を考える:
f(x) =12(x, Ax) − (x, b). (7.54)
Ax = b の真の解を X とし,任意の x を x = X + ∆x と書けば,
f(x) =12(X + ∆x, A(X + ∆x)) − (X + ∆x, b)
=12(X, AX) +
12(∆x, AX) +
12(X, A∆x) +
12(∆x, A∆x) − (X, b) − (∆x, b)
={
12(X, AX) − (X, b)
}+
{12(∆x, AX) +
12(X, A∆x) − (∆x, b)
}+
12(∆x, A∆x) (7.55)
= f(X) +{
12(∆x, b) +
12(b, ∆x) − (∆x, b)
}+
12(∆x, A∆x)
= f(X) +12(∆x, A∆x)
となる.右辺第二項は A の正値性より必ず正であり,したがってこの式は,A が正値対称行列の場合,連
立一次方程式 Ax = b を解くことと,f(x) = 12 (x, Ax) − (x, b) を最小にする x を見つけることが同値で
あることを示している.
最初から真の解 X を見つけることはできないので,逐次近似法で解くことを考える.すなわち,第 kス
テップにおける近似解を x(k) とし,
x(k+1) = x(k) + αkp(k) (7.56)
のように修正しながら真の解 X に近づくことを考える.ここで p(k), αk は探索方向および修正量を決め
るベクトルおよびスカラーである.
探索方向 p(k) を何らかの方法で選んだとし,αk は f(x(k+1)) が最小になるように選ぶものとする.こ
136
のとき
f(x(k+1)) =12(x(k+1), Ax(k+1)) − (x(k+1), b)
=12(x(k) + αkp(k), A(x(k) + αkp(k))) − (x(k) + αkp(k), b)
=12(x(k), Ax(k)) +
12αk(p(k), Ax(k)) +
12αk(x(k), Ap(k))
+12α2
k(p(k), Ap(k)) − (x(k), b) − αk(p(k), b) (7.57)
(7.57)は αk について 2次式であり,これを最小にする αk は
∂f(x(k+1))∂αk
=12(p(k), Ax(k)) +
12(x(k), Ap(k)) + αk(p(k), Ap(k)) − (p(k), b) = 0 (7.58)
を満たす αk である.A の対称性より (7.58)は
αk(p(k), Ap(k)) − (p(k), b − Ax(k)) = 0 (7.59)
となる.ここで第 kステップにおける残差ベクトル
r(k) = b − Ax(k) (7.60)
を導入すれば αk は
αk =(p(k), r(k))
(p(k), Ap(k))(7.61)
のように確定する.したがって,どのようなルールで次の探索方向 p(k) を選択したとしても,それに対す
る最適な αk はいつも (7.61)にしたがって決まる.
あとの問題は「どのような精神で探索方向 p(k) を選ぶべきか」という点であり,この選択方法の違いに
よっていくつかの異なった手法がある.ここではそれらの中で代表的なものとして,最急降下法と共役勾配
法について説明する.
7.3.2 最急降下法
(7.54)で定義される f(x) を最小にする x を探すのが目的であれば,f(x) が最も速く減少する方向を探索方向として採用するのが最も自然なやり方であろう.f(x) が最も速く減少する方向は,−grad f を求め
ることによって知ることができる.分かりやすいように成分を使って書くと13
f(x) =12xiAijxj − xibi. (7.62)
このとき,
(grad f)i =∂f
∂xi=
12Aijxj +
12xjAji − bi = Aijxj − bi = −ri (7.63)
この計算により,f(x) が最も速く減少する方向は,残差ベクトル r の方向であることが分かる.これより
最急降下法 (steepest-descent method)の手順は以下のようになる.
13ここでは一つの項に同じ添え字が2回現れたときは,その添え字について 1 から n までの和をとるという規約(Einstein の規約)を用いている.
137
最急降下法¶ ³1. 出発点 x(0) を選ぶ.
2. Do k = 0, 1, . . .
3. r(k) = b − Ax(k)
4. αk = (r(k), r(k))/(r(k), Ar(k))
5. x(k+1) = x(k) + αkr(k)
6. End Doµ ´図 7.2は (7.48)の例題に対してこの最急降下法を用いた場合の x1 に含まれる誤差の減少の様子をプロット
したものであるが,この問題に適用した場合,収束の速さは Jacobi法と同程度である.
10-1610-1410-1210-1010-810-60.00010.011
0 5 10 15 20 25
steepest
Err
or in
x_1
number of iteration
図 7.2: 最急降下法の誤差の減少
(7.57)の f(x(k+1)) に対する表現に,最急降下法における選択,すなわち
p(k) = r(k), αk =(r(k), r(k))
(r(k), Ar(k))(7.64)
を代入すると
f(x(k+1)) = f(x(k)) − 12
(r(k), r(k))2
(r(k), Ar(k))(7.65)
という関係が得られる.このことから,最急降下法においては1ステップごとに f(x(k)) が確実に減少し,真の解に収束することが保証されている.14
14分母が正なのは A の正定値性より.
138
しかし,探索方向が残差 r (= b − Ax) であるために,真の解に接近して r が小さくなるとそれに含ま
れる相対誤差が増大し,次の探索方向を正確に定めることができなくなる.また,探索方向をそのつど最急
降下の方向に取ることは,過去に探索済みの方向との関係が考慮されておらず,したがって有限回の操作
で n次元空間内のすべての一次独立な方向を探索しつくすということは保証されていない.最急降下法の
これらの欠点を除くように工夫されたものが次に述べる共役勾配法であると言える.
7.3.3 共役勾配法
上述の最急降下法と同様,第 kステップにおける近似解を x(k) として,
x(k+1) = x(k) + αkp(k) (7.66)
のように修正しながら真の解 X に近づくことを考える.すでに示したように,どのようなルールで探索方
向 p(k) を選んでも αk は
αk =(p(k), r(k))
(p(k), Ap(k))(7.67)
と決まる.ここで r(k) は第 kステップにおける残差 b − Ax(k) である.
r(k+1) = b − Ax(k+1) = b − A(x(k) + αkp(k)
)=
(b − Ax(k)
)− αkAp(k) = r(k) − αkAp(k) (7.68)
より r(k) は漸化式
r(k+1) = r(k) − αkAp(k) (7.69)
を満たす.
今いる場所 x(k) から真の解 X(= A−1b) を見るベクトル X − x(k) と Ap(k−1) の内積を取ると(Ap(k−1), X − x(k)
)=
(p(k−1), AX − Ax(k)
)(7.70)
=(p(k−1), AX − A
(x(k−1) + αk−1p
(k−1)))
(7.71)
=(p(k−1),
(b − Ax(k−1)
)− αk−1Ap(k−1)
)(7.72)
=(p(k−1), r(k−1)
)− αk−1
(p(k−1), Ap(k−1)
)= 0 (7.73)
となり,x(k) から見ると真の解 X を見る方向は Ap(k−1) と直角の方向であることが分かる.このことか
ら次の探索方向 p(k) は,最急降下の方向である r(k) に適当な補正を加えて,(p(k), Ap(k−1)) = 0 が成り立つように選ぶのがよいと考えられる.そこで,具体的には p(k) が
p(k) = r(k) + βk−1p(k−1) (7.74)
という漸化式で与えられると仮定し,これに (p(k), Ap(k−1)) = 0 を要求する.すると(p(k), Ap(k−1)
)=
(r(k), Ap(k−1)
)+ βk−1
(p(k−1), Ap(k−1)
)= 0 (7.75)
より βk−1 が
βk−1 = − (r(k), Ap(k−1))(p(k−1), Ap(k−1))
(7.76)
のように決まる.
以上を総合すると以下のような手順の反復法となるが,この手法を共役勾配法 (conjugate gradient
method)と呼ぶ.略してCG法と呼ぶことも多い.
139
共役勾配法¶ ³1. 出発点 x(0) を適当に選ぶ.
2. r(0) = b − Ax(0)
3. p(0) = r(0)
4. Do k = 0, 1, . . .
5. αk = (p(k), r(k))/(p(k), Ap(k))
6. x(k+1) = x(k) + αkp(k)
7. r(k+1) = r(k) − αkAp(k)
8. βk = −(r(k+1), Ap(k))/(p(k), Ap(k))
9. p(k+1) = r(k+1) + βkp(k)
10. End Doµ ´7.3.3.1 高々n回の反復で厳密解に到達すること
(7.67),(7.76)で決まる αk,βk を使って漸化式 (7.74),(7.68)にしたがって作られたベクトル列{p(0), p(1), . . .
},{
r(0), r(1), . . .}に対しては (
p(i), Ap(j))
= 0 (i = j) (7.77)
および (r(i), r(j)
)= 0 (i = j) (7.78)
が成り立つことを証明することができる.15 (7.77)の性質は「A に関して共役 (A-conjugate)」と表現さ
れる.これに対して (7.78)の性質はもちろん直交 (orthogonal)と呼ばれる.
(n+1)個のベクトル{r(0), r(1), . . . , r(n)
}は,もしどれも 0 でなければ,(7.78)より互いに直交する.し
かし n次元空間の (n+1)個の非零ベクトルが直交することはありえない.したがって{r(0), r(1), . . . , r(n)
}のうちどれかは 0 でなければならない.これは共役勾配法によると高々 n 回までの反復で厳密解に到達で
きることを意味している.16 有限回の反復で厳密解が得られることが保証されているという意味で,共役
勾配法は直接法と反復法の中間的存在と言うことができる.
表 7.1は,以前に用いた (7.48)の例題に対して共役勾配法を適用した際の,各反復における解ベクトルx を示したものである.初期値 x(0) = 0 から出発しているが,確かに n(= 4)回の反復で厳密解に到達することが確認できる.
15証明は例えば戸川 p.18 参照.16丸め誤差がまったくないとしての話だが.
140
k x1 x2 x3 x4
0 0 0 0 0
1 1.11650491 2.23300982 3.34951448 3.34951448
2 0.943708599 1.88741720 3.18708611 3.89900661
3 1.04829109 1.94864821 3.03094721 3.98656702
4 1.00000000 2.00000000 3.00000000 4.00000000
表 7.1: 共役勾配法による計算例
7.3.3.2 計算回数
共役勾配法の1回の反復に要する計算回数を見積もってみよう.上に示したアルゴリズムによると,まず
手順 5における Ap(k) の計算に n2回,αk の分子分母の内積の計算に 2n回,手順 6の αkp(k) の計算に n
回,手順 7の αkAp(k) の計算に n回,手順 8の βk の分子の内積の計算に n回,手順 9の βkp(k) の計算
に n回の合計 n2 + 6n回の乗算が反復ごとに必要となる.ただし A が疎行列ならこれより少なくて済む.
一方前述の Gaussの消去法(LU分解)による直接解法を用いると,Aが非対称行列でも n3/3 + n2 回,
ここで仮定しているように A が対称行列なら n3/6 + n2 回で解を求めることができる.
したがって,共役勾配法がたとえ n回の反復で厳密解に到達することが保証されているからと言っても,
本当に n回の反復をやったとすると LU分解にもとづく直接法と比較して 6倍もの計算をすることになる.nが大きいとき,nに比べてずっと少ない反復回数で十分な精度の解が得られないのであれば,共役勾配法
の実用上の価値はない.
7.3.3.3 収束の速さと前処理
共役勾配法の厳密解への収束は,A の固有値が互いに近い値に密集しているほど速いことが分かってい
る.17 したがって A をこのような性質を持つ行列に変形したあとで,共役勾配法を適用すればその収束
を速めることができる.このような処理を付加した共役勾配法を前処理付き共役勾配法 (preconditioned
conjugate gradient method),略して PCG法と呼ぶ.前処理としてもっともよく用いられるものの一つが A の不完全コレスキー分解 (incomplete Cholesky decomposition)に基づくものであり,これを
前処理に用いた共役勾配法は ICCG法などと呼ばれる.18
7.3.3.4 非対称行列の場合への拡張
A が任意の正則行列のとき,AT A は必ず正値対称行列になることを利用すれば,A が非対称行列の場合
でも,以下のようにして共役勾配法を適用することができる.すなわち
Ax = b =⇒ AT Ax = AT b =⇒ Ax = b (A ≡ AT A, b ≡ AT b) (7.79)
ただし実際に A = AT A を作るとこれだけで n3回の乗算が必要となり,Gaussの消去法ならこの 1/3の手間ですでに解が見つかってしまう.実際には,例えば Ap(k) の計算であれば,AT (Ap(k)) のように行列とベクトルの積を 2回行うような形で計算をしないといけない.この方法を用いれば,A が対称行列の場合
の 2倍程度の計算量で反復計算を実行することができる.
17例えば村田他 p.98 参照18これらの詳細については例えば村田他 p.99 参照.
141
参考にした書籍
森正武:数値解析(共立出版,1973),戸川隼人:共役勾配法(教育出版,1977),Pozrikidis, C.: NumericalComputation in Science and Engineering (Oxford U.P., 1998),水島二郎・柳瀬眞一郎:理工学のための数値計算法 (数理工学社,2002),一松 信:数値解析(朝倉書店,1982),村田健郎他:大型数値シミュレーション(岩波書店,1990),小国力他:行列計算ソフトウェア(丸善,1991)など.
142