|
3.8.3 近似関数と補間
多くの数値計算では,近似関数を導入すると便利である.近似関数とは普通に使う実数の近似を一般化したものと考えればよい.すなわち,実数の近似数がある数値的な量を特定の桁精度で表すならば,近似関数は単一,もしくは複数のパラメータに依存した量を特定の精度で表すもの,ととらえる. Mathematicaでは, NDSolveを使い求めた微分方程式の解を表すために近似関数が使われている.詳しくは, 1.6.4を参照のこと.
Mathematicaにおける近似関数は InterpolatingFunctionで得られる.この補間の関数は 2.2.5で説明した純粋関数と同じように機能する.この関数の基本的な機能は,特定の引数を与えたときにその引数に対応する近似関数を与えることである.
InterpolatingFunctionは内挿手法に基づいた近似関数を与える.通常,一連の点における関数値を持つが,さらに微分値を持つときもある.また,補間法の前提として,関数がデータ点の間で滑らかに変化するものとされる.この InterpolatingFunctionに任意点における関数の値を要求すると,データから内挿処理がなされ,必要な値が近似される.

近似関数の構築
正弦関数で補間点のリストを作っておく.
In[1]:= Table[{x, Sin[x]}, {x, 0, 2, 0.25}]
Out[1]= 
得られた値を表す近似関数を構築する.
In[2]:= sin = Interpolation[%]
Out[2]= 
この近似関数はリストの各値を再現する.
In[3]:= sin[0.25]
Out[3]= 
リストにない他の点において近似値を得ることもできる.
In[4]:= sin[0.3]
Out[4]= 
得られた補間は,もとの正弦をよく近似している.
In[5]:= Sin[0.3]
Out[5]= 
近似関数は他の Mathematica関数と同じように使うことができる.つまり,近似関数をプロットしたり,積分や根の探索等のための数値的操作を行うことができる.
数値でない未知の引数を使うと,近似関数はシンボル的な形でしか求まらない.
In[6]:= sin[x]
Out[6]= 
近似関数を数値積分する.
In[7]:= NIntegrate[sin[x]^2, {x, 0, Pi/2}]
Out[7]= 
真の正弦に関する数値積分を計算してみる.
In[8]:= NIntegrate[Sin[x]^2, {x, 0, Pi/2}]
Out[8]= 
近似関数をプロットする.グラフから真の正弦と見分けられないほど似ていることが分かる.
In[9]:= Plot[sin[x], {x, 0, 2}]

Out[9]= 
近似関数を微分すると,導関数を表した別の近似関数が生成される.
正弦を計算する近似関数を微分し, における導関数の値を求める.
In[10]:= sin'[Pi/6]
Out[10]= 
真の導関数値を確認してみよう.ほとんど同じなことが分かる.
In[11]:= N[Cos[Pi/6]]
Out[11]= 
InterpolatingFunctionには, Mathematicaの処理で必要になる,近似関数に関する情報がすべて含まれる.標準的な出力表記を使っている場合,補間の定義域を与える部分だけが表示される.補間で実際に使われたパラメータは略式表示される.
標準出力表記では,補間の定義域だけが具体的に表示される.
In[12]:= sin
Out[12]= 
定義域の外にある点で関数を計算すると, Mathematicaから警告が発せられ,外挿処理により値が求められる.
In[13]:= sin[3]

Out[13]= 
近似関数についてより多くの情報を与えれば,それだけ近似精度も向上する.具体的には,関数の0次データだけでなく微分値も与えると精度の向上が期待できる.

導関数を使った近似関数の構築
Interpolationは,データ点を多項式曲線でフィットさせるために使う.曲線の次数を指定するときにはオプション InterpolationOrderを使う.このオプションはデフォルトで, InterpolationOrder -> 3の設定になっているので,特に指定しなければ3次曲線でフィット処理が行われる.
余弦を使ってフィットさせるデータを作っておく.
In[14]:= tab = Table[{x, Cos[x]}, {x, 0, 6}] ;
データの点と点の間を線形補間する.近似関数が生成される.
In[15]:= Interpolation[tab, InterpolationOrder -> 1]
Out[15]= 
求まった近似関数は直線成分からなる.
In[16]:= Plot[%[x], {x, 0, 6}]

Out[16]= 
デフォルトのままだと, InterpolationOrder -> 3が有効なの で,3次曲線でフィット処理が行われる.3次でも関数は滑らかである.
In[17]:= Plot[Evaluate[Interpolation[tab]][x], {x, 0, 6}]

Out[17]= 
通常, InterpolationOrderの設定値を高くすればするほど,より滑らかな近似関数が得られる.ただし,高く設定しすぎると,曲線にまばらな振動部が現れてしまう.

多次元配列的なデータの補間
整数格子点におけるデータ値を補間する.
In[18]:= ListInterpolation[ Table[1.5/(x^2 + y^3), {x, 10}, {y, 15}]]
Out[18]= 
得られた補間関数を使い特定点の値を求める.
In[19]:= %[6.5, 7.2]
Out[19]= 
別の配列データを作っておく.
In[20]:= tab = Table[1.5/(x^2 + y^3), {x, 5.5, 7.2, .2}, {y, 2.3, 8.9, .1}] ;
この配列を補間するには,定義域がどうなっているかを指定しなければいけない.
In[21]:= ListInterpolation[tab, {{5.5, 7.2}, {2.3, 8.9}}]
Out[21]= 
ListInterpolationは何次元の配列でも機能する.補間結果として,特定の数の引数を必要とする InterpolatingFunctionオブジェクトが生成される.
3次元配列を補間する.
In[22]:= ListInterpolation[ Array[#1^2 + #2^2 - #3^2 &, {10, 10, 10}]] ;
生成された InterpolatingFunctionオブジェクトには引数が3ついる.
In[23]:= %[3.4, 7.8, 2.6]
Out[23]= 
Mathematicaは,純粋に数値的な近似関数だけでなく文字パラメータを伴った関数も扱うことができる.
パラメータ a, bに依存した補間オブジェクトが生成される.
In[24]:= sfun = ListInterpolation[{1 + a, 2, 3, 4 + b, 5}]
Out[24]= 
こうすると,2.2の点における内挿値がどうパラメータに依存しているかが分かる.
In[25]:= sfun[2.2] // Simplify
Out[25]= 
InterpolationOrderがデフォルトの設定だと,この点における値は aに依存しなくなる.
In[26]:= sfun[3.8] // Simplify
Out[26]= 
近似関数をもとにした処理を行っていると,複雑に組み合さった InterpolatingFunctionオブジェクトが得られてしまうことがよくある.そのようなときは,特定の定義域について FunctionInterpolationを適用させることで単一の InterpolatingFunctionオブジェクトに統合で きる.
定義域を0から1とする InterpolatingFunctionオブジェクトを新たに生成する.
In[27]:= FunctionInterpolation[x + sin[x^2], {x, 0, 1}]
Out[27]= 
ネストした InterpolatingFunctionオブジェクトを生成する.
In[28]:= ListInterpolation[{3, 4, 5, sin[a], 6}]
Out[28]= 
純粋な2次元 InterpolatingFunctionオブジェクトを生成する.
In[29]:= FunctionInterpolation[a^2 + %[x], {x, 1, 3}, {a, 0, 1.5}]
Out[29]= 

式の評価による近似関数の構築
|