Interpolación cúbica:
La spline cúbica es una spline que usa el polinomio de tercer grado que satisface los m puntos de control dados. Para derivar las soluciones para el spline cúbico, asumimos la segunda derivación 0 en los puntos finales, lo que a su vez proporciona una condición límite que suma dos ecuaciones a m-2 ecuaciones para hacerlas solucionables. El sistema de ecuaciones para el spline cúbico para 1 dimensión puede estar dado por:
ranura
-
- El dominio de s está en intervalos de [a, b].
- S, S’, S” son todas funciones continuas en [a,b].
Aquí S i (x) es el
Dado que hay n intervalos y 4 coeficientes de cada ecuación, para eso necesitamos 4n parámetros para resolver el spline, podemos obtener 2n ecuaciones del hecho de que cada una de las ecuaciones del spline cúbico debe satisfacer el valor en ambos extremos:
continuas y diferenciables, pero también tienen derivadas primera y segunda definidas que también son continuas en los puntos de control.
y
For 1, 2, 3…n-1 proporciona las restricciones de la ecuación 2n -2 . Entonces, necesitamos 2 ecuaciones más para resolver el spline cúbico anterior. Para ello, utilizaremos algunas condiciones de contorno naturales.
Estrías cúbicas naturales:
En Spline cúbico natural, asumimos que la segunda derivada de la spline en los puntos límite es 0:
Ahora, dado que S(x) es un polinomio de tercer orden, sabemos que S”(x) es un spline lineal que se interpola. Por lo tanto, primero construimos S”(x) y luego lo integramos dos veces para obtener S(x).
Ahora, supongamos que t_i = x_i para i= 0, 1,…n, y y de la condición de contorno natural . La diferenciación dos veces de una spline cúbica da una spline lineal que se puede escribir como:
dónde,
Ahora, la ecuación se convierte en:
Integrando esta ecuación dos veces para obtener el spline cúbico:
dónde,
Ahora, para verificar la continuidad de la derivada en t_i, es decir, S^{‘}_{i}(t_i) = S^{‘}_{i-1}(t_{i}). Primero necesitamos encontrar derivadas y poner esa condición:
dónde,
Poniendo la ecuación anterior para la continuidad y resolviéndola da la siguiente ecuación:
Tome, v_i = 6(b_i – b_{i-1}) y la ecuación anterior se puede escribir como forma de array:
Implementación
- En esta implementación, realizaremos la interpolación spline para la función f(x) = 1/x para los puntos b/w 2-10 con spline cúbico que satisfizo la condición de contorno natural.
Python3
#imports import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import CubicSpline, interp1d plt.rcParams['figure.figsize'] =(12,8) x = np.arange(2,10) y = 1/(x) # apply cubic spline interpolation cs = CubicSpline(x, y, extrapolate=True) # apply natural cubic spline interpolation ns = CubicSpline(x, y,bc_type='natural', extrapolate=True) # Apply Linear interpolation linear_int = interp1d(x,y) xs = np.arange(2, 9, 0.1) ys = linear_int(xs) # plot linear interpolation plt.plot(x, y,'o', label='data') plt.plot(xs,ys, label="interpolation", color='green') plt.legend(loc='upper right', ncol=2) plt.title('Linear Interpolation') plt.show() # define a new xs xs = np.arange(1,15) #plot cubic spline and natural cubic spline plt.plot(x, y, 'o', label='data') plt.plot(xs, 1/(xs), label='true') plt.plot(xs, cs(xs), label="S") plt.plot(xs, ns(xs), label="NS") plt.plot(xs, ns(xs,2), label="NS''") plt.plot(xs, ns(xs,1), label="NS'") plt.legend(loc='upper right', ncol=2) plt.title('Cubic/Natural Cubic Spline Interpolation') plt.show() # check for boundary condition print("Value of double differentiation at boundary conditions are %s and %s" %(ns(2,2),ns(10,2)))
Producción:
Value of double differentiation at boundary conditions are -1.1102230246251565e-16 and -0.00450262550915248