web-dev-qa-db-ja.com

スプラインフィットを区分的関数に変換する方法は?

私が持っているとしましょう

import numpy as np
from scipy.interpolate import UnivariateSpline

# "true" data; I don't know this function
x = np.linspace(0, 100, 1000)
d = np.sin(x * 0.5) + 2 + np.cos(x * 0.1)

# sample data; that's what I actually measured
x_sample = x[::20]
d_sample = d[::20]

# fit spline
s = UnivariateSpline(x_sample, d_sample, k=3, s=0.005)

plt.plot(x, d)
plt.plot(x_sample, d_sample, 'o')
plt.plot(x, s(x))
plt.show()

私は得る

enter image description here

私が今持ちたいのは、すべてのオレンジ色の点の間の関数です。

knots = s.get_knots()
f0 = <some expression> for knots[0] <= x < knots[1]
f1 = <some expression> for knots[1] <= x < knots[2]
...

これにより、fiは、スプラインフィットの形状を再現するように選択する必要があります。

私は投稿 here を見つけましたが、そこに生成されたスプラインは上記の例では正しくないようです。また、式を返さないため、正確に必要なものではありません。

スプラインを区分的関数にするにはどうすればよいですか?各間隔を表現する(簡単な)方法はありますか?多項式として?

4
Cleb

あなたが説明したように、次のようなピースワイズ関数を使用できるはずです:

import numpy as np
from scipy.interpolate import UnivariateSpline

# "true" data; I don't know this function
x = np.linspace(0, 100, 1000)
d = np.sin(x * 0.5) + 2 + np.cos(x * 0.1)

# sample data; that's what I actually measured
x_sample = x[::20]
d_sample = d[::20]

# fit spline
s = UnivariateSpline(x_sample, d_sample, k=3, s=0.005)

plt.plot(x, d)
plt.plot(x_sample, d_sample, 'o')
plt.plot(x, s(x))

knots = s.get_knots()

conditions = [x < knots[0], (x >= knots[0]) * (x < knots[1]), (x >= knots[1]) * (x < knots[10]), x >= knots[10]]
# need one function for each condition
fns = [0, lambda x :-x, lambda x: 0.01*x**2, lambda x: 0.2*x**0.5]
y = np.piecewise(x, conditions, fns)

plt.plot(x, y)
plt.show()

私はいくつかのランダムな条件と関数を選びました-きっとあなたはもっと適切なものを見つけることができるでしょう!

overlaid piecewise example

0
Paddy Harrison