Установите кривую в MATLAB, где точки имеют указанные нормали

У меня есть две 2D-точки p1, p2 в MATLAB, и каждая точка имеет нормальный n1, n2. Я хочу найти (кубический) многочлен, который соединяет две точки и согласуется с указанными нормалями на каждом конце. Есть ли что-то встроенное в MATLAB для этого?

Конечно, я мог бы вывести уравнения для полинома вручную, но набор инструментов подбора кривой MATLAB имеет так много встроенного, что я предположил, что это возможно. Мне не удалось найти никаких примеров подгонки кривой, сплайна или полинома, где указаны нормали.

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


person Bill Cheatham    schedule 01.04.2014    source источник


Ответы (2)


1. Если ваши точки являются точками функции, вам понадобится кубический сплайн Эрмита. интерполяция:

В численном анализе кубический сплайн Эрмита или кубический интерполятор Эрмита - это сплайн, где каждая часть представляет собой полином третьей степени, заданный в форме Эрмита, то есть своими значениями и первыми производными в конечных точках соответствующего интервала области.

Кубические сплайны Эрмита обычно используются для интерполяции числовых данных, указанных при заданных значениях аргумента x (1), x (2), ..., x (n), чтобы получить гладкую непрерывную функцию. Данные должны состоять из желаемого значения функции и производной для каждого x (k). (Если указаны только значения, производные должны оцениваться по ним.) Формула Эрмита применяется к каждому интервалу (x (k), x (k + 1)) отдельно. Результирующий сплайн будет непрерывным и будет иметь непрерывную первую производную.

Кубические полиномиальные сплайны могут быть заданы другими способами, форма Безье является наиболее распространенной. Однако эти два метода обеспечивают одинаковый набор сплайнов, и данные можно легко преобразовать между формами Безье и Эрмита; поэтому имена часто используются как синонимы.

Указание нормалей в каждой точке аналогично указанию касательных (наклонов, 1-й производной), потому что последние перпендикулярны первому.

В Matlab функция для вычисления кусочно-кубического интерполяционного полинома Эрмита - это _1 _. Единственная проблема в том, что pchip слишком умен:

Внимательный читатель заметит, что pchip принимает в качестве входных данных значения функций, но не производные значения. Это связано с тем, что pchip использует значения функции f (x) для оценки производных значений. [...] Чтобы сделать хорошее приближение производной, функция должна использовать приближение с использованием 4 или более точек [...] К счастью, с помощью Matlab мы можем написать наши собственные функции для интерполяции с использованием реальных кубических сплайнов Эрмита.

... автор показывает, как это сделать, используя функцию _3 _.

2. Если ваши точки не обязательно являются точками функции, то каждый интервал следует интерполировать с помощью квадратичная кривая Безье:

введите описание изображения здесь

В этом примере даны 3 точки: конечные точки P (0) и P (2), а также P (1), которая является пересечением касательных в конечных точках. Положение P (1) может быть легко вычислено по координатам P (0) и P (2) и нормалей в этих точках.

В Matlab вы можете использовать spmak, см. Примеры здесь и здесь.

person kol    schedule 01.04.2014

Вы можете сделать что-то вроде этого:

function neumann_spline(p, m, q, n)

% example data
p = [0; 1];
q = [2; 5];
m = [0; 1];
n = [1; 1];

if (m(2) ~= 0)
    s1 = atan(-m(1)/m(2));
else
    s1 = pi/2;
end

if (n(2) ~= 0)
    s2 = atan(-n(1)/n(2));
else
    s2 = pi/2;
end

hold on
grid on
axis equal

plot([p(1) p(1)+0.5*m(1)], [p(2) p(2)+0.5*m(2)], 'r', 'Linewidth', 1)
plot([q(1) q(1)+0.5*n(1)], [q(2) q(2)+0.5*n(2)], 'r', 'Linewidth', 1)

sp = csape([p(1) q(1)], [s1 p(2) q(2) s2], [1 1]);
fnplt(sp)

plot(p(1), p(2), 'k.', 'MarkerSize', 16)
plot(q(1), q(2), 'k.', 'MarkerSize', 16)

title('Cubic spline with prescribed normals at the endpoints')

end

Результат

введите описание изображения здесь

person Drake    schedule 01.04.2014