Показать сообщение отдельно
  #1  
Старый 04.06.2009, 15:24
Polina.from Polina.from вне форума
Прохожий
 
Регистрация: 04.06.2009
Сообщения: 2
Репутация: 10
По умолчанию Floating point division by zero. Где ошибка?

Здравствуйте!
Подскажите, подалуйста! Мне нужно найти экстремумы функции методом поразрядного приближения. Delphi выдает Floating point division by zero. Где здесь ошибка?

Код:
function F1(x: real):real;
  begin
    F1:=Ln(x)/Sqrt(x);
  end;
procedure TForm1.Result1Click(Sender: TObject);
  const n=10;

  var
    h,x: real;

  begin
    try
      eps:=StrToFloat(Trim(Edit2.Text)); //преобразуем ввод в число
    except //если возникла ошибка
      ShowMessage('Неверно задана точность');
      Edit2.SetFocus;
      Exit;
    end;
    try
      a:=StrToFloat(Trim(Edit3.Text)); //преобразуем ввод в число
    except //если возникла ошибка
      ShowMessage('Неверно задана нижняя граница исследуемого интервала');
      Edit3.SetFocus;
      Exit;
    end;
    try
      b:=StrToFloat(Trim(Edit4.Text)); //преобразуем ввод в число
    except //если возникла ошибка
      ShowMessage('Неверно задана верхняя граница исследуемого интервала');
      Edit4.SetFocus;
      Exit;
    end;
    if a<=0 then
      begin
      ShowMessage('Нижняя граница интервала не входит в область допустимых значений функции');
      Edit3.SetFocus;
      Exit;
      end;
    if b<a then
      ShowMessage('Значение нижней границы исследуемого интервала не должно превышать значение верхней')
    else
      begin
        h:=(b-a)/n;
        begin
          c:=a;
          d:=b;
          while h>=eps do
            begin
              begin
                while x<=d do
                begin
                  x:=c+h;
                  Xmin:=c;
                  if F1(x)<F1(Xmin) then Xmin:=x;
                end;
              end;
              if Xmin=a then
              begin
                c:=Xmin;
                d:=Xmin+h;
                h:=h/n;
              end;
              if Xmin=b then
              begin
                c:=Xmin-h;
                d:=Xmin;
                h:=h/n;
              end;
              if (Xmin<>a) or (Xmin<>b) then
              begin
                c:=Xmin-h;
                d:=Xmin+h;
                h:=h/n;
              end;
            end;
        end;
        begin
          c:=a;
          d:=b;
          while h>=eps do
            begin
              begin
                while x<=d do
                begin
                  x:=c+h;
                  Xmax:=c;
                  if F1(x)>F1(Xmax) then Xmax:=x;
                end;
              end;
              if Xmax=a then
              begin
                c:=Xmax;
                d:=Xmax+h;
                h:=h/n;
              end;
              if Xmax=b then
              begin
                c:=Xmax-h;
                d:=Xmax;
                h:=h/n;
              end;
              if (Xmin<>a) or (Xmin<>b) then
              begin
                c:=Xmax-h;
                d:=Xmax+h;
                h:=h/n;
              end;
            end;
        end;
      end;
    Label15.Caption:=FloatToStrF(F1(Xmin),ffFixed,7,7);
    Label14.Caption:=FloatToStrF(F1(Xmax),ffFixed,7,7);
end;
Ответить с цитированием