Разработка программы построения по данным заданной таблицы прямой линии регрессии и интерполяционного полинома Лагранжа

Страницы работы

Содержание работы

1.  Постановка задачи

Разработать программу построения по данным заданной таблицы прямой линии регрессии и интерполяционного полинома Лагранжа.

Результаты работы программы представить в виде значений параметров прямой, вычисленных методом наименьших квадратов, и таблицы расчетных значений для данных исходной таблицы. Кроме того, предусмотреть возможность диалога программы с внешним пользователем для расчета значений функции регрессии и полинома Лагранжа по введенному значению аргумента.

Х

1

3

6

7

2

4

12

15

5

9

Y

50

175

180

200

60

140

420

540

170

300

2.  Описание интерфейса программы

При запуске программы на экран выводится значения исходной таблицы, значения параметров a и b,посчитанных методом наименьших квадратов. Выводится новая таблица значений функции, которая подсчитана с помощью подставления х в уравнение линии регрессии (х подставляется из исходной таблицы). Затем программа запрашивает новое значение аргумента (не из таблицы) и подсчитывает значение функции с помощью уравнения линии регрессии и полинома Лагранжа.

3.  Описание алгоритмов решения задачи

Вычисление коэффициентов a и b в уравнении линии регрессии по формулам:

                                   ,

                                 ,

i, n – от 1 до 10

значение линии регрессии вычисляется по формуле:

                                                  y=a+bx

значение интерполяционного полинома Лагранжа вычисляется по формуле:

                                                     ,

где

              .

Значение аргумента х, вводится с клавиатуры.

4.  Текст программы

#include<iostream>

using namespace std;

void main()

{

      int x[10]={1,3,6,7,2,4,12,15,5,9},//64

            y[10]={50,175,180,200,60,140,420,540,170,300},

            n(10),i,j;//2235

      double y_new[10],a,b,c,d,x1(0),y1(0),x2(0),xy(0),

            ch(0),y_end(0),x_end(0);

      //Вывод начальных векторов x и y

      cout<<"  Ha4a/|bHbIe DaHHbIe: "<<endl<<"x = ";

      for (i=0;i<10;i++)

            cout<<x[i]<<" ";

      cout<<endl<<"y = ";

      for (i=0;i<10;i++)

            cout<<y[i]<<" ";

      cout<<endl;

      //промежуточный рассчет сумм xi,xi^2,yi,xi*yi

      for (i=0;i<10;i++)

      {

            x1+=x[i];

            x2+=x[i]*x[i];

            y1+=y[i];

            xy+=x[i]*y[i];

      }

      //Рассчет a и b

      a=(y1*x2-x1*xy)/(n*x2-x1*x1);

      cout<<"a = "<<a<<endl;

      b=(n*xy-x1*y1)/(n*x2-x1*x1);

      cout<<"b = "<<b<<endl;

      //Рассчет нового вектора y(y_new)

      cout<<"HoBbIe y: "<<endl;

      for (i=0;i<9;i++)

      {

            y_new[i]=a+b*x[i];

            cout<<y_new[i]<<" ";

      }

      cout<<endl;

      //Просчет новых y

      cout<<"  XoTuTe IIoc4uTaTb y, IIpu  HoBoM x???"<<endl<<

            "    IIPuwJIu sms Ha HoMeP 3434 s IIoMeTKou Xo4y"<<endl;

      cin>>ch;

      if (ch==1)

      {

            cout<<"  BBeDuTe X.."<<endl;

            cin>>x_end;

            cout<<"  MaJIoBaT Pa3MeP4uK..)"<<endl;

            y_end=a+b*x_end;

            cout<<"y=a+b*x; y="<<y_end<<endl;

            for (int k=0; k<10; k++)

            {

                  c=1;

                  d=1;

                  for(i=0;i<10;i++)

                        if (i!=k)

                              c=(x_end-x[i]);

                  for(j=0;j<10;j++)

                        if (j!=k)

                              d*=(x[k]-x[j]);

                  y_end+=(y[k]*c/d);

            }

            cout<<"  3Ha4eHue uHTePIIoJI9c,uoHHoro IIoJIuHoMa:"<<endl;

            cout<<y_end<<endl;

      }  

      system("pause");

}

Похожие материалы

Информация о работе