2018年11月5日月曜日

Python で 1 変量データ補間

1 次元スプライン補間の他にも様々な補間関数が SciPy には用意されています。 全ての点を通過する 1 変量の補間曲線を得るには、以下に示すような方法があります。

import numpy as np

from scipy import signal, interpolate

from matplotlib import pylab as plt

 

# サンプルデータ作成

t = np.linspace(0, 10, 11)

tt = np.linspace(0, 10, 51)

y = np.sin(t)

 

# 線形補間

f1 = interpolate.interp1d(t, y)

y1 = f1(tt)

 

# 2 次スプライン補間

f2 = interpolate.interp1d(t, y, kind="quadratic")

y2 = f2(tt)

 

# 3 次スプライン補間

f3 = interpolate.interp1d(t, y, kind="cubic")

y3 = f3(tt)

 

# 1 次スプライン補間(線形補間と結果は同じ)

f4 = interpolate.interp1d(t, y, kind="slinear")

y4 = f4(tt)

 

# 0 次スプライン補間

f5 = interpolate.interp1d(t, y, kind="zero")

y5 = f5(tt)

 

# 最近傍点による補間

f6 = interpolate.interp1d(t, y, kind="nearest")

y6 = f6(tt)

 

# 秋間法による補間

f7 = interpolate.Akima1DInterpolator(t, y)

y7 = f7(tt)

 

# 区分的 3 次エルミート補間

# y8 = interpolate.pchip_interpolate(t, y, tt)でも結果は同じ

f8 = interpolate.PchipInterpolator(t, y)

y8 = f8(tt)

 

# 重心補間

# y9 = interpolate.barycentric_interpolate(t, y, tt)でも結果は同じ

f9 = interpolate.BarycentricInterpolator(t, y)

y9 = f9(tt)

 

# Krogh により提案された補間法

# y10 = interpolate.Krogh_interpolate(t, y, tt)でも結果は同じ

f10 = interpolate.KroghInterpolator(t, y)

y10 = f10(tt)

 

plt.figure(figsize=(12, 9))

plt.plot(t, y, "o")

plt.plot(tt, y1, "r", label="linear")

plt.plot(tt, y2, "b", label="quadratic")

plt.plot(tt, y3, "g", label="cubic")

plt.plot(tt, y4, "y", label="slinear")

plt.plot(tt, y5, "m", label="zero")

plt.plot(tt, y6, "c", label="nearest")

plt.plot(tt, y7, "--r", label="Akima")

plt.plot(tt, y8, "--b", label="Pchip")

plt.plot(tt, y9, "--g", label="Barycentric")

plt.plot(tt, y10, "--y", label="Krogh")

plt.legend()

plt.show()

0 件のコメント:

コメントを投稿