Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Интерполяция

Поиск:
Метод Эйткена

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Interpolation (using Eitken method)
//  (c) Johna Smith, 1996
//
//  Method description:
//    Given: several points of the unknown function
//    We should find values of this function between given points
//    Interpolation polynom isn't calculated directly:
//    To calculate values of function between given points we should
//    use the following formulas of linear interpolation:
//                  1     |y0  x0-x|
//     y(x,x0,x1)=------- |        |
//                (x1-x0) |y1  x1-x|
//
//                  1     |y0  x0-x|
//     y(x,x0,x2)=------- |        |
//                (x2-x0) |y2  x2-x|
//
//                      1   |y(x,x0,x1)  x1-x|
//     y(x,x0,x1,x2)=-------|                | and so on...
//                   (x2-x1)|y(x,x0,x2)  x2-x|
//
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#define N  4

float x[N]={-0.12, 1.68, 3.41, 5.62};
float y[N]={0.324, -0.6, -0.4, -0.21};

float xvalues[N-1],f[N-1],tmp[N];
float xa;

void main(void)
{
  // initializing variables
  for(int i=0;i<N-1;i++)
  {
    xvalues[i]=(x[i+1]+x[i])/2; // we'll calculate function between given points
    f[i]=0;
  }

  // calculating function values between given points
  for (int z=0;z<N-1;z++)
  {
    for(int j=0;j<N;j++) tmp[j]=y[j];
    for(j=0;j<N-1;j++)
      for(i=j+1;i<N;i++)
        tmp[i]=((xvalues[z]-x[j])*tmp[i]-(xvalues[z]-x[i])*tmp[j])/(x[i]-x[j]);
    f[z]=tmp[N-1];
  }

  for (i=0;i<N-1;i++)
    printf("F(%f)= %fn",xvalues[i],f[i]);
}



Полином Лагранжа

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Interpolation (using Lagrange polynom)
//  (c) Johna Smith, 1996
//
//  Method description:
//    Given: several points of the unknown function
//    We should find values of this function between given points and
//    approximate  function by polynom.
//    Interpolation polynom calculated by the following formula:
//             N       (x-x0)...(x-x(i-1))(x-x(i+1))...(x-xn)
//       L(x)=SUM y(i)----------------------------------------
//            i=0     (xi-x0)..(xi-x(i-1))(xi-x(i+1))..(xi-xn)
//    To calculate values of function between given points we should
//    calculate value of interpolation polynom in these points.
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#define N  4

float x[N]={-0.12, 1.68, 3.41, 5.62};
float y[N]={0.324, -0.6, -0.4, -0.21};
float xvalues[N-1],f[N-1];
int i,j,z;
float l,k;
float pow[N],temp[N],tempaux[N];

void main(void)
{
  // initializing variables
  for(z=0;z<N-1;z++)
  {
    xvalues[z]=(x[z+1]+x[z])/2; // calculating function between given points
    f[z]=0;
  }
  for(z=0;z<N;z++) pow[z]=0;

  // calculating function values
  for(z=0;z<N-1;z++)
    for(i=0;i<N;i++)
    {
      l=1;
      for(j=0;j<N;j++)
        if(i!=j) l*=(xvalues[z]-x[j])/(x[i]-x[j]);
      l*=y[i];
      f[z]+=l;
    }

  // Determining interpolation polynom
  for(z=0;z<N;z++)
  {
    k=y[z];
    for(i=0;i<N;i++)
      if(i!=z) k/=(x[z]-x[i]);
    for(i=0;i<N;i++) temp[i]=0;
    temp[0]=k;
    for(i=0;i<N;i++)
      if(i!=z)
      {
        for(j=0;j<N-1;j++) tempaux[j+1]=temp[j];
        tempaux[0]=0;
        for(j=0;j<N;j++) tempaux[j]-=temp[j]*x[i];
        for(j=0;j<N;j++) temp[j]=tempaux[j];
      }
    for(i=0;i<N;i++) pow[i]+=temp[i];
  }

  // printing results
  for(z=0;z<N-1;z++) printf("F(%f)=%fn",xvalues[z],f[z]);
  printf("nPolynom: F(X)=");
  for(z=N-1;z>0;z--) printf("%fX^%d+n",pow[z],z);
  printf("%fn",pow[0]);
}



Метод Ньютона

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Interpolation (using Newton polynom)
//  (c) Johna Smith, 1996
//
//  Method description:
//    Given: several points of the unknown function
//    We should find values of this function between given points and
//    approximate  function by polynom.
//    Interpolation polynom is searched by the following formulas:
//
// P(x)=y1+(x-x1)f(x1,x2)+(x-x1)(x-x2)f(x1,x2,x3)+...              n
//                       +(x-x1)(x-x2)...(x-x(n-1))f(x1,x2,..,xn)=SUM Ak fi
//     i            i      i-j             k  k                   i=0
// fi=MUL (x-xj) = SUM aj x    ;   ak=(-1)  MUL xj
//    j=1          j=0                       j=1
//
//         1  l      m+1          k         m
//  a(k-l)=- SUM (-1)   a(k-l+m) SUM (-1/xp); a0=1
//         l m=1                 p=1
//
//
//    To calculate values of function between given points we should
//    calculate value of interpolation polynom in these points.
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <math.h>

#define N  4

float x[N]={-0.12, 1.68, 3.41, 5.62};
float Y[N]={0.324, -0.6, -0.4, -0.21};
float xvalues[N-1],f[N],a[N],y[N],pw,w,s;
int i,j,z,k,l,m,p;

void main(void)
{
  // initializing variables
  for(z=0;z<N-1;z++)
  {
    xvalues[z]=(x[z+1]+x[z])/2; // calculating function between given points
    f[z]=0;
  }
  for(z=0;z<N;z++) y[z]=Y[z];
  a[0]=1;
  f[N-1]=y[0];
  //           n-1
  // P   (x) = SUM A[k]
  //  n-1      k=0
  for(k=1;k<N;k++)
  {
    for(i=1;i<=N-k;i++) y[i-1]=(y[i]-y[i-1])/(x[i+k-1]-x[i-1]);
    //          k  k
    // a[k]=(-1)  MUL x[j]
    //            j=1
    pw=1;
    for(j=1;j<=k;j++) pw*=x[j-1];
    a[k]=(k%2==0?1:-1)*pw;

    //        1  l      m+1          k            m
    // a[k-l]=- SUM (-1)   a[k-l+m] SUM  (-1/x[p])
    //        l m=1                 p=1
    if (k!=1)
    {
      for(l=1;l<=k;l++)
      {
        w=0;
        for(m=1;m<=l;m++)
        {
          s=0;
          for(p=1;p<=k;p++) s+=pow(-1/x[p-1],m);
          w+=(m%2==0?-1:1)*a[k-l+m]*s;
        }
        a[k-l]=w/l;
      }
    }

    for(j=N;j>=N-k;j--) f[j-1]+=a[j-N+k]*y[0];
  }

  // printing results
  for(z=0;z<N-1;z++)
  {
    s=f[0];
    for(i=1;i<N;i++) s=s*xvalues[z]+f[i];
    printf("F(%f)=%fn",xvalues[z],s);
  }
  printf("nPolynom: F(X)=");
  for(z=0;z<N-1;z++) printf("%fX^%d+n",f[z],N-z-1);
  printf("%f",f[N-1]);
}
Сайт: forum.vingrad.ru






Просмотров: 3302

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную