На бирже курсовых и дипломных проектов можно найти образцы готовых работ или получить помощь в написании уникальных курсовых работ, дипломов, лабораторных работ, контрольных работ, диссертаций, рефератов. Так же вы мажете самостоятельно повысить уникальность своей работы для прохождения проверки на плагиат всего за несколько минут.

ЛИЧНЫЙ КАБИНЕТ 

 

Здравствуйте гость!

 

Логин:

Пароль:

 

Запомнить

 

 

Забыли пароль? Регистрация

Повышение уникальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp», которое позволит вам всего за несколько минут, выполнить повышение уникальности любого файла в формате MS Word. После такого повышения уникальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, etxt.ru или advego.ru. Программа «StudentHelp» работает по уникальной технологии и при повышении уникальности не вставляет в текст скрытых символов, и даже если препод скопирует текст в блокнот – не увидит ни каких отличий от текста в Word файле.

Результат поиска


Наименование:


лабораторная работа Безусловная многомерная оптимизация

Информация:

Тип работы: лабораторная работа. Добавлен: 29.10.2012. Сдан: 2012. Страниц: 24. Уникальность по antiplagiat.ru: < 30%

Описание (план):


Уфимский  Государственный Авиационный Технический  Университет
Кафедра Автоматизации Проектирования Информационных Систем
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Лабораторная  работа №2
«Безусловная многомерная оптимизация»
 
Методы оптимизации
 
Вариант 10
 
 
 
 
 
 
 
 
 
 
 
 
Проверил:
Хасанов А.Ю.
 
 
 
 
 
Уфа  2009
 


 
Содержание
 
Цель работы….………………………………..……………………………3
Задание….…………………………………...…………………............…..3
Постановка  задачи………………………………………………………….4
График функции……………………………………………………………4
Блок-схемы………………………………………………………………….5
    Поиск по образцу……………………………………….............................5
    Метод деформируемого симплекса …………………………………….6-8
    Метод симплекса………………………………………………………..9-10
    Градиентный метод с дроблением шага…………………..………....11-12
    Метод наискорейшего спуска……………………..............................13-14
    Подпрограмма Золотое сечение………………………………………….15
    Метод Гаусса-Зейделя.………………………………………………..16-17
    Эвристический алгоритм……………………………………………...18-19
Листинг программы…………………………………………………...20-33
Графики траекторий промежуточных приближений……………….34-36
Результирующая  таблица и вывод……………………………………...37
 

Цель работы: знакомство с методами многомерной безусловной оптимизации первого и нулевого порядка и их освоение, сравнение эффективности применения этих методов конкретных целевых функций.
 
Задание:
1.Изучить  изложенные методы многомерной  безусловной оптимизации.
2.В соответствие  с вариантом задания, определенным  преподавателем,    составить  программы реализующие методы  многомерной безусловной минимизации  и найти точку минимума целевой  функции f(x)=f(x(1), x(2)) с заданной точностью e указанными методами. Начальное приближение x0 и точность e приводятся в условие задачи. Сравнить результаты, полученные разными методами для одной и той же целевой функции (в частности, сравнить число вычислении целевой функции и её производных, понадобившихся для получения заданной точности). Для каждого применяемого метода построить траекторию промежуточных точек, получаемых на очередных шагах метода и сходящихся к точке минимума.
3.Оформить  отчет о выполнении задания  с приведением условия задачи, алгоритмов и программ указанных  в задании методов минимизации,  графиков траекторий промежуточных  приближений, таблицы результатов  сравнения рассмотренных методов,  заключения по результатам сравнения  методов.
 
 
Методы многомерной безусловной  оптимизации:
 
                  а) поиск по образцу;
              б) метод деформируемого симплекса;
              в) метод симплекса;
              г) градиентный метод с дроблением шага;
              д) метод наискорейшего спуска (дихотомия);
              е) метод Гаусса-Зейделя (золотое сечение);
              ж) эвристический алгоритм.
            
 
 
 
 
 
 
    
 
 
Постановка задачи:
Целевая функция f(x)=f(x(1), x(2)) зависит от двух аргументов. Функция f(x) следующего вида:
f(x)=a*x1+b*x2+
 

