Курсовая работа: Анализ методов определения минимального, максимального значения функции при наличии ограничений
На примере были рассмотрены 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;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8