Интерполяция сплайна
spline = spapi(knots,x,y)
spapi(k,x,y)
spapi({knork1,...,knorkm},{x1,...,xm},y)
spapi(...,'noderiv')
spline = spapi(knots,x,y)
возвращает сплайн f (если таковые имеются) порядка
k = length(knots) - length(x)
с последовательностью узла knots
, для который
(*) f(x(j)) = y(:,j), all j.
Если некоторые записи x
являются тем же самым, то это взято в оскуляторном смысле, т.е. в том смысле, что Dm (j) f (x (j)) = y (: j), с m(j)
: = # {i <j: x(i)
= x(j)
}, и Dmf m th производная f. Таким образом r - повторение сгиба сайта z в x
соответствует предписанию значения и первого r – 1 производная f в z. Если вы не хотите это, вызовите spapi
с дополнительным (четвертым) аргументом, в этом случае, на каждом сайте данных, среднее значение всех значений данных с тем же сайтом данных является соответствующим.
Значения данных, y(:,j)
, могут быть скалярами, векторами, матрицами, или даже массивами ND.
spapi(k,x,y)
, с k
положительное целое число, просто задает желаемый порядок сплайна, k
, в этом случае aptknt
используется, чтобы решить, что осуществимое (хотя не обязательно оптимальный) связывает последовательность узлом для данных сайтов x
. Другими словами, команда spapi(k,x,y)
имеет тот же эффект как более явная команда spapi(aptknt(x,k),x,y)
.
spapi({knork1,...,knorkm},{x1,...,xm},y)
возвращает B-форму сплайна продукта тензора interpolant к данным с координатной сеткой. Здесь, каждый knorki
является или последовательностью узла или иначе является положительным целым числом, задающим полиномиальный порядок, который будет использоваться в i
th переменная, таким образом предоставляя право spapi
обеспечить соответствующую последовательность узла для i
th переменная. Далее, y
должен быть (r+m
) -
размерный массив с y(:,i1,...,im)
данная величина, которая будет адаптирована в [x{1}(i1),...,x{m}(im)]
site
, всем i1
..., im
, если сплайн не должен быть со скалярным знаком, в этом случае, в отличие от одномерного случая, y
разрешают быть m
- размерный массив.
spapi(...,'noderiv')
с вектором символов 'noderiv'
как четвертый аргумент, имеет тот же эффект как spapi(...)
за исключением того, что значения данных, совместно использующие тот же сайт, интерпретированы по-другому. С существующим четвертым аргументом среднее значение значений данных с тем же сайтом данных интерполировано на таком сайте. Без него значения данных с тем же сайтом данных интерпретированы как значения последовательных производных, которые будут соответствующими на таком сайте, как описано выше, в первом абзаце этого Описания.
spapi([0 0 0 0 1 2 2 2 2],[0 1 1 1 2],[2 0 1 2 -1])
производит уникальный кубический сплайн f на интервале [0.. 2] точно с одним внутренним узлом, в 1, который удовлетворяет эти пять условий
f (0 +) = 2, f (1) = 0, Df (1) = 1, D 2f (1) = 2, f (2–) = –1
Они включают 3-кратное соответствие в 1, т.е. соответствие там к заданным значениям функции и ее первых двух производных.
Здесь пример оскуляторной интерполяции, к значениям y
и клонится s
на сайтах x
сплайном quintic:
sp = spapi(augknt(x,6,2),[x,x,min(x),max(x)],[y,s,ddy0,ddy1]);
с ddy0
и значениями ddy1
для второй производной в конечных точках.
Как связанный пример, если функциональный sin(x)
должен быть интерполирован на отличных сайтах данных, x
кубическим сплайном и его наклон должны также быть соответствующими в подпоследовательности x(s)
, то это может быть выполнено командой
sp = spapi(4,[x x(s)], [sin(x) cos(x(s))]);
в котором подходящая последовательность узла предоставляется при помощи aptknt
. На самом деле, если вы хотели интерполировать те же данные сплайнами quintic, просто изменить 4
на 6
.
Как двумерный пример, вот двумерный interpolant.
x = -2:.5:2; y = -1:.25:1; [xx, yy] = ndgrid(x,y); z = exp(-(xx.^2+yy.^2)); sp = spapi({3,4},{x,y},z); fnplt(sp)
Как рисунок оскуляторной интерполяции к данным с координатной сеткой, вот полная бикубическая интерполяция, с данными, явным образом выведенными от bicubic полиномиального g (u, v) = u 3v3, чтобы дать возможность для вас видеть точно, куда наклоны и наклоны наклонов (т.е. перекрестные производные) должны быть помещены в предоставленные значения данных. Поскольку наш g является bicubic полиномом, его interpolant, f, должен быть сам g. Мы тестируем это.
sites = {[0,1],[0,2]}; coefs = zeros(4,4); coefs(1,1) = 1; g = ppmak(sites,coefs); Dxg = fnval(fnder(g,[1,0]),sites); Dyg = fnval(fnder(g,[0,1]),sites); Dxyg = fnval(fnder(g,[1,1]),sites); f = spapi({4,4}, {sites{1}([1,2,1,2]),sites{2}([1,2,1,2])}, ... [fnval(g,sites), Dyg ; ... Dxg.' , Dxyg]); if any( squeeze( fnbrk(fn2fm(f,'pp'), 'c') ) - coefs ) 'something went wrong', end
Данные (одномерные) узлы и сайты должны удовлетворить условия Шенберга-Уитни для interpolant, который будет задан. Принимая последовательность сайта x
, чтобы не уменьшиться, это означает, что мы должны иметь
(с равенством, возможным в knots
(1) и knots
(end
)). В многомерном случае эти условия должны содержать в каждой переменной отдельно.
К spcol
обращаются с просьбой обеспечить, матрица словосочетания "почти блокируют диагональ" (Bj, k (x)) (с повторениями в производных обозначения x
, как описано выше), и slvblk
решает линейную систему (*), с помощью QR-факторизации блока.
Данные с координатной сеткой адаптированы, способом продукта тензора, одна переменная за один раз, использовав в своих интересах то, что одномерная подгонка сплайна зависит линейно от адаптируемых значений.