近似関数と補間
多くの数値計算では,近似関数を導入すると便利である.近似関数とは普通に使う実数の近似を一般化したものと考えればよい.すなわち,実数の近似数がある数値的な量を特定の桁精度で表すならば,近似関数は単一,もしくは複数のパラメータに依存した量を特定の精度で表すもの,ととらえる.Mathematica では,NDSolveを使い求めた微分方程式の解を表すために近似関数が使われている.詳しくは,「微分方程式の数値解法」を参照のこと.
Mathematica における近似関数はInterpolatingFunctionオブジェクトで表される.この補間オブジェクトは「純関数」で説明した純関数と同じように機能する.InterpolatingFunctionの基本的な機能は,特定の引数を与えたときにその引数に対応する近似関数の値を与えることである.
InterpolatingFunctionは内挿手法に基づいた近似関数を与える.通常,一連の点における関数値を持つが,さらに微分値を持つときもある.また,補間法の前提として,関数がデータ点の間で滑らかに変化するものとされる.このInterpolatingFunctionに任意点における関数の値を要求すると,データから内挿処理がなされ,必要な値が近似される.
| Interpolation[{f1,f2,...}] | 連続した整数点におけるデータ値 をもとに補間法を使い近似関数を構築する |
| Interpolation[{{x1,f1},{x2,f2},...}] |
| 変数の点 におけるデータ値 をもとに補間法を使い近似関数を構築する |
近似関数の構築
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
リストにない他の点において近似値を得ることもできる.
| Out[4]= |  |
| Out[5]= |  |
近似関数は他の Mathematica 関数と同じように使うことができる.つまり,近似関数をプロットしたり,積分や根の探索等のための数値的操作を行うことができる.
数値でない未知の引数を使うと,近似関数は記号的な形でしか求まらない.
| Out[6]= |  |
| Out[7]= |  |
| Out[8]= |  |
近似関数をプロットする.グラフから真の正弦と見分けられないほど似ていることが分かる.
| Out[9]= |  |
近似関数を微分すると,導関数を表した別の近似関数が生成される.
正弦を計算する近似関数を微分し,

における導関数の値を求める.
| Out[10]= |  |
真の導関数値を確認してみよう.ほとんど同じなことが分かる.
| Out[11]= |  |
InterpolatingFunctionオブジェクトには,Mathematica の処理で必要になる,近似関数に関する情報がすべて含まれる.標準的な Mathematica の出力表記を使っている場合,InterpolatingFunctionオブジェクトの定義域を与える部分だけが表示される.InterpolatingFunctionオブジェクトで実際に使われたパラメータは略式表示される.
| Out[12]= |  |
定義域の外にある点で関数を計算すると,
Mathematica から警告が発せられ,外挿処理により値が求められる.
| Out[13]= |  |
近似関数についてより多くの情報を与えれば,それだけ近似精度も向上する.具体的には,関数の0次データだけでなく微分値も与えると精度の向上が期待できる.
| Interpolation[{{{x1},f1,df1,ddf1,...},...}] |
| 近似関数の構築において点 における導関数も補間データとして使う |
導関数を使った近似関数の構築
| Out[14]= |  |
上の補間よりも導関数へのより適切な補間を見付ける.
| Out[15]= |  |
Interpolationは,データ点を多項式曲線でフィットさせるために使う.曲線の次数を指定するときにはオプションInterpolationOrderを使う.このオプションはデフォルトで,InterpolationOrder->3の設定になっているので,特に指定しなければ三次曲線でフィット処理が行われる.
データの点と点の間を線形補間する.近似関数が生成される.
| Out[17]= |  |
| Out[18]= |  |
| Out[19]= |  |
通常,InterpolationOrderの設定値を高くすればするほど,より滑らかな近似関数が得られる.ただし,高く設定しすぎると,曲線にまばらな振動部が現れてしまう.
| ListInterpolation[{{f11,f12,...},{f21,...},...}] |
| 格子状の2D座標平面における各整数格子点における値を補間する関数を構築する |
| ListInterpolation[list,{{xmin,xmax},{ymin,ymax}}] |
| 等間隔で区画化した格子状の2D座標平面を前提とする |
| ListInterpolation[list,{{x1,x2,...},{y1,y2,...}}] |
| 任意間隔で区画化した格子状の2D座標平面を前提とする |
多次元配列的なデータの補間
| Out[20]= |  |
| Out[21]= |  |
この配列を補間するには,定義域がどうなっているかを指定しなければいけない.
| Out[23]= |  |
ListInterpolationは何次元の配列でも機能する.補間結果として,特定の数の引数を必要とするInterpolatingFunctionオブジェクトが生成される.
| Out[25]= |  |
Mathematica は,純粋に数値的な近似関数だけでなく文字パラメータを伴った関数も扱うことができる.
| Out[26]= |  |
こうすると,2.2の点における内挿値がどうパラメータに依存しているかが分かる.
| Out[27]= |  |
| Out[28]= |  |
近似関数をもとにした処理を行っていると,複雑に組み合さったInterpolatingFunctionオブジェクトが得られてしまうことがよくある.そのようなときは,特定の定義域についてFunctionInterpolationを適用させることで単一のInterpolatingFunctionオブジェクトに統合できる.
| Out[29]= |  |
| Out[30]= |  |
| Out[31]= |  |
| FunctionInterpolation[expr,{x,xmin,xmax}] |
| 式 expr を x が から まで評価することで近似関数を構築する |
| FunctionInterpolation[expr,{x,xmin,xmax},{y,ymin,ymax},...] |
| 多次元で有効な近似関数を構築する |
式の評価による近似関数の構築