2009-05-19 8 views
3

У меня есть хороший кубический сплайн-код, но он предназначен только для интерполяции. Мне нужно extrapolate немного в будущее. Кто-нибудь знает хороший источник кода, а не библиотеку, для этого?Экстраполяция кубических сплайнов

This is the code Я написал в базовом (теперь ASM) для интерполяции.

ответ

1

Вам действительно нужно немного расширить этот вопрос. Кроме того, «кубический сплайн» - очень широкий термин.

Если вас интересуют сплайны, я могу сердечно рекомендовать Карлу де Борусу «Практическое руководство по сплайнам». Однако он немного ориентирован на математику, но содержит примеры кода (их можно загрузить с домашней страницы автора). Googling и wiki для «кубического сплайна» могут привнести некоторые примеры, может быть, даже в конкретных языках - еще одна вещь, чтобы добавить к вопросу (если вы ищете код).

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

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

Кроме того, не могли бы вы объяснить, что именно вы пытаетесь сделать? Какие данные? Что-нибудь ?


Edit1: Вот, попробуйте следующее: Вы можете найти что-то полезное здесь - link

+0

MATLAB - это библиотека, которая ищет код, как уже упоминалось. У меня есть ряд точек данных, создающих кривую. Мне нужно немного расширить кривую. Это не сложнее, чем это. –

+0

Ну, просто возьмите последнюю кривую 3-го порядка, которую вы получили, и вычислите нужные значения. Если вы его доработали, у вас уже есть коэффициенты. – Rook

+0

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

1

Обычно для сплайн-интерполяции вы используете переменную т интерполировать над линией. До тех пор, пока 0 < = t < = 1, вы интерполируете. Однако, когда t < 0 или t> 1, вы просто экстраполируете сплайн.

+0

да это правильно. Мне нужно datapoints для t> 1 в этом примере (но только слегка> t –

+1

Просто оцените формулу сплайна с t> 1, для небольшого t вы должны быть в порядке. –

6

Для этого вам не нужен новый код.

Чтобы экстраполировать сплайн, вы можете экстраполировать параметры первого и последнего сплайнов.

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

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

+0

> Вы можете получить эти две точки, линейно интерполируя между первой/последней двумя точками. Это поражает цель упражнения. Я хочу расширить на основе CURVE, созданного сплайном. –

+0

Как я уже сказал, это будет менее оптимальный запас, если ваш существующий код/​​библиотека не позволит вам экстраполировать (т. Е. Использовать параметр < 0 or > 1) –

0

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

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

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

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

+0

> вам не следует использовать сплайны. Почему нет? Уже рассчитан полином третьего порядка. Мне просто нужно использовать «кривизну» и слегка вытянуть вперед. Я изучу многочлен Лагранжа –

2

Для простоты я буду представлять собой кубическую кривую Безье как 4 точки (А, В, С, D), где А и D являются конечными точками кривой, и В и С являются «контрольные точки управления». (Фактическая кривая обычно не касание контрольных точек управления).

См. "Don Lancaster's Guru's Lair Cubic Spline Library" о способах преобразования этого представления кубической кривой Безье в другие популярные изображения.

интерполяции

Учитывая один кубической кривой Безье (Р0, Р1, Р2, Р3), мы используем De Casteljau's algorithm рубить кривую Безье в левой половины и правой половины. Это супер-легкий даже на микроконтроллер, который не имеет «умножать» инструкцию, , поскольку она требует только вычисления несколько средних, пока мы не получим среднюю точку:

P0 
    F0 := average(P0, P1) 
P1      S0 := average(F0, F1) 
    F1 := average(P1, P2)   Midpoint := average(S0, S1) 
P2      S1 := average(F1, F2) 
    F2 := average(P2, P3) 
P3 

Вся кривая Безье (P0 , P1, P2, P3).

Левая половина всей кривой Безье представляет собой кривую Безье (P0, F0, S0, M).

Правая половина всей кривой Безье представляет собой кривую Безье (M, S1, F2, P3).

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

Но мы хотим пойти в другую сторону - экстраполировать на большую кривую.

экстраполяция

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

Представим себе, что мы забыли исходные точки P1, P2, P3.

Учитывая левую половину кривой Безье (P0, F0, S0, M), мы можем экстраполировать вправо с:

S1 := M + (M - S0) 
F1 := S0 + (S0 - F0) 
P1 := F0 + (F0 - P0) 

затем использовать эти значения для расчета

F2 := S1 + (S1 - F1) 
P2 := F1 + (F1 - P1) 

и, наконец,

P3 := F2 + (F2 - P2) 

экстраполировать и восстановить экстраполировать кривую Bazier (P0, P1, P2, P3).

детали

Экстраполированное кривая (Р0, Р1, Р2, Р3) проходит через каждую точку в исходной кривой (Р0, Р0, S0, М) - в частности, начиная с P0 и проходящей через середину M - и продолжает движение до достижения P3.

Мы всегда можем экстраполировать от любых 4 точек (P0, F0, S0, M), ли эти 4 балла были изначально рассчитаны в левой половине (или правой половине) некоторое увеличение Безье сплайна.

Я уверен, что вы уже знаете об этом, но просто для ясности:

Midpoint = average(F0, F1) 

означает «найти среднюю точку точно посередине между точками F0 и F1», или другими словами,

Midpoint.x = (F0.x + F1.x)/2 
Midpoint.y = (F0.y + F1.y)/2 
Midpoint.z = (F0.z + F1.z)/2 

выражение

S1 := M + (M - S0) 

означает «Учитывая линейный сегмент, с одним концом в S0, и средняя точка в точке М, старта на S0 и запустить в прямом прошлом М, пока не дойдешь до другого конца на S1" , или других словах (если у вас есть приличный вектор библиотека) 3 строки кода

S1.x := M.x + (M.x - S0.x) 
S1.y := M.y + (M.y - S0.y) 
S1.z := M.z + (M.z - S0.z) 

. (Если вы делаете 2D, пропустите все материалы «z» - это всегда ноль).

 Смежные вопросы

  • Нет связанных вопросов^_^