Сплайн-интерполяция

Автор работы: Пользователь скрыл имя, 18 Мая 2012 в 19:08, курсовая работа

Краткое описание

Целью данной курсовой работы является разработка программного продукта, реализующего решение интерполяционного кубического сплайна методом фронтальной прогонки, а так же методом Гаусса.
Для достижения цели были поставлены следующие задачи:
Изучить теоретический материал по теме: «Интерполяционные кубические сплайны».
Применить изученный материал к разработке программного продукта.
Написать программу на языке С++ для решения данного кубического сплайна методом фронтальной рпогонки.
Проверить решение с помощью приложения MathCad, Excel.
Сравнить результаты, полученные в трех пакетах.

Содержание

Введение 2
Глава I. Теоретические основы интерполирования кубическим сплайном. 4
1.1 Постановка задачи интерполирования кубическими сплайнами. 4
1.2 Алгоритм построения интерполяционного кубического сплайна. 5
1.3 Обзор методов решения СЛАУ с трехдиагональными матрицами методом фронтальной прогонки. 9
1.4 Численный пример. 12
Глава II. Практическая реализация интерполирования кубическим сплайном 19
2.1 Реализация в С++. 19
2.2 Реализация в Exel. 20
2.3 Реализация в MathCad. 22
2.4 Сравнение полученных результатов. 23
2.5 Блок-схема программной реализации сплайн интерполяции. 26
Заключение. 27
Список литературы

Вложенные файлы: 1 файл

курсач.docx

— 423.14 Кб (Скачать файл)

Замечания.

  1. Данный метод называется методом скалярной прогонки, так как при решении задачи на каждом i-ом шаге определяется скалярная величина  xi (i= ).
  2. Аналогичный подход используется для решения систем линейных алгебраических уравнений с пятидиагональными матрицами.
  3. Алгоритм метода прогонки называется корректным, если для все

(i= )  , и если устойчивым, если |Рi|<1, (i= ).

  1. Достаточным условием коррекности и устойчивости прогонки является условие преобладания диагональных элементов в матрице А, в матрице ai ≠ 0 и γi ≠ (i= ):

 

 

 

 

 

 

 

    1.   Численный пример.
  1. Равномерная сетка.

Пусть дана равномерная сетка, со значениями функции в точках.

Хi

F(xi)

ΔF(xi)

h

0

0

0.10017

0.05

0.05

0.10017

0.10117

 

0.1

0.20134

0.10318

 

0.15

0.30452

   

 

Мы так  же сразу можем найти ΔF(xi), так как в дальнейших вычислениях эти данные нам пригодятся. ΔF(xi) находится по формуле:

 

И найдем шаг сетки h. Шаг находится по формуле:

 

Запишем систему для внутренних узлов:

 

 

Так как  h = const, для нахождения значения выбираются формулы:

 

 

Подставляем в эти формулы данные с таблицы, и получаем следующие значения , .

 

 

 

 

 

Получается  система:

 

 

 

 

Далее эту  систему мы будем решать методом  прогонки (см. п. 1.2).

По методу прогонки нам надо вычислить:

; ; по формулам :

;  , где .

Найденные значения P: P1 = 0; Р2 = -0,25; Р3 = -0,2667.

Найденные значения Q: Q1 = 1.00169; Q2 = 0.349578; Q3= 1.193179; Q4= 1.208.

Для получения  нужных значений для нахождения сплайна  используем обратный ход, по формулам:

 

.

Получаем  значения:  M1 = 1.00169; M2 = 0.131816; M3 = 0.871046; M4 = 1.208.

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

 

 

Для нахождения сплайна нам понадобится формула:

Где  hi+1 =  xi+1- xi,  Δfi  = fi+1 - fi , Δmi = mi+1 – mi , i=0,1,2,3.

 

 

 Нам  нужно найти значение сплайна  в двух точках Х1 = 0,06 и Х2 = 0,11. Чтобы знать в какой из сплайнов подставлять Х, надо подставить в промежутки. Х1 подходит для второго уравнения, Х2 подходит для третьего. Подставляя Х мы находим значение сплайна в нужном Х.

Подставив 0,06 во второй сплайн, а 0,11в третий сплайн, нашли значение сплайнов, и они  равны:

S3,1(0.06) = 0.120318, S3,2 (0.11) = 0.221774

 

 

 

  1. Неравномерная сетка.

Пусть дана неравномерная сетка, со значениями функции в точках Х.

I

Xi

F(Xi)

Δ F(Xi)

Hi

0

0.1

1.1052

0.0566

0.05

1

0.15

1.1618

0.0474

0.04

2

0.19

1.2092

0.0748

0.06

3

0.25

1.284

   

 

Δ F(Xi) = F(Xi+1) - F(Xi), hi = hi+1 – hi , i=0,1,2,3.

Запишем систему для внутренних узлов:

 

 

Так как  h = var , для нахождения значения выбираются формулы:

 

 

 

Получается  система из 4х уравнений, подставим известные нам значения:

 

 

 

 

 

 

Эту систему  можно решить методом Гаусса:

20

-45

25

0

0

0,00833333

0,03

0,006667

0

0,053

0

0,006667

0,033333

0,01

0,061667

0

25

-8,33333

16,66667

0


 

1

-2,25

1,25

0

0

0

0,04875

-0,00375

0

0,053

0

0,006667

0,033333

0,01

0,061667

0

25

-8,33333

16,66667

0


 

1

-2,25

1,25

0

0

0

1

-0,07692

0

1,087179

0

0

0,033846

0,01

0,054419

0

0

