Квадратичная интерполяция
Постановка задачи:
Дана табличная функция (5 точек):
x |
0,1 |
0,3 |
0,5 |
0,6 |
0,9 |
y |
0,4 |
0,6 |
0,75 |
0,75 |
0,83 |
Требуется решить задачу интерполяции (кусочно-квадратичную) методом неопределенных коэффициентов.
Ручной счет:
Для квадратичной интерполяции с помощью метода неопределенных коэффициентов получим системы:
Реализация в Microsoft Excel:
Экспериментальные данные | |||||
x |
0,1 |
0,3 |
0,5 |
0,6 |
0,9 |
y |
0,4 |
0,6 |
0,75 |
0,75 |
0,83 |
Реализация в Mathcad:
Кусочно- квадратичная
Первый участок
Второй участок
Метод Лагранжа
Постановка задачи:
Дана табличная функция (5 точек):
x |
0,1 |
0,3 |
0,5 |
0,6 |
0,9 |
y |
0,4 |
0,6 |
0,75 |
0,75 |
0,83 |
Требуется решить задачу методом Лагранжа.
Ручной счет:
Реализация в Microsoft Excel:
Интерполяция методом Лагранжа | |||||||||
x= |
2 |
|
|
|
|
|
|
|
|
i |
xi |
yi |
0 |
1 |
2 |
3 |
4 |
Di |
yi/Di |
0 |
0,1 |
0,4 |
1,9 |
-0,2 |
-0,4 |
-0,5 |
-0,8 |
0,0608 |
6,578947 |
1 |
0,3 |
0,6 |
0,2 |
1,7 |
-0,2 |
-0,3 |
-0,6 |
-0,01224 |
-49,0196 |
2 |
0,5 |
0,75 |
0,4 |
0,2 |
1,5 |
-0,1 |
-0,4 |
0,0048 |
156,25 |
3 |
0,6 |
0,75 |
0,5 |
0,3 |
0,1 |
1,4 |
-0,3 |
-0,0063 |
-119,048 |
4 |
0,9 |
0,83 |
0,8 |
0,6 |
0,4 |
0,3 |
1,1 |
0,06336 |
13,09975 |
|
|
|
|
|
|
|
|
|
7,861468 |
|
|
|
|
|
|
|
7,4613 |
|
58,65677 |
Метод неопределенных коэффициентов
Постановка задачи:
Дана табличная функция (5 точек):
x |
0,1 |
0,3 |
0,5 |
0,6 |
0,9 |
y |
0,4 |
0,6 |
0,75 |
0,75 |
0,83 |
Требуется решить задачу интерполяции (полином 4-ой степени) методом неопределенных коэффициентов.
Ручной счет:
Запишем задачу в матричном виде:
C A = Y,
где:
Для решения этой системы используем метод Гаусса, получаем:
Реализация в Microsoft Excel:
Экспериментальные данные | |||||
x |
0,1 |
0,3 |
0,5 |
0,6 |
0,9 |
y |
0,4 |
0,6 |
0,75 |
0,75 |
0,83 |
Реализация в Mathcad:
Реализация в 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;
}