Сплайн-представление с scipy.interpolate: плохая интерполяция для низкоамплитудных, быстро осциллирующих функций

Мне нужно (численно) вычислить первую и вторую производную функции, для которой я пытался использовать обаsplrep а такжеUnivariateSpline создать сплайны с целью интерполяции функции для получения производных.

Однако, похоже, что в самом представлении сплайнов есть внутренняя проблема для функций, величина которых порядка 10 ^ -1 или нижеа также (быстро) колеблются.

В качестве примера рассмотрим следующий код для создания сплайн-представления функции синуса на интервале (0,6 * pi) (поэтому функция колеблется только три раза):

import scipy
from scipy import interpolate
import numpy
from numpy import linspace
import math
from math import sin

k = linspace(0, 6.*pi, num=10000) #interval (0,6*pi) in 10'000 steps
y=[]
A = 1.e0 # Amplitude of sine function

for i in range(len(k)):

  y.append(A*sin(k[i]))

tck =interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=5, s=2)
M=tck(k)

Ниже приведены результаты для M для A = 1.e0 и A = 1.e-2

http://i.imgur.com/uEIxq.png Амплитуда = 1

http://i.imgur.com/zFfK0.png Амплитуда = 1/100

Очевидно, что интерполированная функция, созданная сплайнами, совершенно неверна! 2-й график даже не колеблется с правильной частотой.

У кого-нибудь есть понимание этой проблемы? Или знаете другой способ создания сплайнов внутри numpy / scipy?

Ура, Рори

Ответы на вопрос(2)

Ваш ответ на вопрос