Программирование и основы алгоритмизации

Федеральное агентство образования Российской Федерации

Тульский государственный университет

Кафедра «Системы автоматического управления»













ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе по дисциплине

«Программирование и основы алгоритмизации».











Разработал студент группы 120161

Матях Р.И.

Проверил доцент кафедры САУ:

Илюхин А. С.















Тула 2007 г.


ЗАДАНИЕ



По заданной структурной схеме САУ составить систему ДУ, описывающих её функционирование.

Разработать программу на языке Pascal для решения этой системы методом Эйлера.

Разработать программу на языке Pascal для построения графиков переходных процессов.

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


Общий вид функциональной схемы САУ





z

УУП

ИУ

ОУ

УОС



Обозначения:

 СУ – суммирующее устройство;

 УУП – устройство усиления и преобразования;

 ИУ – исполнительное устройство;

 ОУ – объект управления;

 УОС – устройство обратной связи;

 g – управляющее воздействие;

 έ – сигнал рассогласования;

 u – сигнал на выходе УУП;

 α – координата исполнительного органа исполнительного устройства;

 y – регулируемая величина;

z – сигнал обратной связи.

Варианты УУП:

1. Пропорциональный регулятор





K1



2. Пропорциональный интегральный регулятор





K1

1/(T1*p)



3. Пропорциональный дифференциальный регулятор





K1

K1

1/(T2*p)



4.Интегрально-дифференциальный регулятор





1/(T1*p)

K2

1/(T2*p)



5. Пропорциональный интегрально-дифференциальный регулятор





K1

1/(T1*p)

K2

1/(T2*p)



Варианты схем исполнительных механизмов:

1. Двигатель постоянной скорости





1/(T3*p)



2. Автоматический привод





1/(T3*p)

K3



3. Автоматический привод





K3/(T3*p+1)



Варианты объектов управления:

W(p)=K4/((T4*p+1)*(T5*p+1)*(T6*p+1))

W(p)=K4/(T42*p2+2*η*T4*p+1)

W(p)=K4/(p*(T4*p+1)*(T5*p+1))

W(p)=K4/(p*(T42*p2+2*η*T4*p+1))

W(p)=K4/((T4*p+1) (T52*p2+2*η*T5*p+1))

W(p)=K4/((T4*p+1)*(T5*p+1))

W(p)=K4/(p*(T4*p+1))

Передаточная функция:

W(p)=K6 


1. Решение дифференциальных уравнений методом Эйлера



1.1 Описание метода



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

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

Пусть задано дифференциальное уравнение первого порядка с начальным условием (задача Коши)

dy/dx=F(x,y), (1)

У(x0) = Уо (2)

где F(x,y) – заданная функция двух переменных x и у, x0, у0 – известные числа. Требуется определить функцию у = у(x) при х=>x0. Уравнение (1) можно рассматривать как задание кривой через ее производную в координатной плоскости x, у, поскольку известно как вычислить производную в каждой точке этой кривой через ее координаты. В общем случае уравнению (1) удовлетворяет целое семейство кривых; начальное условие (2) позволяет выбрать из этого семейства одну определенную кривую, которая проходит через заданную точку x0, y0.

Для численного решения (1), (2) заменим область непрерывного изменения аргумента х дискретным множеством точек, т.е. введем сетку. Положим, что величина х изменяется от значения х=x0 до значения х=b. Тогда, рассматривая равномерную сетку, получаем узловые точки x0, x1,… xk,…b, находящиеся на расстоянии h друг от друга, т.е.

xk+1 - xk= h, 	k =0,1... , (3)

где h – шаг сетки. Соответствующие значения функции будем обозначать уk, т.е.

yk=y*(xk).

Здесь у* (х) – функция, которая является приближенным решением (1), (2). Для получения численного решения, дифференциальное уравнение (1) заменяется уравнениями относительно значений функций у*(x) в узловых точках. Эти уравнения называются разностными. Простейшее разностное уравнение для (1) имеет вид

 (yk+1-yk)/h=F(xk, yk) k=0,l ,... , (4) 

Уравнение (4) следует из (1), если производную dy/dx приближенно представить через значения функции у(x) в соседних узлах.

Соотношения (2.12.4) можно записать в виде

Yk+1=yk+h*F(xk,yk). (5)

Тогда, учитывая (2), с помощью формулы (5) можно последовательно определить значения у1,y2,.… Этот метод приближенного решения (1), (2) называется методом Эйлера. Геометрическая интерпретация этой схемы дана на рис.1, где изображено поле интегральных кривых. Использование только первого члена формулы Тейлора означает движение не по интегральной кривой, а по касательной к ней. На каждом шаге мы заново находим касательную; следовательно, траектория движения будет ломаной линией. Из-за этого метод Эйлера иногда называют методом ломаных.





