Интерполирование. Лабораторная работа №3.

advertisement
НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
им.Р.Е.Алексеева
Лабораторная работа №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
Download