Начальное
приближение
Точность
решения
Целевая функция
a
b
c
d
10
25
0,9
0,35
0,35
(1;0)
0,0004

 
График функции:





 

 

 
                       

                   
                    

 
         
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                

             
Подпрограмма double ZS(double a,double b,double x1k,double x2k,double z1,int n)

 
              е) метод Гаусса-Зейделя


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
              


 
 
Листинг программы:
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <iomanip.h>
#include <stdio.h>
#include <ctype.h>
#include <strstrea.h>
 
struct znach_x
{double x1,x2;
};
 
int N0=0,N1=0;
double f(double x1,double x2)
{double y;
N0++;
y=25*x1+0.9*x2+exp(0.35*pow(x1,2)+0.35*pow(x2,2));
 
return y;
}
 
double dfx1(double x1,double x2)
{double y;
N1++;
y=25+0.7*x1*exp(0.35*pow(x1,2)+0.35*pow(x2,2));
return y;
}
 
 
double dfx2(double x1,double x2)
{double y;
N1++;
y=0.9+0.7*x2*exp(0.35*pow(x1,2)+0.35*pow(x2,2));
return y;
}
 
 
void poiskpoobrazcu()
{const int L=1000;
znach_x x[L];
znach_x x_,k;
double y[L],h,eps,ymin,y_,t;
int i,N,l,p;
cout<<"Vvedite bazovuyu tochku:/n"<<endl;
cout<<"x0(x1,x2) ";cout<<endl;
cout<<"x1 = ";
cin>>x[0].x1;
cout<<"x2 = ";
cin>>x[0].x2;
cout<<"Vvedite shag:\n";
cout<<"h = ";cin>>h;
cout<<"Vvedite tochnost':\n";
cout<<"e = "; cin>>eps;
N=0;
y[0]=25*x[0].x1+0.9*x[0].x2+exp(0.35*(x[0].x1*x[0].x1+x[0].x2*x[0].x2));
cout<<"y0 = "<<y[0]<<endl; N++;
p=0;
t=0;
while(true)
{p++;
x[1].x1=x[0].x1+h;
x[1].x2=x[0].x2+h;
x[2].x1=x[0].x1-h;
x[2].x2=x[0].x2+h;
x[3].x1=x[0].x1-h;
x[3].x2=x[0].x2-h;
x[4].x1=x[0].x1+h;
x[4].x2=x[0].x2-h;
/*cout<<"x[0].x1="<<x[0].x1<<" x[0].x2="<<x[0].x2<<endl;
cout<<"x[1].x1="<<x[1].x1<<" x[1].x2="<<x[1].x2<<endl;
cout<<"x[2].x1="<<x[2].x1<<" x[2].x2="<<x[2].x2<<endl;
cout<<"x[3].x1="<<x[3].x1<<" x[3].x2="<<x[3].x2<<endl;
cout<<"x[4].x1="<<x[4].x1<<" x[4].x2="<<x[4].x2<<endl;
getch();
 
cout<<endl; */
for (i=1;i<=4;i++)
 
{ if ((x[i].x1==k.x1)&&(x[i].x2==k.x2)) {y[i]=t; continue;}
  y[i]=25*x[i].x1+0.9*x[i].x2+exp(0.35*(x[i].x1*x[i].x1+x[i].x2*x[i].x2));
  N++;
  cout<<y[i]<<endl;
}
 
ymin=y[0];
 
for (i=1;i<=4;i++)
  if (y[i]<ymin) {ymin=y[i];l=i;}
cout<<"ymin = "<<ymin<<endl;
 
if (y[l]<y[0]) { k=x[0];t=y[0];
x[0]=x[l];
y[0]=y[l];
continue;
       }
     else if (h>eps) {h=h/2.0;continue;}
    else break;
 
}
 
 
x_=x[0];y_=y[0];
cout<<"Resultat:\n";
cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;
cout<<"y_ = "<<y_<<endl;
cout<<"Kol-vo iteracii: N = "<<N<<endl;
cout<<"p="<<p<<endl;
}
 
 
void diform_simplex()
{
int k=0,l1,l2,m=0,N;
double e,x1[3],x2[3],y[4],r,beta,gamma,alfa,c1,c2,u1,u2,d,v1,v2,z,x1_min,x2_min,f_min;
cout<<"Vvedite bazovuyu tochku:/n"<<endl;
cout<<"x0(x1,x2) ";cout<<endl;
cout<<"x1 = ";
cin>>x1[0];
cout<<"x2 = ";
cin>>x2[0];
cout<<"Vvedite tochnost':\n";
cout<<"e = "; cin>>e;
cout<<"Vvedite dlinu storoni:\n";
cout<<"r = "; cin>>r;
cout<<"Vvedite alfa:\n";
cout<<"alfa = "; cin>>alfa;
cout<<"Vvedite beta:\n";
cout<<"beta = "; cin>>beta;
cout<<"Vvedite gamma:\n";
cout<<"gamma = "; cin>>gamma;
 
x1[1]=x1[0]+r;
x2[1]=x2[0];
x1[2]=x1[0];
x2[2]=x2[0]+r;
 
cout<<"Nachalnii simplex:"<<endl;
cout<<"V1: x1="<<setw(4)<<x1[0]<<"  x2="<<x2[0]<<endl;
   cout<<"V2: x1="<<setw(4)<<x1[1]<<"  x2="<<x2[1]<<endl;
cout<<"V3: x1="<<setw(4)<<x1[2]<<"  x2="<<x2[2]<<endl;
 
y[0]=25*x1[0]+0.9*x2[0]+exp(0.35*(x1[0]*x1[0]+x2[0]*x2[0]));
y[1]=25*x1[1]+0.9*x2[1]+exp(0.35*(x1[1]*x1[1]+x2[1]*x2[1]));
y[2]=25*x1[2]+0.9*x2[2]+exp(0.35*(x1[2]*x1[2]+x2[2]*x2[2]));
cout<<y[0]<<" "<<y[1]<<" "<<y[2]<<endl; N=3;
do
{
k++;
l1=0;
l2=0;
if (y[1]<y[0])
l1=1;
else l2=1;
if(y[2]<y[l1])
l1=2;
if(y[2]>y[l2])
l2=2;
for (int i=0;i<3;i++)
if((i!=l1)&&(i!=l2))
m=i;
d=sqrt((pow((y[l2]-y[l1]),2)+pow((y[m]-y[l1]),2))/2);
if(d<e){break;}
{
c1=0,c2=0;
for(int i=0;i<3;i++)
if(i!=l2)
{
c1=c1+x1[i];c2=c2+x2[i];
}
c1=c1/2;
  c2=c2/2;
u1=c1+alfa*(c1-x1[l2]);
u2=c2+alfa*(c2-x2[l2]);
y[3]=25*u1+0.9*u2+exp(0.35*(u1*u1+u2*u2));
  N++;
if(y[3]<y[l1])
{
v1=c1+beta*(u1-c1);
  v2=c2+beta*(u2-c2);
z=25*v1+0.9*v2+exp(0.35*(v1*v1+v2*v2));
  N++;
if(z<y[3])
{
 
x1[l2]=v1;x2[l2]=v2;y[l2]=z;  //optim
 
}
else
{
x1[l2]=u1;x2[l2]=u2;y[l2]=y[3];   //optim
}
    cout<<setw(5)<<k;
cout<<setw(14)<<x1[l2]<<setw(14)<<x2[l2]<<endl;
}
else
{
if(y[3]>y[m])
{
if(y[3]<y[l2])
  {
v1=c1+gamma*(u1-c1);v2=c2+gamma*(u2-c2);
 
}
else
{
v1=c1+gamma*(x1[l2]-c1);v2=c2+gamma*(x2[l2]-c2);
 
}
z=25*v1+0.9*v2+exp(0.35*(v1*v1+v2*v2));
  N++;
if((z<y[l2])&&(z<y[3]))
{
x1[l2]=v1;x2[l2]=v2;y[l2]=z;   //optim
}
else
{
for(int i=0;i<3;i++)
{
if(i!=l1)
{
x1[i]=(x1[i]+x1[l1])/2;
x2[i]=(x2[i]+x2[l1])/2;
y[i]=25*x1[i]+0.9*x2[i]+exp(0.35*(x1[i]*x1[i]+x2[i]*x2[i]));;;
N++;
}
    cout<<setw(5)<<k;
      cout<<setw(14)<<x1[i]<<setw(14)<<x2[i]<<endl;
     }
           }
           cout<<setw(5)<<k;
         cout<<setw(14)<<x1[l2]<<setw(14)<<x2[l2]<<endl;
 
}
else
{
x1[l2]=u1;x2[l2]=u2;y[l2]=y[3];
cout<<setw(5)<<k;
cout<<setw(14)<<x1[l2]<<setw(14)<<x2[l2]<<endl;
 
}
}
}
    }
while(d>e);
x1_min=x1[l1];
x2_min=x2[l1];
f_min=25*x1_min+0.9*x2_min+exp(0.35*(x1_min*x1_min+x2_min*x2_min));
cout<<"Resultat:\n";
cout<<"x_(x1,x2) = x_( "<<x1_min<<","<<x2_min<<" )"<<endl;
cout<<"y_ = "<<f_min<<endl;
cout<<"Kol-vo icpitanii: N = "<<N<<endl;
cout<<"k= "<<(k-1)<<endl;
}
 
 
void regul_simplex()
{
double *px_1,*px_2,*py;
double eps,min,l1,max,l2,r,c1,c2,u1,u2,X1,X2,Y,y;
int i,N,N1,L1,L2;
N1=1;
px_1=new double[3];
px_2=new double[3];
py=new double[3];
cout<<"Vvedite bazovuyu tochku:/n"<<endl;
cout<<"x0(x1,x2) ";cout<<endl;
cout<<"x1 = "; cin>>px_1[0];
cout<<"x2 = "; cin>>px_2[0];
cout<<"eps = "; cin>>eps;
cout<<"r = "; cin>>r;
px_1[1]=px_1[0]+r;
px_2[1]=px_2[0];
px_1[2]=px_1[0];
px_2[2]=px_2[0]+r;
py[0]=25*px_1[0]+0.9*px_2[0]+exp(0.35*(px_1[0]*px_1[0]+px_2[0]*px_2[0]));
py[1]=25*px_1[1]+0.9*px_2[1]+exp(0.35*(px_1[1]*px_1[1]+px_2[1]*px_2[1]));
py[2]=25*px_1[2]+0.9*px_2[2]+exp(0.35*(px_1[2]*px_1[2]+px_2[2]*px_2[2]));
N=3;
point1:
min=py[0]; l1=0;
for(i=1;i<=2;i++)
{if(py[i]<min)
  {min=py[i];
   l1=i;
  }
}
max=py[0]; l2=0;
for(i=1;i<=2;i++)
{if(py[i]>max)
  {max=py[i];
   l2=i;
  }
}
if(r>eps)
{c1=0; c2=0;
for(i=0;i<=2;i++)
{if(i==l2) continue;
c1=c1+px_1[i];
c2=c2+px_2[i];
}
L2=l2;
L1=l1;
u1=c1-px_1[L2];
u2=c2-px_2[L2];
y=25*u1+0.9*u2+exp(0.35*(u1*u1+u2*u2));
N++;
if(y<py[L2])
{px_1[L2]=u1;
px_2[L2]=u2;
py[L2]=y;
}
else
{for(i=0;i<=2;i++)
{if(i==L1) continue;
  px_1[i]=(px_1[i]+px_1[L1])*0.5;
  px_2[i]=(px_2[i]+px_2[L1])*0.5;
  py[i]=25*px_1[i]+0.9*px_2[i]+exp(0.35*(px_1[i]*px_1[i]+px_2[i]*px_2[i]));
  N++;
}
  r=r*0.5;
 
}
cout<<px_1[L1]<<" "<<px_2[L1]<<endl;
N1++;
 
goto point1;
}
X1=px_1[L1];
X2=px_2[L1];
Y=25*px_1[L1]+0.9*px_2[L1]+exp(0.35*(px_1[L1]*px_1[L1]+px_2[L1]*px_2[L1]));
cout<<"x_(x1,x2) = x_( "<<X1<<","<<X2<<" )"<<endl;
cout<<"y_ = "<<Y<<endl;
cout<<"Kol-vo icpitanii: N = "<<N<<endl;
cout<<"Kol-vo iteracii N1="<<N1<<endl;
 
}
 
 
 
