@Encoders

Работа с графиком поиск экстремума?

подскажите как правильно искать экстремумы у функции 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.
  • Вопрос задан
  • 46 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы