1

Python に 2 つの配列があり、それらのポイント間の 3 次スプライン補間を取得 (および実際に使用) したいとします。(IE: 機能を統合したい)。numpy scipy を使用する方法を強くお勧めします。

私はscipy.interpolate.interp1dについて知っています。ただし、それはポイントを評価することしかできません。たとえば、次の非常に単純な機能です。

これで、次のような簡単なことができます。

import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,1,2])
x = np.array(range(len(y)))
xvals = np.linspace(0, len(y)-1, len(y)*100, endpoint = False)
func = scipy.interpolate.interp1d(x, y, kind = "cubic")
yvals = func(xvals)
plt.plot(xvals,yvals)
plt.plot(x,y, "o")

しかし、私はこの 3 次スプラインをさらに処理したいと考えています (つまり、統合を取得する必要があります)。手動で行うには、係数を取得する必要があるため、次のようになります。

a_i * x^3 + b_i * x^2 + c_i * x + d_i where i goes from 0 to n/3 

(n = 要素の数 - これは i 番目の立方体の定義です)

したがって、すべてのスプラインを記述するタプル (または 2 次元配列) のリストが必要です。- または、i 番目の 3 次を取得する方法、そして本当に、現在どのスプラインにいるかを見つけるための便利な「x-to-i」を取得したいと思っています。

(もちろん、この後者の問題は、ソートされたリスト内の参照よりも大きい最初の値の単純な検索ですが、必要に応じて手動で簡単に実行できます)。

4

3 に答える 3

1

役立つかもしれない単なる考え。 docs から、別の方法で 3 次スプライン補間を取得できます。

import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,1,2])
x = np.array(range(len(y)))
xvals = np.linspace(0, len(y)-1, len(y)*100, endpoint = False)
func = scipy.interpolate.splrep(x, y, s=0)
yvals = scipy.interpolate.splev(xvals, func, der=0)

# display original vs cubic spline representation for security...
plt.figure()
plt.plot(x, y, 'x', xvals, yvals, x, y, 'b')
plt.legend(['Linear', 'Cubic Spline'])
plt.axis([-0.05, 20, -2, 20])
plt.title('Cubic-spline interpolation')
plt.show()

これにより、必要に応じて係数にアクセスできます

pp = scipy.interpolate.spltopp(func[0][1:-1],func[1],func[2])

#Print the coefficient arrays, one for cubed terms, one for squared etc
print(pp.coeffs)

また、この 3 次スプライン表現を使用して統合する方法のページに例を示します (状況に合わせて定数を変更してください。マイレージは異なる場合があります)。

def integ(x, tck, constant=0):
    x = np.atleast_1d(x)
    out = np.zeros(x.shape, dtype=x.dtype)
    for n in xrange(len(out)):
        out[n] = scipy.interpolate.splint(0, x[n], tck)
    out += constant
    return out

const_of_integration = 0
yint = integ(xvals, func, const_of_integration)
于 2015-04-14T10:55:30.380 に答える
1

補間には、 を使用できますscipy.interpolate.UnivariateSpline(..., s=0)

とりわけ、統合メソッドがあります。

編集: s=0UnivariateSpline コンストラクターへのパラメーターは、スプラインがすべてのデータ ポイントを通過するように強制します。get_coefs()結果は B スプライン ベースであり、およびメソッドを使用してノットと係数を取得できますget_knots()。形式は、netlib の FITPACK、dierckx で使用されるものと同じです。ただし、 ( ATMinterp1dに依存する) と(代わりに/ ) によって内部的に使用される tck 形式には一貫性がないことに注意してください。splmakeUnivariateSplinesplrepsplev

EDIT2: PPoly.from_splineを使用してスプラインの区分多項式表現を取得できます--- しかし、これはiterp1d と一致しません。splrep(..., s=0) を使用して補間スプラインを取得し、結果を変換します。

于 2015-04-05T16:28:20.520 に答える