Главная       Скачать       Коммерческая поддержка       FAQ       Forum       О нас       Английская версия

Двухмерная сплайн-интерполяция

This article is outdated due to the last updates in the ALGLIB package.
It will be rewritten soon. Till then you may find information you need in the reference manual.

Двухмерная интерполяция имеет ряд особенностей, отличающих её от одномерного случая. Главной такой особенностью является то, что подавляющее большинство алгоритмов двухмерной интерполяции может быть применено только на наборе точек специального вида - на прямоугольной сетке, ориентированной по осям координат. Именно на такой сетке могут быть построены два наиболее важных типа интерполирующих функций: билинейный сплайн и бикубический сплайн.

Билинейный сплайн

Билинейная функция - это функция двух аргументов t и u, которая при фиксированном значении t линейна по u и наоборот. Билинейный сплайн является двухмерным обобщением одномерного линейного сплайна и имеет те же достоинства и недостатки. Он составляется из билинейных функций, определенных на каждой ячейке сетки так, что в узлах сетки они принимают предписанные значения. Этот способ интерполяции хорош своей простотой и быстродействием. Основной недостаток - разрывность производной интерполирующей функции на границах ячеек сетки. Также можно отметить сравнительно невысокую точность такой интерполяционной схемы.

Для построения билинейного сплайна служит подпрограмма BuildBilinearSpline. Результатом работы подпрограммы является таблица коэффициентов, которая передается в подпрограмму SplineInterpolation2D. Алгоритм построения таблицы коэффициентов в этой статье не рассмотрен, однако он неплохо описан в Numerical Recipes[1] и в Википедии[2].

Бикубический сплайн

В ряде случаев оказывается недостаточно точности, которую обеспечивают билинейные сплайны. Разрывность производной также часто оказывается мешающим фактором. В таким случаях можно применить бикубический сплайн, который гарантирует непрерывность первых производных dS/dX и dS/dY, а также непрерывность смешанной производной d 2S/dXdY.

Здесь можно проследить аналогию с одномерными сплайнами, однако есть и различия. Кубический сплайн гарантирует непрерывность первой и второй производных функции. Бикубический сплайн гарантирует непрерывность только градиента и смешанной производной, а непрерывность вторых производных (т.е. d 2S/dX 2 и d 2S/dY 2) не гарантируется.

Для построения бикубического сплайна требуются значения функции в узлах сетки, а также значения её градиента и смешанной производной. Если у нас есть эта информация, то мы можем сразу приступить к вычислению коэффициентов сплайна. Однако обычно мы имеем только значения функции, а значения градиента и смешанной производной требуется вычислять самостоятельно на их основе (например, используя разностные схемы). В этом модуле реализован следующий подход. Сначала на основе таблицы значений функции на сетке строится последовательность одномерных кубических сплайнов, интерполирующих функцию по переменным x и y. Затем одномерные сплайны дифференцируются, после чего мы получаем требуемые нам градиент и смешанную производную. После этого коэффициенты бикубической функции легко рассчитываются на основе полученных данных (более подробно алгоритм рассмотрен в Numerical Recipes[1], также можно опять обратиться к Википедии[3]).

Построение бикубического сплайна осуществляется подпрограммой BuildBicubicSpline. Результатом работы подпрограммы является таблица коэффициентов, которая передается в подпрограмму SplineInterpolation2D (эта подпрограмма может применятсья как для вычисления значения билинейных сплайнов, так и для вычисления значения бикубических сплайнов).

Прочие операции со сплайнами

Помимо вычисления значения сплайна в заданной точке этот модуль поддерживает и другие операции со сплайнами. Каждая из описанных ниже подпрограмм принимает таблитцу коэффициентов, построенную подпрограммой BuildBilinearSpline или подпрограммой BuildBicubicSpline.

Подпрограмма SplineDifferentiation2D осуществляет дифференцирование сплайна: вычисление первых производных dS/dX и dS/dY, а также смешанной производной d 2S/dXdY. Для создания копии таблицы коэффициентов может быть использована подпрограмма Spline2DCopy. Для "распаковки" сплайна, т.е. получения его коэффициентов в удобной для практического применения форме, служит подпрограмма SplineUnpack2D. Линейное преобразование аргументов сплайна осуществляется подпрограммой Spline2DLinTransXY. Линейное преобразование сплайна осуществляется при помощи подпрограммы Spline2DLinTransF.

Билинейное и бикубическое ресемплирование

Ещё одной задачей, которая решается в этом модуле, является ресемплирование. Ресемплирование - это задача, которая возникает, если у нас есть значения функции на регулярной сетке размером M·N узлов, и нам требуется перейти от этой сетки к сетке размером M·N узлов, покрывающей ту же область, и вычислить значения функции на новой сетке. При этом новая сетка может быть как более, так и менее плотная, чем старая.

Ресемплирование - это получение по известным значениям в одних точках значений функции в других точках, т.е. задача интерполяции. Но данный случай является особым - нам требуется вычислять значение функции не в произвольных точках, а в узлах сетки, и вычисления проводятся только один раз, после чего мы получаем новую сетку и больше не возвращаемся к ресурсоемкой интерполяции. Поэтому для решения данной задачи имеет смысл разработать специализированную процедуру.

Как двухмерный сплайн может быть билинейным или бикубическим, так и ресемплирование делится на билинейное и бикубическое. Первое осуществляется подпрограммой BilinearResampleCartesian, второе - подпрограммой BicubicResampleCartesian.

Ссылки по теме

  1. '3.6 Interpolation in Two or More Dimensions', Numerical Recipes in C, Second Edition (1992)
  2. 'Bilinear interpolation', Wikipedia
  3. 'Bicubic interpolation', Wikipedia

Manual entries

C++ spline2d subpackage   
C# spline2d subpackage   

This article is intended for personal use only.

Скачать ALGLIB

C#

Исходный код на C#

Downloads page

 

C++

Исходный код на C++

Downloads page

 

C++, арифметика высокой точности

Исходный код на C++, использующий библиотеки MPFR/GMP.

Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.

Downloads page

 

FreePascal

Исходный код на Free Pascal.

Downloads page

 

Delphi

Исходный код на Delphi.

Downloads page

 

VB.NET

Исходный код на VB.NET.

Downloads page

 

VBA

Исходный код на VBA.

Downloads page

 

Python

Исходный код на Python (CPython и IronPython).

Downloads page

 

 

ALGLIB® - numerical analysis library, 1999-2017.
ALGLIB is registered trademark of the ALGLIB Project.