Построение графика регрессии
Затем программа обращается к процедуре Koef, где решается система линейных уравнений, составленная на основе вычисленной матрицы коэффициентов в процедуре Matrix и вектора свободных членов, составленного в процедуре Vector, по методу Зейделя. Корни этой системы будут коэффициентами полинома. После решения системы на экран выводятся коэффициенты полинома и фраза: «Нажмите клавишу Enter». Для… Читать ещё >
Построение графика регрессии (реферат, курсовая, диплом, контрольная)
Построение графика регрессии
1. Анализ задания на курсовую работу
В данном случае необходимо решить задачу: разработать программу построения графика экспериментальных точек и полинома регрессии второй степени. Для расчета полинома необходимо применить уравнение полинома второй степени:
где а0, а1, а2 — коэффициенты полинома.
Чтобы рассчитать коэффициенты полинома нужно составить систему линейных уравнений, а затем её решить. Для решения системы применим метод Зейделя:
где, cj — элемент матрицы коэффициентов
bk — элемент вектора свободных членов.
Эту задачу можно выполнить в выбранной среде программирования Turbo Pascal. Данный язык позволяет реализовать ряд математических, тригонометрических функций.
При написании программы используются функции стандартных модулей CTR, GRAPH и встроенные процедуры OutТextXY, STR, языка TURBO PASCAL. В данной курсовой работе график будет строиться в декартовой системе координат.
2. Описание программы
2.1 Описание структуры программы
Данная программа состоит из процедур Koef, Vector, Matrix, Ozifr, Tochki, Polinom и функции, предназначенных для реализации поставленных целей.
Рассмотрим подробнее:
Работа программы начинается с процедуры Vector, которая составляет вектор свободных членов. В цикле от i:=1 до Nd и во вложенном в него цикле от k:=1 до m по формуле:
Sum:=Sum+exp (Ln (x[k])*(i-1))*y[k]
путем обращения к элементам массива данных происходит вычисление i-ого элемента вектора свободных членов.
Далее вызывается процедура Matrix. Она состоит из ряда циклов: от i:=1 до Nd и во вложенных в него циклах от j:=1 до Nd, k:=1 до m составляется матрица коэффициентов.
Расчет элементов матрицы производится по формуле:
Sum:=Sum+exp (Ln (x[k])*(i+j-2)).
Затем программа обращается к процедуре Koef, где решается система линейных уравнений, составленная на основе вычисленной матрицы коэффициентов в процедуре Matrix и вектора свободных членов, составленного в процедуре Vector, по методу Зейделя. Корни этой системы будут коэффициентами полинома. После решения системы на экран выводятся коэффициенты полинома и фраза: «Нажмите клавишу Enter». Для продолжения программы необходимо нажать клавишу «Enter». Следом рассчитывается дополнительные значения х, чтобы график полинома был плавной линией.
Инициализируется графический драйвер VGA и режим VGAHI. Далее определяется максимальное значение переменных MaхX, MaхY c помощью встроенных функций GetMaxX, GetMaxY. Следом определяется расстояние между линиями сетки по оси ОХ, ОY:
Rx:=(MaxX-L-P)/(Lin-1);
Ry:=(MaxY-V-N)/(Lin-1);
потом рассчитывается шаг значений х, у по оси ОХ, ОY
Spx:=(x[m] - x[1])/(Lin-1);
Spy:=(y[3] - y[1])/(Lin-1).
Затем происходит вывод подписей осей. Устанавливается цвет линий сетки серым SetColor (Lightgray). В цикле от i:=1 до Lin идет построение линий координатной сетки путём проведения линий.
Line (Round (L+Rx*(i-1)), MaxY-N, Round (L+Rx*(i-1)), V); Line (L, Round (MaxY-N-Ry*(i-1)), MaxX-P, Round (MaxY-N-Ry*(i-1))).
Затем вызывается процедура Ozifr, которая производит оцифровку осей. С помощью встроенной процедуры Str выражение
х[1]+Spx*(i-1)
преобразуется в строковый тип и получившиеся значения присваиваются переменной ss. Далее выравнивается текст, центрируется по горизонтали и вертикали. Затем выводится переменная ss с помощью встроенной процедуры OutTextXY в точку
(L+Round (Rx*(i-1)), MaxY-N+Tx).
Следом идет выравнивание текста для выводимых значений y. Текст выравнивается вправо относительно горизонтали и центрируется по вертикали. Затем выражение
y[1]+Spy*(i-1):3:1, ss
преобразуется с помощью процедуры Str в строковый тип, и получившиеся значения присваиваются переменной ss. Потом значение ss выводятся в точке
(L-Tx, MaxY-N-Round (Ry*(i-1)))
с помощью встроенной процедуры OutTextXY.
Затем происходит расчет коэффициентов связывающих значение x, y с координатами xx, yy
Zx:=(MaxX-L-P)/(x[m] - x[1]);
Zy:=(MaxY-V-N)/(y[3] - y[1]).
программа полином регрессия pascal
Далее вызывается процедура Tochki. В цикле от j:=1 до m происходит построение графика экспериментальных точек. Координаты точек вычисляются по формулам
xx[j]: =L+Round ((x[j] - x[1])*Zx);
yy[j]: =MaxY-N-Round ((y[j] - y[1])*Zy),
после по рассчитанным координатам проводится окружность с центром в точке (xx[j], yy[j]) и радиусом три пикселя. Потом идет процедура Polinom. В цикле от i:=1 до t происходит расчет точек для построения графика полинома по формулам
xx[i]: =L+Round ((xx1 [i] - xx1 [1])*Zx);
yy[i]: =MaxY-N-Round ((f (xx1 [i], a0, a1, a2) — y[1])*Zy),
где f - функция полинома регрессии второй степени, в неё передаются следующие параметры:
xx1 [i] - точки по которым происходит построение,
a0, a1, a2 — коэффициенты полинома.
Затем проверяется условие
If i=1 Then MoveTo (xx[i], yy[i]) Else LineTo (xx[i], yy[i]),
это означает, что если i=1 графический указатель перемещается в точку с координатами (xx[j], yy[j]), иначе проводится линия из текущего положения графического указателя в точку с координатами (xx[i], yy[i]). Затем ожидается нажатие клавиши «Enter» и завершение работы программы.
2.2 Описание работы программы
После запуска программы осуществляется инициализация графического режима.
Затем вызываются процедуры Vector и Matrix, в которых происходит составление вектора свободных членов и матрицы коэффициентов системы линейных уравнений.
Далее решение системы линейных уравнений, нахождение коэффициентов полинома в процедуре Koef.
Потом вывод коэффициентов полинома, инструкция к выводу графика на экран монитора и ожидание нажатие клавиши «Enter».
Расчёт дополнительных значений х для построения графика полиномиальной регрессии второй степени.
После расчета происходит инициализация графического режима с разрешением 640?480 пикселей, 16 цветов.
Затем расчёты расстояния между линиями сетки по оси OX и OY и шага значений х по оси OX и значений y по OY.
Потом вывод подписей осей и построение линий сетки.
Далее идет процедура Ozifr, в которой происходит оцифровка осей ОХ и OY, причем по оси ОХ будут откладываться значения х, а по оси OY значения у.
Рассчитываются коэффициенты связывающие значения х, у с координатами.
Затем построение графика точек экспериментальных данных и потом построение графика линии полинома регрессии, с помощью процедур Tochki и Polinom. Ожидание нажатие клавиши «Enter».
3. Блок-схемы алгоритмов
3.1 Блок-схема функции f
3.2 Блок-схема алгоритма процедуры Koef
3.3 Блок-схема процедуры Ozifr
3.4 Блок-схема процедуры Vector
3.5 Блок-схема процедуры Matrix
3.6 Блок-схема процедуры Tochki
3.7 Блок-схема процедуры Polinom
3.8 Блок-схема алгоритма основной программы
4. Листинг программы
Program POLINOM;
Uses CRT, GRAPH;
Const
e=0.1; {погрешность вычислений}
m=9; {количество значений x, y в таблице данных}
Nd=3; {порядок системы линейных уравнений}
t=60; {количество точек для полинома регрессии}
P=40; {отступ сетки справа, [pix]}
L=50; {отступ сетки слева, [pix]}
N=50; {отступ сетки снизу, [pix]}
V=50; {отступ сетки сверху, [pix]}
Lin=6; {число линий в сетке}
Ndp=20; {отступ для надписи, [pix]}
Tx=10; {отступ для текста, [pix]}
x:array [1.m] of extended=
(100,200,200,300,300,400,500,600,600); {табличные значения х}
y:array [1.m] of extended=
(8. 1,15. 3,16. 2,18. 5,17,13. 5,12. 3,11. 1,10.5);
{табличные значения у}
X1:array [1.Nd] of extended=(0,0,0); {начальные приближения корней системы}
VAR
b, {вектор свободных членов}
X2, {последующее значение корней системы}
Sum1: array [1.Nd] of extended; {сумма}
A:array [1.Nd, 1. Nd] of extended;
{матрица коэффициентов системы линейных уравнений}
xx, yy: array [1.t] of integer; {координаты x, y для построения графиков}
xx1:array [1.t] of extended; {новые значения координаты х}
k, i, j, d: integer; {индексы переменных}
Sum, Sum2, {суммы}
h, {шаг изменения х}
a0, a1, a2: extended; {коэффициенты полинома}
GrDriver, {графический драйвер}
GrMode:integer; {графический режим}
MaxX, MaxY: integer; {максимальное и минимальное значение координаты X, Y, [pix]}
Rx, Ry: extended; {расстояния между линиями сетки по оси X, Y, [pix]}
Spx, {шаг значений х по оси 0Х}
Spy:extended; {шаг значений y по оси 0Y}
ss:string; {строковая переменная}
Zx, Zy: extended; {коэффициенты для перехода в гр. режим}
{*********************** полином 2 степени ************************}
Function f (x, a0, a1, a2: extended): extended;
Begin
f:=a0+a1*x+a2*sqr (x);
End;
{***************вычисление вектора свободных членов ***************}
Procedure Vector;
Begin
For i:=1 to Nd do
Begin
Sum:=0;
For k:=1 to m do
Begin
Sum:=Sum+exp (Ln (x[k])*(i-1))*y[k];
End;
b[i]:=Sum;
End;
End;
{**************** вычисление матрицы коэффициентов ***************}
Procedure Matrix;
Begin
For i:=1 to Nd do
For j:=1 to Nd do
Begin
Sum:=0;
For k:=1 to m do
Begin
Sum:=Sum+exp (Ln (x[k])*(i+j-2));
End;
A [i, j]: =Sum;
End;
End;
{****************вычисление коэффициентов полинома ***************}
Procedure Koef;
Begin
Repeat
d:=0;
For i:=1 to Nd do
Begin
Sum:=0;
For k:=i to Nd do
Begin
Sum:=Sum+A [i, k]*X1 [k];
End;
Sum2:=0;
For k:=1 to i-1 do
Begin
Sum2:=Sum2+A [i, k]*X2 [k];
End;
Sum1 [i]: =Sum+Sum2-B[i];
X2 [i]: =X1 [i] - Sum1 [i]/A [i, i];
If Abs (X2 [i] - X1 [i])>E
Then d:=1;
X1 [i]: =X2 [i];
End;
Until d=0;
End;
{************************ оцифровка осей *************************}
Procedure Ozifr;
Begin
SetColor (White);
For i:=1 to Lin do
Begin
Str (x[1]+Spx*(i-1):3:1, ss);
SetTextJustify (CenterText, CenterText); {выравнивание текста}
OutTextXY (L+Round (Rx*(i-1)), MaxY-N+Tx, ss);
SetTextJustify (RightText, CenterText); {выравнивание текста}
Str (y[1]+Spy*(i-1):3:1, ss);
OuttextXY (L-Tx, MaxY-N-Round (Ry*(i-1)), ss);
End;
End;
{*************** построение экспериментальных точек ***************}
Procedure Tochki;
Begin
SetColor (Green);
For j:=1 to m d
Begin
xx[j]: =L+Round ((x[j] - x[1])*Zx);
yy[j]: =MaxY-N-Round ((y[j] - y[1])*Zy);
Circle (xx[j], yy[j], 3)
End;
End;
{****************** построение полинома регрессии *****************}
Procedure Polinom;
Begin
SetColor (Red);
For i:=1 to t do
Begin
xx[i]: =L+Round ((xx1 [i] - xx1 [1])*Zx);
yy[i]: =MaxY-N-Round ((f (xx1 [i], a0, a1, a2) — y[1])*Zy);
If i=1 Then MoveTo (xx[i], yy[i])
Else LineTo (xx[i], yy[i]);
End;
End;
{***********************Основная программа***********************}
Begin;
Clrscr;
Vector;
Matrix;
Koef;
Writeln (' Kоэффициенты полинома: ');
For i:=1 to Nd do
Writeln ('a', i-1,'=', x1 [i]: 3:10);
Writeln (' Нажмите клавишу Enter');
a0:=x1 [1]; a1:=x1 [2]; a2:=x1 [3];
Readln;
{*************** вычисление шага и увеличение числа х ***************}
h:=(x[m] - x[1])/(t-1);
For i:=1 to t do
xx1 [i]: =x[1]+h*(i-1);
{****************** инициализация гр. режима **********************}
GrDriver:=VGA;
GrMode:=VGAHi;
InitGraph (GrDriver, GrMode, '');
{****************************************************************}
MaxX:=GetMaxX;
MaxY:=GetMaxY;
Rx:=(MaxX-L-P)/(Lin-1); {расстояние между лин. сетки}
Ry:=(MaxY-V-N)/(Lin-1);
Spx:=(x[m] - x[1])/(Lin-1); {шаг коорд. x, y по осям оx, оy}
Spy:=(y[4] - y[1])/(Lin-1);
{***************** подпись осей и название графика *****************}
OutTextXY (MaxX-P, MaxY-N+Ndp-5,'x');
OutTextXY (L-23, V-Ndp+5,'y');
SetTextJustify (CenterText, TopText); {выравнивание текста}
{********************* построение линий сетки *********************}
SetColor (Lightgray);
For i:=1 to Lin do
Begin
Line (Round (L+Rx*(i-1)), MaxY-N, Round (L+Rx*(i-1)), V);
Line (L, Round (MaxY-N-Ry*(i-1)), MaxX-P, Round (MaxY-N-Ry*(i-1)));
End;
{*********************переход в граф. режим ***********************}
Ozifr;
Zx:=(MaxX-L-P)/(x[m] - x[1]);
Zy:=(MaxY-V-N)/(y[3] - y[1]);
Tochki;
Polinom;
Readln;
End.