Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Градиентный метод с дроблением шага. Условная оптимизация.

23K
02 декабря 2006 года
[SP]Kenny
1 / / 02.12.2006
Необходимо решить следующую задачу:

Написать программу поиска экстремума целевой функции градиентным методом с дроблением шага.

Найти минимум функции:

P=3*x1+5*x2,

при ограничении:

0,05^x1+0,02^x2<0,002.

(критерий остановки: ||grad P||<epsilon)

Написал следующее (Button1-кнопка "Посчитать", вводятся начальный шаг, начальная точка (x1, x2) ):

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double lambda=StrToFloat(Edit3->Text);
long double x1,x2,epsilon,mx1,mx2;
epsilon=0.01;
x1=StrToFloat(Edit1->Text);
x2=StrToFloat(Edit2->Text);
double Qp=5*pow(10,-2);
double Qda=2*pow(10,-2);
int Pp,Pda;
Pp=3;
Pda=5;
while(!(sqrt(pow(Pp,2)+pow(Pda,2))<epsilon)){
      mx1=x1;
      mx2=x2;
      x1=x1-lambda*(Pp);
      x2=x2-lambda*(Pda);
      if((Pp*x1+Pda*x2)>(Pp*mx1+Pda*mx2))
      {
          lambda=lambda/2;
          x1=mx1;
          x2=mx2;
      }
      long double gradx1,gradx2;
      gradx1=-(pow(1/20.,x1))*log(20);// компоненты градиента ограничения
      gradx2=-(pow(1/50.,x2))*log(50);
       while(!(pow(Qp,x1)+pow(Qda,x2)-2*pow(10,-3)<=0))
      {
         x1=x1+gradx1;
         x2=x2+gradx2;
      }
}
Label4->Caption=FloatToStr(x1);
Label5->Caption=FloatToStr(x2);
}


Выдает переполнение разрядной сетки.

Вроде бы в алгоритме все правильно. Что не так?
Руководствоваться следовало методичкой [ATTACH]1283[/ATTACH]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог