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

Respuestas a la pregunta(2)

Su respuesta a la pregunta