3

scipy のsplrepを使用すると、テスト用の正弦波を簡単に合わせることができます。

import numpy as np
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt
plt.style.use("ggplot")

# Generate test sinewave
x = np.arange(0, 20, .1)
y = np.sin(x)

# Interpolate
tck = splrep(x, y)
x_spl = x + 0.05 # Just to show it wors
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)

スプライン正弦波プロット

splrepのドキュメントには、重みパラメータのデフォルト値は であると記載されていますnp.ones(len(x))。ただし、これをプロットすると、まったく異なるプロットになります。

tck = splrep(x, y, w=np.ones(len(x_spl)))
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)

splev と重みでプロット

ドキュメントには、重み配列が指定されている場合は平滑化条件sが異なると記載されていますが、設定s=len(x_spl) - np.sqrt(2*len(x_spl))(重み配列なしのデフォルト値) の場合でも、プロットに示されているように、結果は元の曲線に厳密には対応していません。

重み配列を使用した補間 (上記のように) が重みなしの補間と同じ結果を出力するようにするには、上記のコードで何を変更する必要がありますか? これを scipy 0.17.0 でテストしました。テスト IPython ノートブックの要旨

4

1 に答える 1