Смекни!
smekni.com

Анализ методов определения минимального, максимального значения функции при наличии ограничений (стр. 6 из 7)

Рис. 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;