Рис.1



Доказывается, что если шаг сетки h стремится к нулю, то приближенное решение, определяемое (5), стремится к точному решению (1), (2), т.е. имеется факт сходимости приближенного решения к точному при h 0. Однако в условиях реальных вычислений на компьютере при конечном шаге целесообразно знать насколько полученное приближенное решение близко к точному. В качестве меры отклонения (нормы ошибки) часто используют величину

y= max| y(xk) – yk|. (6)

Здесь у(х) — строгое решение (1), (2), yk — приближенное значение искомой функции в узловых точках xk, полученное путем решения разностных уравнений, например (4).

Для разностных уравнений величина y оценивается формулой

yChm (7)

Здесь С —const, зависящая от длины отрезка, на котором ищется решение, и способа дискретизации (1) , m – параметр, который называется порядком точности решения. Порядок точности метода Эйлера - минимальный, т.е. т = 1, что связано с довольно грубым способом аппроксимации дифференциального уравнения разностным. Как правило, чем выше порядок точности, тем более предпочтительным является численный метод.

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

Max| (y(xk+1)-y(xk))/h-f(xk,y(xk))|<=Chm

где С - const, т — порядок аппроксимации разностного уравнения.

Сравнение (1) и (4) показывает, что метод Эйлера имеет первый порядок аппроксимации, так же как и точность решения. Однако в общем случае утверждение о равенстве порядков точности решения и аппроксимации разностного уравнения не является очевидным и требует доказательства. Метод Эйлера является одним из самых старых и широко известных методов численного решения дифференциальных уравнений. К сожалению, этот метод может приводить к недопустимо большим ошибкам, а кроме того, он часто оказывается неустойчивым — малая ошибка (происходящая при округлении или из-за неточности исходных данных) существенно увеличивается с ростом х.



1.2 Программная реализация метода Эйлера



Программа для решения дифференциальных уравнений состоит из трех частей:

Главная программа.

Процедуры, реализующие метод Эйлера.

Процедуры вычисления правых частей.

Процедура вычисления правых частей R имеет вид:

 procedure R( var y0,F: mass);

 begin

 F[1]:=y0[2];

 F[2]:=(ft-k2*y0[2]-k1*y0[1])/Mm

 end; 

где:

F – массив значений правых частей системы, приведенной к нормальной форме Коши; 

y0 – массив значений начальных условий системы;

k1,k2 … kn – коэффициенты;

ft – f(t), т.е. сигнал (воздействие), подаваемый на вход системы;

Процедура, реализующая метод Эйлера:

procedure Eu(var t0,t,h: real; var m:integer; var y0,y:mass);

 var i: integer;

 begin

 R(y0,F);

 for i:=1 to m do

 y[i]:=y[i]+h*F[i];

 t:=t+h;

 end;

 где: 

t0,tk – начальное и конечное значение времени;

m – порядок системы;

h – шаг сетки;

После задания всем переменным определенных значений происходит последовательное вычисление значений функции

while t0<=tk do

 begin

 Eu(t0,t,h,g,y0,y);

 writeln(t,y[1],y[2]);

 for i:=1 to g do

 y0[i]:=y[i];

 end;

readln;

 end.

Для приведённой выше схемы составим систему дифференциальных уравнений:

Выразим неизвестные величины через данные начальных условий

1.  Но 

 Итак, 





2. Аналогично



3. 

4. 

5. Пусть 



тогда 

Таким образом имеем систему из пяти дифференциальных уравнений:



Итак, составим программу для решения дифференциальных уравнений и построения графиков переходных процессов.

Сначала сделаем некоторые переобозначения:

F — массив значений правых частей

F[1]=dZ1/dt

F[2]=X6

F[3]=dα/dt

F[4]=dX4/dt

F[5]=dX6/dt

Y0 — начальные значения переменных системы уравнений

Y — массив переменных системы уравнений

Y[1]=Z1

Y[2]=X5

Y[3]= α

Y[4]=X4

Y[5]=X6


2. Листинг программы



Входные параметры:

* T0 * 0

* TK * 30

* h * 0.01

* Y0 * 0 0 0 0 0

* T * 1 2 1 1 1

* k * 1 1 1 1 1

* g * 1

* n * 0.5

********



2.1. Главная программа



program Eler;