void grad_s_drobl()
{const int L=1500;
znach_x x[L];
znach_x x_;
double a,eps,delta,z1,z2,y,y1,d,y_;
int k,N,N1,N0;
cout<<"Vvedite bazovuyu tochku:/n"<<endl;
cout<<"x0(x1,x2) ";cout<<endl;
cout<<"x1 = ";
cin>>x[0].x1;
cout<<"x2 = ";
cin>>x[0].x2;
cout<<"Vvedite a:\n";
cout<<"a = ";cin>>a;
cout<<"Vvedite tochnost':\n";
cout<<"eps = "; cin>>eps;
cout<<"Vvedite delta:\n";
cout<<"delta = "; cin>>delta;
k=0;
z1=25+0.7*x[0].x1*exp(0.35*(pow(x[0].x1,2)+pow(x[0].x2,2)));
z2=0.9+0.7*x[0].x2*exp(0.35*(pow(x[0].x1,2)+pow(x[0].x2,2)));
 
N1=2;N0=0;
d=sqrt(pow(z1,2)+pow(z2,2));
 
m2:
y=25*x[k].x1+0.9*x[k].x2+exp(0.35*(pow(x[k].x1,2)+pow(x[k].x2,2)));
 
N0++;
m1:
y1=25*(x[k].x1-a*z1)+0.9*(x[k].x2-a*z2)+exp(0.35*(pow((x[k].x1-a*z1),2)+pow((x[k].x2-a*z2),2)));
 
if ((y1-y)>(-a*delta*d)) {a=a/2.0;
  goto m1;}
x[k+1].x1=x[k].x1-a*z1;
x[k+1].x2=x[k].x2-a*z2;
 
cout<<k<<" "<<x[k+1].x1<<" "<<x[k+1].x2<<endl;
cout<<endl;
 
z1=25+0.7*x[k+1].x1*exp(0.35*(pow(x[k+1].x1,2)+pow(x[k+1].x2,2)));
z2=0.9+0.7*x[k+1].x2*exp(0.35*(pow(x[k+1].x1,2)+pow(x[k+1].x2,2)));
N1=N1+2;
d=pow(z1,2)+pow(z2,2);
if (sqrt(d)>eps) {k=k+1;goto m2;}
    else{ x_=x[k+1];
y_=25*x_.x1+0.9*x_.x2+exp(0.35*(pow(x_.x1,2)+pow(x_.x2,2)));
N=N1+N0;}
 
cout<<"Result:\n";
cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;
cout<<"y_ = "<<y_<<endl;
cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;
cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;
cout<<"Kol-vo icpitanii: N = "<<N<<endl;
cout<<"Kol-vo iteracii: k = "<<k<<endl;
}
 
