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

Материал из testwiki
Перейти к навигации Перейти к поиску
Результат бикубической интерполяции функции заданной в ячейке 4х4 [0,3]×[0,3]. Данную ячейку можно рассматривать как квадрат, состоящий из 9 единичных квадратов. Черными точками обозначены известные значения функции до интерполяции. Условным цветом обозначены интерполированные значения в каждой точке полученной функции.
Сравнение разных методов одномерной и двумерной интерполяций

Бикуби́ческая интерполя́ция — в вычислительной математике расширение кубической интерполяции на случай функции двух переменных, значения которой заданы на двумерной регулярной сетке. Поверхность, полученная в результате бикубической интерполяции, является гладкой функцией на границах соседних квадратов, в отличие от поверхностей, полученных в результате билинейной интерполяции или интерполяции методом ближайшего соседа.

Бикубическая интерполяция часто используется в обработке изображений, давая более качественную картинку по сравнению с билинейной интерполяцией. Также бикубическая интерполяция применяется в алгоритмах управления станков с ЧПУ для учёта неровностей плоскостей, например, при фрезеровке печатных плат.

Принцип метода

В случае бикубической интерполяции значение функции в искомой точке вычисляется через её значения в 16 соседних точках, расположенных в вершинах квадратов плоскости x,y.

При использовании приведённых ниже формул для программной реализации бикубической интерполяции следует помнить, что значения x и y являются относительными, а не абсолютными. Например, для точки с координатами (100.3,100.8) x=0.3,y=0.8. Для получения относительных значений координат необходимо округлить вещественные координаты вниз и вычесть полученные числа из вещественных координат.

f(y,x)=b1f(0,0)+b2f(0,1)+b3f(1,0)+b4f(1,1)+b5f(0,−1)+b6f(−1,0)+b7f(1,−1)+b8f(−1,1)+

+b9f(0,2)+b10f(2,0)+b11f(−1,−1)+b12f(1,2)+b13f(2,1)+b14f(−1,2)+b15f(2,−1)+b16f(2,2),

где

b1=14(x−1)(x−2)(x+1)(y−1)(y−2)(y+1),
b2=−14x(x+1)(x−2)(y−1)(y−2)(y+1),
b3=−14y(x−1)(x−2)(x+1)(y+1)(y−2),
b4=14xy(x+1)(x−2)(y+1)(y−2),
b5=−112x(x−1)(x−2)(y−1)(y−2)(y+1),
b6=−112y(x−1)(x−2)(x+1)(y−1)(y−2),
b7=112xy(x−1)(x−2)(y+1)(y−2),
b8=112xy(x+1)(x−2)(y−1)(y−2),
b9=112x(x−1)(x+1)(y−1)(y−2)(y+1),
b10=112y(x−1)(x−2)(x+1)(y−1)(y+1),
b11=136xy(x−1)(x−2)(y−1)(y−2),
b12=−112xy(x−1)(x+1)(y+1)(y−2),
b13=−112xy(x+1)(x−2)(y−1)(y+1),
b14=−136xy(x−1)(x+1)(y−1)(y−2),
b15=−136xy(x−1)(x−2)(y−1)(y+1),
b16=136xy(x−1)(x+1)(y−1)(y+1),

Подобным образом можно использовать и интерполяции более высокого порядка, вычисляя значения функции по соседним 4k2 точкам.

Результат билинейной интерполяции на тех же входных данных. Частные производные не являются непрерывными и терпят разрыв на границах квадратов 4х4.
Результат интерполяции методом ближайшего соседа на тех же входных данных.

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

Допустим, что необходимо интерполировать значение функции f(x,y) в точке P(x,y), лежащей внутри квадрата [0,1]×[0,1], и известно значение функции f в шестнадцати соседних точках (i,j),i=−1…2,j=−1…2.

Тогда общий вид функции, задающей интерполированную поверхность, может быть записан следующим образом:

p(x,y)=∑i=03∑j=03aijxiyj.

Для нахождения коэффициентов aij необходимо подставить в вышеприведённое уравнение значения функции в известных шестнадцати точках. Например:

f(−1,0)=a00−a10+a20−a30f(0,0)=a00f(1,0)=a00+a10+a20+a30f(2,0)=a00+2a10+4a20+8a30.

