Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2010, 22:43   #1
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию нахождение максимума и минимума ф-ции в delphi

Помогите разобраться.

задача: дана ф-ция,найти её минимум и максимум,отобразить на графике максимум красным эллипсом,минимум-синим......данный код предназначен только для определения первого максимума и минимума на графике,а нужно для всех.например:в ф-ции Sin(x)нужно выделить все её минимумы и максимумы.







код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tpoint_r=record
    x,y:real;
  end;
   Tmas_TPoint_r=array of TPoint_r;
   Tfunc=function(z:real):real;
   Tmas_TPoint=array of Tpoint;

 var
  Form1: TForm1;
 a:Tmas_Tpoint_r;
 at,b:Tmas_tPoint;

implementation
  {$R *.dfm}
  function     f1(x:real):real;
  begin
     f1:=sin(x);

  end;
  procedure Tab(xn,xk:real; N:integer; f:Tfunc;
   Var z:Tmas_TPoint_r);
  var h:real;i:integer;
  begin
   h:=(xk-xn)/n;
   Setlength(z,n);
    For i:=0 to n-1 do
     begin
       z[i].x:= xn+ i*h;
       z[i].y := f(z[i].x);
     end;
  end;
 procedure   Grafic(z:Tmas_TPoint_r;Var g:Tmas_TPoint);
  Var hxk,hyk:real;hxn,hyn,i,n,imax,o,imin,t:integer;
  var max,min,mhx,mhy,xn,xk:real;   k:array of integer;
  begin
    n:=length(z);
    Setlength(g,n);
    xn:=z[0].x;
    xk:=z[n-1].x;
    max:=z[0].Y;  min:=z[0].Y;
   for i:=0 to n-1 do
  begin
  if z[i].y>max then
  max:=z[i].Y;
  if z[i].Y<min then
  min:=z[i].y ;
    end;

  hxn:=0; hyn:=0;
  hxk:=form1.Image1.Width;
  hyk:=form1.Image1.Height;

  mhx:=(hxk-hxn)/abs(xk-xn);
  mhy:=(hyk-hyn)/abs(max-min);

  for i := 0 to n - 1 do
   begin
    g[i].X:=round((z[i].x-xn)*mhx)+hxn;
   g[i].Y:=round((max-z[i].y)*mhy)+hyn;
  end;
     for i := 0 to n - 1 do
  form1.Image1.Canvas.Pixels [g[i].x, g[i].Y]:=clred;
  with form1.image1.Canvas do
  begin
    moveto(g[0].x,g[0].y);
    for i := 0 to n - 1 do
      lineto(g[i].X,g[i].y);
  end;
   
       imax:=0;
   g[imax].y:=g[0].y;
           for i:=1 to n-1 do
   begin
  if g[i].Y<g[imax].Y then
  begin
        g[imax].Y:=g[i].Y;
         imax:=i;
     end;
    end;
    Form1.Image1.Canvas.Brush.Color:=clRed;
    Form1.Image1.Canvas.Ellipse(g[imax].x+10,g[imax].Y +10,g[imax].x -10,g[imax].Y -10);

       imin:=0;
   g[imin].y:=g[0].y;
  for i:=1 to n-1 do
   begin
 if g[i].Y>g[imin].Y then
  begin
        g[imin].Y:=g[i].Y;
     imin:=i;
  end;
 end;
  Form1.Image1.Canvas.Brush.Color:=clblue;
  Form1.Image1.Canvas.Ellipse(g[imin].x+10,g[imin].Y +10,g[imin].x -10,g[imin].Y -10);
    end;}

  procedure TForm1.Button1Click(Sender: TObject);
begin
Tab(-9,9,200,f1,a);
Grafic(a,at) ;

end;


end.

заранее спасибо!

Последний раз редактировалось Tatusya; 23.06.2010 в 23:05.
Tatusya вне форума Ответить с цитированием
Старый 24.06.2010, 11:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Смотри: Заводишь массив
maxis:array of double;
А когда получаешь новую координату с максимумом пиши:
Код:
if текущийY>max then begin
 SetLength(maxis,length(maxis)+1);
 maxis[High(maxis)]:=ТекущийХ;
end;
А потом в цикле
Код:
for i:=low(maxis) to high(maxis) do
 maxis[i] - это х-координата одного из экстремумов
Код твой ну дюже заумен для меня, потому разбираться особо не стал, не обижайся - уверен на 120% что задачу твою можно решить гораздо проще и эффективнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2010, 12:08   #3
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

Цитата:
max:=z[0].Y; min:=z[0].Y;
for i:=0 to n-1 do
begin
if z[i].y>max then
max:=z[i].Y;
if z[i].Y<min then
min:=z[i].y ;
end;
Если я правильно поняла, этот код вычисляет максимальное и минимальное ЗНАЧЕНИЕ функции, а не ее максимум и минимум (т.е. ее экстремумы). Макс. значение и макисмум функции - это не одно и то же. Поиск максимумов осуществляется по другому, а именно:

