Вы находитесь на странице: 1из 6

МОДЕЛИРОВАНИЕ ДВИЖЕНИЯ ПРОМЫШЛЕННОГО

Лаб
РОБОТА С ПРИМЕНЕНИЕМ ПРИКЛАДНЫХ ПРОГРАММ
№4
АСНИ

Цель работы: 1. Познакомиться с методами теории приближений, освоить программу


аппроксимации функции многочленом по методу наименьших квадратов.

Краткая теория
Аппроксимация - замена одних объектов другими (приближенными), в том или
ином смысле близкими к исходным.
В физических закономерностях между переменными действуют функциональные
связи, при которых каждому значению одной переменной х соответствует строго
определенное значение другой переменной, т.е. у = f(х).
Однако детерминированная функциональная зависимость на практике встречается
редко или, строго говоря, совершенно отсутствует, так как при измерении величин х и
у всегда имеются ошибки и влияния случайных факторов. При этом каждая из этих
величин может зависеть от одних и тех же или от разных случайных факторов.
Количественные оценки связи между величинами случайного процесса
устанавливает регрессионный анализ.
В общем случае, когда имеется результат каких-либо экспериментальных
исследований, заданный в виде таблицы, связь между переменными аппроксимируется
или интерполируется аналитическими зависимостями простейшего вида.
Под аппроксимацией понимается нахождение аналитического выражения
известного вида, которое максимально приближало бы данную функцию.
Интерполирование же предполагает нахождение выражения для функции,
заданной в табличной форме таким образом, чтобы получаемые по интерполяционной
формуле значения в точках, где задана исходная функция, совпадали со значениями
самой функции в тех же точках.
В инженерной практике часто возникает необходимость представить функцию,
заданную таблицей своих значений в конечном числе точек, в виде некоторой
аналитической зависимости. В качестве одного из возможных представлений может
быть использован интерполяционный многочлен Лагранжа, однако он не всегда
удобен для использования
Во-первых, запись его довольно громоздка, во-вторых, между узлами
интерполяции его значения могут сильно отклоняться от значений интерполируемой
функции. В-третьих, если таблица функции отражает результаты какого-то
эксперимента, и результаты эти получены с некоторой погрешностью, то ошибки
измерений неминуемо найдут свое отражение и в построенном интерполяционном
многочлене.
Поэтому на практике часто используют другой, в каком-то смысле более удобный
и точный способ приближения таблично заданной функции, называемый методом
наименьших квадратов.
Блок схема

