Лаба 3;
.docxНижегородский Государственный Технический Университет
им Р.Е.Алексеева
Кафедра: Прикладная математика
Отчет по лабораторной работе №3
Тема «Методы аппроксимации и интерполяции при обработке экспериментальных данных»
Вариант №1
Выполнил: Кокурин М. А.
Студент группы: 11-КСУ-2
Проверил: Белоцерковская И. Е.
Нижний Новгород
2012г.
Оглавление.
Кусочно-Линейная интерполяция.
-
Ручной счет
-
Excel
-
Mathcad
Кусочно-Параболическая интерполяция.
-
Ручной счет
-
Excel
-
Mathcad
-
Си++
Метод неопределенных коэффициентов
Ручной счет
Excel
Mathcad
Интерполяция методом Лагранжа
Ручной счет
Excel
Mathcad
Метод наименьших квадратов(полином 1-ой степени)
Ручной счет
Excel
Mathcad
Си++
Метод наименьших квадратов(полином 2-ой степени)
Ручной счет
Excel
Mathcad
Список литературы
Вывод
1. Кусочно-линейная интерполяция
1.1 Ручной счет
x |
0,1 |
0,3 |
0,5 |
0,8 |
1 |
y |
0,3 |
0,55 |
0,65 |
0,4 |
0,25 |
В случае интерполяции функция проходит строго через экспериментальные точки. Для кусочно-линейной интерполяции получим две системы из условия прохождения соответствующей прямой через точки 1 и 2, 2 и 3, 3 и 4, а также 4 и 5:
А)
B)
С)
D)
1.2 Реализация в Excel
1.3 Реализация в Mathcad
2 .Кусочно-параболическая интерполяция
Ручной счет
x |
0,1 |
0,3 |
0,5 |
0,8 |
1 |
y |
0,3 |
0,55 |
0,65 |
0,4 |
0,25 |
Для квадратичной интерполяции с помощью метода неопределенных коэффициентов получим системы:
2.2 Реализация в Excel
2.3Реализация в MathCad
3 .Интерполяция полиномом 4-ой степени
Ручной счет
x |
1 |
2 |
3 |
4 |
5 |
y |
5 |
1 |
4 |
2 |
3 |
Запишем задачу в матричном виде:
C A = Y,
где:
Для решения этой системы используем метод Гаусса, получаем:
3.2 Реализация в Excel
3.3 Реализация в Microsoft Visual C++:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <ctime>
#include <iomanip>
#include <math.h>
using namespace std;
void gauss(double **c, int n)
{
int i,j;
cout.precision(3);
int k;
for (k=0; k<n; k++){
for (j=n; j>=k; j--)
c[k][j]/=c[k][k];
for (i=k+1; i<n; i++)
for (j=n; j>=k; j--)
c[i][j]-=c[k][j]*c[i][k];
}
double *a;
a=new double[n*sizeof(double)];
//Обратный ход
for (i=0; i<n; i++)
a[i]=c[i][n];
for (i=n-2; i>=0; i--)
for (j=i+1; j<n; j++)
a[i]-=a[j]*(c[i][j]);
//Печать результата
cout<<"Koeff\n";
for (j=0; j<n; j++)
cout<<"a"<<j<<"="<<a[j]<<endl;
delete[] a; }
void vvod(double *a, int n)
{
for(int i=0;i<n;i++)
cin>>a[i];
}
int main()
{
int n,i,j;
cout<<"kol-vo tochek"<<endl;
cin>>n;
double **c;
double *x, *y;
x= new double[n*sizeof(double)];
cout<<"vvod x"<<endl;
vvod(x,n);
y= new double[n*sizeof(double)];
cout<<"vvod y"<<endl;
vvod(y,n);
cout<<endl<<"prover'te koord tochek"<<endl;
for(i=0;i<n;i++)
cout<<"("<<x[i]<<","<<y[i]<<")"<<endl;
c= new double *[n];
for(i=0;i<n;i++)
c[i]=new double[n];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) c[i][j]=pow(x[i],j);
c[i][n]=y[i];
}
cout<<"Matritsa C+Y"<<endl;
for(i=0;i<n;i++)
{for(j=0;j<n+1;j++)
cout<<setw(7)<<c[i][j];
cout<<endl;}
cout<<endl;
gauss(c,n);
delete[] x;
delete[] y;
// for(i=0;i<n;i++)
// delete c[i];
delete[] c;
cin.get();
cin.get();
return 0;
}
3.4Реализация в MathCad
4 Интерполяция методом Лагранжа.
4.1 Ручной счет
x |
1 |
2 |
3 |
4 |
5 |
y |
5 |
1 |
4 |
2 |
3 |
|
|
|
|
|
|
4.2 Реализация в Excel
5. Аппроксимация полиномом 1-ой степени
5.1 Ручной счет.
x |
1 |
2 |
3 |
4 |
5 |
y |
5 |
1 |
4 |
2 |
3 |
Полином первой степени.
Имеем систему:
5.2 Реализация в Excel
5.3Реализация в MathCad
5.4 Реализация в Microsoft Visual C++:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <ctime>
#include <iomanip>
#include <math.h>
using namespace std;
void gauss(double **c, int n)
{
int i,j;
cout.precision(3);
int k;
for (k=0; k<n; k++){
for (j=n; j>=k; j--)
c[k][j]/=c[k][k];
for (i=k+1; i<n; i++)
for (j=n; j>=k; j--)
c[i][j]-=c[k][j]*c[i][k];
}
double *a;
a=new double[n*sizeof(double)];
//Обратный ход
for (i=0; i<n; i++)
a[i]=c[i][n];
for (i=n-2; i>=0; i--)
for (j=i+1; j<n; j++)
a[i]-=a[j]*(c[i][j]);
//Печать результата
cout<<"Koeff\n";
for (j=0; j<n; j++)
cout<<"a"<<j<<"="<<a[j]<<endl;
delete[] a;
}
void vvod(double *a, int n)
{
for(int i=0;i<n;i++)
cin>>a[i];
}
int main()
{
int n,i,j;
cout<<"kol-vo tochek"<<endl;
cin>>n;
double **c;
double *x, *y;
x= new double[n];
cout<<"vvod x"<<endl;
vvod(x,n);
y= new double[n];
cout<<"vvod y"<<endl;
vvod(y,n);
cout<<endl<<"prover'te koord tochek"<<endl;
for(i=0;i<n;i++)
cout<<"("<<x[i]<<","<<y[i]<<")"<<endl;
int m;
cout<<"stepen polinoma m"<<endl;
cin>>m;
m=m+1; //esli m=1, to yr-ya 2
c= new double *[m];
for(i=0;i<m;i++)
c[i]=new double[m];
int k;
double s;
for(i=0;i<m;i++)
for(j=0;j<m;j++){
s=0;
for(k=0;k<n;k++)
{
s=s+pow(x[k],(i+j));}
c[i][j]=s;}
for(i=0;i<m;i++){s=0;
for(k=0;k<n;k++)
{
s=s+y[k]*pow(x[k],i);}
c[i][m]=s;}
cout<<"Matritsa C+Y"<<endl;
for(i=0;i<m;i++)
{for(j=0;j<m+1;j++)
cout<<setw(5)<<c[i][j]<<" ";
cout<<endl;
}
cout<<endl;
gauss(c,m);
delete[] x;
delete[] y;
// for(i=0;i<n;i++)
// delete c[i];
delete[] c;
cin.get();
cin.get();
return 0;}
6. Аппроксимация полиномом 2-ой степени
6.1 Ручной счет.
x |
1 |
2 |
3 |
4 |
5 |
y |
5 |
1 |
4 |
2 |
3 |
;
Имеем систему:
6.2Реализация в Excel
6.3 Реализация в MathCad
Вывод
В данной работе я рассмотрел методы интерполяции и аппроксимации. Методы аппроксимации будут точнее, и чем выше степень полинома, тем точнее будет решение, так как отклонение от истинного значения будет наименьшим.
Список используемой литературы
1 Соболь, Б.В Мешков «Практикум по вычислительной математике»
2 Н. Культин «Самоучитель Программирования в Turbo Pascal 7.0 и Delphi»
3 Пискунов В.В. «Работа в MathCAD»
4 Кирьянов В. Д «Учебник по MathCAD 14»
5 П. Франка «Учебный курс по С++»
6 Волков «Численные методы»
7 Турчак «Численные методы»