Интерполяционный полином

На входе - набор узловых точек \({x_{i}}\), заданных своими координатами на плоскости и набор значений некоторой функции в этих точках: \({y_{i}}\). Задача состоит в том, что построить полином, график которого проходит через эти точки. Графически это продемонстрировано на рисунке. Красным цветом на рисунке выделены указанные точки с координатами из заданных исходных данных, а синяя линия - график, который построен с использованием интерполяционного полинома. В данном случае будет использован полинмо Лагранжа для интерполяции. Напомним, что интерполяцио́нный многочле́н Лагра́нжа — многочлен минимальной степени, принимающий данные значения в данном наборе точек. Подробнее о методе и полиноме можно прочитать тут. Здесь же интерполяционный поли­ном Лагранжа реализуем в виде метода класса для выполнения интерпо­ляции на основе данных, представленных в виде массивов-полей того же класса. Программный код приведен в следующем листинге.
#include 
#include 
using namespace std;
const int n=9;
class Interpol{
double psi(int i,double z){
double tmp=1;
int j;
for(j=0; j < i; j++) tmp*=(z-x[j])/(x[i]-x[j]);
for(j=i+1; j <= n; j++) tmp*=(z-x[j])/(x[i]-x[j]);
return tmp;}
public:
double x[n+1];
double y[n+1];
double Lagr(double z){
double s=0;
int i;
for(i=0; i <= n; i++) s+=y[i]*psi(i,z);
return s;
}
};
int main(){
int i;
double x;
Interpol obj;
for(i=0; i <= n; i++){
obj.x[i]=i;
obj.y[i]=i*(i-n/3)*(i-n+1)+0.001*(rand()%100-50);
cout << obj.y[i]<<" ";}
cout << endl;
do{
cout << "x = ";
cin >> x;
cout<<"L(x)=" << obj.Lagr(x) << endl;
}while(x >= 0&&x <= n);
return 0;}
Онлайн всего: 37
Гостей: 37
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте