二次元座標系で表現された点列の微分値を効率的に計算する方法を紹介します。
微分値の計算は、入力点列の方程式が判明している場合は、微分公式に従って簡単に求めることが可能ですが、実際に扱う点列は方程式が判明していない場合がほとんどです。この記事では、有限差分法を用いて、入力点列の微分値を計算する方法を紹介します。
入出力
(入力)
※numpy.adarray型としていますが、通常のリスト型でも同様の結果が得られます。
(出力(1階微分))
前方差分
※末尾の要素については、前方差分を計算できないため、np.nanを追加している
後方差分
※先頭の要素については、後方差分を計算できないため、np.nanを追加している
中心差分
※先頭、末尾の要素については、中心差分を計算できないため、np.nanを追加している
(出力(2階微分))
二階中心差分
※先頭、末尾の要素については、2階差分を計算できないため、np.nanを追加している
必要パッケージ
- numpy
- scipy
解法
以下①~②の手順で、微分値を距離を計算する
- 入力点列を極小値hの間隔でリサンプリングする(補間方法:3次スプライン補間
- リサンプリング後の点列に対して、有限差分法の公式より1階微分、2階微分値を計算する
(有限差分法の公式)
前方差分
$$f'(x)=\frac{f(x+h)-f(x)}{h}+O(h)$$
後方差分
$$f'(x)=\frac{f(x)-f(x-h)}{h}+O(h)$$
中心差分
$$f'(x)=\frac{f(x+h)-f(x-h)}{2h}+O(h^2)$$
二階中心差分
$$f”(x)=\frac{f(x+h)-2f(x)+f(x-h)}{h^2}+O(h^2)$$
※O(h)、O(h^2)は打切り誤差で、各微分値にはそれぞれh、h^2程度の誤差が含まれる
コード
Point1: scipyパッケージのinterpolate.interp1d関数で3次スプライン補間することにより、曲線をなめらかにリサンプリングできる
Point2: numpyパッケージのdiff関数の引数nに「2」を指定することで、2階差分を求めることができる
Point3: 有限差分法では計算できない、配列の先頭・末尾の要素にはnp.nanを追加している
Point4: 出力点列を1/hごとに間引くことで、リサンプリング前の点列に対する微分値を取得できる
Point2: numpyパッケージのdiff関数の引数nに「2」を指定することで、2階差分を求めることができる
Point3: 有限差分法では計算できない、配列の先頭・末尾の要素にはnp.nanを追加している
Point4: 出力点列を1/hごとに間引くことで、リサンプリング前の点列に対する微分値を取得できる