Автор работы: Пользователь скрыл имя, 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
Список литературы
Замечания.
(i= ) , и если устойчивым, если |Рi|<1, (i= ).
Пусть дана равномерная сетка, со значениями функции в точках.
Х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
Пусть дана неравномерная сетка, со значениями функции в точках Х.
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. Практическая реализация интерполирования кубическим сплайном
Программа
реализована с помощью трёх основных
функций – В главной функции vo
void main()
{
clrscr();
int ch;
cout<<"Viberi setky:"<<endl;
cout<<"1. Ravnomernaja"<<endl;
cout<<"2.Neravnomernaja"<<
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)*
s3[0]=s3[0]+(1.0/(6.0*h)*dm[1]
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)*
s3[1]=s3[1]+(1.0/(6.0*h)*dm[2]
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)*
s3[2]=s3[2]+(1.0/(6.0*h)*dm[2]
s3[2]+=fx[2];
cout<<"\n S3[2] = "<<s3[2]; }
Для вычисления интерполяционного сплайна требуется знать значения X и Y, которые будут записаны в сетку. В данном пакете реализованы вычисления как по равномерной сетке, так и по неравномерной сетке.
1.Равномерная сетка.
2.Неравномерная сетка.
Для вычисления интерполяционного сплайна в редакторе MathCad существует спефиальная функция.
-vx и vy, содержащие координаты x и y, через которые нужно провести кубический сплайн.
- vs := cspline( vx, vy). Вектор vs содержит вторые производные интерполяционной кривой в рассматриваемых точках. функция cspline генерирует кривую сплайна, которая может быть кубическим полиномом в граничных точках.
- Чтобы найти
интерполируемое значение в
Решая данный интерполяционный сплайн в Excel, C++, MathCad можно сделать вывод, что наиболее точными из трех вышеприведенных программ является Excel. Погрешность незначительная, но всё же она есть (5-го знак после запятой).
Результаты вычислений в С++ по равномерной сетке:
Результаты вычислений в С++ по неравномерной сетке:
Результаты вычислений в MathCad:
Неравномерная сетка.
Равномерная сетка:
Результаты вычислений в Exсel:
Равномерная сетка:
Неравномерная сетка:
Начало
Ввод: Xi,F(Xi)