51485

ИНТЕРПОЛЯЦИЯ

Лабораторная работа

Информатика, кибернетика и программирование

В данной работе был рассмотрен метод наименьших квадратов для интерполяции функции, заданной при помощи выборки ее значений в нескольких точках

Русский

2014-02-11

114 KB

1 чел.

Министерство образования и науки Украины

Приазовский государственный технический университет

Факультет информационных технологий

Кафедра автоматизации технологических процессов и производств

ОТЧЕТ

по лабораторной работе № 3

«ИНТЕРПОЛЯЦИЯ»

по дисциплине «Адаптивные системы АУТП»

Выполнил

студ. гр. КИТ-11-М    (подпись, дата)   Бабаенко Д.А.

Принял

профессор     (подпись, дата)   Зайцев В.С.

Мариуполь, 2011


Лабораторная работа № 3

Цель работы: изучить способы интерполяции функций, реализовать метод наименьших квадратов для интерполяции заданной выборки.

Ход работы:

Соответственно номеру варианта имеем выборку чисел:

X

1

2

3

4

5

6

7

Y

1.92

2.19

1.67

2.20

2.27

2.21

2.40

Задание 1:  занесем в окно MatLab следующий код программы:

%  interpolation

% method of splines

x=[1 2 3 4 5 6 7];

y=[1.92 2.19 1.67 2.20 2.27 2.21 2.40];

plot(x,y,'ko')

xi=[x(1):0.01:x(length(x))];

ynear=interp1(x,y,xi,'nearest');

yline=interp1(x,y,xi,'linear');

yspline=interp1(x,y,xi,'spline');

hold on

