Сплайн-представление с 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?
Ура, Рори