Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Dmitry Pankov                        2:5022/81      23 Dec 2001  17:03:42
 To : Dmitry Sergeev
 Subject : кубический сплайн ?
 -------------------------------------------------------------------------------- 
 
 
 23 декабря 2001 года (а было тогда 14:30)
 Dmitry Sergeev в своем письме к All писал:
 
  DS> Hужно сделать прогу "интерполирование функции кубическим сплайном".
  DS> Может кто делал и сможет пообщаться со мной по этой теме ?
 
 ======== Hачало interpol.cpp ========
 #include <iostream.h>
 #include <stdlib.h>
 #include <math.h>
 #define MS 30
 
 typedef double Matrix[MS][MS+1];
 typedef double Vector[MS];
 
 //****************************************************************************
 // Решение СЛАУ методом прогонки
 // Вход:
 //   A - поддиагональ
 //   B - главная диагональ
 //   C - наддиагональ
 //   D - столбец свободных членов
 //   n - число уравнений
 // Выход:
 //   X - вектор решений
 void Progon(Vector A, Vector B, Vector C, Vector D, Vector X, int n)
 {
   int i;
   Vector U,V;
 
   // прогоночные коэффициенты
   U[0]=D[0]/B[0];
   V[0]=-C[0]/B[0];
   for(i=1; i<=n-2; i++) {
     U[i]=(D[i]-A[i]*U[i-1])/(A[i]*V[i-1]+B[i]);
     V[i]=-C[i]/(A[i]*V[i-1]+B[i]);
   }
   U[n-1]=X[n-1]=(D[n-1]-A[n-1]*U[n-2])/(A[n-1]*V[n-2]+B[n-1]);
   V[n-1]=0;
   // обратный ход
   for(i=n-2; i>=0; i--) X[i]=U[i]+V[i]*X[i+1];
 }
 
 //****************************************************************************
 // Интерполяционный кубический сплайн
 //   X - вектор абсцисс
 //   Y - вектор ординад
 //   n - число узлов
 // Выход:
 //   S - матрица коэффициентов при степенях сплайна
 void CSpline(Vector X, Vector Y, int n, Matrix S)
 {
   Vector h={0}, B={0}, C={0}, D={0},
          Alf={0}, Bet={0}, Gam={0}, Fi={0};
   int i;
 
   // составление трехдиагональной СЛАУ
   for(i=1; i<n; i++) h[i]=X[i]-X[i-1];
   for(i=2; i<n-1; i++) Alf[i]=h[i];
   for(i=1; i<n-1; i++) Bet[i]=2*(h[i]+h[i+1]);
   for(i=1; i<n-2; i++) Gam[i]=h[i+1];
   for(i=1; i<n-1; i++) Fi[i]=6*((Y[i+1]-Y[i])/h[i+1]-(Y[i]-Y[i-1])/h[i]);
 
   // решение СЛАУ методом прогонки
   Progon(Alf,Bet,Gam,Fi,C,n);
 
   for(i=1; i<n; i++) {
     // вычисление коэффициентов сплайна
     D[i]=(C[i]-C[i-1])/h[i];
     B[i]=h[i]/2*C[i]-h[i]*h[i]/6*D[i]+(Y[i]-Y[i-1])/h[i];
     // вычисление коэффициентов при степенях
     S[i-1][0]=Y[i]-B[i]*X[i]+C[i]*pow(X[i],2)/2-D[i]*pow(X[i],3)/6;
     S[i-1][1]=B[i]-C[i]*X[i]+D[i]*pow(X[i],2)/2;
     S[i-1][2]=C[i]/2-D[i]*X[i]/2;
     S[i-1][3]=D[i]/6;
   }
 }
 
 //****************************************************************************
 void main()
 {
   Vector X={-1,0,1,2},
          Y={0,1,1,1},
          C;
   Matrix CS,LS;
   int i,j,n=4;
 
   Vector X1={-2,-1,0,1,2,3},
          Y1={1,0,1,1,1,1};
   n=6;
   int m=2;
 
   CSpline(X1,Y1,n,CS);
   for(i=0; i<n-1; i++) {
     cout << i << " CSpline:" << endl;
     for(j=0; j<=3; j++) cout << "  S[" << i << "][" << j << "]=" << CS[i][j] <<
 endl;
   }
 
 }
 ======== Конец interpol.cpp ========
 С наилучшими пожеланиями, Dmitry                 *e-mail: panda@tula.net*
 
  .  Тишина
 ... Любовь - это полет, а чтобы летать нyжно два кpыла
 --- Win95 UpTime: 00d 22h 31m 01s
  * Origin: Жизнь - игра, в которой нет setup'а (2:5022/81)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 кубический сплайн ?   Dmitry Sergeev   23 Dec 2001 15:30:17 
 кубический сплайн ?   Dmitry Pankov   23 Dec 2001 17:03:42 
Архивное /ru.algorithms/18243c2600e1.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional