Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2012, 13:23
IzIFRag IzIFRag вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 10
Репутация: 10
По умолчанию Близкое значение

Добрый день всем !
Есть такая задача у меня, она больше относится к построению самого алгоритма, но так как пишу на Delphi, то поэтому обратился сюда...
Итак, даны графики нескольких кривых параболоидальной формы( графики построены по точкам не по функциям!!!), Две оси этого графика число F и число F/L - они заданы.
Что нужно: На входе чило [F,FL], необходимо проверить к какой из кривых оно ближе всего.

Т.е. у меня сейчас массив забит числами вещественными не отрицательными. Столбцы которого представляют одну кривую целиком.
Т.е. надо определить, грубо говоря, при заданном F, которое будет означать строку к какому столбцу все - таки ближе значение F/L.
Ткните в алгоритм плиз, заранее благодарен.
Ответить с цитированием
  #2  
Старый 26.06.2012, 00:22
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

Цитата:
Сообщение от IzIFRag
Что нужно: На входе чило [F,FL], необходимо проверить к какой из кривых оно ближе всего.
Цитата:
Сообщение от IzIFRag
Т.е. надо определить, грубо говоря, при заданном F, которое будет означать строку к какому столбцу все - таки ближе значение F/L.
Сам себе противоречишь...

1. Знаешь координаты точки, знаешь координаты всех точек графиков - в цикле считаешь расстояния по формуле всем известной и выбираешь минимальное
2. Ещё проще. Вместо расстояния считаешь дельту игрек.

Что трудного?)

Чтоб минимальное значение найти - как вариант можно использовать
Код:
MinValue (const Data: array of Double ): Double;

Гугл тоже вроде работает
Ответить с цитированием
  #3  
Старый 26.06.2012, 08:43
IzIFRag IzIFRag вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 10
Репутация: 10
По умолчанию

Уже придумал как сделать, позже напишу.
Как в предыдуще посте так просто не получится.
Потому как F может не совпадать с F из таблицы, тогда придется высчитывать для него F/L с помощью интерполяции.
Ответить с цитированием
  #4  
Старый 26.06.2012, 09:31
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Можно метод отсечений применить.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 27.06.2012, 12:04
IzIFRag IzIFRag вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 10
Репутация: 10
По умолчанию

В общем если интересно или пригодится вдруг:
Код:
procedure TForm1.Button11Click(Sender: TObject);
const
 COLUMNS = 7;
var
 DataFL: array of array [0..COLUMNS] of Extended;
  DataC: array of array [0..1] of Extended;
 FdelLmas: array [1..columns]of extended;
  f,f2: TextFile;
 i, Len,index,j,indexFL: integer;
 FdelL: real;

begin
 AssignFile(f,'PrilFL.txt');      //читаем файл, где весь масив вещ. чисел
 Reset(f);
 while not Eof(f) do
  begin
   Len := Length(DataFL);
   SetLength(DataFL, Len + 1);

   for i := 0 to columns do
    Read(f, DataFL[Len, i]);
   Readln(f);
  end;
 CloseFile(f);
 indexfl:=0;    form1.Label17.Caption:='К. формы водосбора = ';
                    label14.Caption:='Параметр Ф = ';
             Fz:=Strtofloat(Form1.Edit1.Text);            //Получаем зачение F
             L:=Strtofloat(Form1.Edit3.Text);             //Получаем зачение L
             C1:=0;
             FdelL:=Fz/L;                                  //Получаем зачение F/L
             if Fz>84 then showmessage('Ошибка значения F')
             else begin

 for i := 0 to Len do
 if Fz= Datafl[i,0] then                      //Значение F только в первом столбце,
    begin                                                    // если находим такое то запоминаем строку и идем дальше
       index:=i;
   if FdelL< Datafl[index,1] then indexfl:=1            //тут смотрим на строку и ищем  близкий элемент к F/L
   else
   if fdell>datafl[index,7] then indexfl:=7
   else
   begin
 for j := 1 to columns do begin
if ((FdelL>datafl[index,j]) and (FdelL<=datafl[index,j+1])) then
begin

          if (abs(dataFl[index,j]-FdelL) < abs(dataFl[index,j+1]-FdelL)) then
          indexFL:=j else indexFL:=j+1;                             // ну и после нахождения близкого находим его индекс

end;       end;

 end;
    end
    else    //Если F не найдено, то нужно вычислять дополнительные F/L для него:


    begin
            if (fz>Datafl[i,0]) and (fz<Datafl[i+1,0]) then                 //находим  между какими строками F
            begin
           for j:=1 to columns do
           begin                                   // интерполяцией вычисляем строку с новыми значениями F/L для этого значения F
          FdelLmas[j]:=(((fz-Datafl[i,0])/(Datafl[i+1,0]-Datafl[i,0])*(Datafl[i+1,j]-Datafl[i,j])+Datafl[i,j] ));
               end;

              if FdelL < (fdellmas[1]) then indexfl:= 1            //тут смотрим на новую строку и ищем  близкий элемент к F/L
   else
   if fdell>fdellmas[columns] then indexfl:=7
   else
   begin
 for j := 1 to columns do
if ((FdelL>fdellmas[j]) and (FdelL<=fdellmas[j+1])) then
begin
          if (abs(fdellmas[j]-FdelL) < abs(fdellmas[j+1]-FdelL)) then
          indexFL:=j else indexFL:=j+1;                             // ну и после нахождения близкого находим его индекс

end;
   end; end;


   end;    

   case indexfl of             //выбираем график близкий к числу
   1: label4.caption:='grafik 1';
   2: label4.caption:='grafik 2';
   3: label4.caption:='grafik 3';
   4: label4.caption:='grafik 4';
   5: label4.caption:='grafik 5';
   6: label4.caption:='grafik 6';
   7: label4.caption:='grafik 7';

    end; end;
end;
Ответить с цитированием
  #6  
Старый 27.06.2012, 12:48
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А чо, метод оптимизации никак не применить?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 28.06.2012, 14:42
IzIFRag IzIFRag вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 10
Репутация: 10
По умолчанию

Че то я не совсем понял о каком конкретном методе оптимизации идет речь...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025