spapi

Интерполяция сплайна

Синтаксис

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, чтобы не уменьшиться, это означает, что мы должны иметь

узлы(j)<x(j)<узлы(j+k), все j

(с равенством, возможным в knots (1) и knots (end)). В многомерном случае эти условия должны содержать в каждой переменной отдельно.

Алгоритмы

К spcol обращаются с просьбой обеспечить, матрица словосочетания "почти блокируют диагональ" (Bj, k (x)) (с повторениями в производных обозначения x, как описано выше), и slvblk решает линейную систему (*), с помощью QR-факторизации блока.

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

Смотрите также

| | |

Для просмотра документации необходимо авторизоваться на сайте