Линеарна интерполација

У програмском језику Octave имплементиране су многе функције за интерполацију. Неке од њих ћемо разматрати у овој секцији.

Најједноставнији вид интерполације је да вредност функције у некој тачки апроксимирамо само на основу вредности функције у њеним најближим суседима. Можемо јој доделити вредност најближег мањег од њега, вредност најближег већег од њега, вредност ближег од та два или линеарну интерполацију њихових вредности. Ако су тачки x најближе тачке xa и xb, и вредности функције у тим тачкама су редом ya, yb, тада вредност у тачки x методом линеарне интерполацијњ рачунамо на следећи начин:

formla linearne interpolacije

Наведене типове интерполације у програмском језику Octave можемо вршити коришћењем функције interp1 која за аргументе редом узима низ тачака, низ вредности функције у одговарајућим тачкама и низ тачака у којима желимо да одредимо вредност функције. Подразумеван је метод линеарне интерполације. Уколико желимо да користимо методу најближег суседа, то можемо урадити додавањем одговарајућег аргумента: "previous", "next" или "nearest". Коришње поемнуте функције можемо видети на примеру:

>> x = [-5:1:5];
>> y = x.^3 - 4*x.^2 + x;
>> plot(x,y,"o","markersize",10); hold on;
>> xi = [-5:0.2:5];
>> yi = interp1(x,y,xi);
>> plot(xi,yi,"+", "color",[1 0.5 0]);
>> yn = interp1(x,y,xi,"nearest");
>> plot(xi,yn,"x", "color","red");

linearna interpolacijanajblizi sused
  

Наведени начини раде брзо, али добијена функција не мора бити глатка. Функцијом interp1 можемо добити и кубни сплајн који има гладак први и други извод навођењем аргумента "spline", као и део-по-део кубни Ермитеов интерполациони полином (piecewise cubic Hermite interpolating polynomial) који има гладак први извод навођењем аргумента "pchip". Информације о добијеном "део-по-део" полиному добијамо навођењем додатног аргумета "pp" (piecewise polynom), и њега можемо евалуирати коришћењем функције ppval као у примеру:

>> pp = interp1(x,y,"pp","spline")
pp =

  scalar structure containing the fields:

    form = pp
    breaks =

      -5  -4  -3  -2  -1   0   1   2   3   4   5

    coefs =

          1.00000   -19.00000   116.00000  -230.00000
          1.00000   -16.00000    81.00000  -132.00000
          1.00000   -13.00000    52.00000   -66.00000
          1.00000   -10.00000    29.00000   -26.00000
          1.00000    -7.00000    12.00000    -6.00000
          1.00000    -4.00000     1.00000     0.00000
          1.00000    -1.00000    -4.00000    -2.00000
          1.00000     2.00000    -3.00000    -6.00000
          1.00000     5.00000     4.00000    -6.00000
          1.00000     8.00000    17.00000     4.00000

    pieces =  10
    order =  4
    dim =  1
    orient = first
  
>> xpp = [-4.67 -1.2 -3.26 -4.2 4.31 1.52 3.78 -1.57];
>> ypp = ppval(pp,xpp);  
>> plot(x,y,"o","markersize",10);
>> plot(xpp,ypp,"x","color","red");

  ppval

Интерполациони полиномом

Уколико функцију желимо да апроксимирамо полиномом, то можемо учинити коришћењем функције polyfit. Повратна вредност биће коефицијенти полинома датог степена који има минималнну средњеквадратну грешку за дате податке.

Део-по-део полином добијамо функцијом splinefit навођењем броја еквидистантних прекида или експлицитно задатог низа прекида и жељеног степена (подразумевано је у питању кубни слпајн) као у примеру:

>> x = 2 * pi * rand (1, 200);
>> y = sin (x) + sin (2 * x) + 0.2 * randn (size (x));
>> breaks = linspace (0, 2 * pi, 41); 
>> pp1 = splinefit (x, y, breaks);
>> pp2 = splinefit (x, y, 10); 
>> xx = linspace (0, 2 * pi, 400);
>> y1 = ppval (pp1, xx);
>> y2 = ppval (pp2, xx);
>> plot (x, y, ".", xx, [y1; y2])
>> legend ({"stvarni podaci", "splajn, 40 delova", "splajn, 10 delova"})
  
splinefit 

Сплајн степена k је k-1 пута непрекидно диференцијабилан. Разлику између сплајнова различитих степена видимо на примеру:

>> x = 2 * pi * rand (1, 200);
>> y = sin (x) + sin (2 * x) + 0.1 * randn (size (x));
>> pp1 = splinefit (x, y, 8, "order", 0);
>> pp2 = splinefit (x, y, 8, "order", 1);
>> pp3 = splinefit (x, y, 8, "order", 2);
>> pp4 = splinefit (x, y, 8, "order", 3);
>> pp5 = splinefit (x, y, 8, "order", 4);
>> xx = linspace (0, 2 * pi, 400);
>> y1 = ppval (pp1, xx);
>> y2 = ppval (pp2, xx);
>> y3 = ppval (pp3, xx);
>> y4 = ppval (pp4, xx);
>> y5 = ppval (pp5, xx);
>> plot (x, y, ".", xx, [y1; y2; y3; y4; y5])
>> legend ({"uzorak", "konstantni splajn", "linearni splajn", "kvadratni splajn", "kubni splajn", "kvarternarni splajn"})
ppval