void naisk_spusk()
{const int L=1500;
znach_x x[L];
znach_x x_;
double a,a1,a2,f1,f2,amin,eps,z1,z2,y1,d,y_,A,B,da,y2;
int k,i,N1,N,N0;
cout<<"Vvedite bazovuyu tochku:/n"<<endl;
cout<<"x0(x1,x2) ";cout<<endl;
cout<<"x1 = ";
cin>>x[0].x1;
cout<<"x2 = ";
cin>>x[0].x2;
cout<<"Vvedite tochnost':\n";
cout<<"eps = "; cin>>eps;
cout<<"Vvedite da:\n";
cout<<"da = "; cin>>da;
k=0;
N0=0;
z1=25+0.7*x[0].x1*exp(0.35*(pow(x[0].x1,2)+pow(x[0].x2,2)));
z2=0.9+0.7*x[0].x2*exp(0.35*(pow(x[0].x1,2)+pow(x[0].x2,2)));
N1=2;
m2:
 
y1=25*x[k].x1+0.9*x[k].x2+exp(0.35*(pow(x[k].x1,2)+pow(x[k].x2,2)));
//cout<<"y1= "<<y1<<endl;
i=0;
m1:
y2=25*(x[k].x1-((i+1)*da)*z1)+0.9*(x[k].x2-((i+1)*da)*z2)+exp(0.35*(pow((x[k].x1-((i+1)*da)*z1),2)+pow((x[k].x2-((i+1)*da)*z2),2)));
//cout<<"y2= "<<y2<<endl;
N0++;
if (y2<y1) {i++;y1=y2;goto m1;}
   else {B=(1+i)*da;
  if (i>0) A=(i-1)*da;
       else A=0;
  }
//cout<<"A="<<A<<" B="<<B<<endl;
 
//dich
d=eps/100;
 
do
   {a=(A+B)/2.0;
    a1=a-d;
    a2=a+d;
    f1=25*(x[k].x1-a1*z1)+0.9*(x[k].x2-a1*z2)+exp(0.35*(pow((x[k].x1-a1*z1),2)+pow((x[k].x2-a1*z2),2)));
    f2=25*(x[k].x1-a2*z1)+0.9*(x[k].x2-a2*z2)+exp(0.35*(pow((x[k].x1-a2*z1),2)+pow((x[k].x2-a2*z2),2)));
    N=0;
    N=N+2;
    cout<<"a1 = "<<a1<<" f1 = "<<f1<<endl;
    cout<<"a2 = "<<a2<<" f2 = "<<f2<<endl;
    if (f1<f2) B=a2;
       else A=a1;
    }
   while (B-A>2*eps);
 
amin=(A+B)/2.0;
 
// cout<<endl;
 
//cout<<"Result:  "<<"amin= "<<amin<<endl;
 
x[k+1].x1=x[k].x1-amin*z1;
x[k+1].x2=x[k].x2-amin*z2;
z1=25+0.7*x[k+1].x1*exp(0.35*(pow(x[k+1].x1,2)+pow(x[k+1].x2,2)));
z2=0.9+0.7*x[k+1].x2*exp(0.35*(pow(x[k+1].x1,2)+pow(x[k+1].x2,2)));
N1=N1+2;
if ((sqrt(z1*z1+z2*z2))>eps) {k=k+1; goto m2;}
    else {x_=x[k+1];
  y_=25*x_.x1+0.9*x_.x2+exp(0.35*(pow(x_.x1,2)+pow(x_.x2,2)));
N=N1+N0;
}
 
 
cout<<"Result:\n";
cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;
cout<<"y_ = "<<y_<<endl;
cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;
cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;
cout<<"Kol-vo icpitanii: N = "<<N<<endl;
cout<<"Kol-vo iteracii: k = "<<k<<endl;
 
}
 
 
void evristich()
{
const int L=1500;
znach_x x[L];
znach_x x_;
double a1,a2,d1,d2,g1,g2,b1,b2,s1,s2;
double eps,y_,p1,p1_1,p2,p2_2,norma;
int k;
int N0=0,N1=0,N;
cout<<"Vvedite bazovuyu tochku:"<<endl;
cout<<"x0(x1,x2) ";cout<<endl;
cout<<"x1 = ";
cin>>x[0].x1;
cout<<"x2 = ";
cin>>x[0].x2;
cout<<"Vvedite tochnost':\n";
cout<<"eps = ";
cin>>eps;
a1=0.5;
a2=2;
d1=0.01;
d2=3;
k=0;
//N=0;N0=0;N1=0;
m1:
p1=dfx1(x[k].x1,x[k].x2);
p2=dfx2(x[k].x1,x[k].x2);
N1=N1+2;                   //N1-kol-vo vichislenii proizv.
if (abs(p1)>d1) g1=p1;
if (p1<=d1)   g1=0;
if (abs(p2)>d1) g2=p2;
if (p2<=d1) g2=0;
 
 
x[k+1].x1=x[k].x1-a1*g1;
x[k+1].x2=x[k].x2-a1*g2;
N0=N0+2;                  //N0 kol-vo vichislenii f
if (f(x[k+1].x1,x[k+1].x2)<f(x[k].x1,x[k].x2)) {k++;goto m1;}
m2:
p1_1=dfx1(x[k].x1,x[k].x2);
p2_2=dfx2(x[k].x1,x[k].x2);
N1=N1+2;
if (abs(p1)>d2) b1=0;
if (p1<=d2)   b1=p1_1;
if (abs(p2)>d2) b2=0;
if (p2<=d2) b2=p2_2;
 
x[k+1].x1=x[k].x1-a2*b1;
x[k+1].x2=x[k].x2-a2*b2;
N0=N0+2;
if (f(x[k+1].x1,x[k+1].x2)<f(x[k].x1,x[k].x2)) {k++;goto m2;}
 
s1=dfx1(x[k+1].x1,x[k+1].x2);
s2=dfx2(x[k+1].x1,x[k+1].x2);
N1=N1+2;
norma=sqrt(pow(s1,2)+pow(s2,2));
 
if (norma>eps)  {a1=0.5*a1;
a2=0.5*a2;
goto m1;}
N=N0+N1;
x_=x[k+1];
y_=f(x_.x1,x_.x2);
 
cout<<"Result:\n";
cout<<"x_(x1,x2) = x_( "<<x_.x1<<","<<x_.x2<<" )"<<endl;
cout<<"y_ = "<<y_<<endl;
cout<<"Kol-vo icpitanii: N1 = "<<N1<<endl;
cout<<"Kol-vo icpitanii: N0 = "<<N0<<endl;
cout<<"Itogo kol-vo icpitanii: N = "<<N<<endl;
cout<<"kol-vo iteracii k="<<k<<endl;
 
}
 
