scipyからこれらの係数を正確に取得する方法があるかどうかはわかりません。scipy.interpolate.splrep
与えられるのは、bスプラインのノットの係数です。Matlabのスプラインが提供するのは、通過する点を結ぶ3次方程式を表す部分多項式係数のようです。これにより、Matlabスプラインは、エルミートやキャットマルロムなどの制御点ベースのスプラインであると私は信じています。 bスプライン。
ただし、scipy.interpolate.interpolate.spltopp
bスプラインの部分多項式係数を取得する方法を提供します。残念ながら、うまく機能していないようです。
>>> import scipy.interpolate
>>> x = [0, 1, 2, 3]
>>> y = [0, 1, 4, 0]
>>> tck = scipy.interpolate.splrep(x, y)
>>> tck
Out:
(array([ 0., 0., 0., 0., 3., 3., 3., 3.]),
array([ 3.19142761e-16, -3.00000000e+00, 1.05000000e+01,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00]),
3)
>>> pp = scipy.interpolate.interpolate.spltopp(tck[0][1:-1], tck[1], tck[2])
>>> pp.coeffs.T
Out:
array([[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000]])
渡された元のポイントごとに1つずつではなく、ノットごとに1セットの係数があることに注意してください。また、係数にbスプライン基底行列を掛けることはあまり役に立ちません。
>>> bsbm = array([[-1, 3, -3, 1], [ 3, -6, 3, 0], [-3, 0, 3, 0],
[ 1, 4, 1, 0]]) * 1.0/6
Out:
array([[-0.16666667, 0.5 , -0.5 , 0.16666667],
[ 0.5 , -1. , 0.5 , 0. ],
[-0.5 , 0. , 0.5 , 0. ],
[ 0.16666667, 0.66666667, 0.16666667, 0. ]])
>>> dot(pp.coeffs.T, bsbm)
Out:
array([[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322,
-7.41098469e-323],
[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322,
-7.41098469e-323],
[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322,
-7.41098469e-323],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000]])
FORTRAN区分的多項式パッケージPPPackには、Bスプラインから区分的多項式形式に変換するコマンドbsplpp
があります。これはニーズに対応する場合があります。残念ながら、現時点ではPPPack用のPythonラッパーはありません。