Мегаобучалка Главная | О нас | Обратная связь


Нахождение экстремума функции при наличии ограничений



2020-02-04 182 Обсуждений (0)
Нахождение экстремума функции при наличии ограничений 0.00 из 5.00 0 оценок




 

Метод симплексных процедур

Симплексом в пространстве n-измерений называют выпуклый многогранник, имеющий n+1 вершин, не лежащих в подпространстве размерности, меньшей n.

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

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

 


Рис. 4.1. Блок-схема метода симплексных процедур.

Реализация метода в программе:

 


Рис. 4.2. Реализация метода симплексных процедур.

 

Рис. 4.3. График метода симплексных процедур.

 

Вывод: Минимальное значение функция принимает в точке А2 (2.3, 0.3). F(2.3, 0.3) = 7,003.

 


Синтез оптимальной по быстродействию системы с помощью принципа максимума Понтрягина

Синтез системы

Критерий управления, как отмечалось ранее, в этом случае

 

 

Мера ошибки в критерии H =1, а верхний предел T неизвестен. Начальная Х(0) = Х0 и конечная Х(T) = ХT точки закреплены.

Запишем функцию Гамильтона и условия трансверсальности:

 

(T) и  (0)-произвольны.

 

Согласно принципу максимума Понтрягина, стратегия управления состоит в минимизации функции Гамильтона относительно u. Минимум Г будет тогда, когда  min по и или  min по и

Отсюда

 

 (5.2)

 

Таким образом, стратегия управления и характер u*(t) определены: оптимальное управление - это релейное управление, максимальное по величине, причем переключение управления производится тогда, когда функция ТВ пересекает ось времени t.

По изложенной методике определим оптимальное управление , которое произвольное начальное состояние (х10, x20) переводит в начало координат за минимальное время Т.

Представим объект  (5.1) в виде уравнения состояния (нормальная форма)

 

 (5.3)

 

В рассматриваемом примере матрица , вектор . Образуем матрицу .

Матрица G — невырожденная, поэтому система (3) будет нормальной. Характеристические числа матрицы A  = 0,  = -2, это числа вещественные, поэтому система (3) удовлетворяет условиям теоремы об n-интервалах. Оптимальное управление u*(t) является кусочно-постоянным и имеет не более двух интервалов постоянства.

Таким образом, управляющие последовательности в зависимости от начального состояния будут: {+ 1}, {-1},{+1,-1}, {-1, + 1}.

Обозначим u* = ∆=±1 и найдем общее решение системы при и* = ∆.

 

 

Обозначим  – множество начальных состояний, которые переводятся в начало координат управляющей последовательностью и* = {+1}, – множество начальных состояний, которые переводятся в начало координат управляющей последовательностью и* = {-1}. Эти множества описываются уравнениями

 

 

Если принять  то множество  запишется в виде

 

 

Закон управления

 

 (5.4)

 

Линия  представляет собой линию переключения.

Введем функцию , характеризующую расстояние от текущего положения фазовой точки (x1,x2) до линии переключения:


 (5.5)

 

Когда фазовая точка окажется на линии переключения, то правая часть уравнения (5) будет равна нулю (  = 0) и управляющее устройство должно произвести переключение знака управления на противоположный. Пока фазовая точка находится над линией переключения,  > 0 и управление должно быть отрицательным и (t) = -U. Когда фазовая точка находится под линией переключения,  < 0 и управление должно быть положительным и (t) = +U. Таким образом, в зависимости от знака должен выбираться и знак управления:

 

 

Все изложенное позволяет записать алгоритм оптимального по быстродействию регулятора для объекта (1):

 

=0, если , х2

 

По алгоритму решения составим структурную схему системы, реализующей закон управления

 

Рис. 5.1. Структурная схема системы


Моделирование объекта

По алгоритму решения

 

,

 

полученному ранее, составим структурные схемы для построения переходной и импульсной характеристик системы, реализующие закон управления для объекта , где k = 1, T1 = 10, T2 = 8.

 

Рис. 5.2. Структурная схема модели ОСАУ для переходной характеристики

 

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

Bm[2]:=DBGMain.Fields[14].AsFloat;

Am[3,1]:=DBGMain.Fields[15].AsFloat;

Am[3,2]:=DBGMain.Fields[16].AsFloat;

Bm[3]:=DBGMain.Fields[17].AsFloat;

Am[4,1]:=DBGMain.Fields[18].AsFloat;

