Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Curves.doc
Скачиваний:
51
Добавлен:
01.09.2019
Размер:
4.51 Mб
Скачать

Поиск Решения

Этот раздел будет немного непонятным и потребует некоторых знаний в линейной алгебре. Во-первых, давайте перепишем dk - p(tk) в другом виде:

Здесь d0, dk и dn даны, а N0,p(tk) и Nh,p(tk) можно найти вычислением N0,p(u) и Nh,p(u) для tk. Для удобства, определим новый вектор qk:

Затем, функцию суммы квадратов f() можно переписать так:

Далее, определим, на что же похож квадрат расстояния погрешности Вспомним тождество x.x = |x|2. Это значит, что скалярное произведение вектора x на самого себя дает квадрат его длины. Таким образом, квадрат погрешности можно переписать как

Затем, функция f() становится

Как минимизировать эту функцию? Функция f() - это эллиптический параболоид для переменных p1, ..., ph-1. Таким образом, мы можем продифференцировать f() по каждому pg и найти нули этих производных. Там, где производная равна нулю, функция достигает экстремума, в данном случае f() достигает минимума.

В вычислении производной по pg, заметьте, что все qk и Ni,p(tk) - это константы (т.e. без участия pk) и их частные производные по любой pg должны быть равны нулю. Таким образом, имеем

Возьмем второй элемент из суммы, который является суммой значений Ni,p(tk)pi .qk. Производная каждой из его составляющих вычисляется так:

Частная производная pi по pg не равна нулю только если i = g. Таким образом, частная производная второго члена суммирования равна:

Производная третьего члена уже сложнее; но все-таки не очень. Здесь испльзуется правило умножения (f.g)' = f'.g + f.g'.

Так как частная производная pi по pg равна нулю, если i не равно g, то частная производная третьего члена суммирования по pg равна:

Объединяя эти результаты, получаем, что частная производная f() по pg равна

Приравнивая ее к нулю, получим:

Так как имеется h-1 переменных, то g изменяется от 1 до h-1 и всего h-1 таких уравнений. Заметьте, что эти уравнения являются линейными для неизвестных pi. Перед тем, как продолжить, определим три матрицы:

Здесь k-й ряд P - это вектор pk, k-й ряд Q - это правая сторона k-го уравнения, а k-й ряд N содержит значения вычислений N1,p(u), N2,p(u), ..., Nh-1,p(u) для tk. Таким образом, если исходные точки - это s-мерные векторы, то P, N и Q - это матрицы размеров соответственно (h-1)×s, (n-1)×(h-1) и (h-1)×s.

Теперь перепишем g-е линейное уравнение

в другом виде, чтобы коэффициент при pi легче читался:

Таким образом, коэффициент при pi равен

Если взглянуть на матрицу N, то видно, что Ng,p(t1), Ng,p(t2), ..., Ng,p(tn-1) - образуют g-й столбец N, а Ni,p(t1), Ni,p(t2), ..., Ni,p(tn-1) - i-й столбец N. Заметьте, что g-й столбец N - это g-й ряд транспонированной матрицы N, NT, а коэффициент pi равен "скалярному" произведению g-го ряда NT и i-го столбца N. Имея это ввиду, систему линейных уравнений можно переписать в таком виде

Так как N и Q известны, то решая эту систему линейных уравнений относительно P, получим искомые контр. точки.

Алгоритм

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

Вход: n+1 исходных точек d0, d1, ..., dn, степень p, и желаемое количество контр. точек h+1; Выход: Кривая B-spline степени p, определяемая h+1 контр. точками, которая аппроксимируется к исходным точкам; Алгоритм:

Получаем набор параметров t0, ..., tn и узловой вектор U; Принимаем p0 = d0, а ph = dn; for k := 1 to n-1 do

Вычисляем qk по следующей формуле:

for i := 1 to h-1 do

Вычисляем следующее и записываем в i-й столбец матрицы Q;

/* матрица Q получена */ for k := 1 to n-1 do

for i := 1 to h-1 do

Вычисляем Ni,p(tk) и записываем в ряд k и столбец i матрицы N;

/* матрица N получена */ Вычисляем M = NT.N; Находим P из M.P = Q; Ряд i матрицы P - это контр. точка pi; Контр. точки p0, ..., ph, узловой вектор U и степень p определяют аппроксимирующую кривую B-spline;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]