python - signal - scipy guide




scipy에서 스플라인 보간 계수 (2)

scipy로 스플라인 보간 계수를 계산하고 싶습니다. MATLAB에서 :

x=[0:3];
y=[0,1,4,0];
spl=spline(x,y);
disp(spl.coefs);

그리고 그것을 반환합니다 :

ans =

   -1.5000    5.5000   -3.0000         0
   -1.5000    1.0000    3.5000    1.0000
   -1.5000   -3.5000    1.0000    4.0000

하지만 나는 scipy에서 interpolate.splrep을 사용하여이를 수행 할 수 없습니다. 계산 방법을 말해 줄 수 있어요?


scipy.interpolate.splrep의 문서 에서 계수를 얻을 수 있다고 말합니다.

Returns:

  tck : tuple

  (t,c,k) a tuple containing the vector of knots, the B-spline coefficients, and the degree of the spline.

내가 scipy에서 정확하게 그 계수를 얻을 어떤 방법이 있는지 모르겠습니다. scipy.interpolate.splrep 은 b- 스플라인의 매듭 점에 대한 계수입니다. Matlab의 스플라인은 여러분이 전달하는 점들을 연결하는 입방 방정식을 설명하는 부분 다항식 계수 인 것으로 보입니다. Matlab 스플라인은 Hermite 나 Catmull-Rom과 같은 제어점 기반 스플라인이라고 생각합니다. 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]])

전달 된 원점 각각에 대해 하나가 아닌 매듭마다 계수 집합이 하나 있음을 유의하십시오. 또한 계수에 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 Piecewise Polynomial 패키지 인 PPPack 에는 B 스플라인에서 조각 별 다항식으로 변환하는 bsplpp 명령이있어 필요에 따라 사용할 수 있습니다. 불행히도 현재 PPPack 용 파이썬 래퍼는 없습니다.





scipy