Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Поиск пересечений графика с осью абсцисс

01.01.2007

Для поиска пересечений графика заданной функции с осью абсцисс очень удобен метод хорд.

Он основан на линейной интерполяции. По двум точкам, лежащим по разные стороны от оси OX,

строится прямая. Поскольку точка пересечения этой прямой с осью OX уже ближе к искомому x,

то при повторении этой операции точность резко увеличивается.

Если функция задана массивом точек, то можно произвести только одну операцию приближения.

function F(x: double): double;
begin
  result := sin(x);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  left = -10;
  right = 10;
var
  x1, x2: double;
  y1, y2: double;
  k, b: double;
  x, y: double;
  d1, d2: double;
begin
  x1 := left;
  y1 := f(x1);
  repeat
    x2 := x1 + 0.1;
    y2 := f(x2);
    if y1 * y2 < 0 then begin
      repeat
        y1 := f(x1);
        y2 := f(x2);
        k := (y1 - y2) / (x1 - x2);
        b := y1 - k * x1;
        x := -b / k;
        y := k * x + b;
        d1 := sqr(x1 - x) + sqr(y1 - y);
        d2 := sqr(x2 - x) + sqr(y2 - y);
        if d1 > d2 then begin
          d1 := d2;
          x1 := x;
        end else x2 := x;
      until d1 < 1E-20;
      ListBox1.Items.Add(FloatToStr(x1));
    end;
    x1 := x2;
    y1 := y2;
  until x2 > right;
end;

Взято с сайта https://blackman.wp-club.net/