plot(xi,ynear,'k',xi,yline','k:',xi,yspline,'k-.')

title('different ways of interpolation of functions')

xlabel('\itx')

ylabel('\ity')

legend('tabulare function', 'nearest', 'linear', 'spline',4)

p4=polyfit(x,y,4)

p5=polyfit(x,y,5)

p6=polyfit(x,y,6)

Результатом работы будут следующие графики:

Рисунок 1 – Результат выполнения задания 1


Задание 2:  занесем в окно
MatLab следующий код программы:

%  interpolation

d=[1 2 3 4 5 6 7];

g=[1.92 2.19 1.67 2.20 2.27 2.21 2.40];

p1=polyfit(d,g,1);

p2=polyfit(d,g,2)

p3=polyfit(d,g,3);

p4=polyfit(d,g,4)

p5=polyfit(d,g,5);

p6=polyfit(d,g,6);

x=(0.1:0.02:7);

v=0.0117*x.^2-0.0190*x+1.9657;

s=-0.0027*x.^4+0.0385*x.^3-0.1708*x.^2+0.2973*x+1.8057;

hold on;

plot(x,v,x,s,d,g,'ko')

Результатом работы будут следующие графики:

Рисунок 2 – Результат выполнения задания 2


Реализовав алгоритм интерполяции на языке С++, получаем следующие результаты ее работы:

Рисунок 3 – Результат работы программы

Как видно на рисунке, результаты расчетов Мatlab и программы совпадают. Текст программы приведен в приложении 1.


Приложение 1

#include <stdio.h>

#include <conio.h>

#include <process.h>

#include <math.h>

float *a, *b, *x, *y, **sums;

int N, K;

//N - number of data points

//K - polinom power

//K<=N

char filename[256];

FILE* InFile=NULL;

void count_num_lines(){

  //count number of lines in input file - number of equations

  int nelf=0;       //non empty line flag

  do{

      nelf = 0;

      while(fgetc(InFile)!='\n' && !feof(InFile)) nelf=1;

      if(nelf) N++;

  }while(!feof(InFile));

}

void freematrix(){

  //free memory for matrixes

  int i;

  for(i=0; i<K+1; i++){

      delete [] sums[i];

  }

  delete [] a;

  delete [] b;

  delete [] x;

  delete [] y;

  delete [] sums;

}

void allocmatrix(){

  //allocate memory for matrixes

  int i,j,k;

  a = new float[K+1];

  b = new float[K+1];

  x = new float[N];

  y = new float[N];

  sums = new float*[K+1];

  if(x==NULL || y==NULL || a==NULL || sums==NULL){

      printf("\nNot enough memory to allocate. N=%d, K=%d\n", N, K);

      exit(-1);

  }

  for(i=0; i<K+1; i++){

      sums[i] = new float[K+1];

      if(sums[i]==NULL){

   printf("\nNot enough memory to allocate for %d equations.\n", K+1);

      }

  }

  for(i=0; i<K+1; i++){

      a[i]=0;

      b[i]=0;

      for(j=0; j<K+1; j++){

   sums[i][j] = 0;

      }

  }

  for(k=0; k<N; k++){

      x[k]=0;

      y[k]=0;

  }

}

void readmatrix(){

  int i=0,j=0, k=0;

  //read x, y matrixes from input file

  for(k=0; k<N; k++){

      fscanf(InFile, "%f", &x[k]);

      fscanf(InFile, "%f", &y[k]);

  }

  //init square sums matrix

  for(i=0; i<K+1; i++){

      for(j=0; j<K+1; j++){

   sums[i][j] = 0;

   for(k=0; k<N; k++){

       sums[i][j] += pow(x[k], i+j);

   }

      }

  }

  //init free coefficients column

  for(i=0; i<K+1; i++){

      for(k=0; k<N; k++){

   b[i] += pow(x[k], i) * y[k];

      }

  }

}

void printresult(){

  //print polynom parameters

  int i=0;

  printf("\n");

  for(i=0; i<K+1; i++){

      printf("a[%d] = %f\n", i, a[i]);

  }

}

/*void testsolve(){

  //test that ax=y

  FILE* OutFile;

  int i=0, j=0;

  float sum, s, begin, end, step;

  begin = x[0][1];

  end = x[N-1][1];

  step = (end-begin)/20;

  printf("\n");

  for(i=0; i<N; i++){

      sum = 0;

      for(j=0; j<N; j++){

   sum += x[i][j]*a[j];

      }

      printf("%f\t%f\n", s, y[i]);

  }

  OutFile = fopen("test.txt", "wt");

  for(s = begin; s<=end; s+=step){

      sum = 0;

      for(j=0; j<N; j++){

   sum += pow(s, j)*a[j];

      }

      fprintf(OutFile, "%f\t%f\n", s, sum);

  }

  fclose(OutFile);

}*/

/*void printresult(){

  int i=0;

  printf("\n");

  printf("Result\n");

  for(i=0; i<N; i++){

      printf("A%d = %f\n", i, a[i]);

  }

}*/

void diagonal(){

  int i, j, k;

  float temp=0;

  for(i=0; i<K+1; i++){

      if(sums[i][i]==0){

   for(j=0; j<K+1; j++){

       if(j==i) continue;

       if(sums[j][i] !=0 && sums[i][j]!=0){

    for(k=0; k<K+1; k++){

        temp = sums[j][k];

        sums[j][k] = sums[i][k];

        sums[i][k] = temp;

    }

    temp = b[j];

    b[j] = b[i];

    b[i] = temp;

    break;

       }

   }

      }

  }

}

void cls(){

  for(int i=0; i<25; i++) printf("\n");

}

void main(){

  int i=0,j=0, k=0;

  cls();

  do{

      printf("\nInput filename: ");

      scanf("%s", filename);

      InFile = fopen(filename, "rt");

  }while(InFile==NULL);

  count_num_lines();

  printf("\nNumber of points: N=%d", N);

  do{

      printf("\nInput power of approximation polinom K<N: ");

      scanf("%d", &K);

  }while(K>=N);

  allocmatrix();

  rewind(InFile);

  //read data from file

  readmatrix();

  //check if there are 0 on main diagonal and exchange rows in that case

  diagonal();

  fclose(InFile);

  //printmatrix();

  //process rows

  for(k=0; k<K+1; k++){

      for(i=k+1; i<K+1; i++){

   if(sums[k][k]==0){

       printf("\nSolution is not exist.\n");

       return;

   }

   float M = sums[i][k] / sums[k][k];

   for(j=k; j<K+1; j++){

       sums[i][j] -= M * sums[k][j];

   }

   b[i] -= M*b[k];

      }

  }

  //printmatrix();

  for(i=(K+1)-1; i>=0; i--){

      float s = 0;

      for(j = i; j<K+1; j++){

   s = s + sums[i][j]*a[j];

      }

      a[i] = (b[i] - s) / sums[i][i];

  }

  //InFile = fopen(filename, "rt");

  //readmatrix();

  //fclose(InFile);

  //printmatrix();

  //testsolve();

  printresult();

  getch();

  freematrix();

}


Вывод:
в данной работе был рассмотрен метод наименьших квадратов для интерполяции функции, заданной при помощи выборки ее значений в нескольких точках.


 

А также другие работы, которые могут Вас заинтересовать

55605. Реклама – как карьера. Её роль в бизнесе 42 KB
  Advertising has rapidly rushed into our life. TV- programs, radio-news, newspapers deal with the advertising every day, using different ways of its presentation. So the topic of our lesson is the role of advertising in business and everyday life. Let’s recollect words and expressions we need for our discussion.
55606. Рекомендации для учителей начальных классов по использованию групповых форм работы на уроках чтения и письма 57.5 KB
  Чтение слов анаграмм составление учащимися слов анаграмм обмен зашифрованными словами Налво волна клво волк Ронова ворона вемеддь медведь Швиня вишня бейрово воробей Упражнение БимБом слоговая зарядка: 1ученик называет слог...
55607. Рельєф України (рівнини) 132.5 KB
  Мета: поглибити та систематизувати одержані з попередніх курсів знання учнів про рельєф та сили що беруть участь у його формуванні; вивчити загальний план будови поверхні території України; сформувати знання про особливості розташування великих форм рельєфу на території України...
55608. Загальна характеристика рельєфу України 66 KB
  Мета: сформувати уявлення про характерні риси рельєфу України та його особливості на основі знань з попередніх курсів. Удосконалювати навички та вміння самостійно аналізувати, пояснювати, надавати характеристики основним формам рельєфу...
55610. Индуизм и другие культы Дравидии 224 KB
  Влево вправо бегают глаза ищут бегают по всей вселенной и возникает эта ось и вокруг оси идёт вращение это все кто ищет. Почему возникает Потому что перед тем как встретить того кто едет надо приготовления делать.
55611. Релігія та культурне життя середньовічної Європи 230 KB
  Мета: з’ясувати роль християнської церкви в середньовічному суспільстві; установити зв'язок між церквою та державною владою; охарактеризувати католицькі чернечі ордени та їх вплив на суспільне життя; розвивати вміння досліджувати суспільні явища та події; формувати навички мовленнєвих компетентностей.
55612. Сказка – цепочка. Русская народная сказка «Репка» 44.5 KB
  Русская народная сказка Репка Цели урока: познакомить с понятием сказкицепочки; совершенствовать технику чтения развивать речь пополнять словарный запас учить глубоко и полно анализировать и оценивать прочитанное...
55613. Бойові дії у 1915-1916 роках 37.5 KB
  Мета. Показати хід бойових дій у 1915 – 1916 роках, охарактеризувати основні битви цього періоду, спираючись на різні джерела; формувати вміння аналізувати історичні документи, простежити причинно-наслідкові зв’язки.