2017-01-24 3 views
2

Я делаю кубический сплайн-интерполяции, используя scipy.interpolate.splrep следующим образом:Попадая коэффициенты кубического сплайна из scipy.interpolate.splrep

import numpy as np 
import scipy.interpolate 

x = np.linspace(0, 10, 10) 
y = np.sin(x) 

tck = scipy.interpolate.splrep(x, y, task=0, s=0) 
F = scipy.interpolate.PPoly.from_spline(tck) 

печатаю т и с:

print F.x 

array([ 0.  , 0.  , 0.  , 0.  , 
    2.22222222, 3.33333333, 4.44444444, 5.55555556, 
    6.66666667, 7.77777778, 10.  , 10.  , 
    10.  , 10.  ]) 

print F.c 

array([[ -1.82100357e-02, -1.82100357e-02, -1.82100357e-02, 
    -1.82100357e-02, 1.72952212e-01, 1.26008293e-01, 
    -4.93704109e-02, -1.71230879e-01, -1.08680287e-01, 
     1.00658224e-01, 1.00658224e-01, 1.00658224e-01, 
     1.00658224e-01], 
    [ -3.43151441e-01, -3.43151441e-01, -3.43151441e-01, 
    -3.43151441e-01, -4.64551679e-01, 1.11955696e-01, 
     5.31983340e-01, 3.67415303e-01, -2.03354294e-01, 
    -5.65621916e-01, 1.05432909e-01, 1.05432909e-01, 
     1.05432909e-01], 
    [ 1.21033389e+00, 1.21033389e+00, 1.21033389e+00, 
     1.21033389e+00, -5.84561936e-01, -9.76335250e-01, 
    -2.60847433e-01, 7.38484392e-01, 9.20774403e-01, 
     6.63563923e-02, -9.56285846e-01, -9.56285846e-01, 
    -9.56285846e-01], 
    [ -4.94881722e-18, -4.94881722e-18, -4.94881722e-18, 
    -4.94881722e-18, 7.95220057e-01, -1.90567963e-01, 
    -9.64317117e-01, -6.65101515e-01, 3.74151231e-01, 
     9.97097891e-01, -5.44021111e-01, -5.44021111e-01, 
    -5.44021111e-01]]) 

так я поставляюсь й массив как:

array([ 0.  , 1.11111111, 2.22222222, 3.33333333, 
    4.44444444, 5.55555556, 6.66666667, 7.77777778, 
    8.88888889, 10.  ]) 

Q.1: The Fx (узлы) не является таким же, как оригинальным массив х и имеет Дублировать e (возможно, чтобы заставить первую производную до нуля?). Также некоторые значения в x (1.11111111, 8.88888889) отсутствуют в F.x. Есть идеи?

Q.2 Форма F.c является (4, 13). Я понимаю, что 4 исходит из того, что это кубический сплайн. Но я не знаю, как выбрать коэффициенты для каждого из 9 разделов, которые я хочу (от x = 0 до x = 1.11111, x = 1.111111 до x = 2.222222 и т. Д.). Любая помощь в извлечении коэффициентов для разных сегментов была бы оценена.

ответ

2

Если вы хотите, чтобы узлы в определенных местах вдоль кривых, которые необходимо использовать аргумент task=-1 из splrep и дать массив внутренних узлов как t аргумента.

Узлы в t должны удовлетворять следующее условие:

If provided, knots t must satisfy the Schoenberg-Whitney conditions, i.e., there must be a subset of data points x[j] such that t[j] < x[j] < t[j+k+1], for j=0, 1,...,n-k-2.

Смотрите документацию here.

Затем вы должны получить F.c из следующих размеров (4, <length of t> + 2*(k+1)-1), соответствующих последовательных интервалах вдоль кривой (k+1 узлы добавляются на обоих концах кривой по splrep).

Попробуйте следующее:

import numpy as np 
import scipy.interpolate 

x = np.linspace(0, 10, 20) 
y = np.sin(x) 

t = np.linspace(0, 10, 10) 

tck = scipy.interpolate.splrep(x, y, t=t[1:-1]) 

F = scipy.interpolate.PPoly.from_spline(tck) 

print(F.x) 
print(F.c) 

# Accessing coeffs of nth segment: index = k + n - 1 
# Eg. for second segment: 
print(F.c[:,4]) 
+0

я сделал следующее: TCK = scipy.interpolate.splrep (X, Y, S = 0, т = х). Тем не менее, я получаю ошибку на этом как: tck = scipy.interpolate.splrep (x, Y, s = 0, t = x) Файл «/Library/Python/2.7/site-packages/scipy/interpolate/fitpack.py ", строка 515, в splrep raise _iermess [ier] [1] (_ iermess [ier] [0]) ValueError: Ошибка при входных данных – user3440489

+0

Извините, но я не вижу никаких намеков на« выбор »узлов там. Любая ссылка на это будет полезна. – user3440489

+0

Измененный ответ, чтобы получить дополнительную информацию о массиве 't' и добавлен пример. Удачи! –

Смежные вопросы