Am[4,2]:=DBGMain.Fields[19].AsFloat;

Bm[4]:=DBGMain.Fields[20].AsFloat;

end;

end;

procedure TFMain.ZnakConstrain();

begin

with FMain do

begin

nomer:=StrToInt(EVar.Text);

Q.Close;

Q.SQL.Text:='select znak1, znak2, znak3, znak4 from Znaki where № = '+IntToStr(nomer);

Q.Open;

znak1:=Q.Fields.Fields[0].AsInteger;

znak2:=Q.Fields.Fields[1].AsInteger;

znak3:=Q.Fields.Fields[2].AsInteger;

znak4:=Q.Fields.Fields[3].AsInteger;

if znak1 = 0 then LC10.Caption:=Chr(8804)+' 0' // Chr(8805)

else LC10.Caption:=Chr(8805)+' 0';

if znak2 = 0 then LC20.Caption:=Chr(8804)+' 0'

else LC20.Caption:=Chr(8805)+' 0';

if znak3 = 0 then LC30.Caption:=Chr(8804)+' 0'

else LC30.Caption:=Chr(8805)+' 0';

if znak4 = 0 then LC40.Caption:=Chr(8804)+' 0'

else LC40.Caption:=Chr(8805)+' 0';

end;

end;

procedure TFMain.EVarChange(Sender: TObject);

begin

with FMain do

begin

Zapoln();

//-----------------------------------------------------------------------------------------------------//

with LFxy do

begin

Caption:='F(x,y)=';

Caption:=Caption+ZnakN(a,'x'+Chr(178));

Caption:=Caption+Znak(2*b,'xy');

Caption:=Caption+Znak(c,'y'+Chr(178));

Caption:=Caption+Znak(2*d,'x');

Caption:=Caption+Znak(2*e,'y');

Caption:=Caption+ZnakKon(f);

end;

//-----------------------------------------------------------------------------------------------------//

LC1.Caption:=ZnakN(Am[1,1],'x')+Znak(Am[1,2],'y')+ZnakKon(Bm[1]);

LC2.Caption:=ZnakN(Am[2,1],'x')+Znak(Am[2,2],'y')+ZnakKon(Bm[2]);

LC3.Caption:=ZnakN(Am[3,1],'x')+Znak(Am[3,2],'y')+ZnakKon(Bm[3]);

LC4.Caption:=ZnakN(Am[4,1],'x')+Znak(Am[4,2],'y')+ZnakKon(Bm[4]);

ZnakConstrain();

end;

end;

procedure TFMain.FormCreate(Sender: TObject);

var FileName, ConStr:String;

begin

FileName:='variants.mdb';//EFileName.Text; //

try

Conn.Connected:= false;

Conn.ConnectionString :=

'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+getCurrentDir+'\'+FileName+';'+

'Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'+

'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;'+

'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;'+

'Jet OLEDB:Encrypt Database=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';

Conn.Connected:= true;

Conn.Open;

DBGMain.DataSource:=DSMain;

DataSetMain.Active:= false;

DataSetMain.CommandText :='select * from Варианты order by №';

DataSetMain.Active:= true;

DataSetMain.Open;

except

ShowMessage('Не удалось подключиться к базе вариантов. Вложите базу "variants.mdb" с вариантами в папку с программой.');

end;

//--------------------------------------------------------------------

ZnakConstrain();

//--------------------------------------------------------------------

Ris;

end;

Function Znak0(str : String) : String;

begin

if str = Chr(8804)+' 0' then Result:= Chr(8805)+' 0'

else Result:= Chr(8804)+' 0';

end;

Function ZnakUpdate(str : String) : Integer;

begin

if str = Chr(8804)+' 0' then Result:= 0

else Result:= 1;

end;

procedure TFMain.LC10Click(Sender: TObject);

begin

LC10.Caption:=Znak0(LC10.Caption);

end;

procedure TFMain.LC20Click(Sender: TObject);

begin

LC20.Caption:=Znak0(LC20.Caption);

end;

procedure TFMain.LC30Click(Sender: TObject);

begin

LC30.Caption:=Znak0(LC30.Caption);

end;

procedure TFMain.LC40Click(Sender: TObject);

begin

LC40.Caption:=Znak0(LC40.Caption);

end;

procedure TFMain.SaveZnakClick(Sender: TObject);

Var zi:Integer;

begin

with FMain do