Программа
uses crt,graph;
const
cp=4; {Задание степени аппроксимирующего полинома}
nt=20;{Задание количества точек}
type
m1=array[0..cp] of real;
var
a:array [0..cp] of m1;
b,xt:m1;
y1,x,y:array [0..(nt-1)] of real;
ip,i,jp,kp,imax:integer;
E,mx,my,maxy,r:real;
gd,gm:integer;
fd,fr:text;
begin
assign(fd,'apr_dan.dat');
assign(fr,'apr_rez.dat');
reset(fd);
rewrite(fr);
{Ввод исходных данных}
writeln('Введите координаты заданной функции x[i], y[i]');
writeln(fr, ' Исходные данные:');
for i:=0 to nt-1 do
begin
readln(fd,x[i],y[i]);
y[i]:=y[i]/10;
writeln(fr,' x[',i:2,']=', x[i]:6:3, ' y[',i:2,']=',y[i]:6:3);
end;
{Определение коэффициентов аппроксимирующего полинома}
for i:=0 to cp do
begin
b[i]:=0;
for jp:=0 to cp do
a[i,jp]:=0
end;
xt[cp]:=1;
for i:=0 to nt-1 do
begin
for jp:=cp-1 downto 0
do xt[jp]:=x[i]*xt[jp+1];
for kp:=0 to cp do
begin
b[kp]:=b[kp]+y[i]*xt[kp];
for jp:=0 to cp do
a[kp,jp]:=a[kp,jp]+xt[jp]*xt[kp]
end
end;
for ip:=0 to cp-1 do
begin
r:=abs(a[ip,ip]);
imax:=ip;
for jp:=ip+1 to cp do
if abs(a[jp,ip])>r then
begin
r:=abs(a[jp,ip]);
imax:=jp
end;
if imax<>ip then
begin
xt:=a[ip];
a[ip]:=a[imax];
a[imax]:=xt;
r:=b[ip];
b[ip]:=b[imax];
b[imax]:=r
end;
for jp:=ip+1 to cp do
begin
r:=a[jp,ip]/a[ip,ip];
for kp:=ip+1 to cp do
a[jp,kp]:=a[jp,kp]-r*a[ip,kp];
b[jp]:=b[jp]-r*b[ip]
end
end;
for ip:=cp downto 0 do
begin
r:=b[ip];
for jp:=ip+1 to cp do
r:=r-b[jp]*a[ip,jp];
b[ip]:=r/a[ip,ip]
end;
for i:=0 to nt-1 do
begin
r:=b[0];
for ip:=1 to cp do
r:=r*x[i]+b[ip];
y1[i]:=r
end;
clrscr;
{ Вывод результатов на экран и в файл }
writeln('Коэффициенты полиномa:');
writeln(fr,'Коэффициенты полиномa:');
for i:=0 to cp do
begin
writeln(b[i]:7:4); writeln(fr,b[i]:7:4);
end;
readln;
clrscr;
E:=0;
writeln(' Исходная ф-ция Полученная ф-ция');
writeln(fr,' Исходная ф-ция Полученная ф-ция');
for i:=0 to nt-1 do
begin
writeln(' ',y[i]:7:4,' -> ',y1[i]:7:4);
writeln(fr,' ',y[i]:7:4,' -> ',y1[i]:7:4);
E:=E+sqr(y[i]-y1[i]);
end;
writeln;
writeln('Сумма квадратов разностей Е=', E:10:6);
writeln(fr,'Сумма квадратов разностей Е=', E:10:6);
readln;
{ Построение графиков функций }
{ Включение графики }
gd:=0;
initgraph(gd,gm,'c:\tp_7_0\BGI');
{ Нахождение масштабов }
{ Масштаб по Х }
mx:=abs(getmaxx/2/x[nt-1]);
maxy:=abs(y1[0]);
for i:=1 to nt-1 do if abs(y1[i])>maxy then maxy:=abs(y1[i]);
for i:=0 to nt-1 do if abs(y[i])>maxy then maxy:=abs(y[i]);
{ Масштаб по Y }
my:=getmaxy/2/maxy;
{ Рисуем оси коордтнат }
line(0,round(getmaxy/2),getmaxx,round(getmaxy/2));
line(round(getmaxx/2),0,round(getmaxx/2),getmaxy);
{ Рисуем график исходной функции }
{ Цвет для исходной функции }
setcolor(10);
outtextxy(5,5,'-- График исходной функции');
moveto(round(getmaxx/2+x[0]*mx),round(getmaxy/2-y[0]*my));
for i:=1 to nt-1 do lineto(round(getmaxx/2+x[i]*mx),round(getmaxy/2-
y[i]*my));
moveto(round(getmaxx/2+x[0]*mx),round(getmaxy/2-y1[0]*my));
readln;
{ Рисуем график полученной функции }
{ Цвет для полученной функции }
setcolor(7);
outtextxy(5,15,'-- График полученной функции');
moveto(round(getmaxx/2+x[0]*mx),round(getmaxy/2-y1[0]*my));
for i:=1 to nt-1 do lineto(round(getmaxx/2+x[i]*mx),round(getmaxy/2-
y1[i]*my));
readln;
{ Закрытие графики }
closegraph;
close(fr);
close(fd);
end.
Вывод: были ознакомлены с методами теории приближений, освоили программу
аппроксимации функции многочленом по методу наименьших квадратов.