7 votos

Matemáticas de Interpolación de Spline Cúbico

Estoy escribiendo un fragmento de código en Python para hacer una interpolación usando splines cúbicos. Primero he hecho los cálculos, y luego he intentado implementar el pseudo código en Python. Sin embargo, creo que podría haberme equivocado con el índice de ejecución o un coeficiente.

¿Podría alguien por favor ser tan amable de revisar mis matemáticas ? La curva resultante no es suave, no encaja en los puntos interiores y está por todas partes.


Deje que $(x_{0},y_{0}),(x_{1},y_{1}), \ldots ,(x_{n},y_{n})$ ser $n+1$ puntos en $ \mathbb {R}^2$ . Un spline es una función polinómica de la forma

$$S(x)= \begin {cases} S_{0}(x),& \text {if } x_{0} \le {x} \lt x_{1} \\ \vdots\\ S_{i}(x),& \text {if } x_{i} \le {x} \lt x_{i+1} \\ \vdots\\ S_{n-1}(x),& \text {if } x_{n-1} \le {x} \lt x_{n} \\ \end {cases}$$

$S_{i}(x)$ es un polinomio cúbico con $4$ cuatro coeficientes, $ \forall {i}$ . Hay $n$ intervalos y un total de $4n$ desconocidos. Por lo tanto, necesitamos $4n$ condiciones.

Supongamos que $S_{i}(x)$ tiene la forma $S_{i}(x)=A_{i}(x-x_{i})^3+B_{i}(x-x_{i})^2+C_{i}(x-x_{i})+D_{i}$ . El primero y segundo derivados de los polinomios cúbicos son:

$ \begin {aligned} S_{i}(x)&=A_{i}(x-x_{i})^3+B_{i}(x-x_{i})^2+C_{i}(x-x_{i})+D_{i} \\ S_{i}'(x)&=3A_{i}(x-x_{i})^2+2B_{i}(x-x_{i})+C_{i} \\ S_{i}''(x)&=6A_{i}(x-x_{i})+2B_{i} \\ \end {aligned}$

También,

$ \begin {aligned} S_{i}(x_{i})&=D_{i} \\ S_{i}'(x_{i})&=C_{i} \\ S_{i}''(x_{i})&=2B_{i} \\ \end {aligned}$

Definimos $h_{i}=x_{i}-x_{i-1}$ . Lo hemos hecho:

$ \begin {aligned} S_{i-1}(x_{i})&=A_{i-1}h_{i}^3+B_{i-1}h_{i}^2+C_{i-1}h_{i}+D_{i-1} \\ S_{i-1}'(x_{i})&=3A_{i-1}h_{i}^2+2B_{i-1}h_{i}+C_{i-1} \\ S_{i-1}''(x_{i})&=6A_{i-1}h_{i}+2B_{i-1} \\ \end {aligned}$

Cuatro propiedades de las estrías cúbicas

El spline debe cumplir con los siguientes criterios -

  1. La función $S(x)$ interpolará todos los puntos de datos. $S(x)$ debe ser continuo. Y así, en cada intervalo, $S_{i}(x_{i})=y_{i}$ y $S_{i-1}(x_{i})=y_{i}$ .

  2. La curva $S(x)$ debe ser suave sin saltos. $S'(x)$ debe ser continuo en el intervalo $[x_{i},x_{i+1}]$ . Por lo tanto, las pendientes en cada punto interior deben coincidir. $S_{i}'(x_{i})=S_{i-1}'(x_{i})$ .

  3. La curva $S(x)$ no debe tener ningún cambio abrupto en su curvatura o convexidad. $S''(x)$ será continuo en el intervalo $[x_{i},x_{i+1}]$ . $S_{i}''(x_{i})=S_{i-1}''(x_{i})$ .

  4. La elección de una de las dos condiciones siguientes en los puntos finales $(x_{0},y_{0})$ y $(x_{n},y_{n})$

a) El spline natural: $S'_{0}(x_{0})=0=S'_{n-1}(x_{n})$

b) El spline cúbico sujetado : $S'_{0}(x_{0})=f'(x_{0})$ y $S'_{n-1}(x_{n})=f'(x_{n})$ donde $f$ es presumiblemente la función, que estamos tratando de aproximar.

Vamos a determinar el $4n$ condiciones.

Evaluación de los coeficientes $A_i,B_{i},C_{i},D_{i}$

1) La primera condición da lugar a

$A_{i-1}h_{i}^3+B_{i-1}h_{i}^2+C_{i-1}h_{i}+D_{i-1}=D_{i}$

2) La segunda condición da lugar a

$3A_{i-1}h_{i}^2+2B_{i-1}h_{i}+C_{i-1}=C_{i}$

3) La tercera condición da lugar a

$6A_{i-1}h_{i}+2B_{i-1}=2B_{i}$

Las ecuaciones anteriores pueden ser algo simplificadas, si sustituimos $S_{i}''(x_{i})=2B_{i}=z_{i}$ . Por lo tanto, tenemos $B_{i}=z_{i}/2$ .

1) La última ecuación se convierte en :

$6A_{i-1}h_{i}=2(z_{i}/2)-2(z_{i-1}/2)=z_{i}-z_{i-1}$ .

$A_{i-1}= \frac {z_{i}-z_{i-1}}{6h_{i}}$

