Монотонная кубическая интерполяция - Monotone cubic interpolation

в математический поле числовой анализ, монотонная кубическая интерполяция это вариант кубическая интерполяция что сохраняет монотонность из набор данных интерполируется.

Монотонность сохраняется линейная интерполяция но не гарантируется кубическая интерполяция.

Монотонная кубическая интерполяция Эрмита

Пример, показывающий немонотонную кубическую интерполяцию (красным) и монотонную кубическую интерполяцию (синим цветом) монотонного набора данных.

Монотонную интерполяцию можно выполнить с помощью кубический шлиц Эрмита с касательными модифицирован для обеспечения монотонности получаемого шлица Эрмита.

Также доступен алгоритм для монотонного квинтик Интерполяция Эрмита.

Выбор интерполянта

Есть несколько способов выбора касательных интерполяции для каждой точки данных. В этом разделе описывается использование метода Фрича – Карлсона. Обратите внимание, что требуется только один проход алгоритма.

Пусть точки данных будут проиндексировано в отсортированном порядке для .

  1. Вычислить наклоны секущие линии между последовательными точками:

    за .

  2. Эти назначения являются предварительными и могут быть отменены на остальных этапах. Инициализируйте касательные в каждой внутренней точке данных как среднее значение секущих,

    за .

    Для конечных точек используйте односторонние различия:

    .

    Если и иметь противоположные знаки, установить .

  3. За , где бы то ни было (где бы то ни было два последовательных равны),
    набор поскольку шлицы, соединяющие эти точки, должны быть плоскими, чтобы сохранить монотонность.
    Игнорируйте шаги 4 и 5 для тех .

  4. Позволять

    .

    Если либо или же отрицательно, то точки входных данных не являются строго монотонными, и является локальным экстремумом. В таких случаях, кусочно монотонные кривые все еще можно получить, выбрав если или же если , хотя строгая монотонность в глобальном масштабе невозможна.

  5. Предотвращать превышение и обеспечить монотонность, должно выполняться хотя бы одно из следующих трех условий:
а) функция

, или же

(б) , или же
(c) .
Для обеспечения строгой монотонности достаточно только условия (а): должен быть положительным.

Один простой способ удовлетворить это ограничение - ограничить вектор к окружности радиуса 3. То есть, если , затем установите

,

и масштабируйте касательные с помощью

.

В качестве альтернативы достаточно ограничить и . Для этого, если , затем установите .

Кубическая интерполяция

После предварительной обработки выше оценка интерполированного сплайна эквивалентна кубический шлиц Эрмита, используя данные , , и за .

Оценить на найдите индекс в последовательности, где , лежит между , и , то есть: . Рассчитать

тогда интерполированное значение

куда являются базисными функциями для кубический шлиц Эрмита.

Пример реализации

Следующее JavaScript реализация берет набор данных и создает монотонную функцию интерполяции кубического сплайна:

/ * Монотонная кубическая сплайн-интерполяция   Пример использования:var f = createInterpolant ([0, 1, 2, 3, 4], [0, 1, 4, 9, 16]);var message = '';for (var x = 0; x <= 4; x + = 0,5) {var xSquared = f (x);message + = x + 'в квадрате примерно' + xSquared + ' n';	}предупреждение (сообщение);*/вар createInterpolant = функция(хз, ys) {	вар я, длина = хз.длина;		// Решаем проблемы с длиной	если (длина != ys.длина) { бросать «Нужно равное количество xs и ys».; }	если (длина === 0) { возвращаться функция(Икс) { возвращаться 0; }; }	если (длина === 1) {		// Impl: предварительное вычисление результата предотвращает проблемы, если ys изменяется позже, и разрешает сборку мусора ys		// Impl: унарный плюс правильно конвертирует значения в числа		вар результат = +ys[0];		возвращаться функция(Икс) { возвращаться результат; };	}		// Переставляем xs и ys так, чтобы xs было отсортировано	вар индексы = [];	за (я = 0; я < длина; я++) { индексы.толкать(я); }	индексы.Сортировать(функция(а, б) { возвращаться хз[а] < хз[б] ? -1 : 1; });	вар oldXs = хз, oldYs = ys;	// Impl: создание новых массивов также предотвращает проблемы, если входные массивы будут изменены позже	хз = []; ys = [];	// Impl: унарный плюс правильно конвертирует значения в числа	за (я = 0; я < длина; я++) { хз.толкать(+oldXs[индексы[я]]); ys.толкать(+oldYs[индексы[я]]); }		// Получить последовательные перепады и уклоны	вар умирает = [], dxs = [], РС = [];	за (я = 0; я < длина - 1; я++) {		вар dx = хз[я + 1] - хз[я], dy = ys[я + 1] - ys[я];		dxs.толкать(dx); умирает.толкать(dy); РС.толкать(dy/dx);	}		// Получаем коэффициенты степени 1	вар c1s = [РС[0]];	за (я = 0; я < dxs.длина - 1; я++) {		вар м = РС[я], mСледующий = РС[я + 1];		если (м*mСледующий <= 0) {			c1s.толкать(0);		} еще {			вар dx_ = dxs[я], dxNext = dxs[я + 1], общий = dx_ + dxNext;			c1s.толкать(3*общий/((общий + dxNext)/м + (общий + dx_)/mСледующий));		}	}	c1s.толкать(РС[РС.длина - 1]);		// Получаем коэффициенты степени 2 и степени 3	вар c2s = [], c3s = [];	за (я = 0; я < c1s.длина - 1; я++) {		вар c1 = c1s[я], м_ = РС[я], invDx = 1/dxs[я], общий_ = c1 + c1s[я + 1] - м_ - м_;		c2s.толкать((м_ - c1 - общий_)*invDx); c3s.толкать(общий_*invDx*invDx);	}		// Возвращаем функцию интерполяции	возвращаться функция(Икс) {		// Самая правая точка в наборе данных должна давать точный результат		вар я = хз.длина - 1;		если (Икс == хз[я]) { возвращаться ys[я]; }				// Ищем интервал, в котором находится x, возвращая соответствующий y, если x является одним из исходных xs		вар низкий = 0, середина, высоко = c3s.длина - 1;		пока (низкий <= высоко) {			середина = Математика.этаж(0.5*(низкий + высоко));			вар xЗдесь = хз[середина];			если (xЗдесь < Икс) { низкий = середина + 1; }			еще если (xЗдесь > Икс) { высоко = середина - 1; }			еще { возвращаться ys[середина]; }		}		я = Математика.Максимум(0, высоко);				// Интерполировать		вар разница = Икс - хз[я], diffSq = разница*разница;		возвращаться ys[я] + c1s[я]*разница + c2s[я]*diffSq + c3s[я]*разница*diffSq;	};};

Рекомендации

  • Fritsch, F.N .; Карлсон, Р. Э. (1980). «Монотонная кусочно-кубическая интерполяция». Журнал SIAM по численному анализу. СИАМ. 17 (2): 238–246. Дои:10.1137/0717021.
  • Dougherty, R.L .; Эдельман, А .; Хайман, Дж. М. (апрель 1989 г.). «Кубическая и квинтическая интерполяция Эрмита с сохранением положительности, монотонности или выпуклости». Математика вычислений. 52 (186): 471–494. Дои:10.2307/2008477.

внешняя ссылка