epresentación de spline con scipy.interpolate: mala interpolación para funciones de baja amplitud y oscilación rápida
Necesito calcular (numéricamente) la primera y segunda derivada de una función para la que he intentado usar ambassplrep
yUnivariateSpline
para crear splines con el propósito de interpolar la función para tomar las derivadas.
in embargo, parece que hay un problema inherente en la representación de spline para funciones cuya magnitud es de orden 10 ^ -1 o menor están (rápidamente) oscilando.
Como ejemplo, considere el siguiente código para crear una representación spline de la función seno durante el intervalo (0,6 * pi) (por lo que la función oscila solo tres veces):
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)
bajo están los resultados para M para A = 1.e0 y A = 1.e-2
http: //i.imgur.com/uEIxq.pn Amplitud = 1
http: //i.imgur.com/zFfK0.pn Amplitud = 1/100
¡Claramente la función interpolada creada por las splines es totalmente incorrecta! El segundo gráfico ni siquiera oscila la frecuencia correcta.
¿Alguien tiene alguna idea de este problema? ¿O conoce otra forma de crear splines dentro de numpy / scipy?
Cheers, Rory