Автор работы: Пользователь скрыл имя, 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
Список литературы
h=const
Да
Решение системы методом Гаусса
Решение системы методом прогонки
Ввод: Х
Вывод: S3(x)
Конец
В результате выполнения курсовой работы был изучен теоретический материал по интерполированию кубическими сплайнами и решен кубический сплайн при помощи равномерной и неравномерной сетки, а также полученные знания были закреплен при разработке программного продукта.
В процессе создания курсового проекта данный метод были рассмотрен в трех математических пакетах: в C++ , MathCAD’e и Excel.
За время курсового
Москва. «Высшая школа» 2008.
(дата обращения: 23.12.2011)
#include<iostream.h>
#include<conio.h>
#include <MATH.H>
void neravn()
{
clrscr();
float a[50][51], x[50], t;
int i, j, k, m, n;
float ix[5],fx[5],dfx[5],h[5],sp[2];
cout<<"Vvedite koli4estvo to4ek = "<<endl;
cin>>n;
m=n+1;
cout<<"‚ўҐ¤ЁвҐ § 票Ґ Ґ«Ґ¬Ґв®ў ¬ ваЁжл "<<endl; //zapis Xi
for (i=0;i<n;i++)
{
cout<<"\n X["<<i<<"]=";
cin>>ix[i];
}
cout<<"Vvedite zna4enie fynkcii "<<endl; // zapis F(x)
for (i=0;i<n;i++)
{
cout<<"\n F(x)["<<i<<"]=";
cin>>fx[i]; }
for (i=0;i<n-1;i++) //vu4islenie dfx
{
dfx[i]=fx[i+1]-fx[i];
}
for (i=0;i<n-1;i++) //vu4islenie waga
{
h[i]=ix[i+1]-ix[i];
}
a[0][0]=1.0/h[0]; //naxojdenie elementov matricu
a[0][1]=-1.0*((1.0/h[0])+(1.0/
a[0][2]=1.0/h[1];
a[0][3]=0;
a[0][4]=0;
a[1][0]=h[0]/6.0;
a[1][1]=(h[0]+h[1])/3.0;
a[1][2]=h[1]/6.0;
a[1][3]=0;
a[1][4]=(dfx[1]/h[1])-(dfx[0]/
a[2][0]=0;
a[2][1]=h[1]/6.0;
a[2][2]=(h[1]+h[2])/3.0;
a[2][3]=h[2]/6.0;
a[2][4]=(dfx[2]/h[2])-(dfx[1]/
a[3][0]=0; a[3][1]=1.0/h[1];
a[3][2]=(-1.0*(1.0/h[1]))+(1.
a[3][3]=1.0/h[2];
a[3][4]=0;
cout<<endl;
cout<<"Nagmite lubuju klavishy dlia prodolgenia"<<endl;
getch();
getch();
cout<<"\n x[i] юF[x[i]] h[i]"; //vivod tablicu
for ( j=0; j< n-1; j++)
{
cout<<"\n "<<x[i]<<"| " <<dfx[j]<<"| "<<h[j]; }
cout<<"\n_____________________
cout<<"\n Ishodnaja matrica n x m"<<endl; //vivod matricu po Gayssa
for ( j=0; j< m; j++)
{
x[j] = 0; }
for (i=0;i<n;i++)
{
cout<<endl;
for (j=0;j<m;j++)
{
cout<<a[i][j]<<" ";
}
}
for (j = 0; j < n; j++)
if (a[j][i] == 0)
{
k = j;
while ((a[k+1][j] == 0) && (k < n))
k++;
if (a[k+1][j] != 0)
for (i = 0; i < m; i++)
{t=a[j][i];
a[j][i] = a[k+1][i];
a[k+1][i] = t;
}
else
cout<<"Imeet reshenie"<<endl;
}
for (k = 0; k < n - 1; k++)
for (j = k + 1; j < n; j++)
{
if (a[k][k] !=0)
{ t=a[j][k] / a[k][k];
for (i = 0; i < n + 1; i++)
a[j][i] = a[k][i] * t - a[j][i];
}
else
cout<<"Slau ne imeet reshenii";
}
for (j = n-1 ; j>=0; j--)
{ t = a[j][n];
for (i = j + 1; i < n; i++)
t= t - a[j][i] * x[i];
x[j] = t/a[j][j];
}
cout<<"\nKorni Slay"<<endl;
cout<<"_______________________
float dlx[4];
for (i=0; i<n; i++) // naxojdenie m
{
cout<<"x"<<i+1<<" = "<< x[i]<<endl;
cout<<" M[i]"; }
for (i=0; i<n-1; i++)
{
dlx[i]= x[i+1]-x[i];
cout<<"\n dM"<< dlx[i]; }
cout<<"\n_____________________
float s3[3];
cout<<"Vvvedite X - ";
cin>>sp[1];
if (sp[1]>=ix[0] && sp[1]<ix[1]) // podbor splaina i rewenie
{
s3[0]= ((1.0/h[0])*dfx[0]-(h[0]/2.0)*
s3[0]=s3[0]+(x[0]/2.0)*pow(sp[
s3[0]=s3[0]+(1.0/6.0*h[0])*
s3[0]=s3[0]+fx[0];
cout<<"s3[0] = "<<s3[0]; }
if (sp[1]>=ix[1] && sp[1]<ix[2])
{
s3[1]= ((1.0/h[1])*dfx[1]-(h[1]/2.0)*
s3[1]=s3[1]+(x[1]/2.0)*pow(sp[
s3[1]=s3[1]+(1.0/6.0*h[1])*
s3[1]=s3[1]+fx[1];
cout<<"\n s3[1] = "<<s3[1]; }
if (sp[1]>=ix[2] && sp[1]<ix[3])
{
s3[2]= ((1.0/h[2])*dfx[2]-(h[2]/2.0)*
s3[2]=s3[2]+(x[2]/2.0)*pow(sp[
s3[2]=s3[2]+(1.0/6.0*h[2])*
s3[2]=s3[2]+fx[2];
cout<<"S3[2] = "<<s3[2];
}
getch();
}
void ravn()
{
clrscr();
double x[4],fx[4],dfx[4],h,ot,a[5][5]
int n,i,m,j;
cout<<"\n Vvedite kpli4estvo to4ek - ";
cin>>n;
m=n+1;
cout<<endl;
cout<<"vvedute X[i]";
for(i=0;i<n;i++)
{
cout<<"\n X["<<i<<"]= ";
cin>>x[i];
}
cout<<"vvedute F[x(i)]";
for(i=0;i<n;i++)
{
cout<<"\n F(X["<<i<<"])= ";
cin>>fx[i];
}
for(i=0;i<n-1;i++) // vu4islenie dfx
{
dfx[i]=fx[i+1]-fx[i];
cout<<"\n"<<dfx[i];
}
h=x[1]-x[0];
cout<<"\n h="<<h;
a[0][0]=1; a[0][1]=0; a[0][2]=0; a[0][3]=0; //trexdiagonalnaia matrica
a[0][4]=((2.0*fx[0])+(5.0*fx[
a[1][0]=h/6.0; a[1][1]=(h+h)/3; a[1][2]=h/6.0; a[1][3]=0;
a[1][4]=(dfx[1]-dfx[0])/h;
a[2][0]=0; a[2][1]= h/6.0;
a[2][2]=(h+h)/3.0; a[2][3]= h/6.0;
a[2][4]=(dfx[2]-dfx[1])/h;
a[3][0]=0; a[3][1]=0; a[3][2]=0; a[3][3]=1;
a[3][4]=(1/pow(h,2))*((-1.0*
cout<<"\n_____________________
for(i=0;i<n;i++)
{
cout<<endl;
for(j=0;j<m;j++)
{
cout<<a[i][j]<<" "; }
}
cout<<"\n_____________________
b[0][0]=0; b[0][1]=-a[0][0];
b[0][2]=a[0][1]; b[0][3]=a[0][4];
b[0][4]=b[0][2]/b[0][1]; b[0][5]= (-1.0*b[0][3])/b[0][1];
b[1][0]=a[1][0]; b[1][1]=-a[1][1]; b[1][2]=a[1][2]; b[1][3]=a[1][4];
b[1][4]=b[1][2]/(b[1][1]-(b[0]
b[1][5]=(b[1][0]*b[0][5]-b[1][
b[2][0]=a[2][1]; b[2][1]=-a[2][2]; b[2][2]=a[2][3];
b[2][3]=a[2][4]; b[2][4]= b[2][2]/(b[2][1]-b[2][0]*b[1][
b[2][5]=(b[2][0]*b[1][5]-b[2][
b[3][0]= a[3][2]; b[3][1]= -a[3][3]; b[3][2]=0; b[3][3]= a[3][4];
b[3][4]=0; b[3][5]=(b[2][0]*b[2][5]-b[3][
for(i=0;i<4;i++)
{
cout<<endl;
for(j=0;j<6;j++)
{
cout<<b[i][j]<<" "; }
}
ix[4]=b[3][5];
ix[3]=b[2][4]*ix[4]+b[2][5];
ix[2]=b[1][4]*ix[3]+b[1][5];
ix[1]=b[1][4]*x[2]+b[0][5];
cout<<"Korni"<<endl;
for(i=1;i<5;i++)
{
cout<<"\n M "<<ix[i];}
for(i=1;i<4;i++)
{
dm[i]=ix[i+1]-ix[i]; }
double s3[3];
cout<<"\n\nюM";
for(i=1;i<4;i++)
{
cout<<"\n"<<dm[i]<<" "; }
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]-(
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)*ix[3]-(
s3[2]=s3[2]+(1.0/(6.0*h)*dm[2]
s3[2]+=fx[2];
cout<<"\n S3[2] = "<<s3[2]; }
getch();
}
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();
}