近似関数と補間

多くの数値計算では,近似関数を導入すると便利である.近似関数とは普通に使う実数の近似を一般化したものと考えればよい.すなわち,実数の近似数がある数値的な量を特定の桁精度で表すならば,近似関数は単一,もしくは複数のパラメータに依存した量を特定の精度で表すもの,ととらえる.Wolfram言語では,NDSolveを使い求めた微分方程式の解を表すために近似関数が使われている.詳しくは,「微分方程式の数値解法」を参照のこと.

Wolfram言語における近似関数はInterpolatingFunctionオブジェクトで表される.この補間オブジェクトは「純関数」で説明した純関数と同じように機能する.InterpolatingFunctionの基本的な機能は,特定の引数を与えたときにその引数に対応する近似関数の値を与えることである.

InterpolatingFunctionは内挿手法に基づいた近似関数を与える.通常,一連の点における関数値を持つが,さらに微分値を持つときもある.また,補間法の前提として,関数がデータ点の間で滑らかに変化するものとされる.このInterpolatingFunctionに任意点における関数の値を要求すると,データから内挿処理がなされ,必要な値が近似される.

Interpolation[{f1,f2,}]連続した整数点におけるデータ値 をもとに補間法を使い近似関数を構築する
Interpolation[{{x1,f1},{x2,f2},}]
変数の点 におけるデータ値 をもとに補間法を使い近似関数を構築する

近似関数の構築

正弦関数で補間点のリストを作っておく.
In[1]:=
Click for copyable input
Out[1]=
得られた値を表す近似関数を構築する.
In[2]:=
Click for copyable input
Out[2]=
この近似関数はリストの各値を再現する.
In[3]:=
Click for copyable input
Out[3]=
リストにない他の点において近似値を得ることもできる.
In[4]:=
Click for copyable input
Out[4]=
得られた補間は,もとの正弦をよく近似している.
In[5]:=
Click for copyable input
Out[5]=

近似関数は他のWolfram言語関数と同じように使うことができる.つまり,近似関数をプロットしたり,積分や根の探索等のための数値的操作を行うことができる.

数値でない未知の引数を使うと,近似関数は記号的な形でしか求まらない.
In[6]:=
Click for copyable input
Out[6]=
近似関数を数値積分する.
In[7]:=
Click for copyable input
Out[7]=
真の正弦関数の数値積分を計算してみる.
In[8]:=
Click for copyable input
Out[8]=
近似関数をプロットする.グラフから真の正弦と見分けられないほど似ていることが分かる.
In[9]:=
Click for copyable input
Out[9]=

近似関数を微分すると,Wolfram言語では導関数を表した別の近似関数が生成される.

正弦を計算する近似関数を微分し,における導関数の値を求める.
In[10]:=
Click for copyable input
Out[10]=
真の導関数値を確認してみよう.ほとんど同じなことが分かる.
In[11]:=
Click for copyable input
Out[11]=

InterpolatingFunctionオブジェクトには,Wolfram言語の処理で必要になる,近似関数に関する情報がすべて含まれる.標準的なWolfram言語の出力表記を使っている場合,InterpolatingFunctionオブジェクトの定義域を与える部分だけが表示される.InterpolatingFunctionオブジェクトで実際に使われたパラメータは略式表示される.

標準出力表記では,InterpolatingFunctionオブジェクトの定義域と出力型だけが具体的に表示される.
In[12]:=
Click for copyable input
Out[12]=
定義域の外にある点で関数を計算すると,Wolfram言語から警告が発せられ,外挿処理により値が求められる.
In[13]:=
Click for copyable input
Out[13]=

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

Interpolation[{{{x1},f1,df1,ddf1,},}]
近似関数の構築において点 における導関数も補間データとして使う

導関数を使った近似関数の構築

以下は正弦関数とその第1導関数の値から補間する.
In[14]:=
Click for copyable input
Out[14]=
上の補間よりも導関数へのより適切な補間を見付ける.
In[15]:=
Click for copyable input
Out[15]=

Interpolationは,データ点を多項式曲線でフィットさせるために使う.曲線の次数を指定するときにはオプションInterpolationOrderを使う.このオプションはデフォルトで,InterpolationOrder->3の設定になっているので,特に指定しなければ三次曲線でフィット処理が行われる.

余弦を使ってフィットさせるデータを作っておく.
In[16]:=
Click for copyable input
データの点と点の間を線形補間する.近似関数が生成される.
In[17]:=
Click for copyable input
Out[17]=
求まった近似関数は直線成分からなる.
In[18]:=
Click for copyable input
Out[18]=
デフォルトのままだと,InterpolationOrder->3が有効なので,三次曲線でフィット処理が行われる.三次でも関数は滑らかである.
In[19]:=
Click for copyable input
Out[19]=

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

ListInterpolation[{{f11,f12,},{f21,},}]
格子状の2D座標平面における各整数格子点における値を補間する関数を構築する
ListInterpolation[list,{{xmin,xmax},{ymin,ymax}}]
等間隔で区画化した格子状の2D座標平面を前提とする
ListInterpolation[list,{{x1,x2,},{y1,y2,}}]
任意間隔で区画化した格子状の2D座標平面を前提とする

多次元配列的なデータの補間

整数格子点におけるデータ値を補間する.
In[20]:=
Click for copyable input
Out[20]=
得られた補間関数を使い特定点の値を求める.
In[21]:=
Click for copyable input
Out[21]=
別の配列データを作っておく.
In[22]:=
Click for copyable input
この配列を補間するには,定義域がどうなっているかをWolfram言語で指定しなければいけない.
In[23]:=
Click for copyable input
Out[23]=

ListInterpolationは何次元の配列でも機能する.補間結果として,特定の数の引数を必要とするInterpolatingFunctionオブジェクトが生成される.

三次元配列を補間する.
In[24]:=
Click for copyable input
Out[24]=
生成されたInterpolatingFunctionオブジェクトには引数が3ついる.
In[25]:=
Click for copyable input
Out[25]=

Wolfram言語は,純粋に数値的な近似関数だけでなく文字パラメータを伴った関数も扱うことができる.

パラメータに依存したInterpolatingFunctionオブジェクトが生成される.
In[26]:=
Click for copyable input
こうすると,2.2の点における内挿値がどうパラメータに依存しているかが分かる.
In[27]:=
Click for copyable input
Out[27]=
InterpolationOrderがデフォルトの設定だと,この点における値はに依存しなくなる.
In[28]:=
Click for copyable input
Out[28]=

近似関数をもとにした処理を行っていると,複雑に組み合さったInterpolatingFunctionオブジェクトが得られてしまうことがよくある.そのようなときは,特定の定義域についてFunctionInterpolationを適用させることで単一のInterpolatingFunctionオブジェクトに統合できる.

定義域を0から1とするInterpolatingFunctionオブジェクトを新たに生成する.
In[29]:=
Click for copyable input
Out[29]=
ネストしたInterpolatingFunctionオブジェクトを生成する.
In[30]:=
Click for copyable input
Out[30]=
純粋な二次元InterpolatingFunctionオブジェクトを生成する.
In[31]:=
Click for copyable input
Out[31]=
FunctionInterpolation[expr,{x,xmin,xmax}]
exprx から まで評価することで近似関数を構築する
FunctionInterpolation[expr,{x,xmin,xmax},{y,ymin,ymax},]
多次元で有効な近似関数を構築する

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