exponenta event banner

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) данная величина, которая будет адаптирована в site [x{1}(i1),...,x{m}(im)], весь 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конец)). В многомерном случае эти условия должны содержать в каждой переменной отдельно.

Алгоритмы

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

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

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

| | |