try

nomer:=StrToInt(EVar.Text);

znak1:=ZnakUpdate(LC10.Caption);

znak2:=ZnakUpdate(LC20.Caption);

znak3:=ZnakUpdate(LC30.Caption);

znak4:=ZnakUpdate(LC40.Caption);

Q.Close;

Q.SQL.Text:='update Znaki set znak1='+IntToStr(znak1)

+', znak2='+IntToStr(znak2)

+', znak3='+IntToStr(znak3)

+', znak4='+IntToStr(znak4)

+' where №='+IntToStr(nomer);

Q.ExecSQL;

ShowMessage('Знаки успешно сохранены.');

except

ShowMessage('Не сохранить записать знаки.');

end;

end;

function RoundEx(chislo: double): double;

begin

RoundEx := (Round(chislo*1000))/1000;

end;

Function ZnakConst(str1, str2, str3 : String; X, Y :Double) : Integer;

Var zn1, zn2, zn3:Integer;

begin

zn1:=0; zn2:=0; zn3:=0;

if ((str1 = Chr(8804)+' 0') and (RoundEx(Am[1,1]*X+Am[1,2]*Y+Bm[1]) <= 0)) or

((str1 = Chr(8805)+' 0') and (RoundEx(Am[1,1]*X+Am[1,2]*Y+Bm[1]) >= 0)) then zn1:=1;

if ((str2 = Chr(8804)+' 0') and (RoundEx(Am[2,1]*X+Am[2,2]*Y+Bm[2]) <= 0)) or

((str2 = Chr(8805)+' 0') and (RoundEx(Am[2,1]*X+Am[2,2]*Y+Bm[2]) >= 0)) then zn2:=1;

if ((str3 = Chr(8804)+' 0') and (RoundEx(Am[3,1]*X+Am[3,2]*Y+Bm[3]) <= 0)) or

((str3 = Chr(8805)+' 0') and (RoundEx(Am[3,1]*X+Am[3,2]*Y+Bm[3]) >= 0)) then zn3:=1;

Result:=zn1+zn2+zn3;

end;

function FindMin(a:Mass):Double;

var

i,temp:integer;

begin

temp:=1;

for i := 1 to 10 do

if (a[i]<a[temp]) and (a[i]<>0) then

temp:=i;

Result:=a[temp]

end;

procedure TFMain.GaussSystem(N:Integer);

var g: Matrix;

bg, xv: Vector;

h: Double;

i,j,k,ns,gi, gN, Fn, ImW, ImH, ms:integer;

str:String;

begin

ms:=StrToInt(ESkor.Text);

ImW:=Im.Width;

ImH:=Im.Height;

//Ввод данных

//Размерность системы

ns := 3;

Zapoln();

MIter.Items.Add(' ');

MIter.Items.Add('------------------------------------ м. Множителей лагранжа: ------------------------------------');

if N=3 then begin gN:=3;Fn:=3; end

else gN:=4;Fn:=6;

for gi := 1 to gN do

begin

if _BoolStop = true then break;

//Коэффициенты

g[1,1]:= 2*a;

g[1,2]:= 2*b;

g[1,3]:= Am[gi,1];

g[2,1]:= 2*b;

g[2,2]:= 2*c;

g[2,3]:= Am[gi,2];

g[3,1]:= Am[gi,1];

g[3,2]:= Am[gi,2];

g[3,3]:= 0;

//Правая часть уравнения

bg[1]:= -2*d;

bg[2]:= -2*e;

bg[3]:= -Bm[gi];

//Прямой ход - исключение переменных

for i:=1 to ns-1 do

for j:=i+1 to ns do

begin

g[j,i]:=-g[j,i]/g[i,i];

for k:=i+1 to ns do

g[j,k]:=g[j,k]+g[j,i]*g[i,k];

bg[j]:=bg[j]+g[j,i]*bg[i];

end;

xv[ns]:=bg[ns]/g[ns,ns];

//Обратный ход - нахождение корней

for i:=ns-1 downto 1 do

begin

h:=bg[i];

for j:=i+1 to ns do h:=h-xv[j]*g[i,j];

xv[i]:=h/g[i,i];

end;

Xm[Fn+gi]:= xv[1];

Ym[Fn+gi]:= xv[2];

//-------------Рисование точек-----------------------------//

xr:=Round(ImW/2)+Round(Xm[Fn+gi]*20);;

