В общем вызвался тут помочь одному товарищу. Но что то застряли в упор.
Дан алгоритм:
Но алгоритм как выяснилось заведомо ошибочен. Опознать ошибку предлагается с помощью магического шара либо какого то особо одаренного телепата.
Дано решение:
3 интервала -10,-8,4 от -8,4 до 3,8 от 3,8 до 10
Вот функция:
function TForm1.F(x: double): double;
begin
Result := -2.0 / (4.0 * sin(0.5 * x) + 0.6 * x - 10.0);
end;
начальный интервал -10, 10
function TForm1.CheckFunc(a, b, gamma: double; var am, bm: double): integer;
var
x0, x1, x2: double;
lastAbs: double;
begin
am := 0;
bm := 0;
x1 := a;
x2 := a + gamma;
while (a < b) do
begin
if (x2 <= b) then
begin
x0 := (x1 + x2) / 2.0;
if ((F(x0) <= F(x1)) or (F(x0) <= F(x2))) then
begin
//выпукла
end
else
begin
// невыпукла
// выбираем максимальный интервал
if abs(x2 - x1) > lastAbs then
begin
am := x1;
bm := x2;
lastAbs := abs(x2 - x1);
end;
a := x2; // начинаем новый интервал c конца предыдущего
x1 := a;
x2 := a;
end;
x2 := x2 + gamma;
end
else
begin
a := a + gamma; // согласно алгоритму сдвигаем левую границу
x1 := a;
x2 := a + gamma;
end;
end;
// проверяем последний интервал
if abs(x2 - x1) > lastAbs then
begin
am := x1;
bm := x2;
lastAbs := abs(x2 - x1);
end;
Result := 2;
end;
Может кто нибудь поможет?? Ни гугл не помогает ни вики.
Первый интервал еще попадает -10, -8,4 а дальше в лучшем случае получалось -8,4, 10
Такое ощущение что над человеком тупо издеваются. Типа вот учебник с ошибкой, но ты должан сам разобраться в теме, найти ошибку и вылечить ее.