Тулбокс поддерживает векторные сплайны. Например, если вы хотите сплайн через заданные плоские точки, то следующий код задает некоторые данные, а затем создает и строит графики такой сплайн, используя параметризацию длины хорды и кубическую сплайн с граничным условием не узла.
x=[19 43 62 88 114 120 130 129 113 76 135 182 232 298 ... 348 386 420 456 471 485 463 444 414 348 275 192 106 ... 30 48 83 107 110 109 92 66 45 23 22 30 40 55 55 52 34 20 16]; y=[306 272 240 215 218 237 275 310 368 424 425 427 428 ... 397 353 302 259 200 148 105 77 47 28 17 10 12 23 41 43 ... 77 96 133 155 164 157 148 142 162 181 187 192 202 217 245 266 303]; xy = [x;y]; df = diff(xy,1,2); t = cumsum([0, sqrt([1 1]*(df.*df))]); cv = csapi(t,xy); fnplt(cv), hold on, plot(x,y,'o'), hold off
Если затем необходимо знать площадь, заключенную в эту кривую, необходимо вычислить интеграл с точкой на кривой, соответствующей значению параметров. Для сплайн в cv только что построенный, это может быть сделано точно в одной (несколько сложной) команде:
area = diff(fnval(fnint( ... fncmb(fncmb(cv,[0 1]),'*',fnder(fncmb(cv,[1 0]))) ... ),fnbrk(cv,'interval')));
Чтобы объяснить, y=fncmb(cv,[0 1])
выбирает второй компонент кривой в cv
, Dx=fnder(fncmb(cv,[1 0]))
предоставляет производную первого компонента, и yDx=fncmb(y,'*',Dx)
создает их точечный продукт. Затем IyDx=fnint(yDx)
создает неопределенный интеграл yDx
и, наконец, diff(fnval(IyDx,fnbrk(cv,'interval')))
оценивает этот неопределенный интеграл в конечных точках базового интервала и затем принимает различие второго от первого значения, получая таким образом определенный интеграл yDx
по своему основному интервалу. В зависимости от того, находится ли замкнутая область справа или слева, когда точка кривой перемещается с параметром увеличения, полученное число является либо положительным, либо отрицательным.
Далее все значения Y
(при наличии) для которого точка (X,Y)
лежит на сплайн в cv
только что построенный может быть получен по следующей (несколько сложной) команде:
X=250; %Define a value of X Y = fnval(fncmb(cv,[0 1]), ... mean(fnzeros(fncmb(fncmb(cv,[1 0]),'-',X))))
Чтобы объяснить: x = fncmb(cv,[1 0])
выбирает первый компонент кривой в cv
; xmX = fncmb(x,'-',X)
переводит этот компонент по X
; t = mean(fnzeros(xmX))
предоставляет все значения параметров, для которых xmX is
нуль, т.е., для которого первый компонент кривой равен X
; y = fncmb(cv,[0,1])
выбирает второй компонент кривой в cv
; и, наконец, Y = fnval(y,t)
оценивает этот второй компонент в тех сайтах параметров, в которых первый компонент кривой в cv
равен X
.
В качестве другого примера использования векторных функций предположим, что вы решили уравнения движения частицы в некотором заданном силовом поле в плоскости, получение в дискретное время положения, а также скорости, сохраненной в 4-векторе, как если бы, стандартным способом, вы решили эквивалентную систему первого порядка численно. Затем следующий оператор, которое использует кубическую интерполяцию Гермита, даст график пути частицы: fnplt(spapi(augknt(t,4,2),t,reshape(z,2,2*n))).