Второй метод, вот что получилось:
Код:
uses
crt;
var
a, b, c, d, x, xn, dx: real;
const
e: real = 0.01;
function f (x: real): real;
begin
f := a * x * x * x +
(b - a) * x * x +
(c - b) * x +
(d - c);
end;
begin
clrscr;
write ('a = '); readln (a);
write ('b = '); readln (b);
write ('c = '); readln (c);
write ('d = '); readln (d);
write ('x = '); readln (x);
dx := 1;
if abs(f(x)) < abs(f(x + dx)) then dx := -1;
while f(x) > e do begin
xn := x + dx;
if abs(f(xn)) > abs(f(x)) else dx := -0.5 * dx;
x := xn;
end;
writeln ('result = ', x : 8 : 6);
readkey;
end.
После запуска вводишь коэффициенты и первое значение x. Потом программа начинает увеличивать (или уменьшать) x на dx (в начале = 1) до тех пор пока функции не начнут расходиться - тогда прога менят направление dx и уменьшает его. Сей процесс продолжается до тех пор, пока разница между функциями не будет меньше какого-то маленького числа e. Прогу не тестил, но, кажись, сработать должно...
Третий метод, как я понял, фактически состоит в решении уравнения
ax^3 + (b-a)x^2 + (c-b)x + (d-c) = 0
а я, хучь убей, не помню ни методов решения кубических уравнений в общем виде.