![]() |
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.
Ещё одной задачей, которая решается в этом модуле, является ресемплирование. Ресемплирование - это задача, которая возникает, если у нас есть значения функции на регулярной сетке размером M1 ·N1 узлов, и нам требуется перейти от этой сетки к сетке размером M2 ·N2 узлов, покрывающей ту же область, и вычислить значения функции на новой сетке. При этом новая сетка может быть как более, так и менее плотная, чем старая.
Ресемплирование - это получение по известным значениям в одних точках значений функции в других точках, т.е. задача интерполяции. Но данный случай является особым - нам требуется вычислять значение функции не в произвольных точках, а в узлах сетки, и вычисления проводятся только один раз, после чего мы получаем новую сетку и больше не возвращаемся к ресурсоемкой интерполяции. Поэтому для решения данной задачи имеет смысл разработать специализированную процедуру.
Как двухмерный сплайн может быть билинейным или бикубическим, так и ресемплирование делится на билинейное и бикубическое. Первое осуществляется подпрограммой BilinearResampleCartesian, второе - подпрограммой BicubicResampleCartesian.
| C++ | spline2d subpackage | |
| C# | spline2d subpackage |
This article is intended for personal use only.
Исходный код на C#
Исходный код на C++
Исходный код на C++, использующий библиотеки MPFR/GMP.
Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.
Исходный код на Free Pascal.
Исходный код на Delphi.
Исходный код на VB.NET.
Исходный код на VBA.
Исходный код на Python (CPython и IronPython).
|
ALGLIB® - numerical analysis library, 1999-2012. |