exponenta event banner

Векторные функции

Панель инструментов поддерживает векторные сплайны. Например, если требуется создать сплайновую кривую через заданные плоские точки, то следующий код определяет некоторые данные, а затем создает и строит график такой сплайновой кривой, используя параметризацию длины хорды и кубическую интерполяцию сплайна с условием конца «не а-узел».

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))).