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);
}
Градиентный метод с дроблением шага. Условная оптимизация.
Написать программу поиска экстремума целевой функции градиентным методом с дроблением шага.
Найти минимум функции:
P=3*x1+5*x2,
при ограничении:
0,05^x1+0,02^x2<0,002.
(критерий остановки: ||grad P||<epsilon)
Написал следующее (Button1-кнопка "Посчитать", вводятся начальный шаг, начальная точка (x1, x2) ):
Код:
Выдает переполнение разрядной сетки.
Вроде бы в алгоритме все правильно. Что не так?
Руководствоваться следовало методичкой [ATTACH]1283[/ATTACH]