Рассматриваются три соседних значения функции (y(x[i-1])=y1, y(x[i])=y2, y(x[i+1]=y3). Если y2>y1 и у2>y3, то в точке x[i] - максимум. Если y2<y1 и y2<y3, то у2 - минимум функции, достигающийся в точке x[i].
В противном случае (функция монотонная) и переходим к рассмотрению тройки значений y(x[i]), y(x[i+1]), y(x[i+2])

Все вычисленные максимумы склдаываются в массив - об этом уже сказал уважаемый Stilet
Snejnaya вне форума Ответить с цитированием
Старый 24.06.2010, 13:55   #4
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию

max:=z[0].Y; min:=z[0].Y;
for i:=0 to n-1 do
begin
if z[i].y>max then
max:=z[i].Y;
if z[i].Y<min then
min:=z[i].y ;
end; ----это для графика...тут всё правильно,

а для нахождения его максимума и минимума нужно немного другое,а метод который вы предложили -это для нахождения точек перегиба.

Эти нюансы прихоть препода,отклоняться от этого метода нельзя.

Stilet спасибо большое...я действовала почти также ,только у меня были проблемы с выделением памяти .попробую как вы предложили.

Последний раз редактировалось Stilet; 24.06.2010 в 14:03.
Tatusya вне форума Ответить с цитированием
Старый 24.06.2010, 14:05   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Эти нюансы прихоть препода
Ньюансы на кол - препода фтопку. Пусть понюхает как закаляется сталь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2010, 15:44   #6
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

Цитата:
а для нахождения его максимума и минимума нужно немного другое,а метод который вы предложили -это для нахождения точек перегиба.
Вы что-то путаете. Точки перегиба - это точки, в которых вторая производная функции меняет свой знак (была выпуклая, стала вогнутая). А экстремумы - это где первая производная меняет свой знак (была возрастающая функция, стала убывающая).

Точку перегиба искать придется куда более сложным и навороченным методом.
Snejnaya вне форума Ответить с цитированием
Старый 24.06.2010, 17:52   #7
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию

Да я ошиблась,я подразумевала экстремумы,только из них нужно выбрать максимальный и минимальный.

Последний раз редактировалось Tatusya; 24.06.2010 в 17:59.
Tatusya вне форума Ответить с цитированием
Старый 24.06.2010, 17:58   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

ну вообще это больше всего похоже на метод свена,который ищет интервал,где есть экстремум(мин.,макс.)Если брать малое приращение,то можно найти экстремум с заданной точностью...ну и задания дают....))
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 24.06.2010, 18:12   #9
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию

В общем я сделала задачу!!!!,только помогите понять почему в каждой точке рисуется по два эллипса?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tpoint_r=record
    x,y:real;
  end;
   Tmas_TPoint_r=array of TPoint_r;
   Tfunc=function(z:real):real;
   Tmas_TPoint=array of Tpoint;

 var
  Form1: TForm1;
 a:Tmas_Tpoint_r;
 at,b:Tmas_tPoint;

implementation
  {$R *.dfm}
  function     f1(x:real):real;
  begin
     f1:=sin(x);

  end;
  procedure Tab(xn,xk:real; N:integer; f:Tfunc;
   Var z:Tmas_TPoint_r);
  var h:real;i:integer;
  begin
   h:=(xk-xn)/n;
   Setlength(z,n);
    For i:=0 to n-1 do
     begin
       z[i].x:= xn+ i*h;
       z[i].y := f(z[i].x);
     end;
  end;
 procedure   Grafic(z:Tmas_TPoint_r;Var g:Tmas_TPoint);
  Var hxk,hyk:real;hxn,hyn,i,n,imax,o,imin,t,j:integer;
  var max,min,mhx,mhy,xn,xk,max1,min1:real;
  begin
    n:=length(z);
    Setlength(g,n);
    xn:=z[0].x;
    xk:=z[n-1].x;
    max:=z[0].Y;  min:=z[0].Y;
   for i:=0 to n-1 do
  begin
  if z[i].y>max then
  max:=z[i].Y;
  if z[i].Y<min then
  min:=z[i].y ;
    end;

  hxn:=0; hyn:=0;
  hxk:=form1.Image1.Width;
  hyk:=form1.Image1.Height;

  mhx:=(hxk-hxn)/abs(xk-xn);
  mhy:=(hyk-hyn)/abs(max-min);

  for i := 0 to n - 1 do
   begin
    g[i].X:=round((z[i].x-xn)*mhx)+hxn;
   g[i].Y:=round((max-z[i].y)*mhy)+hyn;
  end;
     for i := 0 to n - 1 do
  form1.Image1.Canvas.Pixels [g[i].x, g[i].Y]:=clred;
  with form1.image1.Canvas do
  begin
    moveto(g[0].x,g[0].y);
    for i := 0 to n - 1 do
      lineto(g[i].X,g[i].y);
  end;
    max1:=g[0].Y;
       for i:=1 to n-1 do
       if g[i].Y<max1 then
       max1:=g[i].Y;
      for i:=0 to n-1 do
     if g[i].Y=max1 then
     begin
      imax:=i;
   Form1.Image1.Canvas.Brush.Color:=clRed;
    Form1.Image1.Canvas.Ellipse(g[imax].x+10,g[imax].Y +10,g[imax].x -10,g[imax].Y -10);
      end;
    min1:=g[0].y;
  for i:=1 to n-1 do
   if g[i].Y>min1 then
      min1:=g[i].Y;

   for i:=0 to n-1 do
     if g[i].Y=min1 then
     begin
      imin:=i;
  Form1.Image1.Canvas.Brush.Color:=clblue;
  Form1.Image1.Canvas.Ellipse(g[imin].x+10,g[imin].Y +10,g[imin].x -10,g[imin].Y -10);
     end;
     end;

  procedure TForm1.Button1Click(Sender: TObject);
begin
Tab(-9,9,200,f1,a);
Grafic(a,at) ;

end;


end.
Tatusya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение минимума и максимума графика в Delphi BOOFER Помощь студентам 1 20.06.2010 10:12
поиск минимума и максимума в двумерных массивах qbasic Bentli Помощь студентам 3 19.06.2010 20:00
Поиск минимума/максимума в массиве gwarthy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 28.01.2010 22:27
КАК мне поменять 2 минимума и 2 максимума Wi1D Помощь студентам 1 09.12.2008 23:58
Нахождение минимума и максимума в трехмерном массиве 1234 Помощь студентам 11 26.05.2008 16:23