yr:=Round(ImH/2)-Round(Ym[Fn+gi]*20);

Im.Canvas.Pen.Width:=2;

FMain.Im.Canvas.Pen.Color := clBlue;

FMain.Im.Canvas.Ellipse(xr-3, yr-3, xr + 3, yr + 3);

Im.Canvas.TextOut(xr+10,yr-10,'L'+inttostr(gi));

Delay(ms);

//Вывод результата

if ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, xv[1], xv[2]) = 3 then

begin

str:=' - Входит в область определения';

Fm[Fn+gi]:=fz(xv[1],xv[2],a,b,c,d,e,f);

end

else

begin

str:=' - Не входит в область определения';

Fm[Fn+gi]:=9999;

end;

MIter.Items.Add('x'+IntToStr(gi)+ '='+FloatToStr(xv[1])+' | y'+IntToStr(gi)+'='+FloatToStr(xv[2])+' | F(x,y)='+FloatToStr(fz(xv[1],xv[2],a,b,c,d,e,f)) + str);

end;

end;

procedure TFMain.BSimplexClick(Sender: TObject);

Var si, ssi, N, ImW, ImH, ms, yris, xris, NL:Integer; X, Y : array[1..10] of Double;

xg, yg, kg, bg, Xp, Yp:Double;

begin

_BoolStop:=False;

Clear();

ms:=StrToInt(ESkor.Text);

ImW:=Im.Width;

ImH:=Im.Height;

Zapoln();

if (LC4.Caption = '0') or (LC4.Caption = '') then

try

Begin

N:=3;

NL:=3;

for si := 2 to N do

begin

Ym[si-1]:=(Am[si,1]*Bm[1]-Am[1,1]*Bm[si])/(Am[si,2]*Am[1,1]-Am[si,1]*Am[1,2]);

Xm[si-1]:=(Bm[si]*Am[1,2]-Bm[1]*Am[si,2])/(Am[1,1]*Am[si,2]-Am[si,1]*Am[1,2]);//(-Bm[1]-Am[1,2]*Ym[si-1])/Am[1,1];

end;

for si := 3 to N do

begin

Ym[si]:=(Am[si,1]*Bm[2]-Am[2,1]*Bm[si])/(Am[si,2]*Am[2,1]-Am[si,1]*Am[2,2]);

Xm[si]:=(Bm[si]*Am[2,2]-Bm[2]*Am[si,2])/(Am[2,1]*Am[si,2]-Am[si,1]*Am[2,2]);//(-Bm[2]-Am[2,2]*Ym[si])/Am[2,1];

end;

End;

except

ShowMessage('А-юй!');

end

else

Begin

N:=6;

NL:=4;

for si := 2 to N-2 do

begin

Ym[si-1]:=(Am[si,1]*Bm[1]-Am[1,1]*Bm[si])/(Am[si,2]*Am[1,1]-Am[si,1]*Am[1,2]);

Xm[si-1]:=(Bm[si]*Am[1,2]-Bm[1]*Am[si,2])/(Am[1,1]*Am[si,2]-Am[si,1]*Am[1,2]);//(-Bm[1]-Am[1,2]*Ym[si-1])/Am[1,1];

end;

for si := 3 to N-2 do

begin

Ym[si+1]:=(Am[si,1]*Bm[2]-Am[2,1]*Bm[si])/(Am[si,2]*Am[2,1]-Am[si,1]*Am[2,2]);

Xm[si+1]:=(Bm[si]*Am[2,2]-Bm[2]*Am[si,2])/(Am[2,1]*Am[si,2]-Am[si,1]*Am[2,2]);//(-Bm[2]-Am[2,2]*Ym[si-1])/Am[2,1];

end;

Ym[6]:=(Am[4,1]*Bm[3]-Am[3,1]*Bm[4])/(Am[4,2]*Am[3,1]-Am[4,1]*Am[3,2]);

Xm[6]:=(Bm[4]*Am[3,2]-Bm[3]*Am[4,2])/(Am[3,1]*Am[4,2]-Am[4,1]*Am[3,2]);//(-Bm[3]-Am[3,2]*Ym[6])/Am[3,1];

End;

//----------------------------------------------------------------------------------------------

MIter.Items.Add('------------------------------------ Граничные точки области определения: ------------------------------------');

for si := 1 to NL do

begin

if _BoolStop = true then break;

//-------------Рисование прямых-----------------------------//