2) La primera ecuación se convierte en :

$ \begin {aligned} C_{i-1}h_{i}&=y_{i}-y_{i-1}-A_{i-1}h_{i}^3-B_{i-1}h_{i}^2 \\ C_{i-1}&= \frac {y_{i}-y_{i-1}}{h_{i}}-(A_{i-1}h_{i}^2+B_{i-1}h_{i}) \\ C_{i-1}&= \frac {y_{i}-y_{i-1}}{h_{i}}- \left ( \frac {z_{i}-z_{i-1}}{6h_{i}}h_{i}^2+ \frac {z_{i-1}}{2}h_{i} \right ) \\ C_{i-1}&= \frac {y_{i}-y_{i-1}}{h_{i}}-h_{i} \left ( \frac {z_{i}+2z_{i-1}}{6} \right ) \\ \end {aligned}$

Definimos $b_{i}= \frac {y_{i}-y_{i-1}}{h_{i}}$ .

En todas las ecuaciones anteriores, el índice de funcionamiento $i$ va desde $1$ a $n$ . Por lo tanto, ahora tenemos nuestras ecuaciones para determinar los coeficientes.

$A_{i-1}= \frac {z_{i}-z_{i-1}}{6h_{i}}$

$B_{i-1}= \frac {z_{i-1}}{2}$

$C_{i-1}=b_{i}-h_{i} \left ( \frac {z_{i}+2z_{i-1}}{6} \right )$

$D_{i}=y_{i}$

El sistema de ecuaciones en $z_{0},z_{1},z_{2}, \ldots ,z_{n-1}$

Si sustituimos estos valores en la segunda ecuación $3A_{i-1}h_{i}^2+2B_{i-1}h_{i}+C_{i-1}=C_{i}$ deberíamos obtener una relación de recurrencia entre $z_{i}$ -

$ \begin {aligned} 3 \frac {z_{i}-z_{i-1}}{6h_{i}}h_{i}^{2}+2 \frac {z_{i-1}}{2}h_{i}+b_{i}-h_{i} \left ( \frac {z_{i}+2z_{i-1}}{6} \right )&=b_{i+1}-h_{i+1} \left ( \frac {z_{i+1}+2z_{i}}{6} \right ) \\ \left ( \frac {2z_{i}+z_{i-1}}{6} \right )h_{i}+ \left ( \frac {z_{i+1}+2z_{i}}{6} \right )h_{i+1}&=b_{i+1}-b_{i} \\ h_{i+1}z_{i+1}+2z_{i}(h_{i}+h_{i+1})+z_{i-1}h_{i}&=6(b_{i+1}-b_{i}) \end {aligned}$

para $i=1,2,3, \ldots ,n-1$

Este sistema de ecuaciones lineales en $z_{0},z_{1},z_{2}, \ldots ,z_{n-1}$ puede ser representado en la forma de matriz como -

$ \begin {bmatrix} h_{1} & 2(h_{1}+h_{2}) & h_{2} & 0 & \ldots & 0 & 0 \\ 0 & h_{2} & 2(h_{2}+h_{3}) & h_{3} & \ldots & 0 & 0 \\ 0 & 0 & h_{3} & 2(h_{3}+h_{4}) & \ldots & \\ \vdots & & & & \ddots & \\ 0 & 0 & 0 & \ldots & h_{n-1} & 2(h_{n-1}+h_{n}) & h_{n} \end {bmatrix} \begin {bmatrix} z_{0} \\ z_{1} \\ z_{2} \\ \vdots\\ z_{n-1} \end {bmatrix} = \begin {bmatrix} 6(b_{2}-b_{1}) \\ 6(b_{3}-b_{2}) \\ 6(b_{4}-b_{3}) \\ \vdots\\ 6(b_{n}-b_{n-1}) \end {bmatrix}$

Esta matriz tiene $n-1$ filas y $n+1$ columnas. Por lo tanto, necesitamos dos condiciones adicionales.

Para las estrías naturales, $z_{0}=0=z_{n}$ . La primera y la última columna del sistema de ecuaciones lineales anterior pueden ser eliminadas, lo que resulta en,

$ \begin {bmatrix} 2(h_{1}+h_{2}) & h_{2} & 0 & \ldots & 0 & 0 \\ h_{2} & 2(h_{2}+h_{3}) & h_{3} & \ldots & 0 & 0 \\ 0 & h_{3} & 2(h_{3}+h_{4}) & \ldots & \\ \vdots & & & \ddots & \\ 0 & 0 & 0 & \ldots & h_{n-1} & 2(h_{n-1}+h_{n}) \end {bmatrix} \begin {bmatrix} z_{1} \\ z_{2} \\ \vdots\\ z_{n-1} \end {bmatrix} = \begin {bmatrix} 6(b_{2}-b_{1}) \\ 6(b_{3}-b_{2}) \\ 6(b_{4}-b_{3}) \\ \vdots\\ 6(b_{n}-b_{n-1}) \end {bmatrix}$


6voto

Quasar Puntos 86

He comprobado mi código matemático y python con casos regulares y de límite. Después de algunas correcciones, las matemáticas y el código funcionan a la perfección. La intuición, la matemática detrás de los splines cúbicos y el fragmento de código python se pueden encontrar en este Jupyter cuaderno .

Interpolation using cubic splines

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X