![](/user_photo/_userpic.png)
книги / Теоретические основы автоматизированного управления
..pdfОбозначим старые координаты и матрицы надстрочным индексом (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