|
Вопрос # 3 890/ вопрос закрыт / |
|
Здравствуйте!
В приведенной ниже программе, требуется найти минимум функции с точностью 0.001 методом градиентного спуска...
Пмогите найти ошибку!
Приложение: Переключить в обычный режим- function FuncGD (x1, x2: real): real;
- begin
- Result := Sqr(x2 - Sqr(x1)) + Sqr(1 - x1);
- end;
-
- function FuncGDx1 (x1, x2: real): real;
- begin
- Result := 4*x2*x1 + 4*x1*Sqr(x1) + 2*x1 - 2;
- end;
-
- function FuncGDx2 (x1, x2: real): real;
- begin
- Result := 2*x2 - 2*Sqr(x1);
- end;
-
- procedure TMainForm.BitBtnGDRunClick(Sender: TObject);
- var
- x01, x02, h: real;
- x1, x2, l: real;
- E: real;
- begin
-
- x01 := StrToFloat(LabEdGDx01.Text);
- x02 := StrToFloat(LabEdGDx02.Text);
- h := StrToFloat(LabEdGDh.Text);
- E := StrToFloat(LabEdGDAccuracy.Text);
-
- l := Sqrt(Sqr(FuncGDx1(x01, x02)) + Sqr(FuncGDx2(x01, x02)));
- while l > E do begin
- repeat
- x1 := x01 - h*(FuncGDx1(x01, x02));
- x2 := x02 - h*(FuncGDx2(x01, x02));
- h := h/2;
- until FuncGD(x1, x2) < FuncGD(x01, x02);
- l := Sqr(FuncGDx1(x1, x2)) + Sqr(FuncGDx2(x1, x2));
- x01 := x1;
- x02 := x2;
- end;
- EditGDx1.Text := FloatToStr(x1);
- EditGDx2.Text := FloatToStr(x2);
- EditGDfx1x2.Text := FloatToStr(FuncGD(x1, x2));
-
- end;
 |
Вопрос задал: serox (статус: Посетитель)
Вопрос отправлен: 16 марта 2010, 02:03
Состояние вопроса: закрыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 17 марта 2010, 10:09; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 16 марта 2010, 08:09 [#1]:
Цитата (serox):
Пмогите найти ошибку!
Какую ошибку искать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 16 марта 2010, 13:01 [#2]:
в чём ошибка?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
serox (статус: Посетитель), 16 марта 2010, 23:15 [#3]:
Я так понимаю полуается бесконечный цикл... Т.к. программа виснет на этой процедуре... Видимо ошибка в самом алгоритме...
P.S. Хотя по моему всёправильно... *SCRATCH*
That will be, you and do not learn, if never will try! ^__^
|
|
Егор (статус: 10-ый класс), 17 марта 2010, 06:35 [#4]:
Вот зависающий цикл:
repeat
x1 := x01 - h*(FuncGDx1(x01, x02));
x2 := x02 - h*(FuncGDx2(x01, x02));
h := h/2;
until FuncGD(x1, x2) < FuncGD(x01, x02);
Здесь h в конце станет равным нулю, соответственно FuncGD(x1, x2) будет равно FuncGD(x01, x02). Если при этом FuncGD(x1, x2) было больше FuncGD(x01, x02), то выхода из цикла не будет.
Можно, конечно, сделать условие <=, но это глупое условие - слишком высокая точность, на пределе машинной арифметики.
В этом цикле должны меняться переменные x01 и х02. Примерно так:
...
x1 := x01; // <---------
x2 := x02; // <---------
...
repeat
x01 := x1; // <---------
x02 := x2; // <---------
x1 := x01 - h*(FuncGDx1(x01, x02));
x2 := x02 - h*(FuncGDx2(x01, x02));
h := h/2;
until FuncGD(x1, x2) < FuncGD(x01, x02);
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 17 марта 2010, 06:35 [#5]:
вообще, если программа виснет, нужно пользоваться отладчиком - в данном случае стало бы понятно, почему
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
serox (статус: Посетитель), 17 марта 2010, 07:19 [#6]:
Я видимо не такой прошаренный...
P.S. А где можно про него почитать?
That will be, you and do not learn, if never will try! ^__^
|
|
min@y™ (статус: Доктор наук), 17 марта 2010, 08:20 [#7]:
Цитата (serox):
Я видимо не такой прошаренный...
Да, без отладчика только хэллоу, ворлд написать можно. Учись пользоваться дебаггером.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 17 марта 2010, 10:09 [#8]:
Цитата (serox):
А где можно про него почитать?
гугл в помощь - просто рассказывать долго.
а так - очень удобная штука. плюс к тому - несложная
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
27 мая 2013, 12:16: Вопрос закрыт (решение принял DNK): Автор потерял интерес к вопросу
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|