Рис. 5.3. Вводимые параметры
Рис. 5.4. График переходной характеристики
tp = 31.6 c.
Рис. 5.5. Структурная схема модели ОСАУ для импульсной характеристики
Рис. 5.6. Вводимые параметры
Рис. 5.7. График импульсной характеристики
tp = 19,6 c.
В теоретической части курсового проекта были рассмотрены методы поиска безусловного экстремума функции (методы прямого поиска, градиентные методы, методы второго порядка) и методы поиска экстремума функции при наличии ограничений (методы возможных направлений, методы проекции градиента, методы линеаризации, методы штрафов), указаны их основные достоинства и недостатки.
На примере были рассмотрены 2-а градиентных метода поиска безусловного экстремума функции. Метод "Наискорейшего спуска" и метод "Сопряженных направлений", где второй показал много большую скорость сходимости, в чем и заключается его преимущество. Оба метода на порядок быстрее, чем "прямой поиск" так как шаг приближения, пересчитывается на каждой итерации.
Метод "Симплексных процедур" является лучшим выбором, при нахождении экстремумов нелинейной функции, в условиях ограничений типа неравенств. Его достоинство – не сложность подсчетов и точность, подкреплённая теоремой Лагранжа. Минус – много вычислений.
На языке программирования высшего уровня Delphiреализованы алгоритмы вышеназванных методов.
С помощью принципа максимума Понтрягина был выполнен синтез оптимальной по быстродействию системы для объекта
, также была разработана модель ОСАУ для данного объекта. С применениемпрограммногопродукта"20-sim Pro 2.3" было проведено исследование и сняты переходная характеристика (tp = 31.6 c) и импульсная характеристика (tp = 19,6 c). Метод показал прекрасные показатели регулирования.1. Акулич И. Л. Математическое программирование в примерах и задачах. – М: Высшая школа, 1986.
2. Болтянский В. Г. Математические методы оптимального управления. – М: Наука, 1969.
3. Иванов В. А., Фалдин Н. В. Теория оптимальных систем автоматического управления. – М: Наука, 1981.
4. Чураков Е. П. Оптимальные адаптивные системы. – М: Энергоатомиздат, 1987.
5. Пупков К.А., Егупов Н.Д., Методы классической и современной теории автоматического управления: Учебник в 5-и тт.; 2-е изд., - М.: Издательство МГТУ им. Н.Э. Баумана, 2004. - 742 с.
6. Гудвин Г. К., Гребе С. Ф., Сальгадо М. Э., Проектирование систем управления: ИздательствоБином. Лаборатория знаний, 2004. 911 c.
unit all_methods;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DB, IBDatabase, Grids, DBGrids, DBCtrls, Mask,
ADODB, ComCtrls;
type
Vector = array[1..3] of Double;
Matrix = array[1..3] of Vector;
Mass = array[1..10] of Double;
TFMain = class(TForm)
EX: TEdit;
EY: TEdit;
EZ: TEdit;
LX: TLabel;
LY: TLabel;
LZ: TLabel;
BGauss: TButton;
EK: TEdit;
LK: TLabel;
MIter: TListBox;
LFxy: TLabel;
Label2: TLabel;
BClear: TButton;
BSpusk: TButton;
Label11: TLabel;
RBMin: TRadioButton;
RBMax: TRadioButton;
Label13: TLabel;
Label14: TLabel;
EXb: TEdit;
EYb: TEdit;
EU: TEdit;
Label15: TLabel;
GBIn: TGroupBox;
GBOut: TGroupBox;
GBControl: TGroupBox;
BExit: TButton;
BSopr: TButton;
DBGMain: TDBGrid;
DSMain: TDataSource;
EA: TDBEdit;
DBNavigator1: TDBNavigator;
DataSetMain: TADODataSet;
Conn: TADOConnection;
EB: TDBEdit;
EC: TDBEdit;
ED: TDBEdit;
EE: TDBEdit;
EF: TDBEdit;
EX0: TDBEdit;
EY0: TDBEdit;
Im: TImage;
Label18: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
RBx: TRadioButton;
RBy: TRadioButton;
Label10: TLabel;
ESkor: TEdit;
Label19: TLabel;
BSimplex: TButton;
GBConstr: TGroupBox;
LC1: TLabel;
LC3: TLabel;
LC2: TLabel;
EVar: TDBEdit;
GridBox: TGroupBox;
GrapfBox: TGroupBox;
LC10: TLabel;
LC20: TLabel;
LC30: TLabel;
LC40: TLabel;
LC4: TLabel;
Q: TADOQuery;
SaveZnak: TButton;
BStop: TButton;
procedure BGaussClick(Sender: TObject);
procedure BSpuskClick(Sender: TObject);
procedure BExitClick(Sender: TObject);
procedure BSoprClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EVarChange(Sender: TObject);
procedure BSimplexClick(Sender: TObject);
procedure LC10Click(Sender: TObject);
procedure LC20Click(Sender: TObject);
procedure LC30Click(Sender: TObject);
procedure LC40Click(Sender: TObject);
procedure GaussSystem(N:Integer);
procedure Zapoln();
procedure ZnakConstrain();
procedure SaveZnakClick(Sender: TObject);
procedure Clear();
procedure BClearClick(Sender: TObject);
procedure BStopClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FMain: TFMain;
xr, yr: Word; // координаты центра окружности
dr: byte;
a, b, c, d, e, f:Double; //
Am : array[1..4,1..2] of Double;
Bm : array[1..4] of Double;
Fm : Mass;
Xm, Ym : array[1..10] of Double;
znak1, znak2, znak3, znak4, nomer:Integer;
_BoolStop:Boolean;
implementation
{$R *.dfm}
Function fz(x, y, a, b, c, d, e, f : Double) : Double;
begin
Result := a*x*x+2*b*x*y+c*y*y+2*d*x+2*e*y+f;
end;
//---------------------------------------------
Function xi(y, b, d, a : Double) : Double;
begin
Result := -(b*y+d)/a;
end;
//---------------------------------------------
Function yi(x, b, e, c : Double) : Double;
begin
Result := -(b*x+e)/c;
end;
//---------------------------------------------
Function dx(x, y, b, d, a : Double) : Double;
begin
Result := 2*a*x+2*b*y+2*d;
end;
//---------------------------------------------
Function dy(x, y, b, e, c : Double) : Double;
begin
Result := 2*b*x+2*c*y+2*e;
end;
procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= dwMilliseconds;
end;
procedure Ris;
Var ImW, ImH, sm, sm2, k, sm3, sm4, step :Integer;
begin
with FMain do
try
ImW:=Im.Width;
ImH:=Im.Height;
Im.Canvas.Pen.Width:=1;
Im.Canvas.Pen.Color := clBlack;
Im.Canvas.MoveTo(10,Round(ImH/2));
Im.Canvas.LineTo(ImW-10,Round(ImH/2));
Im.Canvas.MoveTo(Round(ImW/2),10);
Im.Canvas.LineTo(Round(ImW/2),ImH-10);
step:=20;
// вправо
sm:=Round(ImW/2)+step;
sm2:=Round(ImH/2)-step;
sm3:=Round(ImW/2)-step;
sm4:=Round(ImH/2)+step;
for k := 1 to 15 do
begin
Im.Canvas.MoveTo(sm,Round(ImH/2)+5);
Im.Canvas.LineTo(sm,Round(ImH/2)-5);
sm:=sm+step;
// вверх
Im.Canvas.MoveTo(Round(ImW/2)+5,sm2);
Im.Canvas.LineTo(Round(ImW/2)-5,sm2);
sm2:=sm2-step;
// влево
Im.Canvas.MoveTo(sm3,Round(ImH/2)+5);
Im.Canvas.LineTo(sm3,Round(ImH/2)-5);
sm3:=sm3-step;
// Вниз
Im.Canvas.MoveTo(Round(ImW/2)+5,sm4);
Im.Canvas.LineTo(Round(ImW/2)-5,sm4);
sm4:=sm4+step;
end;
Im.Canvas.TextOut(Round(ImW/2)+18,Round(ImH/2)+7,'1');
Im.Canvas.TextOut(Round(ImW/2)-11,Round(ImH/2)-27,'1');
Im.Canvas.TextOut(Round(ImW)-12,Round(ImH/2)+7,'X');
Im.Canvas.TextOut(Round(ImW/2)-11,7,'Y');
except
ShowMessage('error');
end;
end;
procedure TFMain.Clear();
begin
with FMain do
begin
Im.Canvas.Brush.Color := ClWhite;
Im.Canvas.FillRect(Canvas.ClipRect);
Ris;
MIter.Clear;
EU.Text:='';
EX.Text:='';
EY.Text:='';
EZ.Text:='';
EK.Text:='';
EXb.Text:='';
EYb.Text:='';
end;
end;
//---------------------------------------------
procedure TFMain.BClearClick(Sender: TObject);
begin
Clear();
end;
procedure TFMain.BExitClick(Sender: TObject);
begin
Close();
end;
procedure TFMain.BGaussClick(Sender: TObject);
var k, i, ostatok:Integer;
x0, y0, z0, x, y, z, _bez:Double; //a, b, c, d, e, f,
begin
if (RBx.Checked = false) and (RBy.Checked = false) then RBx.Checked := true;
try
if Miter.Count > 0 then MIter.Clear;
EU.Enabled := false;
k:=0;
Zapoln();
_bez:=(b*d-e*a)/(a*c-b*b);
EYb.Text:=floattostr(_bez);
EXb.Text:=floattostr(-(b*_bez+d)/a);
//-------------------------------
x:=StrToFloat(EX0.Text);
y:=StrToFloat(EY0.Text);
//z:=fz(x,y,a,b,c,d,e,f);
if RBx.Checked then ostatok := 1
else ostatok := 0;
for i := 1 to 1000 do
Begin
k:=i-1;
//-------------------Вывод-----------------------------------
MIter.Items.Add('---------------------');
MIter.Items.Add('k='+inttostr(k)+' | '+
'x'+inttostr(k)+'='+floattostr(x)+' | '+
'y'+inttostr(k)+'='+floattostr(y)+' | '+
'F(x,y)='+floattostr(z));
x0:=x;
y0:=y;
z0:=fz(x0,y0,a,b,c,d,e,f);
//------------------------------------------------------------
if (i mod 2) = ostatok then
Begin
x:=x0; //xi(y0,b,d,e);
y:=-(b*x0+e)/c;//yi(x0,b,e,c);
End
else
Begin
x:=-(b*y0+d)/a; //xi(y0,b,d,e);
y:=y0; //yi(x0,b,e,c);
End;
z:=fz(x,y,a,b,c,d,e,f);
//------------------------------------------------------------
if ((abs(x-x0)<0.01)and (abs(y-y0)<0.01) and (abs(z-z0)<0.01)) then break;
End;
EX.Text:=floattostr(x);
EY.Text:=floattostr(y);
EZ.Text:=floattostr(z);
EK.Text:=inttostr(k+1);
except
ShowMessage('Неудалосьнайтиэкстремум, попробуйтедругойметод.');
end;
end;
procedure TFMain.BSpuskClick(Sender: TObject);
var k, i:Integer;
x0, y0, z0, x, y, z, Fx, Fy, M, _bez:Double; // a, b, c, d, e, f,
H : array[1..2,1..2] of Double;
begin
if (RBMin.Checked = false) and (RBMax.Checked = false) then RBMin.Checked := true;
if Miter.Count > 0 then MIter.Clear;
EU.Enabled := true;
k:=0;
Zapoln();
//-------------------------------
_bez:=(b*d-e*a)/(a*c-b*b);
EYb.Text:=floattostr(_bez);
EXb.Text:=floattostr(-(b*_bez+d)/a);
//-------------------------------
MIter.Items.Add('---------------------');
x:=StrToFloat(EX0.Text);
y:=StrToFloat(EY0.Text);
z:=fz(x,y,a,b,c,d,e,f);
MIter.Items.Add('k='+inttostr(k)+' '+
'x'+inttostr(k)+'='+floattostr(x)+' '+
'y'+inttostr(k)+'='+floattostr(y)+' '+
'F(x,y)='+floattostr(z));
H[1,1]:=2*a;
H[1,2]:=2*b;
H[2,1]:=2*b;
H[2,2]:=2*c;
for i := 1 to 1000 do
Begin
k:=k+1;
MIter.Items.Add('---------------------');
x0:=x;
y0:=y;
z0:=fz(x0,y0,a,b,c,d,e,f);
Fx:=dx(x0, y0, b, d, a);
Fy:=dy(x0, y0, b, e, c);
M:=(Fx*Fx + Fy*Fy)/(Fx*(H[1,1]*Fx+H[1,2]*Fy) + Fy*(H[2,1]*Fx+H[2,2]*Fy));
if RBMin.Checked then
begin
x:=x0-M*Fx;
y:=y0-M*Fy;
end
else if RBMax.Checked then
Begin
x:=x0+M*Fx;
y:=y0+M*Fy;
End;
z:=fz(x,y,a,b,c,d,e,f);
MIter.Items.Add('k='+inttostr(k)+' | '+
'x'+inttostr(k)+'='+floattostr(x)+' | '+
'y'+inttostr(k)+'='+floattostr(y)+' | '+
'F(x,y)='+floattostr(z)+' | '+
'u'+inttostr(k-1)+'='+floattostr(M));
if ((abs(x-x0)<0.01)and (abs(y-y0)<0.01) and (abs(z-z0)<0.01)) then break;
End;
EX.Text:=floattostr(x);
EY.Text:=floattostr(y);
EZ.Text:=floattostr(z);
EK.Text:=inttostr(k);
EU.Text:=floattostr(M);
end;
procedure TFMain.BStopClick(Sender: TObject);
begin
_BoolStop:=true;
end;
Function Znak(chislo : Double; Stroka:String) : String;
begin
if (chislo > 0) then
if (chislo <> 1) then Result:='+'+FloatToStr(chislo)+Stroka
else Result:='+'+Stroka
else if (chislo < 0) then
if (chislo <> -1) then Result:=FloatToStr(chislo)+Stroka
else Result:='-'+Stroka
else Result:='';
end;
Function ZnakN(chislo : Double; Stroka:String) : String;
begin
if (chislo > 0) then
if chislo <> 1 then Result:=FloatToStr(chislo)+Stroka
else Result:=Stroka
else if (chislo < 0) then
if (chislo <> -1) then Result:=FloatToStr(chislo)+Stroka
else Result:='-'+Stroka
else Result:='';
end;
Function ZnakKon(chislo : Double) : String;
begin
if (chislo > 0) then Result:='+'+FloatToStr(chislo)
else if chislo = 0 then Result:=''
else Result:=FloatToStr(chislo);
end;
procedure TFMain.Zapoln();
begin
with FMain do
begin
a:=DBGMain.Fields[1].AsFloat;
b:=DBGMain.Fields[2].AsFloat;
c:=DBGMain.Fields[3].AsFloat;
d:=DBGMain.Fields[4].AsFloat;
e:=DBGMain.Fields[5].AsFloat;
f:=DBGMain.Fields[6].AsFloat;
Am[1,1]:=DBGMain.Fields[9].AsFloat;
Am[1,2]:=DBGMain.Fields[10].AsFloat;
Bm[1]:=DBGMain.Fields[11].AsFloat;
Am[2,1]:=DBGMain.Fields[12].AsFloat;
Am[2,2]:=DBGMain.Fields[13].AsFloat;