Полностью в матричном виде:

MαT=γT,

где

α=[a00a01a02a03a10a11a12a13a20a21a22a23a30a31a32a33],

γ=[f(−1,−1)f(0,−1)f(1,−1)f(2,−1)f(−1,0)f(0,0)f(1,0)f(2,0)f(−1,1)f(0,1)f(1,1)f(2,1)f(−1,2)f(0,2)f(1,2)f(2,2)],

M=[1−11−1−11−111−11−1−11−111−11−10000000000001−11−11−11−11−11−11−11−11−11−12−22−24−44−48−88−81000−10001000−10001000000000000000100010001000100010002000400080001111−1−1−1−11111−1−1−1−11111000000000000111111111111111111112222444488881248−1−2−4−81248−1−2−4−8124800000000000012481248124812481248248164816328163264].

Решая получившуюся систему линейных алгебраических уравнений, можно найти значения aij в явном виде:

αT=136[000003600000000000−12000−1800036000−600018000−36000180000000−600018000−180006000000−12−1836−60000000046−12269−183−12−1836−623−61−6−918−31218−366−6−918−3000023−61−6−918−369−183−2−36−1000018−3618000000000−612−60−918−9018−36180−36−309−1890−1836−1809−18900000−36−309−1890−918−903−6300000−618−186000000002−66−23−99−3−618−1861−33−1−39−936−1818−6−39−9300001−33−1−39−933−99−3−13−31]γT.

Единожды найденные коэффициенты aij теперь могут быть использованы для многократного вычисления интерполированного значения функции в произвольных точках квадрата [0,1]×[0,1].

Следует отметить, что такой способ обеспечивает непрерывность самой функции и её второй производной на границах смежных квадратов, но приводит к разрыву первых производных на границах ячеек 4×4. Для обеспечения непрерывности самой функции и её первой производной необходимо подставлять в исходное выражение значения функции и значения первых производных по направлениям x и y в вершинах центральной ячейки, производные рассчитываются через центральные разности. Для подстановки производных выражение должно быть продифференцировано соответствующим образом.

Последовательная кубическая интерполяция

Другая интерпретация метода заключается в том, что для нахождения интерполированного значения можно сначала произвести кубическую интерполяцию в одном направлении, а затем в другом.

Для функции f(x) с известными значениями f(−1), f(0), f(1), f(2) можно построить кубический сплайн: p(x)=∑i=03bixi, или в матричном виде:

p(x)=[1xx2x3][b0b1b2b3],

где

[b0b1b2b3]=A[f(−1)f(0)f(1)f(2)],

A=13[0600−2−36−13−630−13−31].

Таким образом, для нахождения интерполированного значения p(x,y) в квадрате [0,1]×[0,1] можно сначала рассчитать четыре значения p(x,−1), p(x,0), p(x,1), p(x,2) для зафиксированного x, затем через полученные четыре точки построить кубический сплайн, и этим завершить вычисление p(x,y):

p(x,y)=[1yy2y3]A([1xx2x3]A[f(−1,−1)f(0,−1)f(1,−1)f(2,−1)f(−1,0)f(0,0)f(1,0)f(2,0)f(−1,1)f(0,1)f(1,1)f(2,1)f(−1,2)f(0,2)f(1,2)f(2,2)])T=

=[1yy2y3]A[f(−1,−1)f(−1,0)f(−1,1)f(−1,2)f(0,−1)f(0,0)f(0,1)f(0,2)f(1,−1)f(1,0)f(1,1)f(1,2)f(2,−1)f(2,0)f(2,1)f(2,2)]AT[1xx2x3].

Следует отметить, что такой подход обеспечивает непрерывность самой функции и её вторых производных на границе ячеек, но не обеспечивает непрерывности первой производной. Для обеспечения непрерывности первой производной необходимо подставлять значения функции и её первых производных на границе центральной ячейки. Тогда коэффициенты сплайна будут иметь вид:

[b0b1b2b3]=B−1[f(0)f(1)f(1)−f(−1)2f(2)−f(0)2],

B=[1000111101000123],B−1=[10000010−33−2−12−211].

См. также

Шаблон:Нет источников

Литература