python - معاملات استيفاء الخيط في سسيبي




matlab scipy (2)

أريد حساب معاملات الاستكمال الداخلي من قبل سسيبي. في ماتلاب:

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

ولكن لا أستطيع أن أفعل ذلك من خلال interpolate.splrep في سسيبي. هل يمكن أن تخبرني كيف تحسب ذلك؟


أنا لست متأكدا من أن هناك أي طريقة للحصول بالضبط تلك المعاملات من سسيبي. ما scipy.interpolate.splrep يمنحك هو معاملات للعقدة ل 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]])

لاحظ أن هناك مجموعة واحدة من المعاملات لكل عقدة، وليس واحدة لكل نقطة من النقاط الأصلية التي تم تمريرها. كما أن ضرب المعاملات بواسطة مصفوفة أساس ب-سبلاين لا يبدو مفيدا جدا.

>>> 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]])

حزمة فورتران بييسويس متعدد الحدود، بباك ، لديه bsplpp الأمر الذي يحول من B- سبلين إلى بييسويس شكل متعدد الحدود، والتي قد تخدم احتياجاتك. لسوء الحظ، ليس هناك مجمع بايثون ل بباك في هذا الوقت.


المستندات على 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.