uses mdd, graph; 

 begin

 start(ymin,ymax,t0,tk,t,k1,k2,k3,k4,t1,t2,t3,h,g,y0,y);

 output1;

 while t<=tk do

 begin

 Eu(g,k1,k2,k3,k4,k6,t1,t2,t3,t4,d,t,h,m,y0,F,y,Gr);

 abc (Gr, ymin, ymax);

 output(t,y)

 end;

 readln;

 begline;

 start2(t0,t,y0,y);

 top(ymin,ymax,t0,tk,shg,hi,bx,by);

 while t<=tk do

 begin

 Eu(g,k1,k2,k3,k4,k6,t1,t2,t3,t4,d,t,h,m,y0,F,y,Gr);

 draw(Gr,t,shg,hi,bx,by,h);

 end;

 finish(t0,tk,ymin,ymax,shg,hi,bx,by);

 readln

 end.



2.2. Модуль



unit MDD;

interface {описание структуры программы}

uses graph;

const m=5;

 m2=5;

type mass=array [1..m] of real; {массив дифференциалов}

 mass2=array [1..m2] of real; {массив переходных процессов}

var

 y0, y, F: Mass;

 Gr: Mass2;

 f1,e: text;

 i,grdriver,grmode:integer;

 g,n,u4,k3,k4,t1,t2,t3,T4,T5,d,k6,k1,k2,h,ymin,ymax,t0,tk,t, shg,hi,bx,by,i1:real;

 s:string[8];

procedure start(var ymin, ymax,t0, tk, t,k1,k2,k3,k4,t1,t2, t3,h,g:real;var y0,y:mass);

procedure start2(var t0,t: real; var y0,y: mass);Procedure Eu (var g,k1, k2,k3,k4,t1,t2,t3, u4, k, d, t, h: real; m:integer; var y0, F, y: mass; var Gr: mass2);

Procedure R (var y0, F: mass; g,k1,k2,k3,k4,k6,t1,t2,t3,t4,n: real);

procedure graphiks(var Gr: mass2; y, y0: mass; g,k1,k2,k3,k4,k6,T1,T2,T3,T4,n: real);

procedure begline;

procedure abc (Gr: mass2; var ymin,ymax:real);

procedure top(ymin,ymax,t0,tk: real; var shg,hi,bx,by: real);

procedure draw(Gr: mass2; t,shg,hi,bx,by,h: real);

procedure finish(t0,tk,ymin,ymax,shg,hi,bx,by: real);

procedure output1;

procedure output(t: real; y: mass);

implementation

procedure start(var ymin,ymax,t0,tk,t,k1,k2,k3,k4,t1,t2,t3,h,g:real;var y0,y:mass); {начальные присвоения}

 begin

 assign (f1, 'C:\nu.txt');

 assign (e, 'C:\Result.txt');

 reset (f1);

 readln(f1);



{чтение данных из файла} readln(f1);

 readln(f1,s, T0);

 readln(f1,s, TK);

 readln(f1,s, h);

 read(f1,s);

 for i:=1 to m do begin

 read(f1, y0[i]);

 y[i]:=y0[i];

 end;

 readln(f1);

 readln(f1, s, t1, t2, t3, t4, t5);

 readln(f1,s, k1, k2, k3, k4, k6);

 readln(f1,s, g);

 readln(f1,s, n);

 ymin:=y0[1];

 ymax:=y0[1];

 T:=t0;

 close(f1);

 end;

procedure start2(var t0,t: real; var y0,y: mass); 
{начальные присвоения2}

 begin

 reset (f1);

 readln(f1);

 readln(f1);

 readln(f1);

 readln(f1);

 readln(f1);

 read(f1,s);

 for i:=1 to m do begin

 read(f1, y0[i]);

 y[i]:=y0[i];

 end;

 close(f1);

 T:=t0;

 end;

Procedure Eu (var g,k1, k2,k3,k4,t1,t2,t3, u4, k, d, t, h: real; m:integer; var y0, F, y: mass; var Gr: mass2);





 var i: integer;

begin

 R (y0,F,g,k1,k2,k3,k4,k6,T1,T2,T3,T4,n);

 for i:=1 to m do for i:=1 to m do

 y[i]:=y0[i]+h*F[i];

 graphiks(Gr,y,y0,g,k1,k2,k3,k4,k6,T1,T2,T3,T4,n);

 t:=t+h;

 for i:=1 to m do

 y0[i]:=y[i];

end;

Procedure R (var y0, F: mass; g,k1,k2,k3,k4,k6,T1,T2,T3,T4,n: real);

begin



{вычисление правых частей} F[1]:=((g-y0[2]*k6-y0[1])*k2)/T2;

 F[2]:=y0[5];

 F[3]:=(k3*(y0[1]+y0[2])-y0[3])/T3;

 F[4]:=(k4*y0[1]-y0[4])/T4;

 F[5]:=(y0[4]-2*n*T5*y0[5]-y0[2])/(T5*T5);

end;

 procedure graphiks(var Gr: mass2; y, y0: mass; g,k1,k2,k3,k4,k6,T1,T2,T3,T4,n: real);



