Нахождение длины кубического B-сплайна - PullRequest
7 голосов
/ 02 февраля 2010

Используя функцию interpolate.splprep Сципи, получить параметрический сплайн по параметру u, но область u не является линейным интегралом сплайна, это кусочно-линейное соединение входных координат. Я пробовал integrate.splint, но это только дает отдельные интегралы по u. Очевидно, что я могу численно интегрировать кучу декартовых дифференциальных расстояний, но мне было интересно, существует ли метод замкнутой формы для получения длины сплайна или сплайн-сегмента (используя scipy или numpy), который я пропускаю.

Редактировать: Я ищу решение в закрытой форме или очень быстрый способ приблизиться к ответу с машинной точностью. Я почти отказался от численных методов поиска корней, и теперь я в основном после закрытого ответа. Если у кого-то есть опыт интеграции эллиптических функций или он может указать мне хороший ресурс (кроме Вольфрама), это было бы здорово.

Я собираюсь попробовать Maxima, чтобы попытаться получить неопределенный интеграл от функции, которая, на мой взгляд, является функцией для одного сегмента сплайна: я сделал кросс-пост на MathOverflow

Ответы [ 2 ]

6 голосов
/ 02 февраля 2010

Поскольку оба x & y являются кубическими параметрическими функциями, не существует закрытого решения с точки зрения простых функций. Численная интеграция - путь. Либо интеграция выражения длины дуги, либо простое добавление длины отрезка линии - зависит от точности, к которой вы стремитесь, и того, сколько усилий вы хотите приложить.

Точный и быстрый метод "Добавление длины отрезков":

Использование рекурсивного подразделения (форма алгоритма де Кастельо) для генерации точек может дать вам очень точное представление с минимальным количеством точек. Подразделять только подразделения, если они не соответствуют критериям. Обычно критерии основаны на длине, соединяющей контрольные точки (корпус или клетка). Для кубического, обычно сравнивая близость P0P1 + P1P2 + P2P3 к P0P3, где P0, P1, P2 & P3 - контрольные точки, которые определяют ваш Безье.

Вы можете найти код Delphi здесь: текст ссылки

Конвертировать в Python должно быть относительно легко. Это будет генерировать очки. Код уже рассчитывает длину сегментов для проверки критериев. Вы можете просто накапливать эти значения длины по пути.

4 голосов
/ 02 февраля 2010

Вы можете интегрировать функцию sqrt(x'(u)**2+y'(u)**2) через u, где вы вычисляете производные x' и y' ваших координат с помощью scipy.interpolate.splev . Интеграция может быть выполнена с помощью одной из подпрограмм из scipy.integrate (quad является точным [Кленшоу-Кертис], romberg обычно быстрее). Это должно быть более точным и, вероятно, быстрее, чем сложение множества небольших расстояний (что эквивалентно интеграции с правилом прямоугольника).

...