![]() |
|
|
Курсовая работа: Анализ методов определения минимального, максимального значения функции при наличии ограниченийРис. 5.3. Вводимые параметры Рис. 5.4. График переходной характеристики tp = 31.6 c. Рис. 5.5. Структурная схема модели ОСАУ для импульсной характеристики Рис. 5.6. Вводимые параметры Рис. 5.7. График импульсной характеристики tp = 19,6 c. Заключение В теоретической части курсового проекта были рассмотрены методы поиска безусловного экстремума функции (методы прямого поиска, градиентные методы, методы второго порядка) и методы поиска экстремума функции при наличии ограничений (методы возможных направлений, методы проекции градиента, методы линеаризации, методы штрафов), указаны их основные достоинства и недостатки. На примере были рассмотрены 2-а градиентных метода поиска безусловного экстремума функции. Метод "Наискорейшего спуска" и метод "Сопряженных направлений", где второй показал много большую скорость сходимости, в чем и заключается его преимущество. Оба метода на порядок быстрее, чем "прямой поиск" так как шаг приближения, пересчитывается на каждой итерации. Метод "Симплексных процедур" является лучшим выбором, при нахождении экстремумов нелинейной функции, в условиях ограничений типа неравенств. Его достоинство – не сложность подсчетов и точность, подкреплённая теоремой Лагранжа. Минус – много вычислений. На языке программирования высшего уровня Delphi реализованы алгоритмы вышеназванных методов. С помощью принципа
максимума Понтрягина был выполнен синтез оптимальной по быстродействию системы
для объекта Список использованной литературы 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. |
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |