Смекни!
smekni.com

Базисные сплайны (стр. 4 из 4)

Из теоремы 1.2 вытекает

Следствие 1.1. Всякий сплайн

, принадлежащий
, с конечным носителем минимальной длины с точностью до постоянного множителя совпадает с В-сплайном.

Доказательство. Минимальным конечным носителем сплайна является один из интервалов

Согласно (9)

Так как

для
то, выбирая последовательно
, получаем, что
. Аналогично,
для
Следовательно,

Замечание. Представление сплайнов через B-сплайпы в виде (9) имеет смысл для конечного отрезка [а, b]. Чтобы получить его для всей вещественней оси, нужно положить

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

§3. Нормализованные базисные сплайны и представление ими многочленов

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

(1)

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

на отрезке, где B-сплайн отличен от нуля.

Тождество (2.4) для нормализованных 5-сплайнов имеет вид

С его помощью легко можно построить последовательность сплайнов

Приведем первые четыре функции этой последовательности для случая равноудаленных узлов hi = h.

Будем обозначать

Точка
- это середина отрезка-носителя В-сплайна. Тогда имеем

Эти В-сплайны изображены на рис. 1.3, а, б, в, г соответственно.

В § 1 было отмечено, что многочлены Рп(х) степени не выше n являются элементами пространства сплайнов

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

Лемма 1.4. Справедливо тождество

в предположении

Доказательство. В формуле (4) положим

Тогда получаем

Подставляя

в (3), находим

Повторяя это преобразование n раз, получим справа

Теперь разложим обе части тождества (5) по степеням t. При этом

Здесь

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


Подставляя разложения (6) и (7) в (5) и приравнивая коэффициенты при одинаковых степенях t, находим представления мономов

через нормализованные В-сплайны па отрезке

В частности, при а = 0 получаем соотношение

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

Полученные формулы (8) решают вопрос о представлении произвольного многочлена п-й степени через нормализованные В-сплайны.

Заключение

В данной работе мы рассмотрели понятие сплайна и основные определения необходимые для работы с ним. Было изучено понятие базисного сплайна или B-сплайна, а так же уделено внимание его форме в виде нормализованного сплайна. Так же была создана программа для интерполяции сплайнов при помощи языка программирования высокого уровня C++.


Список литературы

1. Вержбицкий В.М. Основы численных методов – М.:Высш. шк., 2002.

2. Завьялов Ю.С., Квасов Б.И., Мирошниченко В.Л. Методы сплайн – функций - М.: Наука, 1980. 352 с

3. Бахвалов Н. С., Жидков Е. П., Кобельков Г. М. Численные методы. Учебное пособие. - 4-е издание – М.- СПб.: Физматлит, Невский диалект, Лаборатория базовых знаний, 2003

4. Препарата Ф., Шеймос М. Вычислительная геометрия. Введение. - Мир, 1989

5. Колмогоров А. Н., Фомин С. В. Элементы теории функций и функционального анализа - М.: Наука, 1976

Приложение

Листинг программы.

#include<conio.h>

#include<iostream>

using namespace std;

double KubichSplain ( int n, double *X, double *Y, double Xp )

{

double *Q, *L, *A, *B, *C, *D, DXp, Yp;

int i, j, k;

Q = new double [n];

L = new double [n];

A = new double [n];

B = new double [n];

C = new double [n];

D = new double [n];

for(i=0;i<n;i++)

if(Xp<=X[i])

{

k=i;

break;

}

Q[1] = (-1) * (X[2]-X[1])/2*(X[1]-X[0] + X[2]-X[1]);

L[1] = (3*(Y[2]-Y[1])/(X[2]-X[1]) - 3*(Y[1]-Y[0])/(X[1]-X[0])) / (2*(X[1]-X[0] + X[2]-X[1]));

C[n-1]=0;

C[0]=0;

for(i=3; i<n; i++)

{

Q[i-1]=(-1) * (X[i]-X[i-1]) / (2*(X[i-1]-X[i-2]+X[i]-X[i-1])+(X[i-1]-X[i-2])*Q[i-2]);

L[i-1]=(3*((Y[i]-Y[i-1])/(X[i]-X[i-1])-(Y[i-1]+Y[i-2])/

(X[i-1]-X[i-2]))-(X[i-1]-X[i-2])*L[i-2])/(2*(X[i-1]-X[i-2]+X[i]-X[i-1])+(X[i-1]-X[i-2])*Q[i-2]);

}

for(i=n-1; i>=2; i--)

C[i-1]=Q[i-1]*C[i]+L[i-1];

A[0]=Y[0];

for(i=1;i<n;i++)

{

A[i]=Y[i];

D[i]=(C[i]-C[i-1])/3.*(X[i]-X[i-1]);

B[i]=(Y[i]-Y[i-1])/(X[i]-X[i-1])+2.*(X[i]-X[i-1])*C[i]/3.+(X[i]-X[i-1])*C[i-1]/3.;

}

DXp=Xp-X[k];

//получение значения интерполирующей функции

Yp = A[k] + B[k]*DXp + C[k]*DXp*DXp + D[k]*DXp*DXp*DXp;

delete []A;

delete []B;

delete []C;

delete []D;

delete []Q;

delete []L;

return Yp;

}

void main ( void )

{

double *X, *Y, Xp;

int n, i;

system("CLS");

cout << "Enter n: ";

cin >> n;

X = new double [n];

Y = new double [n];

for ( i = 0; i < n; i ++ )

{

cout << "X[ " << i+1 << " ] = ";

cin >> X[i];

}

for ( i = 0; i < n; i ++ )

{

cout << "Y( " << X[i] << " ) = ";

cin >> Y[i];

}

cout << "Xp = ";

cin >> Xp;

cout << "Y( " << Xp << " ) = " << KubichSplain ( n, X, Y, Xp )<<"&bsol;n";

getch();

delete []X;

delete []Y;

}