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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать файл)

h=const



                 Да                                                                           Нет


 


 

 


 

 


 

 

 


 

Решение системы методом Гаусса


Решение системы методом прогонки



 

 

 


Ввод: Х




 


 


 

 

 

 

 

 

 

 

 


 

Вывод: S3(x)




Конец



Заключение.

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

В процессе  создания курсового  проекта данный  метод  были рассмотрен в трех математических  пакетах: в C++ , MathCAD’e и Excel.

За время курсового проектирования был закреплен и усвоен материал. Курсовой проект позволяет продемонстрировать знания, полученные при изучении курса  программирования и вычислительной математики. Выполнение курсового проекта  требует творческого подхода  и применения дополнительных знаний.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

  1. В.И. Киреев А.В. Пантелеев Численные методы в примерах и задачах.

Москва. «Высшая школа» 2008.

  1. Б.И. Квасов Методы Изогеометрической апроксимации сплайнами. Москва. «Физматлит» 2006.
  1. Положение о  курсовой работе. /Утверждено Ученым Советом Рыбницкого филиала ПГУ им. Т.Г.Шевченко – Протокол №1 от 25.09.2008г.
  1. Марчук Г. И. Методы вычислительной математики. – М.: Наука, 1979.
  1. Интерполяция и функции предсказания. [Электронный ресурс] – Режим доступа: http://www.exponenta.ru/soft/mathcad/usersguide/chapter13/13_5.asp

(дата обращения: 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/h[1]));

  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]/h[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]/h[1]);

  a[3][0]=0; a[3][1]=1.0/h[1];

  a[3][2]=(-1.0*(1.0/h[1]))+(1.0/h[2]);

  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_________________________"<<endl;

  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<<"________________________________"<<endl;

 

  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_____________________________________"<<endl;

 

  float s3[3];

  cout<<"Vvvedite X - ";

  cin>>sp[1];                            // vvod zna4enia

  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)*x[0]-(h[0]/6.0)*dlx[0])*(sp[1]-ix[0]);

s3[0]=s3[0]+(x[0]/2.0)*pow(sp[1]-ix[0],2);

s3[0]=s3[0]+(1.0/6.0*h[0])*dlx[0]*pow(sp[1]-ix[0],3);

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)*x[1]-(h[1]/6.0)*dlx[1])*(sp[1]-ix[1]);

s3[1]=s3[1]+(x[1]/2.0)*pow(sp[1]-ix[1],2);

s3[1]=s3[1]+(1.0/6.0*h[1])*dlx[1]*pow(sp[1]-ix[1],3);

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)*x[2]-(h[2]/6.0)*dlx[2])*(sp[1]-ix[2]);

s3[2]=s3[2]+(x[2]/2.0)*pow(sp[1]-ix[2],2);

s3[2]=s3[2]+(1.0/6.0*h[2])*dlx[2]*pow(sp[1]-ix[2],3);

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],b[10][10],ix[5],dm[6];

  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[1])+(4.0*fx[2])-fx[3]);

  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*fx[0])+4.0*fx[1]-5.0*fx[2]+2.0*fx[3]);

 

  cout<<"\n______________________";

 

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

{

cout<<endl;

   for(j=0;j<m;j++)

{

 cout<<a[i][j]<<" ";   }

}

  cout<<"\n_________________________________________";    //tablica

  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][1]*b[0][4]));

  b[1][5]=(b[1][0]*b[0][5]-b[1][3])/(b[1][1]-b[1][0]*b[0][4]);

  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][4]);

  b[2][5]=(b[2][0]*b[1][5]-b[2][3])/(b[2][1]-b[2][0]*b[1][4]);

  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][3])/(b[3][1]-b[3][0]*b[2][4]);

 

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

{

cout<<endl;

  for(j=0;j<6;j++)

{

cout<<b[i][j]<<" "; }

}

  ix[4]=b[3][5];                         // M

  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]-(h/6)*dm[1])*(ot-x[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]; }

 

  getch();

}

  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();

}

 


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