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

Материал из 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(x1)(x2)(x+1)(y1)(y2)(y+1),
b2=14x(x+1)(x2)(y1)(y2)(y+1),
b3=14y(x1)(x2)(x+1)(y+1)(y2),
b4=14xy(x+1)(x2)(y+1)(y2),
b5=112x(x1)(x2)(y1)(y2)(y+1),
b6=112y(x1)(x2)(x+1)(y1)(y2),
b7=112xy(x1)(x2)(y+1)(y2),
b8=112xy(x+1)(x2)(y1)(y2),
b9=112x(x1)(x+1)(y1)(y2)(y+1),
b10=112y(x1)(x2)(x+1)(y1)(y+1),
b11=136xy(x1)(x2)(y1)(y2),
b12=112xy(x1)(x+1)(y+1)(y2),
b13=112xy(x+1)(x2)(y1)(y+1),
b14=136xy(x1)(x+1)(y1)(y2),
b15=136xy(x1)(x2)(y1)(y+1),
b16=136xy(x1)(x+1)(y1)(y+1),

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

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

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

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

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

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

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

f(1,0)=a00a10+a20a30f(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=[1111111111111111111100000000000011111111111111111111222244448888100010001000100010000000000000001000100010001000100020004000800011111111111111111111000000000000111111111111111111112222444488881248124812481248124800000000000012481248124812481248248164816328163264].

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

αT=136[0000036000000000001200018000360006000180003600018000000060001800018000600000012183660000000046122691831218366236169183121836669183000023616918369183236100001836180000000006126091890183618036309189018361809189000003630918909189036300000618186000000002662399361818613313993618186399300001331399339931331]γ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[0600236136301331].

Таким образом, для нахождения интерполированного значения 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]=B1[f(0)f(1)f(1)f(1)2f(2)f(0)2],

B=[1000111101000123],B1=[1000001033212211].

См. также

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

Литература