НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им.Р.Е.Алексеева Лабораторная работа №3. Интерполирование. Вариант №6 Выполнил: студент группы 06-В-2 Пантелеев Д.С. Проверил: Чернова Т.С. Н.Новгород 2008 год Постановка задачи. 1.Используя первую или вторую интерполяционную формулы Ньютона, вычислить значение функции при данных значениях аргумента. /h=0.05, n=12/ X 0.101 0.106 0.111 0.116 0.121 0.126 0.131 0.136 0.141 0.146 0.151 Y 0.26183 0.27644 0.29122 0. 30617 0. 32130 0. 33660 0. 35207 0. 36773 0. 38357 0.39959 0.41579 X1 X2 X3 0.1035 0.1492 0.096 Блок-схема алгоритма начало Описание массивов x[11],y[11],dyo[1 2][12] Функция подсчета факториала fac(int i) Функция разности к-го порядка delta(int k) Функция вывода разностей matrix() Функция многочлена Ньютона result(int r) A=delta(k)/fac(k)/pow(h,k) p*=(X[r]-x[j]) n+=p*a(i) 1 2 X4 0.153 Вывод начальных данных Вывод таблиц разности Вывод результата X[i] 1 2 конец Текст программы #include<iostream.h> #include<stdlib.h> #include<conio.h> #include<math.h> #include<stdio.h> const float x[11]={0.101, 0.106, 0.111, 0.116, 0.121, 0.126, 0.131, 0.136, 0.141, 0.146, 0.151};/*данные х*/ const float y[11]={0.26183,0.27644,0.29122,0.30617,0.32130,0.33660,0.35207,0.36773,0.3835 7,0.39959,0.41579};/*данные у*/ const int N=11; const float h=0.05;/*шаг*/ const float X[4]={0.1035, 0.1492, 0.096, 0.153};/*данные Х*/ float dy0[12][12];/*база сохранения значений разностей*/ long fac(int i) /*подсчет факториала*/ { if(i==1||i==0) return 1; return fac(i-1)*i; } float delta(int k) /*разность к-ого порядка*/ { return dy0[0][k]; } void matrix() /*вывод разностей*/ { int p=11; for(int i=0;i<11;i++) {dy0[i][0]=y[i];} for(int j=1; j<12;j++) { printf("%d\n ",j);/*номер строки*/ for(i=0; i<p; i++) { dy0[i][j]=dy0[i+1][j-1]-dy0[i][j-1]; printf("%3.5f|",dy0[i][j]); } printf("\n\n"); p--; } 3 } float a(int k)/*подсчет разностей*/ { float A; A=delta(k)/fac(k)/pow(h,k); return A; } float result(int r) /*многочлен Ньютона*/ { float n=0,p=1; for(int i=0; i<N;i++) { p=1; for(int j=0; j<i;j++) { p*=(X[r]-x[j]); } n+=p*a(i); } return n; } int main() { printf("\n Newton Method\n"); printf(" x"); printf(" y"); printf("\n\n"); for(int j=0;j<11;j++) { printf("\n"); printf("%3.3f ",x[j]); printf("%f ",y[j]); } getch(); printf("\n\nTablica raznostey:\n\n"); matrix(); for(int i=0; i<4;i++) { printf("\n x=%1.4f y=%f",X[i],result(i)); } getch(); return 0; } 4 Результат работы программы 2.Найти приблизительное значение функции при данном значении аргумента с помощью интерполяционного многочлена Лагранжа, еcли функция задана в а) неравноотстоящих узлах таблицы; б) равноотстоящих узлах таблицы; а) б) X Y X Y 0.210 4.83170 0.11 9.05421 0.215 4.72261 0.15 6.61659 0.220 4.61855 0.21 4.69170 0.225 4.51919 0.29 3.35106 0.230 4.42422 0.35 2.73951 0.235 4.33337 0.40 2.36552 x=0.235 x=0.2165 5 Блок-схема алгоритма начало Описание массивов x[6],y[6] Вспомогательная функция k для дроби Числитель m*=(X-x[i]) Знаменатель p*=(x[j]-x[i]) Дробь l=m/p Функция result() Многочлен Лагранжа l+=k(t)*y[t] Вывод начальных данных Вывод результата X[i] конец 6 Текст программы а) #include<iostream.h> #include<conio.h> #include<stdio.h> const const float const float x[6]={ 0.11, 0.15, 0.21, 0.29, 0.35, 0.40}; float y[6]={ 9.05421, 6.61659, 4.69170, 3.35106, X=0.235;/*заданное значение*/ int N=6; 2.73951, 2.36552}; float k(int j) { float l=0,m=1,p=1; for(int i=0;i<N;i++) { if(i!=j) m*=(X-x[i]);/*вычисление числителя дроби l*/ } for(i=0; i<N; i++) { if(i!=j) p*=(x[j]-x[i]);/*вычисление знаменателя l*/ } l=m/p;/*формирование многочленов l*/ return l; } float result()/*формирование многочлена Лагранжа*/ { float l=0; for(int t=0; t<N; t++) { l+=k(t)*y[t]; } return l; } int main()/*Рисование интерфейса*/ { cout<<"\nLagrange method\n"; printf(" x"); printf(" y"); printf("\n"); for(int j=0;j<6;j++) { printf("\n"); printf("%3.3f ",x[j]); printf("%f ",y[j]); } getch(); cout<<"\nx=" <<X<<" y="<<result(); getch(); return 0; } 7 Результат работы программы б) #include<iostream.h> #include<conio.h> #include<stdio.h> const const float const float x[6]={0.210,0.215,0.220,0.225,0.230,0.235}; float y[6]={4.83170,4.72261,4.61855,4.51919,4.42422,4.33337}; X=0.2165; int N=6; float k(int j) { float l=0,m=1,p=1; for(int i=0;i<N;i++) { if(i!=j) m*=(X-x[i]); } for(i=0; i<N; i++) { if(i!=j) p*=(x[j]-x[i]); } l=m/p; return l; } float result() { float l=0; for(int t=0; t<N; t++) { l+=k(t)*y[t]; } return l; } int main() { 8 cout<<"\nLagrange method\n"; printf(" x"); printf(" y"); printf("\n"); for(int j=0;j<6;j++) { printf("\n"); printf("%3.3f ",x[j]); printf("%f ",y[j]); } getch(); cout<<"\nx=" <<X<<" y="<<result(); getch(); return 0; } Результат работы программы 9