LoginSignup
0
0

内挿補間(spline補間など)

Last updated at Posted at 2024-06-01

離散データから連続値を得よう!

離散的なデータ$(x_i, y_i)$から$y=f(x)$となるような$f$を作成。
色々な補間方法を一つのクラスから生成できるようにしています。

from scipy import interpolate

class Interpolate():
    def __init__(self, name, xrefs, yrefs):
        self.methods = {"1st": lambda x, y: interpolate.interp1d(x, y, kind=1),
                        "2nd": lambda x, y: interpolate.interp1d(x, y, kind=2),
                        "3rd": lambda x, y: interpolate.interp1d(x, y, kind=3),
                        "Akima": interpolate.Akima1DInterpolator,
                        "PCHIP": interpolate.PchipInterpolator,
                        "nearest": lambda x, y: interpolate.interp1d(x, y, kind="nearest"),
                        "nearest_up": lambda x, y: interpolate.interp1d(x, y, kind="nearest-up"),
                        "previous": lambda x, y: interpolate.interp1d(x, y, kind="previous"),
                        "next": lambda x, y: interpolate.interp1d(x, y, kind="next"),
                        "Lagrange": interpolate.lagrange,
                        "Krogh": interpolate.KroghInterpolator,
                        "Barycentric": interpolate.BarycentricInterpolator
                        }
        
        method = self.methods[name]
        self.fittedcurve = method(xrefs, yrefs)
        
    def __call__(self, x):
        return self.fittedcurve(x)

使い方

  1. 既知データxrefs, yrefsと補間方法を指定してInterpolateクラスのインスタンスを作成
  2. インスタンスに未知のxを代入すると補間された結果が返ってくる

下記コードでは1次のスプライン補間(線形補間)を行っています。

# 既知データ
xrefs = [0.0, 5.0, 10.0]
yrefs = [0.0, 5.0, 10.0]

# 推定したいx
x = [0.0, 2.5, 5.0]

# Interpolateクラスのインスタンス、今回は線形補間
y = Interpolate("1st", xrefs, yrefs)

print(x)
print(y(x))

# [0.0, 2.5, 5.0]
# [0.  2.5 5. ]

nearestnearest_upの違いは2点間のちょうど中点が指定された際、下側をとるか上側を取るかの違い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0