Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2013, 15:48   #1
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию Метод наискорейшего спуска в 3D(виснет программа)

Здравствуйте. Почему-то не загружается, вернее виснет программа по нахождению экстремума функции. Сама программа и источник, из которого я её позаимствовал, прикреплены ниже. Помогите, пожалуйста.
Вложения
Тип файла: rar Наиск.Спуск.rar (725.9 Кб, 20 просмотров)
.FROST. вне форума Ответить с цитированием
Старый 17.04.2013, 16:09   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Залей сюда код, где подвисает.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 17.04.2013, 19:30   #3
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

Без этого куска кода,все более менее работает, но мне необходимо,что бы программа отображала графически изменение точек=(

Код:
procedure TForm1.FormPaint(Sender: TObject);
var
i,j: real;
zz,xl,yl,zl,zlm,stg,h: glfloat;
fy,fx,clr,clb,obl : real;
it,wn : integer;
mm1,mm2,mm3,mm4 : array [0..5] of TM;
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
xl:=0;
yl:=0;
zl:=0;
zlm:=StrToFloat(StringGrid1.cells[0,3]);
stg:=StringGrid1.ColCount;
clr:=0;
clb:=1.0;
h:=StrToFloat(Edit3.text);
wn:=StrToInt(Edit5.text);
obl:= StrToFloat(Edit6.Text);
//ox oy oz
glscalef(masht,masht,masht);
glLineWidth(3);
glcolor3f(1.0,1.0,1.0);
glBegin(GL_Lines);
glVertex3f(-1,-1,1);
glVertex3f(1,-1,1);
glVertex3f(-1,-1,1);
glVertex3f(-1,1,1);
glVertex3f(-1,-1,1);
glVertex3f(-1,-1,-1);
glend;
glLineWidth(1);
glcolor3f(1.0,1.0,0.0);
glBegin(GL_Lines);
//x
glVertex3f(1.1-0.03,-1+0.1,1);
glVertex3f(1.1+0.03,-1-0.1,1);
glVertex3f(1.1+0.03,-1+0.1,1);
glVertex3f(1.1-0.03,-1-0.1,1);
//z
glVertex3f(-1-0.03,1.1,1);
glVertex3f(-1+0.03,1.1,1);
glVertex3f(-1-0.03,1.1,1);
glVertex3f(-1+0.03,1.2,1);
glVertex3f(-1-0.03,1.2,1);
glVertex3f(-1+0.03,1.2,1);
//y
glVertex3f(-1,-1,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1-0.03,-1+0.2,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1+0.03,-1+0.2,-1-0.1);
glend;

//if(ComboBox1.ItemIndex=1) then begin
//z1:sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
//z1:=sin(x0)/(x0+y0*y0+1);

i:=-wn;
j:=-wn;
while j<=wn do begin
i:=-wn;
yl:=j;
//glBegin(GL_points);
glBegin(GL_Lines);
glcolor3f(clr,0.0,clb);
while i<=wn do begin
xl:=i; //f(x) ==
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
if zl>=zlm then begin
zlm:=zl;
clr:=clr+0.01;
clb:=clb-0.01;
glcolor3f(clr,0.0,clb);
end;
glVertex3f(xl*obl,zl*obl,yl*obl); //+++
i:=i+0.1;
xl:=i;
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
glVertex3f(xl*obl,zl*obl,yl*obl); //++++
end;
j:=j+h;
end;
glend;
//----------------------
i:=-wn;
j:=-wn;
clr:=0;
clb:=1.0;
zlm:=StrToFloat(StringGrid1.cells[0,3]);
while j<=wn do begin
i:=-wn;
xl:=j;
glBegin(GL_Lines);
glcolor3f(clr,0.0,clb);
while i<=wn do begin
yl:=i; //f(x) ||
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
if zl>=zlm then begin
zlm:=zl;
clr:=clr+0.01;
clb:=clb-0.01;
glcolor3f(clr,0.0,clb);
end;
glVertex3f(xl*obl,zl*obl,yl*obl); //+++
i:=i+0.1;
yl:=i;
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
glVertex3f(xl*obl,zl*obl,yl*obl); //+++
end;
j:=j+h;
end;
glend;
//------
it:=0;
glLineWidth(2);
glBegin(GL_Line_strip);
glcolor3f(0.0,1.0,0.0);
while it<StringGrid1.ColCount do begin
xl:=StrToFloat(StringGrid1.cells[it,1]); //+
yl:=StrToFloat(StringGrid1.cells[it,2]); //+
zl:=StrToFloat(StringGrid1.cells[it,3]); //+
glVertex3f(xl*obl,zl*obl,yl*obl);
it:=it+1;
end;
glend;
glLineWidth(1);
//tmax
glPointSize(6);
glBegin(GL_points);
glcolor3f(1.0,0.0,0.0);
glVertex3f(xl*obl,zl*obl,yl*obl);
glcolor3f(0.0,0.0,1.0);
glVertex3f(StrToFloat(StringGrid1.cells[0,1])*obl,StrToFloat(StringGrid1.cells[0,3])*obl,StrToFloat(StringGrid1.cells[0,2])*obl);
glend;
glscalef(1.0/masht,1.0/masht,1.0/masht);
glRotatef(verx,1,0,0);
glRotatef(rt,0,1,0);
SwapBuffers(DC);
Label2.Caption:=FloatToStr(zlm);

end;
.FROST. вне форума Ответить с цитированием
Старый 17.04.2013, 23:19   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Скачал проект. В суть алгоритма не вникал, скажу сразу, что h изначально получает значение "0", так что цикл
Код:
while j<=wn
будет крутиться вечно, т.к.
Код:
j:=j+h; // другими словами j:=j+0;
Далее, если в IDE на стадии разработки в Edit3.Text записать значение>0 , то вылезет другая ошибка, а именно:"В какой-то ячейке StringGrid значение не является вещественным". Вылезает здесь:
Код:
xl:=StrToFloat(StringGrid1.cells[it,1]); //+
yl:=StrToFloat(StringGrid1.cells[it,2]); //+
zl:=StrToFloat(StringGrid1.cells[it,3]); //+
Будет честны, там вообще ничего нет =). А какие там значения должны быть, черт его знает.
Почему же таки виснет прога спросишь Ты меня? Ёсик ответит Тебе. Из-за цикла, который вставлен в FormPaint. А метод FormPaint вызывается тогда, когда нужно нарисовать наше окно. ТО есть мы нажимаем "Compile", и вызовутся методы:
Код:
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
Form.Create;
FormPaint;// а вот тут мы из-за цикла повиснем
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 17.04.2013 в 23:25.
Rin вне форума Ответить с цитированием
Старый 18.04.2013, 08:10   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Даже беглого взгляда на код достаточно, чтобы понять, что написан он безграмотно, и пользоваться им - себе дороже.

