En el campo matemático del análisis numérico , la interpolación cúbica monótona es una variante de la interpolación cúbica que conserva la monotonicidad del conjunto de datos que se interpola.
La monotonicidad se conserva mediante interpolación lineal, pero no se garantiza mediante interpolación cúbica .
Interpolación Hermite cúbica monótona
La interpolación monótona se puede lograr usando spline Hermite cúbico con las tangentes modificado para asegurar la monotonicidad de la spline de Hermite resultante.
También está disponible un algoritmo para la interpolación de Hermite quíntica monótona .
Selección interpolante
Hay varias formas de seleccionar tangentes de interpolación para cada punto de datos. Esta sección describirá el uso del método Fritsch-Carlson. Tenga en cuenta que solo se requiere una pasada del algoritmo.
Deje que los puntos de datos sean indexados en orden ordenado para .
- Calcule las pendientes de las líneas secantes entre puntos sucesivos:
por . - Estas asignaciones son provisionales y pueden reemplazarse en los pasos restantes. Inicialice las tangentes en cada punto de datos interior como el promedio de las secantes,
por .
Para los puntos finales, use diferencias unilaterales:
Si y tener signos opuestos, establecer ..
- Para donde alguna vez (donde siempre dos sucesivos son iguales),
establecerya que la ranura que conecta estos puntos debe ser plana para preservar la monotonicidad.
Ignore los pasos 4 y 5 para aquellos. - Dejar
Si alguno o es negativo, los puntos de datos de entrada no son estrictamente monótonos y es un extremo local. En tales casos, aún se pueden generar curvas monótonas por partes eligiendo Si o Si , aunque la monotonicidad estricta no es posible a nivel mundial..
- Para evitar el sobreimpulso y garantizar la monotonicidad, se debe cumplir al menos una de las siguientes tres condiciones:
- (a) la función
, o
- (B) , o
- (C) .
- Solo la condición (a) es suficiente para garantizar una monotonicidad estricta: debe ser positivo.
- Una forma sencilla de satisfacer esta restricción es restringir el vector a un círculo de radio 3. Es decir, si , luego establece
y reescalar las tangentes a través de,
.
- Alternativamente, es suficiente restringir y . Para lograr esto si , luego establece .
- (a) la función
Interpolación cúbica
Después del preprocesamiento anterior, la evaluación de la spline interpolada es equivalente a la spline de Hermite cúbica , utilizando los datos, , y por .
Para evaluar en , encuentra el índice en la secuencia donde , entre mentiras , y , es decir: . Calcular
entonces el valor interpolado es
dónde son las funciones base para la spline cúbica de Hermite .
Implementación de ejemplo
La siguiente implementación de JavaScript toma un conjunto de datos y produce una función interpolante de spline cúbica monótona:
/ * Interpolación de splines cúbicos monótonos Ejemplo de uso: var f = createInterpolant ([0, 1, 2, 3, 4], [0, 1, 4, 9, 16]); var mensaje = ''; para (var x = 0; x <= 4; x + = 0.5) { var xSquared = f (x); mensaje + = x + 'al cuadrado se refiere a' + xSquared + '\ n'; } alerta (mensaje); * / var createInterpolant = function ( xs , ys ) { var i , length = xs . longitud ;// hacer frente a problemas de longitud si ( longitud ! = Ys . De longitud ) { tiro 'Necesita un recuento igual de xs e ys'. ; } if ( longitud === 0 ) { función de retorno ( x ) { retorno 0 ; }; } if ( length === 1 ) { // Impl: Precalcular el resultado evita problemas si ys se muta más tarde y permite la recolección de basura de ys // Impl: Unary plus convierte correctamente los valores en números var result = + ys [ 0 ]; función de retorno ( x ) { resultado de retorno ; }; } // Reorganiza xs e ys para que xs se ordene var indexes = []; para ( i = 0 ; i < longitud ; i ++ ) { índices . empujar ( i ); } índices . sort ( función ( a , b ) { return xs [ a ] < xs [ b ] ? - 1 : 1 ; }); var oldXs = xs , oldYs = ys ; // Impl: La creación de nuevas matrices también evita problemas si las matrices de entrada se mutan más tarde xs = []; ys = []; // Impl: Unary plus convierte correctamente los valores en números para ( i = 0 ; i < length ; i ++ ) { xs . push ( + oldXs [ índices [ i ]]); ys . push ( + oldYs [ índices [ i ]]); }// Obtener diferencias y pendientes consecutivas var dys = [], dxs = [], ms = []; para ( i = 0 ; i < longitud - 1 ; i ++ ) { var dx = xs [ i + 1 ] - xs [ i ], dy = ys [ i + 1 ] - ys [ i ]; dxs . empujar ( dx ); dis . empujar ( dy ); ms . empujar ( dy / dx ); }// Obtener coeficientes de grado 1 var c1s = [ ms [ 0 ]]; para ( i = 0 ; i < dxs . longitud - 1 ; i ++ ) { var m = ms [ i ], mNext = ms [ i + 1 ]; si ( m * mNext <= 0 ) { c1s . empujar ( 0 ); } más { var dx_ = dxs [ i ], dxNext = dxs [ i + 1 ], common = dx_ + dxNext ; c1s . push ( 3 * común / (( común + dxSiguiente ) / m + ( común + dx_ ) / mSiguiente )); } } c1s . empujar ( ms [ ms . longitud - 1 ]);// Obtener coeficientes de grado 2 y grado 3 var c2s = [], c3s = []; para ( i = 0 ; i < c1s . longitud - 1 ; i ++ ) { var c1 = c1s [ i ], m_ = ms [ i ], invDx = 1 / dxs [ i ], common_ = c1 + c1s [ i + 1 ] - m_ - m_ ; c2s . empujar (( m_ - c1 - común_ ) * invDx ); c3s . empujar ( common_ * invDx * invDx ); }// Devuelve la función interpolante return function ( x ) { // El punto más a la derecha del conjunto de datos debe dar un resultado exacto var i = xs . longitud - 1 ; if ( x == xs [ i ]) { return ys [ i ]; }// Busque el intervalo en el que se encuentra x, devolviendo la y correspondiente si x es uno de los originales xs var low = 0 , mid , high = c3s . longitud - 1 ; while ( bajo <= alto ) { medio = Matemáticas . piso ( 0.5 * ( bajo + alto )); var xHere = xs [ mid ]; si ( xAquí < x ) { bajo = medio + 1 ; } más si ( xAquí > x ) { alto = medio - 1 ; } else { return ys [ mid ]; } } i = Matemáticas . max ( 0 , alto );// Interpolar var diff = x - xs [ i ], diffSq = diff * diff ; devuelve ys [ i ] + c1s [ i ] * diff + c2s [ i ] * diffSq + c3s [ i ] * diff * diffSq ; }; };
Referencias
- Fritsch, FN; Carlson, RE (1980). "Interpolación cúbica por partes monótona". Revista SIAM de Análisis Numérico . SIAM. 17 (2): 238–246. doi : 10.1137 / 0717021 .
- Dougherty, RL; Edelman, A .; Hyman, JM (abril de 1989). "Interpolación Hermite cúbica y quíntica conservadora de positividad, monotonicidad o convexidad" . Matemáticas de la Computación . 52 (186): 471–494. doi : 10.2307 / 2008477 .
enlaces externos
- Implementación de C ++ con licencia GPLv 2 : MonotCubicInterpolator.cpp MonotCubicInterpolator.hpp