double ZS(double a,double b,double x1k,double x2k,double z1,int n)
{ double e0,t,x1,x2,fi1,fi2;
e0=0.0001;
t=(1+sqrt(5))/2;
 
x1=a+(b-a)/(t*t);
x2=a+(b-a)/t;
if (n==1)
{ fi1=f(x1k-x1*z1,x2k);
fi2=f(x1k-x2*z1,x2k);
do
{ if (fi1<fi2) { b=x2; x2=x1; fi2=fi1;
x1=a+b-x2;fi1=f(x1k-x1*z1,x2k); }
        else { a=x1; x1=x2; fi1=fi2;
x2=a+b-x1; fi2=f(x1k-x2*z1,x2k); }
}
while((b-a)/2>e0);
if (fi1<fi2) b=x2;
else   a=x1; }
else
{ fi1=f(x1k,x2k-x1*z1);
fi2=f(x1k,x2k-x2*z1);
do
{ if (fi1<fi2) { b=x2; x2=x1; fi2=fi1;
x1=a+b-x2; fi1=f(x1k,x2k-x1*z1); }
else { a=x1; x1=x2;fi1=fi2;
x2=a+b-x1; fi2=f(x1k,x2k-x2*z1); }
}
while((b-a)/2>e0);
if (fi1<fi2) b=x2;
else   a=x1; }
return ((a+b)/2); }
 
