unit ECUnit;

{$OPTIMIZATION OFF}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Spin, MiscRoutines, PlugCommon;

type
  TSEDialog = class(TForm)
    Bevel1: TBevel;
    OkButton: TButton;
    CancelButton: TButton;
    Label1: TLabel;
    RGType: TRadioGroup;
    GBResults: TGroupBox;
    EX1: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    EX2: TEdit;
    EX3: TEdit;
    SESteps: TSpinEdit;
    SaveButton: TButton;
    SaveDialog: TSaveDialog;
    Label5: TLabel;
    ERes: TEdit;
    procedure EX1Change(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
    procedure OkButtonClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  end;

var
  SEDialog : TSEDialog;
  
implementation

{$R *.DFM}

procedure TSEDialog.EX1Change(Sender: TObject);
begin
  SaveButton.Enabled:=(EX1.Text<>'')or(EX1.Text<>'')or(EX1.Text<>'');
end;

procedure TSEDialog.FormShow(Sender: TObject);
begin
  EX1Change(Self);
end;

procedure TSEDialog.SaveButtonClick(Sender: TObject);
var
  S : TFileStream;
begin
  if(not SaveDialog.Execute) then exit;
  try
    S:=TFileStream.Create(SaveDialog.FileName,fmCreate);
    fPrint(TStream(S),'Поиск экстремума произведен: '+
      string(GetSystemDateStr)+', '+string(GetSystemTimeStr)+#13);
    fPrint(TStream(S),'Результаты поиска:'+#13);
    fPrint(TStream(S),'X1 = '+EX1.Text+#13);
    fPrint(TStream(S),'X2 = '+EX2.Text+#13);
    fPrint(TStream(S),'X3 = '+EX3.Text+#13);
    fPrint(TStream(S),'Экстремальное значение = '+ERes.Text+#13);
    S.Destroy;
  except
    on EFCreateError do
    begin
      Error('Ошибка создания файла "'+SaveDialog.FileName+'".');
      exit;
    end;
    on EReadError do
    begin
      Error('Ошибка записи файла "'+SaveDialog.FileName+'".');
      S.Destroy;
      exit;
    end;
  end
end;

{$OPTIMIZATION OFF}        // Компилятор генерирует неверный код.

procedure TSEDialog.OkButtonClick(Sender: TObject);
var
  X, Xbest : array[0..9] of double;
  c1,c2,c3 : double;
  step : double;
  current, best : double;
  procedure store_point;
  begin
    Xbest[0]:=X[0];
    Xbest[1]:=X[1];
    Xbest[2]:=X[2];
    best:=current;
  end;
begin
  // Начальное приближение - центральная точка.
  X[0]:=1/3;
  X[1]:=1/3;
  X[2]:=1/3;
  GetMainServer.GetY(@X,@current);
  store_point;
  step:=1/SESteps.Value;
  if(RGType.ItemIndex=0) then
  begin
    // Минимум
    c1:=1;
    while(c1>=0) do
    begin
      c2:=0;
      while((c1+c2)<=1) do
      begin
        c3:=1-(c1+c2);
        X[0]:=c1;
        X[1]:=c2;
        X[2]:=c3;
        GetMainServer.GetY(@X,@current);
        if(current<best) then store_point;
        c2:=c2+step;
      end;
      c1:=c1-step;
    end;
  end
  else
  begin
    // Максимум
    c1:=1;
    while(c1>=0) do
    begin
      c2:=0;
      while((c1+c2)<=1) do
      begin
        c3:=1-(c1+c2);
        X[0]:=c1;
        X[1]:=c2;
        X[2]:=c3;
        GetMainServer.GetY(@X,@current);
        if(current>best) then store_point;
        c2:=c2+step;
      end;
      c1:=c1-step;
    end;
  end;
  EX1.Text:=Format('%f',[Xbest[0]]);
  EX2.Text:=Format('%f',[Xbest[1]]);
  EX3.Text:=Format('%f',[Xbest[2]]);
  ERes.Text:=Format('%f',[best]);
end;

{$OPTIMIZATION ON}

procedure TSEDialog.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if(Key=VK_ESCAPE) then Close;
end;

end.
