1 階微分演算モジュール diff.f90 に含まれる微分演算関数の動作をテストする.
テストはそれぞれの微分演算関数に対し, 下記に示すように初期分布および格子点数を変えて行う.
テストの際の注意点を以下にあげる.
テスト結果として元の関数, 微分演算を行った後の関数, 解析的に微分して得られる関数, 誤差(微分演算を行った関数の解析的に微分して得られる関数に対する差)の図を描く. 図は計算領域内のみのものと計算領域外を含むものの2種類を描く.
arare (微分・平均演算テスト用) 2004-10-07 版
このプログラムソースは杉山さん作成の微分・平均演算用に特化したソースプログラム (http://www.gfd-dennou.org/arch/deepconv/arare/sample/2004-10-28_sugiyama)が大元である.
領域の端では微分係数を計算できない場合がある. このような場合は微分係数を 0 としている. 上下左右のどの端の微分係数が計算できないかは微分演算関数によって異なる.
打ち切り誤差の見積もり方については「打ち切り誤差の見積もり方」を参照.
打ち切り誤差精度を見積もる際に用いる格子点間隔には注意が必要である. それは微分を計算するのに用いる 2 点(あるいは 4 点)間の距離が, 微分演算関数によって異なるためである. ここでテストする微分演算関数の場合, 格子点間隔を Δx とすると 2Δx 離れた 2 点の値を用いて微分を計算する場合と, Δx 離れた 2 点の値を用いて微分を計算する場合がある.
誤差の絶対値が極大となる部分のその大きさは以下のようになる.
格子点数 | 誤差の絶対値 |
20 | 1.0e-5 |
50 | 1.7e-6 |
100 | 4.1e-7 |
誤差の絶対値が極大となる部分のその大きさは以下のようになる.
格子点数 | 誤差の絶対値 |
20 | 2.6e-6 |
50 | 4.1e-7 |
100 | 1.0e-7 |
テストした関数のリストを以下の表に列挙する(それぞれの関数のテスト結果のページにリンクされている).
関数名 | 計算出来ない点 | 誤差評価時の格子間隔 |
ss_dx_ss | 左, 右 | 2Δx |
ss_dz_ss | 上, 下 | 2Δx |
ss_dx_fs | 左 | Δx |
ss_dz_fs | 上, 下, 左 | 2Δx |
ss_dx_sf | 下, 左, 右 | 2Δx |
ss_dz_sf | 下 | Δx |
関数名 | 計算出来ない点 | 誤差評価時の格子間隔 |
fs_dx_ss | 右 | Δx |
fs_dz_ss | 上, 下, 右 | 2Δx |
fs_dx_fs | 左, 右 | 2Δx |
fs_dz_fs | 上, 下 | 2Δx |
fs_dx_sf | 下, 右 | Δx |
fs_dz_sf | 下, 右 | Δx |
関数名 | 計算出来ない点 | 誤差評価時の格子間隔 |
sf_dx_ss | 上, 左, 右 | 2Δx |
sf_dz_ss | 上 | Δx |
sf_dx_fs | 上, 左 | Δx |
sf_dz_fs | 上, 左 | Δx |
sf_dx_sf | 左, 右 | 2Δx |
sf_dz_sf | 上, 下 | 2Δx |