FMain.Im.Canvas.Pen.Color := clMaroon;

Im.Canvas.Pen.Width:=1;

if Am[si,2] = 0 then

if Bm[si] = 0 then

begin

xris:=Round(ImW/2);

yris:=Round(ImH/2-100);

Im.Canvas.MoveTo(xris,yris);

yris:=Round(ImH/2+100);

Im.Canvas.LineTo(xris,yris);

end

else

begin

xris:=Round(ImW/2-Bm[si]*20);

yris:=Round(ImH/2-100);

Im.Canvas.MoveTo(xris,yris);

yris:=Round(ImH/2+100);

Im.Canvas.LineTo(xris,yris);

end

else if Am[si,1] = 0 then

if Bm[si] = 0 then

begin

yris:=Round(ImH/2);

xris:=Round(ImW/2+100);

Im.Canvas.MoveTo(xris,yris);

xris:=Round(ImW/2)-100;

Im.Canvas.LineTo(xris,yris);

end

else

begin

yris:=Round(ImH/2+Bm[si]*20);

xris:=Round(ImW/2+100);

Im.Canvas.MoveTo(xris,yris);

xris:=Round(ImW/2)-100;

Im.Canvas.LineTo(xris,yris);

end

else

begin

kg:=-Am[si,1]/Am[si,2];

bg:=-Bm[si]/Am[si,2];

xris:=Round(ImW/2+200);

yris:=(Round(ImH/2)-Round((kg*10+bg)*20));

Im.Canvas.MoveTo(xris,yris);

xris:=Round(ImW/2)-100;

yris:=(Round(ImH/2)-Round((kg*(-5)+bg)*20));

Im.Canvas.LineTo(xris,yris);

end;

Delay(ms);

end;

//----------------------------------------------------------//

for si := 1 to N do

begin

if _BoolStop = true then break;

Fm[si]:=fz(Xm[si],Ym[si],a,b,c,d,e,f);

//-------------Рисование точек-----------------------------//

xr:=Round(ImW/2)+Round(Xm[si]*20);

yr:=Round(ImH/2)-Round(Ym[si]*20);

Im.Canvas.Pen.Width:=2;

FMain.Im.Canvas.Pen.Color := clRed;

FMain.Im.Canvas.Ellipse(xr-3, yr-3, xr + 3, yr + 3);

Im.Canvas.TextOut(xr+10,yr-10,'A'+inttostr(si));

Delay(ms);

//------------------------------------------------------//

MIter.Items.Add('x'+inttostr(si)+'='+floattostr(Xm[si])+' | y'+inttostr(si)+'='+floattostr(Ym[si])+' | F(x,y)='+FloatToStr(Fm[si]));

end;

//------------------ Обвести область-----------------------------------------------------------

for si := 1 to N do

begin

for ssi:=si to N do

begin

if _BoolStop = true then break;

Xp:=Xm[ssi]; Yp:=Ym[ssi];

if (ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, Xp, Yp) = 3)

and (ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, Xm[si], Ym[si]) = 3)

and (ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, (Xm[si]+Xp)/2, (Ym[si]+Yp)/2) = 3) then

begin

xr:=Round(ImW/2)+Round(Xp*20);

yr:=Round(ImH/2)-Round(Yp*20);

Im.Canvas.Pen.Width:=2;

FMain.Im.Canvas.Pen.Color := clRed;

Im.Canvas.MoveTo(xr,yr);

xr:=Round(ImW/2)+Round(Xm[si]*20);

yr:=Round(ImH/2)-Round(Ym[si]*20);

Im.Canvas.LineTo(xr,yr);

Xp:=Xm[si]; Yp:=Ym[si];

Delay(ms);

end;

end;

end;

//----------------------------------------------------------------------------------------------

GaussSystem(N);

for si := 1 to 10 do

begin

if _BoolStop = true then break;

if FindMin(Fm) = Fm[si] then

begin

MIter.Items.Add(' ');

MIter.Items.Add('Ответ: F(x,y)='+FloatToStr(Fm[si])+' x='+FloatToStr(Xm[si])+' y='+FloatToStr(Ym[si]));

end;

end;

end;

procedure TFMain.BSoprClick(Sender: TObject);

var k, i, ImW, ImH, r, yris, xris, ms:Integer;

x0, y0, z0, x, y, z, Fx, Fy, M, _bez, xg, yg, kg,bg:Double;