void gauss_zeidel()
{
int k,m;
double x1[100],x2[100];
double e2,dalpha;
double alphamin1,alphamin2,z1,z2,y1,y2,a1,b1,a2,b2,xmin1,xmin2,ymin,d;
k=0;
x1[0]=1;
x2[0]=0;
e2=0.0004;
dalpha=0.9;
cout<<setw(5)<<setiosflags(ios::left)<<"k"<<setw(14)<<"x1"<<setw(14)<<"x2"<<endl;
metka:
z1=dfx1(x1[2*k],x2[2*k]);
m=0;
y1=f(x1[2*k]-m*dalpha*z1,x2[2*k]);
metka1:
y2=f(x1[2*k]-(m+1)*dalpha*z1,x2[2*k]);
if (y2<y1)
{m++;y1=y2;goto metka1;}
else
{b1=(m+1)*dalpha;
if (m==0) a1=0;
else a1=(m-1)*dalpha; }
 
alphamin1=ZS(a1,b1,x1[2*k],x2[2*k],z1,1);
 
x1[2*k+1]=x1[2*k]-alphamin1*z1;
x2[2*k+1]=x2[2*k];
cout<<setw(5)<<setiosflags(ios::left)<<(k+1)<<setw(14)<<x1[2*k+1]<<setw(14)<<x2[2*k+1]<<endl;
 
z2=dfx2(x1[2*k+1],x2[2*k+1]);
m=0;
y1=f(x1[2*k+1],x2[2*k+1]-m*dalpha*z2);
metka2:
y2=f(x1[2*k+1],x2[2*k+1]-(m+1)*dalpha*z2);
if (y2<y1)
{m++;y1=y2;goto metka2;}
else
{b2=(m+1)*dalpha;
if (m==0) a2=0;
else a2=(m-1)*dalpha; }
 
alphamin2=ZS(a2,b2,x1[2*k+1],x2[2*k+1],z2,2);
 
x1[2*k+2]=x1[2*k+1];
x2[2*k+2]=x2[2*k+1]-alphamin2*z2;
cout<<setw(5)<<setiosflags(ios::left)<<" "<<setw(14)<<x1[2*k+2]<<setw(14)<<x2[2*k+2]<<endl;
 
d=sqrt(pow((x1[2*k+2]-x1[2*k]),2)+pow((x2[2*k+2]-x2[2*k]),2));
if (d>e2)
{k++;goto metka;}
else
{ xmin1=x1[2*k+2];
xmin2=x2[2*k+2];
ymin=f(xmin1,xmin2); }
cout<<endl<<endl;
cout<<"x1="<<xmin1<<", x2="<<xmin2<<"; y="<<ymin<<endl;
cout<<"N="<<(N0+N1)<<endl;
cout<<"k="<<(k+1)<<endl;
 
}
 
