подскажите как правильно искать экстремумы у функции cos(x)/x
program graph;
uses
graphABC;//Подключаем графический модуль
const
W = 800;
H = 500;//Размеры графического окна
function F(x: real): real;
begin
F := cos(x) / x; //Функция
end;
var
x0, y0, x, y, xLeft, yLeft, xRight, yRight, long, code: integer;
a, b, fmin, fmax, x1, y1, mx, my, n, fig, i: real;
nume, str1: string;
begin
repeat
writeln('Задайте интервал графика');
writeln('a: ');
repeat
readln(str1);
val(str1, a, code);
if Code <> 0 then
writeln('Недопустимое значение...');
until Code = 0;
writeln('b: ');
repeat
Readln(str1);
val(str1, b, code);
if Code <> 0 then
writeln('Недопустимое значение...')
else if b = a then
writeln('"b" не должно быть равным "a"');
until (code = 0);
until (a <> b);
SetWindowSize(W, H); //Устанавливаем размеры графического окна
//Координаты левой верхней границы системы координат:
xLeft := 50;
yLeft := 50;
//Координаты правой нижней границы системы координат:
xRight := W - 50;
yRight := H - 50;
if (a > b) then
begin
n := a;
a := b;
b := n;
n := 0;
end;
if (b < 0) then
begin
mx := (xRight - xLeft) / (1 + (a) * (-1));
x0 := xRight - trunc(mx);
end
else if (a > 0) then
begin
mx := (xRight - xLeft) / (1 + (b));
x0 := xLeft + trunc(mx);
end
else
begin
mx := (xRight - xLeft) / (b - a + 4);
x0 := trunc((abs(a) + 2) * mx) + xLeft;
end;
// нахождение экстремум
fmax := F(a);
fmin := F(a);
x1:= a;
repeat
x1:= x1 + 0.001;
if (fmax < F(x1)) then fmax:= F(x1);
if (fmin > F(x1)) then fmin:= F(x1);
until(x1 < b);
my := (yRight - yLeft) / (fmax - fmin); //масштаб по Y
y0 := yRight - trunc(abs(fmin) * my);
write(fmin);
write(fmax);
//Рисуем оси координат:
line(xLeft - 10, y0, xRight + 10, y0); //осьОХ
line(x0, yLeft - 10, x0, yRight + 10); //осьОY
SetFontSize(12); //Размершрифта
SetFontColor(clBlue); //Цветшрифта
TextOut(xRight + 20, y0 - 15, 'X'); //Подписываем ось OX
TextOut(x0 - 10, yLeft - 30, 'Y'); //Подписываем ось OY
SetFontSize(8); //Размер шрифта
SetFontColor(clRed);//Цвет шрифта
long := trunc((xRight - x0) / mx);
fig := 1;
if (trunc((xRight - xLeft) / mx) > 60) then
fig := 5
else if (trunc((xRight - xLeft) / mx) > 30) then
fig := 2
else if (trunc((xRight - xLeft) / mx) < 10) then
fig := 0.5;
while (i < long) do
begin
i := i + fig;
str(i, nume);
line(x0 + trunc(mx * i), y0 - 3, x0 + trunc(mx * i), y0 + 3);
TextOut(x0 + trunc(mx * i), y0 + 5, nume);
end;
i := 0;
long := trunc((x0 - xLeft) / mx);
while (i < long) do
begin
i := i + fig;
str((-i), nume);
line(x0 - trunc(i * mx), y0 - 3, x0 - trunc(mx * i), y0 + 3);
TextOut(x0 - trunc(mx * i), y0 + 5, nume);
end;
i := 0;
long := trunc((y0 - yLeft) / my);
while (i < long) do
begin
i := i + fig;
str(i, nume);
line(x0 - 3, y0 - trunc(my * i), x0 + 3, y0 - trunc(my * i));
TextOut(x0 + 3, y0 - trunc(my * i), nume);
end;
i := 0;
long := trunc((yRight - y0) / my);
while (i < long) do
begin
i := i + fig;
str((-i), nume);
line(x0 - 3, y0 + trunc(my * i), x0 + 3, y0 + trunc(my * i));
TextOut(x0 + 3, y0 + trunc(my * i), nume);
end;
TextOut(x0 - 10, y0 + 10, '0'); //Нулевая точка
{ График функции строим по точкам: }
x1 := a; //Начальное значение аргумента
while x1 <= b do
begin
if(x1 < -0.01) then begin
y1 := F(x1); //Вычисляем значение функции
x := x0 + round(x1 * mx); //Координата Х в графическом окне
y := y0 - round(y1 * my); //Координата Y в графическом окне
//Если y попадает в границы [yLeft; yRight], то ставим точку:
if (y >= yLeft) and (y <= yRight) then SetPixel(x, y, clGreen);
end;
if(x1 > 0.01) then begin
y1 := F(x1); //Вычисляем значение функции
x := x0 + round(x1 * mx); //Координата Х в графическом окне
y := y0 - round(y1 * my); //Координата Y в графическом окне
//Если y попадает в границы [yLeft; yRight], то ставим точку:
if (y >= yLeft) and (y <= yRight) then SetPixel(x, y, clGreen);
end;
x1 := x1 + 0.001//Увеличиваем абсциссу
end;
end.