![]() |
|
|
#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
|
||||
|
||||
|
Можно метод отсечений применить.
|
|
#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
|
||||
|
||||
|
А чо, метод оптимизации никак не применить?
|
|
#7
|
|||
|
|||
|
Че то я не совсем понял о каком конкретном методе оптимизации идет речь...
|