Нельзя брать такой код за основу своего проекта: и проблем с ним не оберетесь, и программировать как следует не научитесь.
s-andriano вне форума Ответить с цитированием
Старый 18.04.2013, 10:29   #6
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

А как по-другому вывести изменение точек на график?
.FROST. вне форума Ответить с цитированием
Старый 18.04.2013, 13:34   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

"По-другому" по сравнению с чем?
s-andriano вне форума Ответить с цитированием
Старый 18.04.2013, 14:13   #8
.FROST.
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 56
По умолчанию

нужно просто решить задачу нахождения минимума/максимума функции одним из методов оптимизации, при этом на графике изобразить переход точек.
.FROST. вне форума Ответить с цитированием
Старый 18.04.2013, 21:26   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

И в чем именно состоит проблема?
s-andriano вне форума Ответить с цитированием
Старый 19.04.2013, 01:43   #10
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Короче, заводишь булевую переменную(флаг), которая отвечает за разрешение начала рисования. В FormPaint в самом начале проверяешь чему равен флаг: false - на выход, true - погнали считать.
Флагу присваивается значение true, если нажали на кнопку "Расчет". При этом нужно проверить, введены ли все входные значения и введены ли они верно. Введут "Маша", а нам Маша и не нужна для расчетов, нам число нужно! Вместо "." поставят "," в Edite и вылетит ошибка "Что-то ни фига не вещественное число вы ввели", да ещё и на английском. Так же проверяй значения, которые используются в циклах с условием, а то получится, что h=0, и та же песня с зависанием. Если в программе используется деление, да ещё и в цикле, то может возникнуть ситуация деления на ноль. Так что все проверки на правильность введения сделай до того, как флагу присвоить true.

Флагу присваивается значение false, если начинают вводить новые значения в любое поле.
А на счет этикета программирования можешь где-нибудь почитать сам.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 19.04.2013 в 01:44. Причина: Punto Switcher
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод наискорейшего спуска RocBoy-D Помощь студентам 0 26.03.2013 18:05
Метод наискорейшего спуска Михаил77 Помощь студентам 0 17.12.2012 18:36
Методы оптимизации: метод Ньютона и метод наискорейшего спуска ruslanGacurap Помощь студентам 0 30.01.2012 13:54
Метод наискорейшего спуска Михаил1800 Помощь студентам 1 19.07.2011 13:30
Алгоритм наискорейшего спуска для любого количества аргументов целевой функции Evil Sun Общие вопросы C/C++ 5 08.05.2009 13:18