МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
“ЛЬВІВСЬКА ПОЛІТЕХНІКА”
АВТОМАТИЗОВАНІ СИСТЕМИ УПРАВЛІННЯ
Лабораторна робота №1
ОПТИМАЛЬНЕ КЕРУВАННЯ ПРОЦЕСАМИ З ЗАСТОСУВАННЯМ
МЕТОДУ ЛІНІЙНОГО ПРОГРАМУВАННЯ
Мета роботи
Вивчення і застосування методу лінійного програмування для рішення задач оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями.
Хід роботи
ознайомитися з теоретичними зведеннями і прикладами використання методу лінійного програмування для рішення задач оптимального керування;
представити цільову функцію і систему обмежень у вигляді функцій змінних керування шляхом заміни змінних стану змінних керування;
скласти програму рішення задачі на мові delphi
вивести на друк максимальне і мінімальне значення цільової функції, значення змінних керування;
Індивідуальне завдання
Варіант 1
Цільова функція
Модель процесу
Обмеження
Код програми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label2: TLabel;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Label3: TLabel;
Label4: TLabel;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Label5: TLabel;
Edit10: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit11: TEdit;
Edit12: TEdit;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Edit13: TEdit;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Button4: TButton;
DBMemo1: TDBMemo;
DBMemo2: TDBMemo;
Label18: TLabel;
DBMemo3: TDBMemo;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
mfx:array [1..3] of integer;
mcy:array [1..2] of integer;
msr:array [1..2] of integer;
x:array [1..20] of Extended;
y:array [1..20] of Extended;
xn:array [1..20] of Extended;
yn:array [1..20] of Extended;
o1:array [1..40] of integer;
o2:array [1..40] of integer;
mob:array [1..20,1..5] of integer;
mobr:array [1..20,1..4] of integer;
n,i,j,z,k,g,g1,g2,f,b,k1,p,nb,q,bn:integer;
max,min: Extended;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
mfx[1]:=strtoint(edit1.Text);
mfx[2]:=strtoint(edit2.Text);
mfx[3]:=strtoint(edit3.Text);
mcy[1]:=strtoint(edit4.Text);
mcy[2]:=strtoint(edit5.Text);
n:=strtoint(edit6.Text);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
i:=i+1;
mob[i][1]:=strtoint(edit7.Text);
mob[i][2]:=strtoint(edit8.Text);
mob[i][3]:=strtoint(edit9.Text);
mob[i][4]:=strtoint(edit10.Text);
if edit13.Text='>' then mob[i][5]:=0
else mob[i][5]:=1;
edit7.Text:='';
edit8.Text:='';
edit9.Text:='';
edit10.Text:='';
edit13.Text:='';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
p:=0;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
i:=1;
j:=0;
k:=0;
msr[1]:=mfx[3]*mcy[1]+mfx[1];
msr[2]:=mfx[3]*mcy[2]+mfx[2];
for i:=1 to n do
begin
if mob[i][1]=0 then
begin
mobr[i][1]:=mob[i][2];
mobr[i][2]:=mob[i][3];
mobr[i][3]:=mob[i][4];
mobr[i][4]:=mob[i][5];
end
else
begin
mobr[i][1]:=mob[i][1]*mcy[1]+mob[i][2];
mobr[i][2]:=mob[i][1]*mcy[2]+mob[i][3];
mobr[i][3]:=mob[i][4];
mobr[i][4]:=mob[i][5];
end;
end;
z:=1;
k:=1;
for i:=1 to n-1 do
begin
z:=z+1;
for j:=z to n do
begin
g:=mobr[i][1]*mobr[j][2]- mobr[i][2]*mobr[j][1];
g1:=mobr[i][3]*mobr[j][2]-mobr[j][3]*mobr[i][2];
g2:= mobr[j][3]* mobr[i][1]- mobr[j][1]*mobr[i][3];
x[k]:=g1/g;
y[k]:=g2/g;
o1[k]:=i;
o2[k]:=j;
k:=k+1;
end;
end;
k:=k-1;
b:=1;
nb:=n;
i:=1;
while(k<>0) do
begin
f:=0;
while (n+1<>i) do
begin
if mobr[i][4]=0 then
begin
if ((mobr[i][1]*x[k])+(mobr[i][2]*y[k]))>=mobr[i][3] then i:=i+1
else
begin
f:=1;
i:=i+1;
end;
end;
if mobr[i][4]=1 then
begin
if ((mobr[i][1]*x[k])+(mobr[i][2]*y[k]))<=mobr[i][3] then i:=i+1
else
begin
f:=1;
i:=i+1;
end;
end;
end;
if f=0 then
begin
xn[b]:=x[k];
yn[b]:=y[k];
b:=b+1;
end;
k:=k-1;
// n:=nb;
i:=1;
end;
b:=b-1;
bn:=b;
max:=(msr[1]*xn[b])+(msr[2]*yn[b]);
min:=(msr[1]*xn[b])+(msr[2]*yn[b]);
b:=b-1;
while b<>0 do
begin
if ((msr[1]*xn[b])+(msr[2]*yn[b]))>max then max:=((msr[1]*xn[b])+(msr[2]*yn[b]));
if ((msr[1]*xn[b])+(msr[2]*yn[b]))<min then min:=((msr[1]*xn[b])+(msr[2]*yn[b]));
b:=b-1;
end;
edit11.Text:=FloatToStr(max);
edit12.Text:=FloatToStr(min);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
dbmemo1.Lines.Clear;
dbmemo2.Lines.Clear;
dbmemo3.Lines.Clear;
while bn<>0 do
begin
dbmemo1.Lines.Add(floattostrF (xn[bn],ffGeneral, 2, 2));
dbmemo2.Lines.Add(floattostrF (yn[bn],ffGeneral, 2, 2));
dbmemo3.Lines.Add(floattostrF ((msr[1]*xn[bn]+msr[2]*yn[bn]),ffGeneral, 5, 3));
bn:=bn-1;
end;
end;
end.
Результати роботи
Графік
Висновок: На даній лабораторній роботі я навчився запрограмовувати задачі оптимального керування, у яких цільова функція, модель процесу й обмеження є лінійними функціями. Програмно будувати їх графік, та визначати деякі максимальні і мінімальні точки