Нахождение экстремума функции методом Фибоначчи — Pascal(Паскаль)

const
  fib:array [1..15] of integer=(1,1,2,3,5,8,13,21,34,55,89,144,233,377,610);
 
...
 
Function fac(a,x:extended):extended;
begin
  result:=-a*exp(x);
end;
 
Function Fibonachi(a,e,x1,x2:string):TStringList;
 
Function NomberFib(Fibc:extended):integer;
var i:integer;
begin
  i:=0;
  repeat
    i:=i+1;
  until Fibc<Fib[i];
    result:=i;
end;
 
var
  ma,me,dx,d,F,nx1,nx2,mx1,mx2:extended;
  N:integer;
begin
  result:=TstringList.Create;
  result.Clear;
  ma:=strtofloat(a);
  me:=strtofloat(e);
  mx1:=strtofloat(x1);
  mx2:=strtofloat(x2);
  dx:=me;
  repeat
    F:=(mx2-mx1)/dx;
    result.Add('Число Фибаночи = '+floattostr(f));
    N:=NomberFib(F);
    result.Add('Берем N = '+inttostr(N));
    nx1:=mx1+(mx2-mx1)*(fib[N-2]/fib[N]);
    nx2:=mx1+(mx2-mx1)*(fib[N-1]/fib[N]);
    result.Add('Получаем интервал:');
    result.Add(floattostr(nx1)+'  '+floattostr(nx2));
    if fac(ma,nx1)<fac(ma,nx2) then begin
      mx2:=nx2;
      result.Add('Отбрасываем правый интервал.');
    end;
    if fac(ma,nx1)>=fac(ma,nx2) then begin
      mx1:=nx1;
      result.Add('Отбрасываем левый интервал.');
    end;
    result.Add('');
    d:=mx2-mx1;
  until d<me;
    result.Add('Ответ: '+floattostr((mx2+mx1)/2)+'; '+floattostr(fac(ma,(mx2+mx1)/2)));
end

Leave a Comment

40 + = 41