Отчет по лабораторной работе №2
по предмету «Методы оптимизации»
на тему: Безусловная многомерная оптимизация
Выполнил: студент гр.
Проверил: Хасанов А.Ю.
Лабораторная работа №2
Цель работы: знакомство с методами многомерной безусловной оптимизации первого и нулевого порядка и их освоение, сравнение эффективности применения этих методов конкретных целевых функций.
Задание: найти точку минимума целевой функции
f(x1, x2) = 20·x1 + 0.4·x2 + exp(0.3·x12 + 0.3·x22), если начальное приближение [0,-1] при заданной точности =10-4.
Используемые методы: в) метод наискорейшего спуска (с использованием метода дихотомии);
г) метод покоординатного спуска с постоянным шагом;
л) метод симплекса;
н) метод поиска по образцу.
Блок-схема метода наискорейшего спуска (с использованием метода дихотомии)
Блок-схема метода покоординатного спуска с постоянным шагом
Блок-схема симплекс-метода
x[1][1]=x[1][0]+r;
x[2][1]=x[2][0]; x[1][2]=x[1][0]; x[2][2]=x[2][0]+r; N=0;
y[0]=fx(x[1][0],x[2][0]); y[1]=fx(x[1][1],x[2][1]); y[2]=fx(x[1][2],x[2][2]);
N=N+3;
l1=0,l2=0;
i=0
да
нет
l2=i i++
i=2
i=0
да
нет
i=2
да
нет
c1=0,c2=0
X1min=x[1][l1];
X2min=x[2][l1]; fmin=y[l1];
i=0
c1+=x[1][i];
c2+=x[2][i];
да
нет
i++
i=2
c1/=2;
c2/=2; u1=2*c1-x[1][l2];
u2=2*c2-x[2][l2]; y[3]=fx(u1,u2); N++;
да нет
i=0
x[1][l2]=u1; x[2][l2]=u2; y[l2]=y[3];
x[1][i]=(x[1][i]+x[1][l1])/2;
x[2][i]=(x[2][i]+x[2][l1])/2; y[i]=fx(x[1][i],x[2][i]); N++
нет
i++
i=2
r=r/2;
N=N+2
Блок-схема поиска по образцу
y[0]=fx(x[1][0],x[2][0]),
N=1; t=0
да
нет
да
нет
да
нет
да
нет
t=0;
l=1
i=1
l=i
нет
i++
i=4
нет да
да
h=h/2;
x[1][l-2]=x[1][0]; x[2][l-2]=x[2][0]; y[l-2]=y[0];
t=l-2; x[1][l+2]=x[1][0]; x[2][l+2]=x[2][0]; y[l+2]=y[0];
t=l+2;
нет
да
minx1=x[1][0];
minx2=x[2][0]; minf=y[0];
x[1][0]=x[1][l]; x[2][0]=x[2][l]; y[0]=y[l];
Листинг программы метод наискорейшего спуска (с использованием метода дихотомии)
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <conio.h>
double Ff(double x1, double x2)
{ double f;
f=20*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);
return(f);
}
double Fx1(double x1, double x2)
{double f1;
f1=20+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);
return(f1);
}
double Fx2(double x1, double x2)
{double f2;
f2=0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);
return(f2);
}
void main ()
{ int k,i,N,N0,N1,l1,l2;
double a,b,d,ymin,xmin1,xmin2,e0,alpha;
double x[3000][2]; double y[10];
x[0][1]=0;
x[0][2]=-1;
e0=0.0001;
double e2,z1,z2,y1,y2,e,p,alpmin,g1,g2;
int m;
e2=0.00025;
e=0.0002;
FILE*f=fopen("d:\\lab1.xls","w");
fprintf(f,"%Lf\t%Lf\n",x[0][1],x[0][2]);
cout<<"Metod naiskor. spuska"<<endl;
k=0; N0=0; N1=0;
z1=Fx1(x[0][1],x[0][2]);
z2=Fx2(x[0][1],x[0][2]);
N1+=2;
alpha=2.2;
mm1:
m = 0;
y1=Ff(x[k][1],x[k][2]);N0++;
metka:
y2=Ff(x[k][1]-(m+1)*alpha*z1,x[k][2]-(m+1)*alpha*z2);
N0++;
if (y2<y1)
{m++;y1=y2;goto metka;}
else
{ b=(m+1)*alpha;
if (m==0)
{a=0;}
else {a=(m-1)*alpha;}
}
do {
p=(a+b)/2;
g1=Ff(x[k][1]-(p-0.0001)*z1,x[k][2]-(p-0.0001)*z2);
N0++;
g2=Ff(x[k][1]-(p+0.0001)*z1,x[k][2]-(p+0.0001)*z2);
N0++;
if (g1<g2)
{b=p+0.0001;}
else {a=p-0.0001;}
} while ((b-a)/2>e);
alpmin=(a+b)/2;
cout<<"\nk="<<k+1<<endl;
x[k+1][1]=x[k][1]-alpmin*z1; cout<<"\nx[1][1]="<<x[k+1][1];
x[k+1][2]=x[k][2]-alpmin*z2; cout<<"\nx[1][2]="<<x[k+1][2]<<endl;
z1=Fx1(x[k+1][1],x[k+1][2]);
z2=Fx2(x[k+1][1],x[k+1][2]);
N1+=2;
d=pow(z1*z1+z2*z2,0.5);
if (d>e2)
{k++;goto mm1;}
else {xmin1=x[k+1][1];
xmin2=x[k+1][2];
ymin=Ff(xmin1,xmin2);
cout<<"x1="<<xmin1<<" x2="<<xmin2<<" ymin="<<ymin<<endl<<"N1="<<N1;
cout<<" N0="<<N0<<" k="<<k+1<<endl;
}
getch();
fclose(f);
}