Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-25372
-=DeMoH=-
2003-12-23 15:12
2004.01.09
Кто знаком с мат.статистикой?


6-25475
ученик)
2003-11-08 02:54
2004.01.09
WebBrowser и Navigate2


1-25383
TJ
2003-12-24 23:09
2004.01.09
Алгоритм перевода десятиричного числа в двоичный в HEX OCT и т.д.


7-25623
Jedi
2003-10-09 16:10
2004.01.09
Доступ к HDD используя LBA


1-25387
hellmachine
2003-12-23 00:58
2004.01.09
Выполнение по шагам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский