Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Теоретические основы автоматизированного управления

..pdf
Скачиваний:
17
Добавлен:
13.11.2023
Размер:
24.2 Mб
Скачать

Обозначим старые координаты и матрицы надстрочным индексом (s), а

новые — индексом (л). Новые связи получат двухиндексные обозначения (например, (sn)). Примем, что z ^ (0 J = z*(7), a z*(0J = 0). Тогда

к

к

+

i f (0 = A fZf (I) + J{Eÿ> /)A<J У / >(/)+

У -1.У**

j= l

 

+ J{E <“ >(OA(">}Z^ )(O +B^ U(;>(O + 4 Î )W ,

/= 1

z*/)(0) = z<f><r>, #> < /) =C (;>z(;>(/);

z[n)(t) = а<л>4',)(0+Е<е (17п)(оа'7л)}2<п)(о +

r= l

+X {E 7,(f)A(^ V /Ч о + B(rn)u,n)(/)+«<">(/),

r= l

z(; )(0) = z(; o), z^>(0) = z ^ , r = ü î ;

/f = AT + F ; * = i r ^ ; / = r F ;

 

у(гя)(0=С(; )г(; )(0,

(П.24)

где {Е ^ Ч О А ^Ь {E ÿ)(0A<Jr)}, (y) = (ri) или y = (s) — матрицы размерностей

Трансформируется и целевая функция (6.82), при этом очевидно, что:

Eii)« = P </ )(0 -y (/ )« ,

t[n)(t) =p{rn)(t)-y(rn)(t).

Структурные возмущения, как видно из (П.24), получают вид:

к

 

K+F

 

w</ )(0= X

{[I-E^(/)]A y>}z^(0+X {Е^ЧОА^>}z^(0;

(П.25)

У=1,j* k

 

У=1

 

w(; 4 o = X (E{^4/)A (; î)>z^(/)+X{Eÿ,«A (; )}z'',)(4

(n .2 6 )

 

У- l,

y-1

 

где I — матрица с нулевой диагональю и остальными единичными элемен­

тами.

 

=u<;,л« +и(/ )г( о W / >р(о + и (/ >(/)+ « (* )w ,

а

 

 

и^(/) =и(; )л ( t) +и(; )г(о+и^)р (о+и(; л)(/)+и( )(о,

где

и u f 0 соответствуют первому и второму членам выражения (П.25);

и

— членам выражения (П.26).

Приложение 3 Программные продукты

/*Интерфейс InterBase и UNDO*/

unit Unitl;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls, ExtCtrls, Mask, DBCtrls, Buttons, Undo;

type

TCol = array of Double;

TForml = class(TForm)

Createlzdel: TQuery;

Databasel: TDatabase;

Selectlzdel: TQuery;

DataSourcel: TDataSource;

CreateOborud: TQuery;

DBGridl: TDBGrid;

Selectlzdeliname: TStringField;

Selectlzdelfrez: TFloatField;

Selectlzdeltok: TFloatField;

Selectlzdelshtamp: TFloatField;

Selectlzdelsborka: TFloatField;

Selectlzdelcomplect: TFloatField;

Selectlzdelpribyl: TIntegerField;

Selectlzdelnmin: TIntegerField;

Selectlzdelnmax: TIntegerField;

Panell: TPanel;

StaticTextl: TStaticText;

Panel3: TPanel;

Panel4: TPanel;

Labell: TLabel;

Label2 : TLabel;

Label3: TLabel;

Label4: TLabel;

LâbelS: TLabel;

DBEditl: TDBEdit;

DBEdit2: TDBEdit;

DBEdit3: TDBEdit;

DBEdit4: TDBEdit;

DBEdit5: TDBEdit;

Label6: TLabel;

Label7: TLabel;

SelectOborud: TQuery;

DataSource2: TDataSource;

SelectOborudfrez: TIntegerField;

SelectOborudtok: TIntegerField;

SelectOborudshtamp: TIntegerField;

SelectOborudsborka: TIntegerField;

SelectOborudcomplect: TIntegerField;

Panel2: TPanel;

Label8: TLabel;

Panel5: TPanel;

Label9: TLabel;

Label 10: TLabel;

Panel6: TPanel; DBNavigatorl: TDBNavigator; SpeedButtonl: TSpeedButton; Session 1: TSession;

procedure FormDestroy(Sender: TObject); procedure SpeedButtonlClick(Sender: TObject); procedure FormShow(Sender: TObject);

private

{ Private declarations } FValuesrarray of Double; FColStart:array of integer; FRowsiarray of integer; pEnv:pLSenv; pModekpLSmodel; procedure CheckDatabase; procedure Filllzdel; procedure FillOborud;

procedure Matrix2Vector(m:array of TCol); procedure LoadModel;

procedure Optimize; procedure ShowSolution; public

{ Public declarations } procedure MakeVectors; end;

var

Forml: TForml;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForml.CheckDatabase;//npoBepKa таблиц и алиаса var l:TStringList;

begin

if AliasF.ShowModal(Sessionl)mrOK then begin

ApplicationTerminate;

exit;

end;

l:=TStringList.Create; Databasel .Connected:=FALSE;

if AliasF.RadioButton2.Checked then begin

Database 1.Params.Values!‘PATH ’]:=AliasF. Edit1 .Text; Databasel.DriverNamer-’STANDARD’;

end else begin

Database 1.AliasName:=AliasF.ComboBox 1 .Text; end;

Database 1 .Connected:=TRUE; Databasel.GetTableNames(l, FALSE);

if (LIndexOf(‘izder)— 1)

OR

(l.IndexOf(‘IZDEL’) = - l)

OR

(UndexO f(toborud,)= - l)

OR

(LIndexOf(<OBO RUD,) = - 1) then

if Application. MessageBox(cОдна или несколько таблиц в выбранной базе дан­ ных отсутствует 6,MB_OKCANCEL)=ID_OK then

begin

 

if (l.IndexOf(‘izd er)= -l)

A N D

(l.IndexOf(TZDEL’)= -l)

then

begin

 

CreatelzdeLExecSQL;

 

Fffllzdel;

end;

if (l.IndexOf(toborud,)= -l) OR (l.IndexO R ^BO R U D ’)— !) then begin

CreateOborud.ExecSQL;

FillOborud;

end; end

else begin

Application.Terminate;

exit;

end;

SelectlzdeLOpen; SelectOborud.Open;

end;

procedure TForml.LoadModel;//3arpy3Ka данных var nErrorcode:integer;

nD irinteger; dObjConst:double; adC.array of double; x:integer;

adBrarray of double; acConTypes:AnsiString; nNZ:integer; anBegCokinteger;

nM, nNrinteger; begin

if pModelnil then LSdeleteModel(pModel);

pModel:=LScreateModel(pEnv, nErrorcode); ErrorCheck(pEnv, nErrorcode);

//* Number of variables */

nN := Selectlzdel.RecordCount;

//* Number of constraints */ nM := 5+nN*2;

//* The direction of optimization */ nDir := LS_MAX;

//* The objective’s constant term */ dObjConst := 0.;

//* The coefficients of the objective function */

SetLength(adC, nN); SelectlzdeLFirst;

for x:=0 to nN-1 do begin

adC[x] :=SelectIzdelPribyl.Value;

Selectlzdel.Next;

end;

//* The right-hand sides of the constraints */ SetLength(adB, nM);

adB[0] := SelectOborudFrez.Value; adB[l] := SelectOborudTok.Value; adB[2] := SelectOborudShtamp.Value; adB[3] := SelectOborudSborka.Value; adB[4) := SelectOboradComplect.Value;

Selectlzdel.First; for x:=l to nN do begin

adB[4+2*x-1]:=SelectIzdelNMin.Value; adB[4+2*x]:=SelectIzdelNMax.Value; Selectlzdel.Next;

end;

//* The constraint types */

acConTypes

‘LLLLL’;

for x:=l to nN do

acConTypes

:= acConTypes+’GL’;

//* The number of nonzeros in the constraint matrix */ nNZ := length(FValues);

{/* We have now assembled a fall description of the model. We pass this information to LSloadLPData with the following call. */}

nErrorCode := LSloadLPData(pModel, nM, nN, nDir, dObjConst, adC[0], adB[0], PChar(acConTypes),

nNZ, FColStart[0],

Integer(nUA), FValues[0], FRows[0], ОоиЫе(ш1л), ОоиЫе(т1л)>; ErrorCheck(pEnv, nErrorCode);

end;

procedure TForml.MakeVectors; );{Хранение разреженных матриц}

var m:array of TCol; x,p:integer;

begin Selectlzdel.First; p:=0;

while NOT Selectlzdel.Eof do begin SetLength(m,length(m)+1);

SetLength(m[High(m)], 5+SdectIzdel.RecordCount*2); m[High(m)][0]:=SelectIzdelFrez.Value; m[High(m)][l]:=SelectIzdelTok.Value; m[High(m)][2]:=SelectIzdelShtamp.Value; m[High(m)j[3]:=SelectIzdelSborka.Value; m[High(m)][4]:—SelectlzdelComplect.Value;

for x:=l to p do begin

m[High(m)][5+2*x-2]:=0; m[High(m)][5+2*x-l]:=0; end;

m[High(m)][5+2*p]:=1; m[High(m)][5+2*p+l]:=l; Inc(p);

SelectlzdeLNext;

end;

Matrix2Vector(m);

end;

procedure TForml.Matrix2Vector(m: array of TCol);{Хранение разреженных матриц}

var x,y,p,c:integer; newc:boolean; begin

SetLength(FValues, length(m)*length(m[0])); SetLength(FColStart, length(FValues)+l); SetLength(FRows, length(FValues));

p:=0;

c:=0;

for x:=0 to High(m) do begin

newc:=TRUE;

for y:=0 to High(m[x]) do begin

if m[x][y]0 then begin

FValuesfp]:=m[x][y]; if newc then

begin FColStart[c]:=p; newc:=FALSE; Inc(c);

end;

FRows[pJ:=y;

Inc(p); end end;

end;

FColStart[c]:=p; SetLength(FValues, p); SetLength(FColStart, c+1); SetLength(FRows, p);

end;

procedure TForml .Орйпйге;//Оптимизация var nErrorCode:integer;

begin

nErrorcode := LSoptimize( pModel, LS_METHOD_PSIMPLEX); ErrorCheck(pEnv, nErrorcode);

end;

procedure TForml.ShowSolution;//IloKa3aTb решение var i:integer;

adX:array o f double; dObj:double; nErrorcode:integer; begin

//* Get the variable values */

SetLength(adX, Selectlzdel.RecordCount);

nErrorcode := LSgetPrimalSolution (pModel, adX[0]); ErrorCheck(pEnv, nErrorcode);

dObj:=0;

with Form2 do begin SelectResult. Open;

for i:=0 to High(adX) do begin

SelectResult. Edit; SelectResulfNOpt.Value:=Round(Int(adX[i])); dObj:=dObj+SelectResultNOpt.Value*SelectResultPribyl.Value; SelectResultNext;

end;

cf.Caption:=IntToStr(Round(dObj));

ShowModal;

end;

end;

procedure TForml .SpeedButtonlClick(Sender: TObject);//3anycK оптимизации begin

if SelectOborud.State=dsEdit then SelectOborud. Post;

MakeVectors;

LoadModel;

Optimize;

ShowSolution;

end;

procedure TForml.FormShow(Sender: TObject); var nErr:integer;

begin CheckDatabase;

pEnv:=LScreateEnv(nErr, MY_LICENCE_KEY); ErrorCheck(pEnv, nErr);

OnShow:=nil;

end;

end.

{Линейное программирование, фрагмент}

Серверная часть.

{Таблицы} TABLE “А”

(

«STi» INTEGER,

“ST2" INTEGER, “KTZ” FLOAT

); / / Содержит матрицу А

TABLE “T l”

(

“DIG” FLOAT,

“ST3" INTEGER, “CHR” VARCHAR(2), “FLG” INTEGER

); / / Содержит знаки и правые части ограничений

{Хранимые прцедуры} SET TERM!!;

CREATE PROCEDURE CLEAN_ALL AS

BEGIN UPDATE A SET KTZ=0; UPDATE A SET KTZ=1

Соседние файлы в папке книги