{вычисление переходных процессов} begin

 Gr[1]:=g-k6*y[2];

 Gr[2]:=(g-y[2]*k6y[1])*k2+k1*(g-y[2]*k6);

 Gr[3]:=y[3];

 Gr[4]:=y[2];

 Gr[5]:=y[2]*k6;

end;

 procedure begline;

 begin

 grdriver:=detect;

 initgraph(grdriver, grmode, 'd:\bp\bgi');



{инициализация графики; прорисовка фона} setfillstyle(1,11);

bar(0,0,640,480);

 setcolor(15);

rectangle(40,460,600,40);

 i:=40;

while i<600 do

 begin

 setcolor(15);

 line(i,40,i,460);

i:=i+56;

 end;

i:=40;

while i<460 do

 begin

 line(40,i,600,i);

 i:=i+42

 end;

 end;

procedure abc (Gr: mass2; var ymin,ymax: real);



{поиск наименьшего и наибольшего значений по оси Y} begin

 for i:=1 to m2 do begin

 if ymin>Gr[i] then ymin:=Gr[i];

 if ymax<Gr[i] then ymax:=Gr[i];

 end;

 end;

procedure top(ymin,ymax,t0,tk: real; var shg,hi,bx,by: real);



{задание масштаба координатной сетки } begin

 shg:=560/(tk-t0);

 hi:=420/(ymax-ymin);

 bx:=600-tk*shg;

 by:=440-ymax*hi;

 end;

procedure draw(Gr: mass2; t,shg,hi,bx,by,h: real);

 {процедура построения графиков}

begin

for i:=1 to m2 do begin

moveto(round((t-h)*shg+bx),round(GetMaxY-Gr[i]*hi-by));

SetColor(11+i);

SetLineStyle(0,1,3);

lineto(trunc(t*shg+bx),trunc(GetMaxY-Gr[i]*hi-by));

end;

 end;

procedure finish(t0,tk,ymin,ymax,shg,hi,bx,by: real);

 begin

 setfillstyle(1,11);

 bar(40,475,600,461);

 setfillstyle(1,11);

 bar(40,5,635,39);

setfillstyle(1,15);

setcolor(12);

SetLineStyle(0,1,3);

setcolor(5);

 i1:=t0;

 while i1<=tk do

 begin

 str(i1:5:2,s);

 settextstyle(0,0,1);

 outtextxy(round(i1*shg+bx)-10,GetMaxY-30,s);

 i1:=i1+(tk-t0)/10;

 end;

 setcolor(12);

line(50,30,60,30);

settextstyle(0,0,2);

outtextxy(70,20,'E');

setcolor(13);

line(170,30,180,30);

outtextxy(190,20,'U');

setcolor(14);

line(280,30,290,30);

outtextxy(300,20,'A');

setcolor(15);

line(390,30,400,30);

outtextxy(410,20,'Y');

setcolor(16);

line(500,30,510,30);

outtextxy(520,20,'Z');

setcolor(4);

settextstyle(1,0,2);

outtextxy(round(i1*shg+10),getMaxY-40,'T(c)');

setcolor(5);

i1:=ymin;

 while i1<=ymax do

 begin

 str(i1:5:3,s);

 settextstyle(0,0,1);

 outtextxy(10,round(GetMaxY-i1*hi-by),s);

 i1:=i1+(ymax-ymin)/10;

 end;

setfillstyle(1,1);

bar(0,0,5,480);

bar(0,0,640,5);

bar(640,0,635,480);

bar(640,480,5,475);

 end;

Procedure output1; 

begin

 rewrite(e);

 writeln(e,' Результаты решение системы ДУ');

writeln(e,'****************************************************');

writeln(e,'* T (c) * D(z1) * D(x5) * D(A) * D(x4) * D(x6) *');

writeln(e,'***************************************************');

writeln(' Результаты решение системы ДУ');

writeln('*****************************************************');

 writeln('* T (c) * D(z1) * D(x5) * D(A) * D(x4) * D(x6) *');

writeln('*****************************************************');

 end;

procedure output(t: real; y: mass); {Вывод на экран результатов решения системы уравнений и их запись во внешний файл}

begin

 write (e, t:3:2,' ');

 write (t:3:2,' ');

 for i:=1 to m do begin write (e, y[i]:5:4,' ');

 write (y[i]:5:4,' '); end;

 writeln(e);

 writeln

 end;

END.


3. Графики переходных процессов



Зависимость сигнала на выходе УУП от времени





Зависимость сигнала рассогласования от времени





Зависимость от времени координаты исполнительного органа ИУ





Регулируемая величина





График сигнала обратной связи





Общий вид решения



4