コンテンツにスキップ

「差分法」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m +otheruse
en:Finite difference method 11:19, 2 September 2015‎ と擦り合わせる
1行目: 1行目:
{{dablink|微分積分学における微分法 (differential calculus; 微分学) の離散的対応物としての差分法 (difference calculus, calculus of (finite) difference) は「{{仮リンク|差分学|de|Differenzenrechnung}}」を参照。}}
{{dablink|微分積分学における微分法 (differential calculus; 微分学) の離散的対応物としての差分法 (difference calculus, calculus of (finite) difference) は「{{仮リンク|差分学|de|Differenzenrechnung}}」を参照。}}
{{出典の明記|date=2013年1月7日 (月) 03:58 (UTC)}}
{{出典の明記|date=2013年1月7日 (月) 03:58 (UTC)}}
'''差分法'''(さぶんほう、{{Lang|en|difference method}})は、[[微分方程式]]を解く[[数値解析]]おける離散化手法のひとつである。[[関数 (数学)|関数]]が2つの[[変数 (数学)|変数]]値に対してとる値の間の[[有限]]な差を'''差分'''(さぶん、{{Lang|en|difference}}といい、この差分を変数値の差割って得られる商を'''差分商'''(さぶんしょう、{{Lang|en|difference quotient}})という[[微分]]を差分商で[[近似]]することにより微分方程式を解くものである。18世紀に[[オイラー]]が考案したと言われる<ref>{{cite|和書 |title=コンピュータによる流体力学 |author=Joel H. Ferziger |author2=Milovan Peri&#x107; |translator=小林敏雄、谷口伸行、坪倉誠 |publisher=シュプリンガー・フェアラーク東京 |year=2003 |isbn=4-431-70842-1 |page=36}}</ref>。
[[数値解析]]における'''有限差分法'''(ゆうげんさぶんほう、{{lang-en-short|''finite-difference methods''; '''FDM'''}})あるいは単に'''差分法'''は、[[微分方程式]]を解くために[[微分]][[有限差分|有限差分近似]]差分)で置き換えて得られる[[差分方程式]]で近似するという[[離散化]]手法用いる[[数値解法]]である。18世紀に[[オイラー]]が考案したと言われる<ref>{{cite|和書 |title=コンピュータによる流体力学 |author=Joel H. Ferziger |author2=Milovan Peri&#x107; |translator=小林敏雄、谷口伸行、坪倉誠 |publisher=シュプリンガー・フェアラーク東京 |year=2003 |isbn=4-431-70842-1 |page=36}}</ref>。


今日ではFDMは[[偏微分方程式]]の数値解法として支配的な手法である<ref name="GrossmannRoos2007">{{cite book|author1=Christian Grossmann|author2=Hans-G. Roos|author3=Martin Stynes|title=Numerical Treatment of Partial Differential Equations|year=2007|publisher=Springer Science & Business Media|isbn=978-3-540-71584-9|page=23}}</ref>
[[偏微分方程式]]の数値解法を特に'''有限差分法'''(ゆうげんさぶんほう、{{Lang|en|finite difference method}}, FDM)という。


== 精度と誤差 ==
==概要==
{{see also|{{仮リンク|有限差分係数|en|Finite difference coefficient}}}}

解の誤差とは、真の解析解と近似解との間の差として定義される。有限差分法における誤差の原因は[[丸め誤差]]および[[打ち切り誤差]]または[[離散化誤差]]である。

[[File:Finite Differences.svg|right|thumb|有限差分法は函数の定義域を格子に離散化することに基づく]]
問題に対する会の近似に有限差分法を用いるためには、まず初めに問題の領域を離散化しなければならない。これは普通は、その領域を一様な格子に分ければよい。これは有限差分法がしばしば「時間刻み」な仕方で微分に対する離散的な数値近似の集合を提供することを意味することに注意。
: <math>f(x_i)=f(x_0+i h)</math>.

一般に注目すべきは{{仮リンク|局所打ち切り誤差|en|local truncation error}}で、典型的にはこれを[[ランダウの記号| O-記法]]で表す。局所打ち切り誤差は、各点における誤差について言うもので、真値 {{math|''f''{{'}}(''x''{{msub|''i''}})}} と近似値 {{mvar|''f''{{'}}{{msub|''i''}}}} との差
: <math>f'(x_i) - f'_i</math>
として書ける。この誤差の評価には、[[テイラー展開]]の剰余項を見るのが簡便である。式 {{math|''f''(''x''{{msub|0}} + ''h'')}} に対するテイラー展開のラグランジュ型剰余項
: <math>R_n(x_0 + h) = \frac{f^{(n+1)}(\xi)}{(n+1)!} (h)^{n+1}\quad (x_0 < \xi < x_0 + h)</math>
から、局所打ち切り誤差の支配項が求められる。例えば、一階差分近似 ({{math|''n'' {{=}} 1}}) を考えれば
: <math> f(x_0 + i h) = f(x_0) + f'(x_0)i h + \frac{f''(\xi)}{2!} (i h)^{2}</math>
であり、適当な代数的操作で
: <math> \frac{f(x_0 + i h) - f(x_0)}{i h} = f'(x_0) + \frac{f''(\xi)}{2!} i h</math>
と書きなおすと、この左辺は有限差分法で得られる近似値であり、右辺が真値と剰余項の和である。明らかにこの剰余項が局所打ち切り誤差であり、そのオーダーが
: <math> \frac{f(x_0 + i h) - f(x_0)}{i h} = f'(x_0) + O(h)</math>
となることが分かる。この場合、局所打ち切り誤差は刻み幅に比例するということになる。有限差分法の近似解の精度と計算量は方程式の離散化の仕方や刻み幅の取り方に依存する。これらは刻み幅を小さくするにつれ著しく増加する<ref name=IserlesA_1996>{{cite book|author1=Arieh Iserlas|title= A first course in the numerical analysis of differential equations |year=2008|publisher= Cambridge University Press |isbn=9780521734905|page=23}}</ref>から、実用上は必要な精度と計算時間を天秤にかけて十分合理的な条件で近似を行う。時間の刻み幅が大きければ多くの場合に計算速度は早くなるが、大きくしすぎると不安定性を生じ、データの精度に問題がでる<ref name=HoffmanJD_2001>{{cite book|author1=Hoffman JD|author2=Frankel S|year=2001|title=Numerical methods for engineers and scientists|publisher=CRC Press, Boca Raton}}</ref><ref name=Jaluria_CM_1994>{{cite journal|author1=Jaluria Y|author2=Atluri S|year=1994|title=Computational heat transfer|journal= Computational Mechanics|volume=14|pages=385–386|doi=10.1007/BF00377593}}</ref>。

数値モデルの安定性を決定するために、[[フォン・ノイマンの安定性解析]]を用いるのが普通である<ref name=HoffmanJD_2001 /><ref name=Jaluria_CM_1994 /><ref>{{cite book|author1=Majumdar P|year=2005|title=Computational methods for heat and mass transfer|edition=1st|publisher=Taylor and Francis, New York}}</ref><ref name="SmithGD_1985">{{cite book|author1=Smith GD|year=1985|title=Numerical solution of partial differential equations: finite difference methods|publisher=Oxford University Press|edition=3rd}}</ref>。

== 簡単な例 ==
最も簡単な例として、次の1階[[常微分方程式]]を考える:
最も簡単な例として、次の1階[[常微分方程式]]を考える:
:<math> u'(x) = 3u(x) + 2 \, </math>
:<math> u'(x) = 3u(x) + 2 \, </math>
13行目: 36行目:
:<math> u(x+h) = u(x) + h(3u(x)+2) \, </math>
:<math> u(x+h) = u(x) + h(3u(x)+2) \, </math>
と近似する。この方法を'''[[オイラー法]]'''という。この最後の[[方程式]]のように、微分方程式の微分を差分商に置き換えたものを、'''差分方程式'''(さぶんほうていしき、{{Lang|en|difference equation}})と呼ぶ。
と近似する。この方法を'''[[オイラー法]]'''という。この最後の[[方程式]]のように、微分方程式の微分を差分商に置き換えたものを、'''差分方程式'''(さぶんほうていしき、{{Lang|en|difference equation}})と呼ぶ。

変数軸に等間隔''h'' の目盛り(メッシュ)をとり、それらに対する関数''u'' の値で[[数列]]を作ることができる。例えば、<math> \dots, u_{n-1} = u(x-h), u_{n} = u(x), u_{n+1} = u(x+h),\dots </math>とすれば、隣接項の差が差分となる。差分方程式は[[漸化式]]として表され、これを解けば微分方程式の近似解が得られる。

なお、[[離散的]]な問題にも差分方程式が必要とされるが、この場合には逆に差分の近似として微分を用いることもできる([[作用素]]の項を参照)。

微分方程式の近似解と厳密解との[[誤差]]は、差分と微分との誤差(打ち切り誤差)で決まる。

== 差分の種類 ==
次のように、本来の微分をとる点''x'' あるいは''n'' に対して、近似としてその次の点''n'' + 1 と''n'' との間で差分をとる方法を、'''前進'''(前方)'''差分'''({{Lang|en|forward difference}})という:
:<math> \Delta u(x) = u(x+h) - u(x) = u_{n+1} - u_{n} </math>
同様に、''n'' とその前の点''n'' - 1 との間で差分をとる方法を、'''後退'''(後方)'''差分'''({{Lang|en|backward difference}})という:
:<math> \nabla u(x) = u(x) - u(x-h) = u_{n} - u_{n-1} </math>
また、''n'' に対して、''n'' + 1 と''n'' - 1 との間で差分をとる(前進差分と後退差分を平均する)方法を、'''中央'''(中心)'''差分'''({{Lang|en|central difference}})という:
:<math> \delta u(x) = u\left(x + \frac{1}{2}h\right) - u\left(x - \frac{1}{2}h\right) = \frac{\Delta u(x) + \nabla u(x)}{2} = \frac{u(x+h)-u(x-h)}{2} = \frac{u_{n+1} - u_{n-1}}{2} </math>
2階微分の近似としては、'''2階差分'''({{Lang|en|2nd difference}})を用いる。これは差分の差分に当たる:
:<math> \delta^{2} u(x) = (u_{n+1} - u_n) - (u_n - u_{n-1}) = u_{n+1} - 2u_n + u_{n-1} </math>
この例では''n'' を中央にして''n'' + 1 と''n'' - 1 の間で差分をとっているので、2階中央(中心)差分という。差分商としては''h''<sup>2</sup> で割る。

== 作用素(演算子) ==
上記の各差分値をそれぞれ&Delta;''u'' (''x'' ) 、&nabla;''u'' (''x'' ) 、&delta;''u'' (''x'' ) 、&delta;<sup>2</sup>''u'' (''x'') と書く。これらの関数の前につけた記号を'''差分[[作用素]]'''(差分演算子、{{Lang|en|difference operator}})という。これらは微分作用素と同様、関数から関数への[[写像]]である(ただしこれらは同じ記号でも[[ナブラ]]や[[変分]]作用素ではないので、混同しないよう注意)。&Delta;を'''前進差分演算子'''({{Lang|en|forward difference operator}})、&nabla;を'''後退差分演算子'''({{Lang|en|backward difference operator}})、&delta;を'''中心(中央)差分演算子'''({{Lang|en|central difference operator}})、''D'' を微分演算子({{Lang|en|derivative operator}})と呼ぶ。

差分の[[テイラー展開]]から、前進差分作用素&Delta;は形式的には次のように、微分作用素(微分演算子) ''D'' によるテイラー展開として表され、差分作用素の有限部分が微分作用素であるとみることができる:
:<math> \Delta = hD + \frac12 h^2D^2 + \frac1{3!} h^3D^3 + \cdots = \mathrm{e}^{hD} - 1 </math>
また逆に微分作用素''D'' は
:<math> hD = \log(1+\Delta) = \Delta - \frac12 \Delta^2 + \frac13 \Delta^3 + \cdots \, </math>
と書ける。

また後退差分&nabla;と中央差分&delta;に対してはそれぞれ
:<math> hD = -\log(1-\nabla) </math>
:<math> hD = \, \operatorname{arcsinh} \left( \delta \right) </math>
となる。

前進差分の誤差は(''u'' が連続微分可能として):
:<math> \frac{\Delta u(x)}{h} - u'(x) = O(h) \quad (h \to 0) </math>
後退差分に対しても同じ式が成り立つ:
:<math> \frac{\nabla u(x)}{h} - f'(x) = O(h) </math>
中央差分はさらに正確な近似を与える。(''u'' が2回連続微分可能として)誤差は間隔の2乗に比例する:
:<math> \frac{\delta u(x)}{h} - u'(x) = O(h^{2}) \!</math>


== 例 熱伝導方程式 ==
== 例 熱伝導方程式 ==

2015年9月16日 (水) 13:58時点における版

数値解析における有限差分法(ゆうげんさぶんほう、: finite-difference methods; FDM)あるいは単に差分法は、微分方程式を解くために微分有限差分近似(差分商)で置き換えて得られる差分方程式で近似するという離散化手法を用いる数値解法である。18世紀にオイラーが考案したと言われる[1]

今日ではFDMは偏微分方程式の数値解法として支配的な手法である[2]

精度と誤差

解の誤差とは、真の解析解と近似解との間の差として定義される。有限差分法における誤差の原因は丸め誤差および打ち切り誤差または離散化誤差である。

有限差分法は函数の定義域を格子に離散化することに基づく

問題に対する会の近似に有限差分法を用いるためには、まず初めに問題の領域を離散化しなければならない。これは普通は、その領域を一様な格子に分ければよい。これは有限差分法がしばしば「時間刻み」な仕方で微分に対する離散的な数値近似の集合を提供することを意味することに注意。

.

一般に注目すべきは局所打ち切り誤差英語版で、典型的にはこれを O-記法で表す。局所打ち切り誤差は、各点における誤差について言うもので、真値 f'(xi) と近似値 f'i との差

として書ける。この誤差の評価には、テイラー展開の剰余項を見るのが簡便である。式 f(x0 + h) に対するテイラー展開のラグランジュ型剰余項

から、局所打ち切り誤差の支配項が求められる。例えば、一階差分近似 (n = 1) を考えれば

であり、適当な代数的操作で

と書きなおすと、この左辺は有限差分法で得られる近似値であり、右辺が真値と剰余項の和である。明らかにこの剰余項が局所打ち切り誤差であり、そのオーダーが

となることが分かる。この場合、局所打ち切り誤差は刻み幅に比例するということになる。有限差分法の近似解の精度と計算量は方程式の離散化の仕方や刻み幅の取り方に依存する。これらは刻み幅を小さくするにつれ著しく増加する[3]から、実用上は必要な精度と計算時間を天秤にかけて十分合理的な条件で近似を行う。時間の刻み幅が大きければ多くの場合に計算速度は早くなるが、大きくしすぎると不安定性を生じ、データの精度に問題がでる[4][5]

数値モデルの安定性を決定するために、フォン・ノイマンの安定性解析を用いるのが普通である[4][5][6][7]

簡単な例

最も簡単な例として、次の1階常微分方程式を考える:

これを解くには、差分商

を用いて

と近似する。この方法をオイラー法という。この最後の方程式のように、微分方程式の微分を差分商に置き換えたものを、差分方程式(さぶんほうていしき、difference equation)と呼ぶ。

例 熱伝導方程式

偏微分方程式の例として、一様ディリクレ境界条件に従う1次元規格化熱伝導方程式を考える:

左辺は時間t による微分、右辺は座標x による2階微分である。また、境界条件および初期条件は以下とする:

(境界条件)
(初期条件)

これを数値的に解く1つの方法は、すべての微分を差分で近似することである。空間の領域をメッシュで、時間の領域をメッシュで分割しよう。どちらの分割も等間隔とし、空間点の間隔をh、時刻の間隔をk とする。の数値的近似をで表す。

陽解法

時刻には前進差分を用い、空間点で2次微分に対して2次中央差分を用いれば、次の漸化式:

が得られる。これを陽解法という。

の値は次のように得られる:

ただしここで拡散数と呼ばれる)である。

ゆえに、時刻n での値がわかれば、対応する時刻n + 1 での値も漸化式を用いて求められる。には境界条件(この例ではどちらも0)を適用する。

この陽解法は、r ≤ 1/2 であれば数値的に安定収束することが知られている。

誤差は時間ステップ数と空間ステップ数の2乗とに比例する:

陰解法

時刻に後退差分を用い、空間点 で2階中央差分を用いれば、漸化式:

が得られる。これを陰解法という。

線形方程式系:

を解けば、が得られる。この方法は常に数値的に安定で収束するが、時刻ごとに方程式系を解く必要があるため、陽解法よりも繁雑である。誤差は時間ステップ数と空間ステップ数の4乗とに比例する。

クランク・ニコルソン法

さいごに、時刻で中央差分を、空間点での空間微分に2階中央差分を用いれば、漸化式:

が得られる。これをクランク・ニコルソン法(Crank-Nicolson method)という。

線形方程式系:

を解けば、が得られる。

この方法は常に数値的に安定で収束するが、各時刻で方程式系を解く必要があるので繁雑なことが多い。誤差は時間ステップ数の4乗と空間ステップ数の2乗とに比例する:

しかし、境界付近では誤差はO(h4 ) でなくO(h2 ) となることが多い。

クランク・ニコルソン法は時間ステップ数が少なければたいてい最も正確な方法である。陽解法はそれより正確でなく不安定でもあるが、最も実行しやすく、繁雑さも最も少ない。陰解法は時間ステップ数が多い場合に最も優れている。

参考文献

  1. ^ Joel H. Ferziger; Milovan Perić 著、小林敏雄、谷口伸行、坪倉誠 訳『コンピュータによる流体力学』シュプリンガー・フェアラーク東京、2003年、36頁。ISBN 4-431-70842-1 
  2. ^ Christian Grossmann; Hans-G. Roos; Martin Stynes (2007). Numerical Treatment of Partial Differential Equations. Springer Science & Business Media. p. 23. ISBN 978-3-540-71584-9 
  3. ^ Arieh Iserlas (2008). A first course in the numerical analysis of differential equations. Cambridge University Press. p. 23. ISBN 9780521734905 
  4. ^ a b Hoffman JD; Frankel S (2001). Numerical methods for engineers and scientists. CRC Press, Boca Raton 
  5. ^ a b Jaluria Y; Atluri S (1994). “Computational heat transfer”. Computational Mechanics 14: 385–386. doi:10.1007/BF00377593. 
  6. ^ Majumdar P (2005). Computational methods for heat and mass transfer (1st ed.). Taylor and Francis, New York 
  7. ^ Smith GD (1985). Numerical solution of partial differential equations: finite difference methods (3rd ed.). Oxford University Press 

関連項目

外部リンク