-6,41026

16,66667

-27,1795


 

1

-2,25

1,25

0

0

0

1

-0,07692

0

1,087179

0

0

1

0,295455

1,607828

0

0

0

18,56061

-16,8729


 

1

-2,25

1,25

0

0

0

1

-0,07692

0

1,087179

0

0

1

0,295455

1,607828

0

0

0

1

-0,90907


 

По обратному  ходу найдем искомые Mi :

M1 = 0.425397; M2 = 1.231519; M3 = 1.876417; M4 = -0.90907;

Найдем ΔMi = Mi+1 – Mi . M1 = 0.806122; M2 = 0.644898; M3 = -2.78549.

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

Для нахождения сплайна нам понадобится формула:

Где  hi+1 =  xi+1- xi,  Δfi  = fi+1 - fi , Δmi = mi+1 – mi , i=0,1,2,3.

 

 

 

 

 

Нам нужно  найти значение сплайна в двух точках Х1 = 0,2 и Х2 = 0,17. Чтобы знать в какой из сплайнов подставлять Х, надо подставить в промежутки. Х1 подходит для второго уравнения, Х2 подходит для третьего. Подставляя Х мы находим значение сплайна в нужном Х.

Подставив 0,17 во второй сплайн, а 0,2в третий сплайн, нашли значение сплайнов, и они  равны:

S3,1(0.17) = 1.185168, S3,2 (0.2) = 1.221476.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Глава II. Практическая реализация интерполирования кубическим сплайном

    1. Реализация в С++.

Программа реализована с помощью трёх основных функций – В главной функции void main() реализована основная часть программы. Здесь хранится условие, по какому из методов будет решаться сплайн:

void main()

{

 clrscr();

 int ch;

 cout<<"Viberi setky:"<<endl;

 cout<<"1. Ravnomernaja"<<endl;

 cout<<"2.Neravnomernaja"<<endl;

 cin>>ch;

 if(ch==1) ravn();

 if(ch==2)neravn();

 cout<<"\n Vihod!";

   getch();

}

 

Функция void neravn() и void ravn(). Предназначены для вычисления всех необходимых данных для нахождения сплайна. К примеру часть программы которая вычисляет сплайн выглядит так :

cout<<"\n Vvedite zna4enie X - "<<endl;

   cin>>ot;

   if(ot>=x[0] && ot<x[1])

{

s3[0]=((1.0/h)*dfx[0]-(h/2)*ix[1]-(h/6)*dm[1])*(otx[0])+(ix[1]/2)*(pow(ot--x[0],2)) ;

s3[0]=s3[0]+(1.0/(6.0*h)*dm[1]*pow(ot-x[0],3)   ) ;

 s3[0]+=fx[0];

 cout<<"\n S3[0] = "<<s3[0];     }

 

  if(ot>=x[1] && ot<x[2])

{

s3[1]=((1.0/h)*dfx[1]-(h/2)*ix[2]-(h/6)*dm[2])*(ot-x[1])+(ix[2]/2)*(pow(ot--x[0],2)) ;

s3[1]=s3[1]+(1.0/(6.0*h)*dm[2]*pow(ot-x[1],3)   ) ;

s3[1]+=fx[1];

cout<<"\n S3[1] = "<<s3[1];  }

 

  if(ot>=x[2] && ot<x[3])

{

s3[2]=((1.0/h)*dfx[2]-(h/2)*ix[3]-(h/6)*dm[3])*(ot-x[2])+(ix[3]/2)*(pow(ot-x[1],2)) ;

s3[2]=s3[2]+(1.0/(6.0*h)*dm[2]*pow(ot-x[2],3)   ) ;

 s3[2]+=fx[2];

 cout<<"\n S3[2] = "<<s3[2]; }

 

    1. Реализация в Exel.

Для вычисления интерполяционного сплайна требуется знать значения X и Y, которые будут записаны в сетку. В данном пакете реализованы вычисления как по равномерной сетке, так и по неравномерной сетке.

1.Равномерная сетка.

 

 

 

 

 

 

 

2.Неравномерная сетка.

 

 

 

 

 

    1. Реализация в MathCad.

Для вычисления интерполяционного сплайна в  редакторе MathCad существует спефиальная функция.

-vx и vy, содержащие координаты x и y, через которые нужно провести кубический сплайн.

- vs := cspline( vx, vy). Вектор vs содержит вторые производные интерполяционной кривой в рассматриваемых точках. функция  cspline генерирует кривую сплайна, которая может быть кубическим полиномом в граничных точках.

- Чтобы найти  интерполируемое значение в произвольной  точке, скажем x0, вычислите interp(vs, vx,vy, x0), где vs, vx и vy — векторы, описанные ранее.

 

 

 

 

 

 

 

 

 

 

2.4 Сравнение полученных результатов.

Решая  данный интерполяционный сплайн   в Excel, C++, MathCad можно сделать вывод, что наиболее точными из трех вышеприведенных программ является  Excel. Погрешность незначительная, но всё же она есть (5-го знак после запятой).

Результаты вычислений в С++ по равномерной сетке:

 

Результаты вычислений в С++ по неравномерной сетке:

 

 

 

 

 

 

 

Результаты вычислений в MathCad:

Неравномерная сетка.

Равномерная сетка:

 

 

Результаты вычислений в Exсel:

 

Равномерная сетка:

 

  Неравномерная сетка:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.5 Блок-схема программной  реализации сплайн интерполяции.

 

Начало




Ввод: Xi,F(Xi)



 



 

 


 

 

 

Информация о работе Сплайн-интерполяция