H : array[1..2,1..2] of Double;

S, S0, sp : array[1..2] of Double;

begin

_BoolStop:=False;

Clear();

if (RBMin.Checked = false) and (RBMax.Checked = false) then RBMin.Checked := true;

if Miter.Count > 0 then MIter.Clear;

EU.Enabled := true;

ms:=StrToInt(ESkor.Text);

ImW:=Im.Width;

ImH:=Im.Height;

k:=0;

Zapoln();

//-------------------------------

_bez:=(b*d-e*a)/(a*c-b*b);

EYb.Text:=floattostr(_bez);

EXb.Text:=floattostr(-(b*_bez+d)/a);

Im.Canvas.Pen.Color:=clred;

Im.Canvas.Pen.Width:=2;

xr :=Round(ImW/2)+Round(StrToFloat(EXb.Text)*20);

yr :=Round(ImH/2)-Round(StrToFloat(EYb.Text)*20);

FMain.Im.Canvas.Pen.Color := clBlue;

FMain.Im.Canvas.Ellipse(xr-4, yr-4, xr + 4, yr + 4);

Delay(ms);

Im.Canvas.TextOut(xr+10,yr-10,'Aб');

Delay(ms);

//----------------------------------------------------------------------------

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));

//----------------------------------------------------------------------------

xr:=Round(ImW/2)+Round(StrToFloat(EX0.Text)*20);;

yr:=Round(ImH/2)-Round(StrToFloat(EY0.Text)*20);

FMain.Im.Canvas.Pen.Color := clRed;

FMain.Im.Canvas.Ellipse(xr-2, yr-2, xr + 2, yr + 2);

Delay(ms);

Im.Canvas.TextOut(xr-16,yr-10,'Ao');

Delay(ms);

// Гессиан

H[1,1]:=2*a;

H[1,2]:=2*b;

H[2,1]:=2*b;

H[2,2]:=2*c;

// Направление

S[1]:=1;

S[2]:=1;

// Цикл рассчета метода

for i := 1 to 1000 do

Begin

if _BoolStop = true then break;

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);

S0[1]:=S[1];

S0[2]:=S[2];

// Находим u

M:=(Fx*S0[1] + Fy*S0[2])/(S0[1]*(H[1,1]*S0[1]+H[1,2]*S0[2]) + S0[2]*(H[2,1]*S0[1]+H[2,2]*S0[2]));

sp[1]:=H[1,1]*S0[1]+H[1,2]*S0[2];

sp[2]:=H[2,1]*S0[1]+H[2,2]*S0[2];

S[1]:=sp[2];

S[2]:=-sp[1];

if RBMin.Checked then

begin

x:=x0-M*S0[1];

y:=y0-M*S0[2];

end

else if RBMax.Checked then

Begin

x:=x0+M*S0[1];

y:=y0+M*S0[2];

End;

MIter.Items.Add('S'+inttostr(k-1)+'('+floattostr(S0[1])+','+floattostr(S0[2])+')');

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;

// Промежуточные точки

xr:=Round(ImW/2)+Round(x*20);;

yr:=Round(ImH/2)-Round(y*20);

Im.Canvas.Pen.Width:=2;

FMain.Im.Canvas.Pen.Color := clOlive;

FMain.Im.Canvas.Ellipse(xr-2, yr-2, xr + 2, yr + 2);

Delay(ms);

// Уравнение прямой и рисование направления

xg:=x+S0[1];

yg:=y+S0[2];

kg:=(yg-y)/(xg-x);

bg:=yg-kg*xg;

FMain.Im.Canvas.Pen.Color := clBlack;

Im.Canvas.Pen.Width:=1;

yris:=(Round(ImH/2)-Round((kg*5+bg)*20));

Im.Canvas.MoveTo(Round(ImW/2+100),yris);

yris:=(Round(ImH/2)-Round((kg*(-5)+bg)*20));

Im.Canvas.LineTo(Round(ImW/2)-100,yris);

Delay(ms);

End;

EX.Text:=floattostr(x);

EY.Text:=floattostr(y);

EZ.Text:=floattostr(z);

EK.Text:=inttostr(k);

EU.Text:=floattostr(M);

end;

end.

 



2020-02-04 182 Обсуждений (0)
Нахождение экстремума функции при наличии ограничений 0.00 из 5.00 0 оценок









Обсуждение в статье: Нахождение экстремума функции при наличии ограничений

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (182)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)