Форум: "Потрепаться";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизПример поиска методом Фибоначи.. Найти похожие ветки
← →
Makhanev A.S. (2003-12-17 21:33) [0]Буду очень благодарен за обычный вузовский пример поиска экстремума сабжем.
Попросили сделать...но у меня времени нету....
Почитал, посмотрел, почти всё понял...кроме четкого осознания переприсваивания иксов....
Примерчик бы глянуть.
← →
Makhanev A.S. (2003-12-17 22:51) [1]Пожалуйста.
Хочется человеку помоць...
← →
Lu (2003-12-18 03:38) [2]Методом "золотого сечения", что ли?
← →
nikkie (2003-12-18 08:20) [3]я чегой-то слабо представляю себе алгоритмы поиска экстремума, кроме как разбить на отрезочки длины необходимой точности и далее полного перебора.
← →
Kair (2003-12-18 09:27) [4]Посмотрим, кажись у меня что-то было насчет Фибоначи.
← →
Внук (2003-12-18 09:47) [5]>>Lu © (18.12.03 03:38) [2]
>>Методом "золотого сечения", что ли?
Смысл тот же, только отрезок делится на отношения, задаваемые числами Фиббоначчи, а не значением золотого сечения (получается непостоянное отношение, меняется от итерации к итерации).
>>Makhanev A.S. © (17.12.03 21:33)
Вот так и живем, заказывает один, выполняет второй, а удовольствие(либо деньги) получае третий. Коммунизьм
← →
Makhanev A.S. (2003-12-18 11:07) [6]Использовал чужие (жуткие) лекции.
Кое что реализовал,
но все же считает неправильно:
function TfrmMain.Fb(n: Integer): Integer;
var //вычисление n-го элемента ряда Фибоначе
f,f1,f2:longint;
k:byte;
begin
if n < 3 then
begin
Result := 1;
Exit;
end;
f := n;
f1 := 1; f2 := 2;
k := 3;
while k <= n do
begin
f := f1 + f2;
f1 := f2;
f2 := f;
inc(k);
end;
Result := f;
end;
function TfrmMain.Fx(x: Real): Real;
begin // целевая функция
Result := 198 * sqrt(abs(x));
end;
procedure TfrmMain.btnCalculateClick(Sender: TObject);
var
x1, x3: Real; // левая/правая границы интервала соответственно
x2: Real; // искомый минимум
x4: Real;
n: Integer; // количество итераций
E: Real; // точность
L1, L2: Real;
i: Integer; // счётчик итераций
begin
// ввод переменных
x1 := StrToFloat(ledX1.Text);
x3 := StrToFloat(ledX3.Text);
n := StrToInt(ledN.Text);
E := StrToFloat(ledE.Text);
// основные вычисления
L1 := x3 - x1;
if Odd(n) then
L2 := (Fb(n - 1) / Fb(n)) * L1 - E / Fb(n)
else
L2 := (Fb(n - 1) / Fb(n)) * L1 + E / Fb(n);
x2 := x1 + L2;
x4 := x3 - x2 + x1;
i := 0; // обнуляем счётчик
repeat
if Fx(x2) > Fx(x4) then
begin
if x2 > x4 then
x3 := x2
else
x1 := x2;
x2 := x4;
end
else begin
if x2 > x4 then
x1 := x4
else
x3 := x4;
end;
Inc(i);
until i > n;
edResult.Text := FloatToStr(x2);
end;
Есть подозрение, что L1, L2 должны пересчитываться в цикле.
Но в лекциях (чужих) дан именно такой алгоритм...:(
Скорее всего в лекциях ошибка.
> Внук © (18.12.03 09:47) [5]
Я не прошу Вас выполнить что-либо за кого-то.
Если Вам не сложно, можете привести 2 формулы для вычисления новых иксов?
Я много искал в инете, не нашёл.
Нашел по гуглу, переводил... еще больше запутался, т.к. каждый автор использует свою терминологию и т.п... + язык программирования, который не совсем понятен. Всё это я могу и сам сообразить/вывести, но мне потребуется часик-другой. Странно как-то выводить метод Фибоначе, если его до меня вывели в 13-ом веке...
Задавая этот вопрос, я полагал, что отвечающему будет проще всего просто кинуть рабочий пример (любой).
> Вот так и живем, заказывает один, выполняет второй, а удовольствие(либо
> деньги) получае третий. Коммунизьм
Если существуют законные бесплатные источники, почему ими не воспользоваться???
Я же не прошу решить что-либо за меня.
В любом случае я никого не обязываю, Ваше право - отвечать или нет.
Здесь нет "коммунизьма": назовите цену за свои услуги. Я поговорю с человеком, выберем форму оплаты... вдруг договоримся?
НО: я полагаю, что перечисление сотни рублей по России наложенным платежом - вещь невыгодная (из-за комиссии).
И во-вторых, думаю для Мастера DELPHI сотня рублей - деньги небольшие..но это ИМХО.
← →
Внук (2003-12-18 14:52) [7]>>Makhanev A.S. © (18.12.03 11:07) [6]
Дело не в деньгах. Просто фраза "Попросили сделать...но у меня времени нету...." вызывает не лучшие эмоции.
Да, L1, L2 должны пересчитываться в цикле. Формулу скажу, если до завтра терпит. Надо в методичку заглянуть, чтоб наверняка.
← →
Makhanev A.S. (2003-12-18 20:34) [8]
> Внук © (18.12.03 14:52) [7]
1)"Попросили сделать...но у меня времени нету...." - я имел ввиду то, что нет времени на выведение илгоритма с нуля, когда есть сто лет назад выведенные формулы.
Подозреваю, что вопрос был задан некорректно, за что перед Вами и извиняюсь.
Перечитал, подумал...решил, что действительно нагловато выглядело.
2)включил вычисление L1, L2 в цикл, получилось (по крайней мере на моих тестовых примерах).
До завтра терпит, буду благодарен за формулу, т.к. охота сверить:)
Благодарю за внимание.
← →
Kair (2003-12-19 06:43) [9]Вот есть такая ерунда
program Project1;
{$APPTYPE CONSOLE}
(* ****** Метод Фибоначчи ****** *)
function F(X: Real): Real;
begin
Result:=36897.883-545.382*X+2.033*Sqr(X);
end;
const W: array [1..13] of Byte =
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233);
var
k,j: Byte;
A,B,E,Z,H,X1,X2,Xopt,F1,F2,Fopt: Real;
begin
A:=125;
B:=140;
E:=0.5;
j:=1;
Z:=(B-A)/E;
for k:=1 to Length(W) do
if (Z>W[k-1])and(Z<W[k]) then Break;
H:=(B-A)/W[k];
X1:=A;
F1:=F(X1);
X2:=X1+H*W[k-j];
while j<k do
begin
F2:=F(X2);
Inc(j);
if F2>F1 then X2:=X1-H*W[k-j] else X2:=X1+H*W[k-j];
X1:=X2;
F1:=F2;
end;
Xopt:=X2;
Fopt:=F(Xopt);
Writeln("Xopt=",Xopt:9:6);
Writeln("Fopt=",Fopt:9:6);
Readln;
end.
Последовательность чисел Фибоначчи представлена в массиве, потому как для данных значений A и B больше и не надо. А если понадобится больше, то там есть формула для вычисления последовательности чисел:
W[k]:=W[k-1]+W[k-2], W[1]=W[2]=1, k=1,2,3,4,...
Возможно, что тут что-то не то, потому как значение Xopt значительно расходится со значениями Xopt, полученными в других методах (дихотомии, Больцано и пр.)...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c