void main()
{int j;
 
while (true)
 
{clrscr();
 
cout<<endl;
cout<<"1.Poisk po obrazcu\n";
cout<<"2.Diformir. simpleks\n";
cout<<"3.Regul. simplecs\n";
cout<<"4.Grad. s drobleniem\n";
cout<<"5.Naisk. spusk\n";
cout<<"6.Gauss-Zeidel\n";
cout<<"7.Evristich.\n";
cout<<"0.Vihod iz programmi\n";
cout<<endl;
cout<<"Vash vibor 0-7: "; cin>>j;
switch(j)
{
case 1:poiskpoobrazcu();getch(); break;
case 2:diform_simplex();getch(); break;
case 3:regul_simplex();getch(); break;
case 4:grad_s_drobl();getch(); break;
case 5:naisk_spusk();getch(); break;
case 6:gauss_zeidel();getch(); break;
case 7:evristich();getch(); break;
case 0: cout<<"Over!"; getch();exit(0);
default:{cout<<"Net takogo punkta!";exit(1);}
 
getch(); }
 
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Графики траекторий промежуточных приближений
 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
Результирующая  таблица
 
ymin
Общее кол-во испытаний
Название метода
xmin
Кол-во итераций
x1
x2
1. поиск  по образцу
-2,712158
-0,097412
-54,722806
99
28
2. деформир. симплекс
-2,713434
-0,101445
-54,722682
50
24
3.регул.  симплекс
-2,712158
-0,097656
-54,722806
50
22
4. градиентный  с дроблением шага
-2,71213
-0,097677
-54,722806
86
27
5. наискорейший  спуск
-2,717127
-0,097659
-54,722806
71
22
6. Гаусс-Зейдель
-2,71213
-0,0976367
-54,7228
278
3
7.Эвристический 

-2,71213

-0,0976367

-54,7228

506

109


 

Вывод

На основе полученных результатов, приведённых в таблице, можно  сделать вывод, что наилучшим  методом многомерной безусловной  оптимизации с точки зрения количества итераций является метод Гаусса-Зейделя, а лучший метод с точки зрения количества экспериментов – это  метод деформируемого симплекса.

 



и т.д.................


Перейти к полному тексту работы


Скачать работу с онлайн повышением уникальности до 90% по antiplagiat.ru, etxt.ru или advego.ru


Смотреть полный текст работы бесплатно


Смотреть похожие работы


* Примечание. Уникальность работы указана на дату публикации, текущее значение может отличаться от указанного.