![]() |
|
#1
|
|||
|
|||
![]() Добрый день всем !
Есть такая задача у меня, она больше относится к построению самого алгоритма, но так как пишу на Delphi, то поэтому обратился сюда... Итак, даны графики нескольких кривых параболоидальной формы( графики построены по точкам не по функциям!!!), Две оси этого графика число F и число F/L - они заданы. Что нужно: На входе чило [F,FL], необходимо проверить к какой из кривых оно ближе всего. ![]() Т.е. у меня сейчас массив забит числами вещественными не отрицательными. Столбцы которого представляют одну кривую целиком. Т.е. надо определить, грубо говоря, при заданном F, которое будет означать строку к какому столбцу все - таки ближе значение F/L. Ткните в алгоритм плиз, заранее благодарен. |
#2
|
|||
|
|||
![]() Цитата:
Цитата:
1. Знаешь координаты точки, знаешь координаты всех точек графиков - в цикле считаешь расстояния по формуле всем известной и выбираешь минимальное 2. Ещё проще. Вместо расстояния считаешь дельту игрек. Что трудного?) Чтоб минимальное значение найти - как вариант можно использовать Код:
MinValue (const Data: array of Double ): Double; Гугл тоже вроде работает |
#3
|
|||
|
|||
![]() Уже придумал как сделать, позже напишу.
Как в предыдуще посте так просто не получится. Потому как F может не совпадать с F из таблицы, тогда придется высчитывать для него F/L с помощью интерполяции. |
#4
|
||||
|
||||
![]() Можно метод отсечений применить.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
![]() В общем если интересно или пригодится вдруг:
Код:
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
|
||||
|
||||
![]() А чо, метод оптимизации никак не применить?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
|||
|
|||
![]() Че то я не совсем понял о каком конкретном методе оптимизации идет речь...
|